@liberfi.io/ui-predict 0.1.112 → 0.1.113
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 +8 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -8
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -15
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/components/categories/categories.script.ts","../src/components/categories/categories.ui.tsx","../src/components/categories/categories.widget.tsx","../src/utils/predict-market-adapter.ts","../src/consts/index.ts","../src/providers/PredictWalletProvider.tsx","../src/components/trade-form/trade-form.script.ts","../src/components/kyc-modal/kyc-modal.ui.tsx","../src/components/trade-form/trade-form.ui.tsx","../src/components/trade-form/trade-form.widget.tsx","../src/components/trade-form/trade-form.modal.tsx","../src/components/events/events-filter.ui.tsx","../src/components/events/events-toolbar.ui.tsx","../src/components/events/events.script.ts","../src/components/events/events.skeleton.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/event-detail/event-detail-activity.ui.tsx","../src/components/event-detail/event-detail-skeleton.tsx","../src/components/event-detail/event-market-depth-chart.ui.tsx","../src/components/event-detail/event-market-detail.widget.tsx","../src/components/event-detail/event-price-chart.ui.tsx","../src/components/event-detail/event-detail.ui.tsx","../src/components/event-detail/event-detail.widget.tsx","../src/components/event-detail/event-similar-events.ui.tsx","../src/components/event-detail/event-detail.page.tsx","../src/components/event-detail/event-detail.scripts.ts","../src/components/search/search-history.script.ts","../src/components/search/search-history.ui.tsx","../src/components/search/search-history.widget.tsx","../src/components/search/search-input.ui.tsx","../src/components/matches/source-badge.ui.tsx","../src/components/search/search-result-item.ui.tsx","../src/components/search/search-result-list.script.ts","../src/components/search/search-result-list.widget.tsx","../src/components/search/search.script.ts","../src/components/search/search.widget.tsx","../src/components/search/search.modal.tsx","../src/components/search/search-events-button.tsx","../src/components/matches/matches-filter-bar.ui.tsx","../src/components/matches/matches-hero.ui.tsx","../src/components/matches/match-market-card.ui.tsx","../src/components/matches/matches.widget.tsx","../src/components/matches/matches.page.tsx","../src/components/matches/match-group-card.ui.tsx","../src/components/matches/matches-stats-bar.ui.tsx","../src/components/matches/spread-indicator.ui.tsx","../src/components/profile/profile-history.ui.tsx","../src/components/profile/profile-orders.ui.tsx","../src/components/profile/profile-positions.ui.tsx","../src/components/profile/profile-stats.ui.tsx","../src/components/profile/profile.page.tsx","../src/components/setup-modal/setup-modal.ui.tsx"],"names":["version_default","RAW_TAGS_BY_CATEGORIES","CATEGORY_ORDER","STATIC_CATEGORIES","orderIndex","cat","idx","label","rawTags","t","a","b","CategoriesUI","categories","selectedCategory","selectedTag","activeTags","onCategorySelect","onTagSelect","trailing","pulsingTab","className","useTranslation","handleSelectAll","useCallback","trendingLabel","jsxs","cn","jsx","Tab","TabSeparator","Chip","tag","isSelected","onPress","badge","showPulse","icon","CategoriesSkeleton","count","_","i","Skeleton","toUICategories","items","c","toUITags","CategoriesWidget","onSelect","selectedCategorySlug","setSelectedCategorySlug","useState","selectedTagSlug","setSelectedTagSlug","handleCategorySelect","categoryLabel","handleTagSelect","tagLabel","uiCategories","activeCat","predictEventToStandard","event","predictMarketToStandard","market","yes","no","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","PredictWalletContext","createContext","usePredictWallet","ctx","useContext","DEFAULT_POLLING_INTERVAL","PredictWalletProvider","pollingInterval","enabled","children","wallets","useWallets","solanaAddress","useMemo","w","ChainNamespace","evmAddress","kalshiBalanceData","kalshiBalanceLoading","kalshiBalanceFetching","kalshiBalanceError","useBalance","kalshiKycData","kalshiKycLoading","useDFlowKYC","polySetupData","polySetupLoading","usePolymarketSetup","polymarketSafeAddress","polymarketSetupVerified","polymarketBalanceData","polymarketBalanceLoading","polymarketBalanceFetching","polymarketBalanceError","value","DURATION_UNIT_SECONDS","resolveExpiration","preset","customDuration","customDurationUnit","now","end","fireCelebration","defaults","confetti","useTradeForm","initialOutcome","initialSide","authStatus","useAuth","switchChain","useSwitchChain","predictClient","usePredictClient","polymarketCtx","PolymarketContext","queryClient","useQueryClient","source","supportsLimitOrder","solanaWallet","evmWallet","isAuthenticated","userPublicKey","outcome","setOutcomeRaw","side","setSideRaw","orderType","setOrderTypeRaw","quantity","setQuantityRaw","limitPrice","setLimitPriceRaw","isSubmitting","setIsSubmitting","pendingSignature","setPendingSignature","pendingSellCashConvert","setPendingSellCashConvert","kycRequired","setKycRequired","expirationEnabled","setExpirationEnabled","expirationPreset","setExpirationPreset","setCustomDuration","setCustomDurationUnit","contextBalance","contextKycVerified","contextKycUrl","contextSafeAddress","pricePerShare","o","setOrderType","type","setOutcome","useEffect","shares","amountStr","yesMint","noMint","usdcMint","SOLANA_TOKENS","collateralMint","marketOutcomeMint","positionUser","positionsData","positionsLoading","usePositions","positionMarketMeta","p","effectiveOutcomeMint","effectiveCollateral","inputMint","outputMint","quoteEnabled","refetchQuote","useDFlowQuote","usdcBalance","sum","isBalanceLoading","yesTokenBalance","noTokenBalance","effectivePrice","estimatedCost","bidPrice","potentialPayout","potentialProfit","setSide","s","setQuantity","v","clamped","rounded","setLimitPrice","validation","errors","holdingBalance","submitDFlow","useDFlowSubmit","orderStatus","useOrder","convertCashToUsdc","cashAmount","collateral","cashTx","txBytes","signedTxBytes","status","toast","submitDFlowOrder","quoteRecord","transaction","outAmount","result","submitPolymarketOrder","previousChain","needsSwitch","Chain","provider","usesSafe","signer","domain","types","primaryType","domainFields","fullTypes","creds","tokenIdx","tokenId","rawClobTokenIds","negRisk","price","polyOrderType","sizeInShares","input","buildCtfExchangeDomain","orderMessage","buildOrderMessage","signature","CTF_ORDER_TYPES","signedOrder","buildSignedOrder","clobPayload","buildClobPayload","body","headers","buildPolymarketL2Headers","submit","err","detail","KycModal","isOpen","onClose","kycUrl","StyledModal","open","ModalContent","key","USDC_LOGO","EXPIRATION_PRESETS","EXPIRATION_PRESET_I18N","DURATION_UNITS","DURATION_UNIT_I18N","TradeFormUI","variant","isValid","validationErrors","onOutcomeChange","onSideChange","onOrderTypeChange","onQuantityChange","onLimitPriceChange","onExpirationEnabledChange","onExpirationPresetChange","onCustomDurationChange","onCustomDurationUnitChange","onSubmit","showOdds","setShowOdds","kycModal","useDisclosure","currentPriceCents","hasAmount","submitLabel","sideLabel","outcomeLabel","winAmount","submitColor","handleHalf","handleMax","showErrors","setShowErrors","handleSubmitPress","Fragment","Tabs","StyledNumberInput","pct","StyledSwitch","Select","keys","val","SelectItem","u","ChevronDownIcon","Button","TradeFormWidget","chain","authenticatedSubmit","useAuthCallback","adaptedEvent","adaptedMarket","PREDICT_TRADE_MODAL_ID","PredictTradeModal","id","AsyncModal","modalProps","PredictTradeModalContent","params","onOpenChange","isMobile","useScreen","DEFAULT_FILTER_STATE","countActiveFilters","state","EventsFilterUI","onChange","draft","setDraft","handleOpenChange","handleReset","handleApply","updateDraft","prev","activeCount","platformOptions","timeRemainingOptions","volumeOptions","liquidityOptions","CloseButton","FilterSection","FilterChipGroup","onClick","options","selected","allowDeselect","opt","isActive","e","SORT_PRESETS","SORT_LABEL_KEYS","SORT_ORDER","btnBase","dropdownBase","EventsToolbarUI","sortPreset","onSortChange","sortAsc","onSortAscChange","onFilterPress","filterCount","setIsOpen","dropdownRef","useRef","handleClickOutside","onEscape","ActiveIcon","SORT_ICONS","SortIcon","ChevronDown","Icon","FilterBarIcon","CalendarIcon","ChartLineIcon","DropletIcon","TimerIcon","useEventsInfinite","baseParams","resolveEventsParams","infiniteData","isLoading","isFetching","isFetchingMore","isError","error","hasMore","fetchNextPage","refetch","usePredictInfiniteEvents","data","page","item","fetchMore","refetchAll","SHIMMER_CSS","EventsSkeleton","SkeletonCard","index","shimmer","titleWidth","j","EventsPageSkeleton","bar","MAX_DISPLAYED_OUTCOMES","SOURCE_GLOW","GLOW_FALLBACK","C_PRIMARY","C_SECONDARY","C_RED","TEAM_PALETTE","hashString","hash","getOutcomeColors","labels","l","label0","label1","idx0","idx1","getYesAsk","getYesPercent","formatPercent","getYesCents","getNoCents","yesPrice","formatCountdown","isoDate","diff","d","h","m","parts","injectedCSS","EventItem","href","LinkComponent","onSelectOutcome","onHover","expandedSlug","setExpandedSlug","rawMarkets","openMarkets","singleMarket","displayedMarkets","moreCount","formattedVolume","expandedMarket","isExpanded","handleCardClick","handleHeaderClick","handleShowMore","footerContent","SingleMarketFooter","ExpandedMarketFooter","MarketListFooter","el","glowColor","CardHeader","SingleMarketBody","ExpandedMarketBody","MarketListBody","CardFooter","countdown","Linkable","Avatar","EventIndicators","getEventBadges","badges","isCrypto","isLive","remaining","fiveMin","fifteenMin","cryptoColor","LiveBadge","CryptoCountdownBadge","ClosedBadge","color","onMarketClick","YesNoPill","onShowMore","ChevronRightIcon","SourceIcon","ElevatedButton","bgColor","textColor","shadowColor","OutcomeButtons","dynamicColors","labelFormat","c0","c1","effectiveFormat","yesLabel","noLabel","onCollapse","ChevronUpIcon","ChevronLeftIcon","PolymarketIcon","KalshiIcon","MD","LG","XL","GLOW_INSET","ROW_HEIGHT_SM","ROW_HEIGHT_LG","END_ROW_HEIGHT","getColumnCount","width","getRowHeight","EventsUI","events","onFetchMore","getEventHref","containerRef","listRef","containerWidth","containerHeight","useResizeObserver","columnCount","rowHeight","dataRowCount","showEndOfList","totalRowCount","isRowLoaded","loadMoreRows","onRowsRendered","useInfiniteLoader","handleScrollToTop","List","EventGridRow","style","onScrollToTop","EndOfListRow","Spinner","startIdx","rowEvents","emptySlots","EventsWidget","tagSlugSelection","limit","sort_by","sort_asc","with_markets","timeRemaining","minVolume","minLiquidity","EventsPage","setTagSlugSelection","filterState","setFilterState","isFilterOpen","openFilter","closeFilter","openTradeModal","useAsyncModal","handleSelectOutcome","selection","handleSortChange","handleSortAscChange","asc","handleFilterChange","sortBy","toolbar","ROW_HEIGHT","HEADER_HEIGHT","CONTENT_HEIGHT","LIST_HEIGHT","UserActivitySection","walletAddress","onCancelOrder","activeTab","setActiveTab","marketSlugs","positionsCount","tabs","tab","PositionsTab","OrdersTab","TradesTab","positions","TabSkeleton","EmptyState","PositionVirtualRow","closeLabel","position","pnl","pnlPercent","avgPrice","currentPrice","pnlColor","pnlSign","marketLabel","payoutIfRight","settlementStr","formatSettlementTime","formatPrice","hasNextPage","useInfiniteOrders","cancelMutation","useCancelOrder","orders","allItems","openStatuses","filtered","handleCancel","order","itemCount","rowCount","OrderVirtualRow","onCancel","isCancelling","cancelLabel","isBuy","OrderStatusBadge","useInfiniteTrades","trades","TradeVirtualRow","trade","timeStr","formatTimestamp","usdSize","message","cents","unixSeconds","date","month","day","hours","mins","isoString","EventDetailSkeleton","marketCount","showBack","TradeFormSkeleton","BID_COLOR","ASK_COLOR","formatKMB","n","abs","heightPow","cumulative","maxCumulative","buildDepthData","bids","asks","rawBidQty","rawAskQty","bid","slot","ask","cumBid","cumBidCost","bidTotal","bidCumCostArr","cumAsk","cumAskCost","askTotal","askCumCostArr","isBid","isAsk","hasOrder","DepthTooltipPanel","info","left","right","DepthColumn","memo","onEnter","onLeave","barRef","isVisible","X_TICKS","DepthXAxis","tick","EventMarketDepthChartUI","midPrice","bestBid","bestAsk","hasData","tooltip","setTooltip","activeBarRef","handleColumnEnter","barEl","handleColumnLeave","formatPriceCents","OrderbookSkeleton","EventMarketDetailWidget","onTradeAction","viewMode","setViewMode","isNo","orderbook","isOrderbookLoading","useOrderbook","spread","raw","OrderbookTableIcon","OrderbookDepthIcon","EventOrderbookTableUI","MAX_ROWS_PER_SIDE","sortedAsks","sortedBids","maxQty","all","r","OrderbookRow","depthPct","bgClass","priceClass","formattedContracts","dollarValue","formattedTotal","ChartErrorBoundary","Component","MAX_SELECTED","CHART_COLORS","ms","range","formatTooltipTimestamp","INTERVAL_OPTIONS","IntervalSwitcher","useCursorOverlay","wrapperRef","overlayRef","onMouseMove","wrapper","overlay","rect","xPct","onMouseLeave","CustomTooltip","active","payload","labelMap","allSeries","payloadMap","MarketSelector","markets","selectedSlugs","colorMap","onToggle","setOpen","rootRef","handleClick","atMax","triggerContent","slug","mk","isDisabled","isOnlyOne","yesOutcome","LegendBar","series","displayValues","medianOfSorted","sorted","mid","downsampleSeries","maxPoints","step","start","bucket","buildChartData","maxPointsPerSeries","sampledSeries","allTimestamps","lookups","lastValues","ts","row","map","last","EventPriceChart","props","EventPriceChartInner","externalLoading","volume","allMarkets","seen","sortedMarkets","priceOf","setSelectedSlugs","chartRange","setChartRange","selectedMarkets","hookSeries","hookLoading","useMarketHistory","dayMs","chartData","yDomain","min","max","pad","currentValues","tooltipSeries","chartWrapperRef","overlayDivRef","handleWrapperMouseMove","handleWrapperMouseLeave","handleToggle","hoveredValues","setHoveredValues","hoveredValuesRef","lastPayloadKeyRef","rafIdRef","showChart","ResponsiveContainer","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","Line","lastRow","yVal","ReferenceDot","dx","dy","formatCents","getMarketLabel","getPlatformLabel","formatISOTimestamp","iso","year","minutes","useCountdown","targetIso","setNow","target","days","secs","formatCountdownDate","offset","sign","tzHours","EventDetailUI","collapseRef","isCollapsed","useScrollCollapse","rest","isEnded","startCountdown","endCountdown","startDateFormatted","endDateFormatted","EventMarketsUI","EventRulesUI","DEFAULT_VISIBLE_COUNT","showAll","setShowAll","firstOpenSlug","activeKey","setActiveKey","visibleMarkets","toggleExpand","handleTradeAction","noPrice","MarketRow","activeYes","activeNo","onToggleExpand","volumeFormatted","showFullRules","setShowFullRules","showTimeline","setShowTimeline","selectedIdx","setSelectedIdx","marketsWithContent","selectedMarket","rulesText","truncatedRules","Dropdown","DropdownTrigger","DropdownMenu","DropdownItem","arr","EventDetailWidget","eventSlug","isEventLoading","eventError","useEvent","SimilarEventsSection","onEventClick","similarEvents","useSimilarEvents","ev","SimilarEventCard","EventDetailPage","onSimilarEventClick","onBack","tradeSelection","setTradeSelection","hasBack","tradeFormKey","listCandlesticksParamsForRange","useEventDetail","candlestickMarketSlugs","client","candlestickParams","marketsToQuery","dedupedMarkets","candlestickQueries","useQueries","candlesticksQueryKey","isCandlesticksLoading","q","candlestickErrors","candlesticks","MAX_HISTORY_SIZE","searchHistoriesAtom","atomWithStorage","usePredictSearchHistory","histories","setHistories","useAtom","addHistory","keyword","trimmed","clearHistories","SearchHistoryUI","onClear","TrashIcon","SearchHistoryWidget","SearchInputUI","onValueChange","StyledInput","SearchIcon","XCloseIcon","Kbd","SOURCE_META","DEFAULT_META","getSourceMeta","SourceBadge","meta","formatVolume","vol","SearchResultItemUI","firstTag","sourceMeta","useSearchResultListScript","isFetchingNextPage","useSearchEvents","SearchResultListWidget","scriptParams","ref","height","isItemLoaded","loadMoreItems","onRowsLoaded","LoadingState","SearchResultRow","EmptyIcon","useSearchScript","onKeywordChange","text","setText","setKeyword","onKeywordChangeStable","useCallbackRef","addHistoryStable","debouncedSearch","debounce","setText_","setKeyword_","clearKeyword","SearchWidget","onSelectEvent","PREDICT_SEARCH_MODAL_ID","PredictSearchModal","PredictSearchModalContent","onResult","handleSelectEvent","handleEscape","ModalHeader","ModalBody","SearchEventsButton","modalParams","isDesktop","onOpen","onSelectEventStable","handleOpen","handleClose","handleKeyDown","activeElement","isInEditableElement","SORT_OPTIONS","VOLUME_PRESETS","getVolumeLabel","MatchesFilterBar","onMinVolumeChange","onRefresh","sortOpen","setSortOpen","volumeOpen","setVolumeOpen","tooltipVisible","setTooltipVisible","spinning","setSpinning","sortRef","volumeRef","currentSort","handleRefresh","SortOptionIcon","FilterIcon","InfoIcon","shared","onMouseEnter","STAT_CARDS","MatchesHero","stats","line","card","getYesPrice","getOutcomeName","getSpreadTier","spreadPercent","SPREAD_THEME","SPREAD_GLOW","CONFIDENCE_THEME","getConfidenceTierKey","tier","score","SpreadGauge","theme","filled","PLATFORM_COLORS","DEFAULT_PLATFORM","getPlatformColor","MatchMarketCard","match","getMarketHref","priceA","priceB","cheaperSource","title","confKey","confTheme","ctaAccent","glow","PlatformRow","isCheaper","platColor","outcomeName","content","MatchesWidget","forwardRef","onStatsChange","isPlaceholderData","useInfiniteMatchMarkets","keepPreviousData","animKey","setAnimKey","prevIsPlaceholder","setPrevIsPlaceholder","k","useImperativeHandle","allMatches","total","maxSpread","totalVolume","highSpreadCount","sentinelRef","observer","entries","MatchesSkeletonList","itemIndex","SORT_TITLE_KEY","StatusClock","time","setTime","fmt","MatchesStatusBar","MatchesPage","bgImageSrc","setSortBy","setSortAsc","setMinVolume","heroStats","setHeroStats","widgetRef","sort","handleStatsChange","startTransition","DEFAULT_PLATFORM_COLORS","getPlatformColors","getBestMarketPair","group","best","bestSpread","extractPlatformData","pair","entryA","entryB","getOutcome","oA","oB","MatchGroupCard","onSelectEntry","bestPair","platA","platB","isHighSpread","cheapest","cheapestMeta","PlatformBlock","colors","MatchesStatsBar","matches","sources","entry","StatItem","Separator","valueClassName","getSpreadColor","SpreadIndicator","arbProfit","hasArb","PAGE_SIZE","PAGINATION_HEIGHT","ProfileHistory","listHeight","currentPage","setCurrentPage","kalshiData","kalshiLoading","fetchNextKalshi","hasMoreKalshi","isFetchingKalshi","polyData","polyLoading","fetchNextPoly","hasMorePoly","isFetchingPoly","allTrades","totalPages","pageStart","pageTrades","handlePrev","handleNext","canGoPrev","canGoNext","contentHeight","HistoryRowStatic","HistoryCard","statusLabel","mapTradeStatus","isDeposit","depositSign","depositColor","eventTitle","eventImage","txUrl","getTxUrl","pnlValue","extractPnl","feeValue","extractFee","ExternalLinkIcon","parsed","fee","tz","tzSign","ProfileOrders","pageOrders","OrderRowStatic","Pagination","OrderCard","cost","onPrev","onNext","onPage","compact","ProfilePositions","onClosePosition","handleCloseAll","pos","pagePositions","PositionRowStatic","PositionCard","outcomeSide","MobileStat","ProfileStats","realizedPnl","positionsValue","wins","settled","tr","winRateStr","StatCard","ProfilePage","hasWallet","kalshiPositions","kalshiPosLoading","polyPositions","polyPosLoading","allPositions","kalshiTrades","kalshiTradesLoading","polyTrades","polyTradesLoading","statsLoading","SetupModal","safeDeployed","tokenApproved","onDeployAndApprove","setupRunning","setSetupRunning","setupError","setSetupError","optimisticDone","setOptimisticDone","effectiveSafeDeployed","effectiveTokenApproved","step1Status","step2Status","allDone","handleSetup","steps","handleAction","actionLabel","StepIndicator"],"mappings":"gjFAOI,OAAO,MAAA,CAAW,GAAA,GACpB,MAAA,CAAO,mBAAA,CAAsB,MAAA,CAAO,mBAAA,EAAuB,EAAC,CAC5D,MAAA,CAAO,mBAAA,CAAoB,wBAAwB,CAAA,CAAI,SAAA,CAAA,CAGzD,IAAOA,EAAAA,CAAQ,UCMf,IAAMC,EAAAA,CAA0D,CAC9D,OAAA,CAAS,CACP,mBAAA,CACA,eAAA,CACA,gBAAA,CACA,mBAAA,CACA,YACF,CAAA,CACA,SAAA,CAAW,CACT,MAAA,CACA,kBAAA,CACA,MAAA,CACA,WAAA,CACA,MAAA,CACA,SACF,CAAA,CACA,MAAA,CAAQ,CACN,KAAA,CACA,SACA,QAAA,CACA,KAAA,CACA,KAAA,CACA,MAAA,CACA,YAAA,CACA,KAAA,CACA,KAAA,CACA,MACF,CAAA,CACA,SAAA,CAAW,CACT,QAAA,CACA,KAAA,CACA,WAAA,CACA,gBAAA,CACA,YAAA,CACA,SAAA,CACA,gBAAA,CACA,uBAAA,CACA,KAAA,CACA,sBACF,CAAA,CACA,SAAA,CAAW,CAAC,WAAA,CAAa,yBAAyB,CAAA,CAClD,aAAA,CAAe,CACb,OAAA,CACA,QAAA,CACA,cAAA,CACA,YAAA,CACA,QAAA,CACA,aAAA,CACA,QAAA,CACA,iBACF,CAAA,CACA,UAAA,CAAY,CACV,KAAA,CACA,QAAA,CACA,OAAA,CACA,QAAA,CACA,YAAA,CACA,KAAA,CACA,SAAA,CACA,SAAA,CACA,KACF,CAAA,CACA,QAAA,CAAU,CAAC,aAAA,CAAe,UAAA,CAAY,eAAe,CAAA,CACrD,QAAA,CAAU,CACR,OAAA,CACA,UAAA,CACA,eAAA,CACA,iBAAA,CACA,QACA,WAAA,CACA,MAAA,CACA,OACF,CAAA,CACA,OAAA,CAAS,CAAC,IAAA,CAAM,QAAA,CAAU,OAAO,CAAA,CACjC,MAAA,CAAQ,IAAA,CACR,MAAA,CAAQ,CACN,QAAA,CACA,YAAA,CACA,UAAA,CACA,UAAA,CACA,QAAA,CACA,MAAA,CACA,QAAA,CACA,YAAA,CACA,SAAA,CACA,QAAA,CACA,KAAA,CACA,OAAA,CACA,UAAA,CACA,UAAA,CACA,OAAA,CACA,SAAA,CACA,cAAA,CACA,OACF,CAAA,CACA,KAAA,CAAO,IACT,CAAA,CAMMC,EAAAA,CAA2B,CAC/B,UAAA,CACA,QAAA,CACA,QAAA,CACA,WAAA,CACA,YAAA,CACA,WAAA,CACA,eAAA,CACA,WAAA,CACA,wBAAA,CACA,qBAAA,CACA,UAAA,CACA,QAAA,CACA,OACF,CAAA,CAuCaC,EAAAA,CAAAA,CAAyC,IAAM,CAC1D,IAAMC,CAAAA,CAAcC,CAAAA,EAAwB,CAC1C,IAAMC,CAAAA,CAAMJ,EAAAA,CAAe,QAAQG,CAAG,CAAA,CACtC,OAAOC,CAAAA,GAAQ,EAAA,CAAKJ,EAAAA,CAAe,MAAA,CAASI,CAC9C,CAAA,CAEA,OAAO,MAAA,CAAO,OAAA,CAAQL,EAAsB,CAAA,CACzC,GAAA,CACC,CAAC,CAACM,CAAAA,CAAOC,CAAO,CAAA,IAAyB,CACvC,IAAA,CAAMD,CAAAA,CACN,KAAA,CAAAA,CAAAA,CACA,IAAA,CAAA,CAAOC,CAAAA,EAAW,EAAC,EAAG,GAAA,CACnBC,CAAAA,GAAwB,CAAE,IAAA,CAAMA,CAAAA,CAAG,KAAA,CAAOA,CAAE,CAAA,CAC/C,CACF,CAAA,CACF,CAAA,CACC,IAAA,CAAK,CAACC,CAAAA,CAAGC,CAAAA,GAAMP,CAAAA,CAAWM,CAAAA,CAAE,IAAI,CAAA,CAAIN,CAAAA,CAAWO,CAAAA,CAAE,IAAI,CAAC,CAC3D,CAAA,IChJO,SAASC,EAAAA,CAAa,CAC3B,UAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAAa,UAAA,CACb,SAAA,CAAAC,CACF,CAAA,CAAsB,CACpB,GAAM,CAAE,CAAA,CAAAZ,CAAE,CAAA,CAAIa,cAAAA,EAAe,CAEvBC,CAAAA,CAAkBC,WAAAA,CAAY,IAAM,CACxCP,CAAAA,CAAiB,IAAI,EACvB,CAAA,CAAG,CAACA,CAAgB,CAAC,CAAA,CAEfQ,CAAAA,CAAgBhB,CAAAA,CAAE,6BAA6B,CAAA,CAErD,OACEiB,IAAAA,CAAC,KAAA,CAAA,CACC,UAAWC,IAAAA,CACT,wFAAA,CACAN,CACF,CAAA,CAGA,QAAA,CAAA,CAAAK,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gEAAA,CACb,QAAA,CAAAF,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+CAAA,CAEb,QAAA,CAAA,CAAAE,GAAAA,CAACC,EAAAA,CAAA,CACC,KAAA,CAAOJ,CAAAA,CACP,UAAA,CAAYX,CAAAA,GAAqB,IAAA,CACjC,OAAA,CAASS,CAAAA,CACT,SAAA,CAAWE,CAAAA,GAAkBL,CAAAA,CAC/B,CAAA,CAGAQ,GAAAA,CAACE,EAAAA,CAAA,EAAa,CAAA,CAGbjB,CAAAA,CAAW,GAAA,CAAKR,CAAAA,EACfuB,GAAAA,CAACC,EAAAA,CAAA,CAEC,KAAA,CAAOxB,CAAAA,CAAI,QAAA,CACX,UAAA,CAAYS,CAAAA,GAAqBT,CAAAA,CAAI,QAAA,CACrC,OAAA,CAAS,IAAMY,CAAAA,CAAiBZ,CAAAA,CAAI,QAAQ,CAAA,CAC5C,KAAA,CAAOA,CAAAA,CAAI,KAAA,CACX,SAAA,CAAWA,CAAAA,CAAI,WAAae,CAAAA,CAAAA,CALvBf,CAAAA,CAAI,QAMX,CACD,CAAA,CAAA,CACH,CAAA,CACF,CAAA,CACCc,CAAAA,EAAYS,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CAAiB,QAAA,CAAAT,CAAAA,CAAS,CAAA,CAAA,CACxD,CAAA,CAGCL,CAAAA,EAAoBE,CAAAA,CAAW,MAAA,CAAS,CAAA,EACvCY,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mEAAA,CACb,QAAA,CAAAF,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAACG,EAAAA,CAAA,CACC,KAAA,CAAOtB,CAAAA,CAAE,+BAA+B,CAAA,CACxC,UAAA,CAAYM,CAAAA,GAAgB,IAAA,CAC5B,OAAA,CAAS,IAAMG,CAAAA,CAAY,IAAI,CAAA,CACjC,CAAA,CACCF,CAAAA,CAAW,GAAA,CAAKgB,CAAAA,EACfJ,GAAAA,CAACG,EAAAA,CAAA,CAEC,KAAA,CAAOC,CAAAA,CAAI,KAAA,CACX,IAAA,CAAMA,CAAAA,CAAI,IAAA,CACV,UAAA,CAAYjB,CAAAA,GAAgBiB,CAAAA,CAAI,KAAA,CAChC,OAAA,CAAS,IAAMd,CAAAA,CAAYc,CAAAA,CAAI,KAAK,CAAA,CAAA,CAJ/BA,CAAAA,CAAI,KAKX,CACD,CAAA,CAAA,CACH,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CAcA,SAASH,EAAAA,CAAI,CAAE,KAAA,CAAAtB,CAAAA,CAAO,UAAA,CAAA0B,CAAAA,CAAY,OAAA,CAAAC,CAAAA,CAAS,KAAA,CAAAC,CAAAA,CAAO,SAAA,CAAAC,CAAU,CAAA,CAAa,CACvE,OACEV,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASQ,CAAAA,CACT,SAAA,CAAWP,IAAAA,CACT,oHAAA,CACAM,CAAAA,CACI,gCAAA,CACA,4DACN,CAAA,CAEC,QAAA,CAAA,CAAAG,CAAAA,CACCV,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,6BAAA,CACd,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,wDAAA,CAAyD,CAAA,CACzEA,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAArB,CAAAA,CAAM,CAAA,CAAA,CACf,CAAA,CAEAA,CAAAA,CAGD4B,CAAAA,EACCP,GAAAA,CAAC,QAAK,SAAA,CAAU,qHAAA,CACb,QAAA,CAAAO,CAAAA,CACH,CAAA,CAAA,CAEJ,CAEJ,CAMA,SAASL,EAAAA,EAAe,CACtB,OACEF,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oCAAA,CAAqC,aAAA,CAAY,MAAA,CAAO,QAAA,CAAA,GAAA,CAExE,CAEJ,CAaA,SAASG,EAAAA,CAAK,CAAE,KAAA,CAAAxB,CAAAA,CAAO,IAAA,CAAA8B,CAAAA,CAAM,UAAA,CAAAJ,CAAAA,CAAY,OAAA,CAAAC,CAAQ,CAAA,CAAc,CAC7D,OACER,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASQ,CAAAA,CACT,SAAA,CAAWP,IAAAA,CACT,wJAAA,CACAM,CAAAA,CACI,0CAAA,CACA,0EACN,CAAA,CAEC,QAAA,CAAA,CAAAI,CAAAA,EAAQT,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAWD,IAAAA,CAAG,gBAAA,CAAkBU,CAAI,CAAA,CAAG,CAAA,CACrD9B,CAAAA,CAAAA,CACH,CAEJ,CAMO,SAAS+B,EAAAA,CAAmB,CAAE,KAAA,CAAAC,CAAAA,CAAQ,CAAE,CAAA,CAAuB,CACpE,OACEX,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sDAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACZ,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQW,CAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAACC,CAAAA,CAAGC,CAAAA,GACrCb,GAAAA,CAACc,QAAAA,CAAA,CAAiB,SAAA,CAAU,2BAAA,CAAA,CAAbD,CAAyC,CACzD,CAAA,CACH,CAAA,CACF,CAEJ,CCpLA,SAASE,EAAAA,CAAeC,CAAAA,CAA2C,CACjE,OAAOA,CAAAA,CAAM,GAAA,CAAKC,CAAAA,GAAO,CACvB,QAAA,CAAUA,CAAAA,CAAE,KAAA,CACZ,IAAA,CAAMA,CAAAA,CAAE,IAAA,CAAK,GAAA,CAAKpC,CAAAA,EAAMA,CAAAA,CAAE,KAAK,CACjC,CAAA,CAAE,CACJ,CAEA,SAASqC,EAAAA,CAASzC,CAAAA,CAA8C,CAC9D,OAAKA,CAAAA,CACEA,CAAAA,CAAI,IAAA,CAAK,GAAA,CAAK,CAAA,GAAO,CAC1B,KAAA,CAAO,CAAA,CAAE,KAAA,CACT,IAAA,CAAM,CAAA,CAAE,IACV,CAAA,CAAE,CAAA,CAJe,EAKnB,CAMO,SAAS0C,EAAAA,CAAiB,CAC/B,QAAA,CAAAC,CAAAA,CACA,QAAA,CAAA7B,CAAAA,CACA,SAAA,CAAAE,CACF,CAAA,CAA0B,CACxB,GAAM,CAAC4B,CAAAA,CAAsBC,CAAuB,CAAA,CAAIC,QAAAA,CAEtD,IAAI,CAAA,CACA,CAACC,CAAAA,CAAiBC,CAAkB,CAAA,CAAIF,QAAAA,CAAwB,IAAI,CAAA,CAIpEG,CAAAA,CAAuB9B,WAAAA,CAC1B+B,CAAAA,EAAiC,CAChCL,CAAAA,CAAwBK,CAAa,CAAA,CACrCF,CAAAA,CAAmB,IAAI,CAAA,CAEvBL,CAAAA,GAAW,CACT,YAAA,CAAcO,CAAAA,CACd,QAAS,IACX,CAAC,EACH,CAAA,CACA,CAACP,CAAQ,CACX,CAAA,CAEMQ,CAAAA,CAAkBhC,WAAAA,CACrBiC,CAAAA,EAA4B,CAC3BJ,CAAAA,CAAmBI,CAAQ,CAAA,CAE3BT,CAAAA,GAAW,CACT,YAAA,CAAcC,CAAAA,CACd,OAAA,CAASQ,CACX,CAAC,EACH,CAAA,CACA,CAACR,CAAAA,CAAsBD,CAAQ,CACjC,CAAA,CAIMU,CAAAA,CAAef,EAAAA,CAAexC,EAAiB,CAAA,CAE/CwD,CAAAA,CAAYxD,EAAAA,CAAkB,IAAA,CACjC0C,CAAAA,EAAMA,CAAAA,CAAE,IAAA,GAASI,CACpB,CAAA,CACMjC,CAAAA,CAAa8B,EAAAA,CAASa,CAAS,CAAA,CAErC,OACE/B,GAAAA,CAAChB,EAAAA,CAAA,CACC,UAAA,CAAY8C,CAAAA,CACZ,gBAAA,CAAkBT,CAAAA,CAClB,WAAA,CAAaG,CAAAA,CACb,UAAA,CAAYpC,CAAAA,CACZ,gBAAA,CAAkBsC,CAAAA,CAClB,WAAA,CAAaE,CAAAA,CACb,QAAA,CAAUrC,EACV,SAAA,CAAWE,CAAAA,CACb,CAEJ,CCvHO,SAASuC,EAAAA,CAAuBC,CAAAA,CAAoC,CACzE,OAAO,CACL,KAAA,CAAOA,CAAAA,CAAM,KAAA,CACb,QAAA,CAAUA,CAAAA,CAAM,SAClB,CACF,CAEO,SAASC,EAAAA,CAAwBC,CAAAA,CAAuC,CAC7E,IAAMC,CAAAA,CAAMD,CAAAA,CAAO,QAAA,CAAS,CAAC,CAAA,CACvBE,CAAAA,CAAKF,CAAAA,CAAO,QAAA,CAAS,CAAC,CAAA,CAC5B,OAAO,CACL,QAAA,CAAUA,CAAAA,CAAO,QAAA,CACjB,OAAQC,CAAAA,EAAK,QAAA,EAAYA,CAAAA,EAAK,KAAA,CAC9B,KAAA,CAAOC,CAAAA,EAAI,QAAA,EAAYA,CAAAA,EAAI,KAAA,CAC3B,MAAA,CAAQD,CAAAA,EAAK,QAAA,CACb,KAAA,CAAOC,CAAAA,EAAI,QAAA,CACX,WAAA,CAAaD,CAAAA,EAAK,KAAA,EAAS,KAAA,CAC3B,UAAA,CAAYC,CAAAA,EAAI,KAAA,EAAS,IAC3B,CACF,CCrBO,IAAMC,EAAAA,CAAoB,EAAA,CAGpBC,EAAAA,CAA4B,CAAA,CAK5BC,EAAAA,CAAoB,CAE/B,UAAA,CAAY,CAAA,CAEZ,QAAA,CAAU,EAAA,CAEV,OAAA,CAAS,IACX,CAAA,CAQaC,EAAAA,CAAa,CAExB,OAAA,CAAS,IAAA,CAET,QAAA,CAAU,IAAA,CAEV,SAAA,CAAW,IAAA,CAEX,GAAA,CAAK,KACP,CAAA,CAKaC,EAAAA,CAAsBD,EAAAA,CAAW,GAAA,CAGjCE,EAAAA,CACX,CACE,CAACF,EAAAA,CAAW,OAAO,EAAGD,EAAAA,CAAkB,UAAA,CACxC,CAACC,EAAAA,CAAW,QAAQ,EAAGD,EAAAA,CAAkB,QAAA,CACzC,CAACC,EAAAA,CAAW,SAAS,EAAGD,EAAAA,CAAkB,QAAA,CAC1C,CAACC,EAAAA,CAAW,GAAG,EAAGD,EAAAA,CAAkB,OACtC,CAAA,CAGWI,EAAAA,CAA8D,CACzE,CAACH,EAAAA,CAAW,OAAO,EAAG,GAAA,CACtB,CAACA,EAAAA,CAAW,QAAQ,EAAG,IAAA,CACvB,CAACA,EAAAA,CAAW,SAAS,EAAG,KAAA,CACxB,CAACA,EAAAA,CAAW,GAAG,EAAG,IAAA,CAAU,EAC9B,CAAA,CAGaI,EAAAA,CAA8D,CACzE,CAACJ,EAAAA,CAAW,OAAO,EAAG,IAAA,CAAU,EAAA,CAChC,CAACA,EAAAA,CAAW,QAAQ,EAAG,KAAA,CAAc,EAAA,CACrC,CAACA,EAAAA,CAAW,SAAS,EAAG,GAAA,CAAU,EAAA,CAAK,EAAA,CACvC,CAACA,EAAAA,CAAW,GAAG,EAAG,IACpB,CAAA,CAKaK,EAAAA,CAAqB,CAAA,CAGrBC,EAAAA,CAAmB,CAAA,CAGnBC,EAAAA,CAAkB,CAAA,CAGlBC,EAAAA,CAAkB,EAAA,CAKlBC,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,EAAAA,CAGT,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,EC7DA,IAAMG,EAAAA,CAAuBC,aAAAA,CAC3B,IACF,CAAA,CAEO,SAASC,EAAAA,EAAmB,CACjC,IAAMC,CAAAA,CAAMC,UAAAA,CAAWJ,EAAoB,CAAA,CAC3C,GAAI,CAACG,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,8DACF,CAAA,CAEF,OAAOA,CACT,CAEA,IAAME,EAAAA,CAA2B,GAAA,CAO1B,SAASC,EAAAA,CAAsB,CACpC,eAAA,CAAAC,CAAAA,CAAkBF,EAAAA,CAClB,OAAA,CAAAG,EAAU,IAAA,CACV,QAAA,CAAAC,CACF,CAAA,CAA+B,CAI7B,IAAMC,CAAAA,CAAUC,UAAAA,EAAW,CAErBC,CAAAA,CAAgBC,OAAAA,CACpB,IACEH,CAAAA,CAAQ,IAAA,CACLI,CAAAA,EAAMA,CAAAA,CAAE,cAAA,GAAmBC,cAAAA,CAAe,MAAA,EAAUD,CAAAA,CAAE,WACzD,CAAA,EAAG,OAAA,CACL,CAACJ,CAAO,CACV,CAAA,CAEMM,CAAAA,CAAaH,OAAAA,CACjB,IACEH,CAAAA,CAAQ,IAAA,CACLI,CAAAA,EAAMA,CAAAA,CAAE,cAAA,GAAmBC,cAAAA,CAAe,GAAA,EAAOD,CAAAA,CAAE,WACtD,CAAA,EAAG,OAAA,CACL,CAACJ,CAAO,CACV,CAAA,CAKM,CACJ,IAAA,CAAMO,CAAAA,CACN,SAAA,CAAWC,CAAAA,CACX,UAAA,CAAYC,CAAAA,CACZ,KAAA,CAAOC,CACT,CAAA,CAAIC,UAAAA,CACF,CAAE,MAAA,CAAQ,QAAA,CAAU,IAAA,CAAMT,CAAAA,EAAiB,EAAG,EAC9C,CACE,OAAA,CAASJ,CAAAA,EAAW,CAAC,CAACI,CAAAA,CACtB,eAAA,CAAiBL,CACnB,CACF,CAAA,CAKM,CAAE,IAAA,CAAMe,CAAAA,CAAe,SAAA,CAAWC,CAAiB,CAAA,CAAIC,WAAAA,CAC3DZ,CAAAA,CACA,CACE,OAAA,CAASJ,CAAAA,EAAW,CAAC,CAACI,CAAAA,CACtB,eAAA,CAAiB,GACnB,CACF,CAAA,CAKM,CAAE,IAAA,CAAMa,CAAAA,CAAe,SAAA,CAAWC,CAAiB,CAAA,CACvDC,kBAAAA,CAAmBX,CAAAA,CAAY,CAC7B,OAAA,CAASR,CAAAA,EAAW,CAAC,CAACQ,CAAAA,CACtB,eAAA,CAAiB,GACnB,CAAC,CAAA,CAKGY,CAAAA,CAAwBH,CAAAA,EAAe,YAAA,CACvCI,CAAAA,CAA0BJ,CAAAA,EAAe,QAAA,EAAY,KAAA,CAErD,CACJ,IAAA,CAAMK,CAAAA,CACN,SAAA,CAAWC,CAAAA,CACX,UAAA,CAAYC,CAAAA,CACZ,KAAA,CAAOC,CACT,EAAIZ,UAAAA,CACF,CAAE,MAAA,CAAQ,YAAA,CAAc,IAAA,CAAMO,CAAAA,EAAyB,EAAG,CAAA,CAC1D,CACE,OAAA,CAASpB,CAAAA,EAAWqB,CAAAA,EAA2B,CAAC,CAACD,CAAAA,CACjD,eAAA,CAAiBrB,CACnB,CACF,CAAA,CAKM2B,CAAAA,CAAQrB,OAAAA,CACZ,KAAO,CACL,aAAA,CAAAD,CAAAA,CACA,UAAA,CAAAI,CAAAA,CACA,qBAAA,CAAAY,CAAAA,CACA,iBAAA,CAAmBX,CAAAA,CACf,MAAA,CAAOA,CAAAA,CAAkB,OAAO,CAAA,CAChC,IAAA,CACJ,qBAAA,CACEY,CAAAA,EAA2BC,CAAAA,CACvB,MAAA,CAAOA,CAAAA,CAAsB,OAAO,CAAA,CACpC,IAAA,CACN,iBAAA,CAAmBR,CAAAA,EAAe,QAAA,EAAY,KAAA,CAC9C,YAAA,CAAcA,CAAAA,EAAe,OAAA,EAAW,IAAA,CACxC,gBAAA,CAAAC,CAAAA,CACA,uBAAA,CAAAM,CAAAA,CACA,sBAAA,CAAwBJ,CAAAA,EAAe,aAAA,EAAiB,KAAA,CACxD,uBAAA,CAAyBA,CAAAA,EAAe,gBAAkB,KAAA,CAC1D,sBAAA,CAAwBC,CAAAA,CACxB,SAAA,CAAWR,CAAAA,EAAwBa,CAAAA,CACnC,UAAA,CAAYZ,CAAAA,EAAyBa,CAAAA,CACrC,KAAA,CAAOZ,CAAAA,EAAsBa,CAAAA,EAA0B,IACzD,CAAA,CAAA,CACA,CACErB,CAAAA,CACAI,CAAAA,CACAY,CAAAA,CACAX,CAAAA,CACAa,CAAAA,CACAD,CAAAA,CACAP,CAAAA,CACAC,CAAAA,CACAE,CAAAA,CACAC,CAAAA,CACAR,CAAAA,CACAa,CAAAA,CACAZ,CAAAA,CACAa,CAAAA,CACAZ,CAAAA,CACAa,CACF,CACF,CAAA,CAEA,OACEtF,GAAAA,CAACqD,EAAAA,CAAqB,QAAA,CAArB,CAA8B,KAAA,CAAOkC,CAAAA,CACnC,QAAA,CAAAzB,CAAAA,CACH,CAEJ,CClGA,IAAM0B,EAAAA,CAAsD,CAC1D,OAAA,CAAS,EAAA,CACT,KAAA,CAAO,IAAA,CACP,IAAA,CAAM,KACR,CAAA,CAEA,SAASC,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACQ,CACR,IAAMC,CAAAA,CAAM,KAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CAAI,GAAI,CAAA,CACxC,OAAQH,CAAAA,EACN,KAAK,IAAA,CACH,OAAOG,CAAAA,CAAM,GAAA,CACf,KAAK,IAAA,CACH,OAAOA,CAAAA,CAAM,IAAA,CACf,KAAK,KAAA,CACH,OAAOA,CAAAA,CAAM,GAAA,CAAU,EAAA,CACzB,KAAK,KAAA,CACH,OAAOA,CAAAA,CAAM,IAAA,CAAU,EAAA,CACzB,KAAK,KAAA,CAAO,CACV,IAAMC,CAAAA,CAAM,IAAI,IAAA,CAChB,OAAAA,CAAAA,CAAI,WAAA,CAAY,EAAA,CAAI,EAAA,CAAI,EAAA,CAAI,CAAC,CAAA,CACtB,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAI,OAAA,EAAQ,CAAI,GAAI,CACxC,CACA,KAAK,QAAA,CACH,OAAOD,CAAAA,CAAMF,CAAAA,CAAiBH,EAAAA,CAAsBI,CAAkB,CAC1E,CACF,CAEA,SAASG,EAAAA,EAAkB,CACzB,IAAMC,CAAAA,CAAW,CAAE,aAAA,CAAe,EAAA,CAAI,MAAA,CAAQ,GAAA,CAAK,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,IAAK,CAAA,CAC3EC,EAAAA,CAAS,CAAE,GAAGD,CAAAA,CAAU,aAAA,CAAe,EAAA,CAAI,MAAA,CAAQ,CAAE,CAAA,CAAG,EAAA,CAAK,CAAA,CAAG,EAAI,CAAE,CAAC,CAAA,CACvE,UAAA,CAAW,IAAM,CACfC,EAAAA,CAAS,CAAE,GAAGD,CAAAA,CAAU,aAAA,CAAe,EAAA,CAAI,MAAA,CAAQ,CAAE,CAAA,CAAG,EAAA,CAAK,CAAA,CAAG,EAAI,CAAE,CAAC,EACzE,CAAA,CAAG,GAAG,CAAA,CACN,UAAA,CAAW,IAAM,CACfC,EAAAA,CAAS,CAAE,GAAGD,CAAAA,CAAU,aAAA,CAAe,EAAA,CAAI,MAAA,CAAQ,CAAE,EAAG,EAAA,CAAK,CAAA,CAAG,EAAI,CAAE,CAAC,EACzE,CAAA,CAAG,GAAG,EACR,CAMO,SAASE,EAAAA,CAAa,CAC3B,MAAA,CAAA/D,CAAAA,CACA,cAAA,CAAAgE,CAAAA,CAAiB,KAAA,CACjB,WAAA,CAAAC,CAAAA,CAAc,KAChB,CAAA,CAA2C,CACzC,GAAM,CAAE,CAAA,CAAAvH,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB,CAAE,MAAA,CAAQ2G,CAAW,CAAA,CAAIC,OAAAA,EAAQ,CACjCvC,CAAAA,CAAUC,UAAAA,EAAW,CACrBuC,CAAAA,CAAcC,cAAAA,EAAe,CAC7BC,CAAAA,CAAgBC,gBAAAA,EAAiB,CACjCC,CAAAA,CAAgBlD,UAAAA,CAAWmD,iBAAiB,CAAA,CAC5CC,CAAAA,CAAcC,cAAAA,EAAe,CAC7BC,CAAAA,CAAyB5E,CAAAA,CAAO,MAAA,CAChC6E,CAAAA,CAAqBD,CAAAA,GAAW,YAAA,CAEhCE,CAAAA,CAAelD,CAAAA,CAAQ,IAAA,CAC1BI,CAAAA,EAAMA,EAAE,cAAA,GAAmBC,cAAAA,CAAe,MAAA,EAAUD,CAAAA,CAAE,WACzD,CAAA,CACM+C,CAAAA,CAAYnD,CAAAA,CAAQ,IAAA,CACvBI,CAAAA,EACCA,CAAAA,CAAE,cAAA,GAAmBC,cAAAA,CAAe,GAAA,EACpCD,CAAAA,CAAE,WAAA,EACF,aAAA,GAAiBA,CACrB,CAAA,CAEMgD,CAAAA,CAAkBd,CAAAA,GAAe,eAAA,CACjCe,CAAAA,CAAgBH,CAAAA,EAAc,OAAA,CAC9B5C,CAAAA,CAAa6C,CAAAA,EAAW,OAAA,CAKxB,CAACG,CAAAA,CAASC,CAAa,CAAA,CAAI/F,QAAAA,CAAuB4E,CAAc,CAAA,CAChE,CAACoB,CAAAA,CAAMC,CAAU,CAAA,CAAIjG,QAAAA,CAAoB6E,CAAW,CAAA,CACpD,CAACqB,CAAAA,CAAWC,CAAe,CAAA,CAAInG,QAAAA,CAAoB,QAAQ,CAAA,CAC3D,CAACoG,CAAAA,CAAUC,CAAc,CAAA,CAAIrG,QAAAA,CAAiB,GAAG,CAAA,CACjD,CAACsG,CAAAA,CAAYC,CAAgB,CAAA,CAAIvG,QAAAA,CAAiB,GAAG,EACrD,CAACwG,EAAAA,CAAcC,CAAe,CAAA,CAAIzG,QAAAA,CAAS,KAAK,CAAA,CAChD,CAAC0G,CAAAA,CAAkBC,CAAmB,CAAA,CAAI3G,QAAAA,CAAwB,IAAI,CAAA,CACtE,CAAC4G,EAAAA,CAAwBC,EAAyB,CAAA,CAAI7G,QAAAA,CAGlD,IAAI,CAAA,CACR,CAAC8G,CAAAA,CAAaC,CAAc,CAAA,CAAI/G,QAAAA,CAAS,KAAK,CAAA,CAC9C,CAACgH,CAAAA,CAAmBC,CAAoB,CAAA,CAAIjH,QAAAA,CAAS,KAAK,CAAA,CAC1D,CAACkH,EAAAA,CAAkBC,EAAmB,CAAA,CAC1CnH,QAAAA,CAA2B,IAAI,CAAA,CAC3B,CAACoE,EAAAA,CAAgBgD,EAAiB,CAAA,CAAIpH,QAAAA,CAAS,EAAE,CAAA,CACjD,CAACqE,EAAAA,CAAoBgD,EAAqB,CAAA,CAC9CrH,QAAAA,CAAuB,SAAS,CAAA,CAK9BsH,EAAAA,CAIO,IAAA,CACPC,EAAAA,CAAqB,KAAA,CACrBC,EAAAA,CAA+B,IAAA,CAC/BC,EAAAA,CACJ,GAAI,CACF,IAAMxF,CAAAA,CAAMD,EAAAA,EAAiB,CAC7BsF,EAAAA,CAAiB,CACf,iBAAA,CAAmBrF,CAAAA,CAAI,iBAAA,CACvB,qBAAA,CAAuBA,CAAAA,CAAI,qBAAA,CAC3B,SAAA,CAAWA,CAAAA,CAAI,SACjB,CAAA,CACAsF,EAAAA,CAAqBtF,CAAAA,CAAI,iBAAA,CACzBuF,EAAAA,CAAgBvF,CAAAA,CAAI,YAAA,CACpBwF,EAAAA,CAAqBxF,CAAAA,CAAI,sBAC3B,CAAA,KAAQ,CAER,CAKA,IAAMyF,EAAAA,CAAgB/E,OAAAA,CAAQ,IAAM,CAClC,IAAMxF,CAAAA,CAAM2I,CAAAA,GAAY,KAAA,CAAQ,CAAA,CAAI,CAAA,CAC9B6B,CAAAA,CAAI/G,CAAAA,CAAO,QAAA,CAASzD,CAAG,CAAA,CAC7B,OAAO6I,CAAAA,GAAS,KAAA,CACX2B,CAAAA,EAAG,QAAA,EAAYA,CAAAA,EAAG,KAAA,EAAS,EAAA,CAC3BA,CAAAA,EAAG,QAAA,EAAYA,CAAAA,EAAG,KAAA,EAAS,EAClC,CAAA,CAAG,CAAC/G,CAAAA,CAAO,QAAA,CAAUkF,EAASE,CAAI,CAAC,CAAA,CAE7B4B,EAAAA,CAAevJ,WAAAA,CAAawJ,CAAAA,EAAoB,CACpD1B,CAAAA,CAAgB0B,CAAI,EACtB,CAAA,CAAG,EAAE,CAAA,CAECC,CAAAA,CAAazJ,WAAAA,CAAasJ,CAAAA,EAAoB,CAClD5B,CAAAA,CAAc4B,CAAC,CAAA,CACfpB,CAAAA,CAAiB,GAAG,EACtB,CAAA,CAAG,EAAE,CAAA,CAELwB,SAAAA,CAAU,IAAM,CACV7B,CAAAA,GAAc,OAAA,EAAW,KAAA,CAAMI,CAAU,CAAA,EAC3CC,CAAAA,CAAiB,IAAA,CAAK,KAAA,CAAMmB,EAAAA,CAAgB,GAAG,CAAA,CAAI,GAAG,EAE1D,CAAA,CAAG,CAACxB,CAAAA,CAAWI,CAAAA,CAAYoB,EAAa,CAAC,CAAA,CAEzC,IAAMM,EAAAA,CAASrF,OAAAA,CAAQ,IACjB,KAAA,CAAMyD,CAAQ,CAAA,EAAKA,CAAAA,EAAY,CAAA,CAAU,CAAA,CACtCJ,CAAAA,GAAS,MACZ0B,EAAAA,CAAgB,CAAA,CACdtB,CAAAA,CAAWsB,EAAAA,CACX,CAAA,CACFtB,CAAAA,CACH,CAACJ,CAAAA,CAAMI,CAAAA,CAAUsB,EAAa,CAAC,CAAA,CAE5BO,EAAAA,CAAYtF,OAAAA,CAAQ,IACpB,KAAA,CAAMyD,CAAQ,CAAA,EAAKA,CAAAA,EAAY,CAAA,CAAU,GAAA,CACtC,MAAA,CAAO,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAW,GAAS,CAAC,CAAA,CAC7C,CAACA,CAAQ,CAAC,CAAA,CAKP8B,EAAAA,CAAWtH,CAAAA,CAAO,aAAA,GAAgB,eAAe,CAAA,EAAgB,EAAA,CACjEuH,EAAAA,CAAUvH,CAAAA,CAAO,aAAA,GAAgB,cAAc,CAAA,EAAgB,EAAA,CAC/DwH,EAAAA,CAAWC,aAAAA,CAAc,WAAA,CAAY,IAAA,CAAK,OAAA,CAC1CC,EAAAA,CACH1H,CAAAA,CAAO,aAAA,GAAgB,sBAAsB,CAAA,EAAgB,EAAA,CAC1D2H,EAAAA,CAAoBzC,CAAAA,GAAY,KAAA,CAAQoC,EAAAA,CAAUC,EAAAA,CAKlDK,EAAAA,CACJhD,CAAAA,GAAW,SAAYK,CAAAA,EAAiB,EAAA,CAAO/C,CAAAA,EAAc,EAAA,CAEzD,CAAE,IAAA,CAAM2F,EAAAA,CAAe,SAAA,CAAWC,EAAiB,CAAA,CAAIC,YAAAA,CAC3D,CAAE,MAAA,CAAAnD,CAAAA,CAAQ,IAAA,CAAMgD,EAAa,CAAA,CAC7B,CAAE,OAAA,CAAS,CAAA,CAAQA,EAAc,CACnC,CAAA,CAkBMI,EAAAA,CAVmBjG,OAAAA,CAAQ,IAC3B,CAAC8F,EAAAA,EAAiBzC,CAAAA,GAAS,MAAA,CAAe,IAAA,CAE5CyC,EAAAA,CAAc,SAAA,CAAU,IAAA,CACrBI,CAAAA,EACCA,CAAAA,CAAE,IAAA,EAAM,WAAA,EAAY,GAAM/C,CAAAA,EAAW+C,CAAAA,CAAE,MAAA,EAAQ,IAAA,GAASjI,CAAAA,CAAO,IACnE,CAAA,EAAK,IAAA,CAEN,CAAC6H,EAAAA,CAAe7H,CAAAA,CAAO,IAAA,CAAMkF,CAAAA,CAASE,CAAI,CAAC,CAAA,EAED,MAAA,EAAQ,aAAA,CAC/C8C,EAAAA,CACH9C,CAAAA,GAAS,MAAA,EACP4C,EAAAA,GAAqB,mBAAmB,CAAA,EAC3CL,EAAAA,CACIQ,EAAAA,CACH/C,CAAAA,GAAS,MAAA,EACP4C,EAAAA,GAAqB,sBAAsB,CAAA,EAC9CN,EAAAA,CAIIU,EAAAA,CAAYhD,CAAAA,GAAS,KAAA,CAAQoC,EAAAA,CAAWU,EAAAA,CACxCG,EAAAA,CACJjD,CAAAA,GAAS,KAAA,CAAQuC,EAAAA,CAAoBQ,EAAAA,EAAuBX,EAAAA,CAKxDc,EAAAA,CACJ1D,CAAAA,GAAW,QAAA,EACX,CAAA,CAAQwD,EAAAA,EACR,CAAA,CAAQC,EAAAA,EACR,CAAA,CAAQpD,CAAAA,EACRoC,EAAAA,GAAc,GAAA,CAEV,CAAE,OAAA,CAASkB,EAAa,CAAA,CAAIC,aAAAA,CAChC,CACE,SAAA,CAAAJ,EAAAA,CACA,UAAA,CAAAC,EAAAA,CACA,MAAA,CAAQhB,EAAAA,CACR,aAAA,CAAepC,CAAAA,EAAiB,EAAA,CAChC,WAAA,CAAa,GACf,CAAA,CACA,CAAE,OAAA,CAASqD,EAAa,CAC1B,CAAA,CAKMG,EAAAA,CAAc1G,OAAAA,CAAQ,IACtB2E,EAAAA,CACK9B,CAAAA,GAAW,QAAA,CACd8B,EAAAA,CAAe,iBAAA,CACfA,EAAAA,CAAe,qBAAA,CAEhBmB,IACSA,EAAAA,CAAc,SAAA,CAAU,MAAA,CAAO,CAACa,CAAAA,CAAKT,EAAAA,GAC7CA,EAAAA,CAAE,IAAA,GAAS,MAAA,EAAUA,EAAAA,CAAE,IAAA,GAAS,YAAA,CAC3BS,CAAAA,EAAOT,EAAAA,CAAE,aAAA,EAAiB,CAAA,CAAA,CAC5BS,CAAAA,CACN,CAAC,CAAA,EACY,IAAA,CACf,CAAChC,EAAAA,CAAgBmB,EAAAA,CAAejD,CAAM,CAAC,CAAA,CAEpC+D,EAAAA,CAAmBjC,EAAAA,CACrBA,EAAAA,CAAe,SAAA,CACfoB,EAAAA,CAEEc,EAAAA,CAAkB7G,OAAAA,CAAQ,IACzB8F,EAAAA,CACOA,EAAAA,CAAc,SAAA,CAAU,IAAA,CACjCI,CAAAA,EAAMA,CAAAA,CAAE,IAAA,EAAM,WAAA,EAAY,GAAM,KAAA,EAASA,CAAAA,CAAE,MAAA,EAAQ,IAAA,GAASjI,CAAAA,CAAO,IACtE,CAAA,EACY,IAAA,EAAQ,CAAA,CAJO,IAAA,CAK1B,CAAC6H,EAAAA,CAAe7H,CAAAA,CAAO,IAAI,CAAC,CAAA,CAEzB6I,EAAAA,CAAiB9G,OAAAA,CAAQ,IACxB8F,GACOA,EAAAA,CAAc,SAAA,CAAU,IAAA,CACjCI,CAAAA,EAAMA,CAAAA,CAAE,IAAA,EAAM,WAAA,EAAY,GAAM,IAAA,EAAQA,CAAAA,CAAE,MAAA,EAAQ,IAAA,GAASjI,CAAAA,CAAO,IACrE,CAAA,EACY,IAAA,EAAQ,CAAA,CAJO,IAAA,CAK1B,CAAC6H,EAAAA,CAAe7H,CAAAA,CAAO,IAAI,CAAC,CAAA,CAKzB8I,EAAAA,CAAiB/G,OAAAA,CAAQ,IACzBuD,CAAAA,GAAc,OAAA,EAAWT,CAAAA,EAAsB,CAAC,KAAA,CAAMa,CAAU,CAAA,CAC3DA,CAAAA,CAEFoB,EAAAA,CACN,CAACxB,CAAAA,CAAWT,CAAAA,CAAoBa,CAAAA,CAAYoB,EAAa,CAAC,CAAA,CAEvDiC,EAAAA,CAAgBhH,OAAAA,CAAQ,IAAM,CAClC,GAAI,KAAA,CAAMyD,CAAQ,CAAA,EAAKA,CAAAA,EAAY,CAAA,CAAG,OAAO,CAAA,CAC7C,GAAIJ,CAAAA,GAAS,KAAA,CAAO,OAAOI,CAAAA,CAC3B,IAAMwD,CAAAA,CACJ9D,IAAY,KAAA,CACPlF,CAAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,QAAA,EAAY,CAAA,CAChCA,CAAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,QAAA,EAAY,CAAA,CACvC,OAAOwF,CAAAA,CAAWwD,CACpB,CAAA,CAAG,CAAC5D,CAAAA,CAAMF,CAAAA,CAASM,CAAAA,CAAUxF,CAAAA,CAAO,QAAQ,CAAC,CAAA,CAEvCiJ,EAAAA,CAAkBlH,OAAAA,CAAQ,IAC1B,KAAA,CAAMyD,CAAQ,CAAA,EAAKA,CAAAA,EAAY,CAAA,CAAU,CAAA,CACzCJ,CAAAA,GAAS,KAAA,CACJ0D,EAAAA,CAAiB,CAAA,CAAKtD,CAAAA,CAAWsD,EAAAA,CAAkB,CAAA,CAAI,CAAA,CAEzDC,EAAAA,CACN,CAAC3D,CAAAA,CAAMI,CAAAA,CAAUsD,EAAAA,CAAgBC,EAAa,CAAC,CAAA,CAE5CG,EAAAA,CAAkBD,EAAAA,CAAkBF,EAAAA,CAKpCI,EAAAA,CAAU1L,WAAAA,CAAa2L,CAAAA,EAAiB,CAC5C/D,CAAAA,CAAW+D,CAAC,CAAA,CACZ3D,CAAAA,CAAe,GAAG,EACpB,CAAA,CAAG,EAAE,CAAA,CAEC4D,EAAAA,CAAc5L,WAAAA,CACjB6L,CAAAA,EAAc,CACb,GAAI,KAAA,CAAMA,CAAC,CAAA,CAAG,CACZ7D,CAAAA,CAAe,GAAG,CAAA,CAClB,MACF,CACA,IAAM8D,CAAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGD,CAAC,CAAA,CACvBE,EAAAA,CACJpE,CAAAA,GAAS,KAAA,CAAQ,IAAA,CAAK,KAAA,CAAMmE,CAAAA,CAAU,GAAG,CAAA,CAAI,GAAA,CAAM,IAAA,CAAK,KAAA,CAAMA,CAAO,CAAA,CACvE9D,CAAAA,CAAe+D,EAAO,EACxB,CAAA,CACA,CAACpE,CAAI,CACP,CAAA,CAEMqE,EAAAA,CAAgBhM,WAAAA,CAAa6L,CAAAA,EAAc,CAC/C,GAAI,KAAA,CAAMA,CAAC,CAAA,CAAG,CACZ3D,CAAAA,CAAiB,GAAG,CAAA,CACpB,MACF,CACA,IAAM4D,CAAAA,CAAU,KAAK,GAAA,CAAI,GAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAMD,CAAC,CAAC,CAAA,CAChD3D,CAAAA,CAAiB,IAAA,CAAK,KAAA,CAAM4D,CAAAA,CAAU,GAAG,CAAA,CAAI,GAAG,EAClD,CAAA,CAAG,EAAE,CAAA,CAKCG,EAAAA,CAAa3H,OAAAA,CAA6B,IAAM,CACpD,IAAM4H,CAAAA,CAAmB,EAAC,CAAA,CACtB,KAAA,CAAMnE,CAAQ,CAAA,EAAKA,CAAAA,CAAW7E,EAAAA,GAChCgJ,CAAAA,CAAO,IAAA,CAAK,CAAA,oBAAA,EAAuBhJ,EAAkB,CAAA,CAAE,CAAA,CAErDX,CAAAA,CAAO,MAAA,GAAW,MAAA,EACpB2J,CAAAA,CAAO,IAAA,CAAK,sBAAsB,CAAA,CAGlCvE,CAAAA,GAAS,KAAA,EACTqD,EAAAA,EAAe,IAAA,EACf,CAAC,KAAA,CAAMjD,CAAQ,CAAA,EACfA,CAAAA,CAAW,CAAA,EACXA,CAAAA,CAAWiD,EAAAA,EAEXkB,CAAAA,CAAO,IAAA,CAAK,2BAA2B,CAAA,CAEzC,IAAMC,CAAAA,CAAiB1E,CAAAA,GAAY,KAAA,CAAQ0D,EAAAA,CAAkBC,EAAAA,CAC7D,OACEzD,CAAAA,GAAS,MAAA,EACTwE,CAAAA,EAAkB,IAAA,EAClB,CAAC,KAAA,CAAMpE,CAAQ,CAAA,EACfA,CAAAA,CAAW,CAAA,EACXA,CAAAA,CAAWoE,CAAAA,EAEXD,CAAAA,CAAO,IAAA,CAAK,qBAAqB,CAAA,CAGjCrE,CAAAA,GAAc,OAAA,EACdT,CAAAA,GACC,KAAA,CAAMa,CAAU,CAAA,EAAKA,CAAAA,CAAa,GAAA,EAAQA,CAAAA,CAAa,GAAA,CAAA,EAExDiE,CAAAA,CAAO,IAAA,CAAK,6CAA6C,CAAA,CAGzDrE,CAAAA,GAAc,OAAA,EACdT,CAAAA,EACAuB,CAAAA,EACAE,EAAAA,GAAqB,QAAA,GACpB,KAAA,CAAM9C,EAAc,CAAA,EAAKA,EAAAA,EAAkB,CAAA,CAAA,EAE5CmG,CAAAA,CAAO,IAAA,CAAKjN,CAAAA,CAAE,sCAAsC,CAAC,CAAA,CAEhD,CAAE,OAAA,CAASiN,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,MAAA,CAAAA,CAAO,CAChD,CAAA,CAAG,CACDnE,CAAAA,CACAxF,CAAAA,CAAO,MAAA,CACPoF,CAAAA,CACAqD,EAAAA,CACAG,EAAAA,CACAC,EAAAA,CACA3D,CAAAA,CACAI,CAAAA,CACAT,CAAAA,CACAa,CAAAA,CACAU,CAAAA,CACAE,EAAAA,CACA9C,EAAAA,CACA9G,CACF,CAAC,CAAA,CAKK,CAAE,WAAA,CAAamN,EAAY,CAAA,CAAIC,cAAAA,EAAe,CAS9C,CAAE,IAAA,CAAMC,EAAY,CAAA,CAAIC,QAAAA,CAC5B,CAAE,EAAA,CAAIlE,CAAAA,EAAoB,EAAA,CAAI,MAAA,CAAAlB,CAAO,CAAA,CACrC,CAAE,OAAA,CAAS,CAAA,CAAQkB,CAAkB,CACvC,CAAA,CAEMmE,EAAAA,CAAoBxM,WAAAA,CAAY,SAAY,CAChD,GAAI,CAACuI,EAAAA,EAA0B,CAACf,CAAAA,EAAiB,CAACH,CAAAA,CAAc,OAChE,GAAM,CAAE,UAAA,CAAAoF,CAAAA,CAAY,UAAA,CAAAC,CAAW,CAAA,CAAInE,EAAAA,CACnCC,EAAAA,CAA0B,IAAI,CAAA,CAE9B,GAAI,CAQF,IAAMmE,EAAAA,CAAAA,CAPY,MAAM9F,CAAAA,CAAc,gBAAA,CAAiB,CACrD,SAAA,CAAW6F,CAAAA,CACX,UAAA,CAAY3C,EAAAA,CACZ,MAAA,CAAQ0C,CAAAA,CACR,aAAA,CAAAjF,CAAAA,CACA,WAAA,CAAa,GACf,CAAC,CAAA,GACsD,WAAA,CAGvD,GAAI,CAACmF,EAAAA,CAAQ,OAEb,IAAMC,EAAAA,CAAU,UAAA,CAAW,IAAA,CAAK,IAAA,CAAKD,EAAM,CAAA,CAAItL,EAAAA,EAAMA,EAAAA,CAAE,UAAA,CAAW,CAAC,CAAC,CAAA,CAC9DwL,EAAAA,CAAgB,MAAMxF,CAAAA,CAAa,eAAA,CAAgBuF,EAAO,CAAA,CAChE,MAAMR,EAAAA,CAAY,CAChB,iBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,GAAGS,EAAa,CAAC,CAAA,CAC7D,YAAA,CAAc,CACZ,eAAA,CAAiBrF,CAAAA,CACjB,UAAA,CAAYkF,CAAAA,CACZ,WAAA,CAAa3C,GACb,MAAA,CAAQ0C,CAAAA,CACR,KAAA,CAAO,GAAA,CACP,IAAA,CAAM,MAAA,CACN,OAAA,CAAS,EAAA,CACT,WAAA,CAAa,EAAA,CACb,YAAA,CAAc,GAChB,CACF,CAAC,EACH,CAAA,KAAc,CAEd,CACF,CAAA,CAAG,CACDlE,EAAAA,CACAf,CAAAA,CACAH,CAAAA,CACAR,CAAAA,CACAuF,EAAAA,CACArC,EACF,CAAC,CAAA,CAEDL,SAAAA,CAAU,IAAM,CACd,GAAI,CAAC4C,EAAAA,EAAe,CAACjE,CAAAA,CAAkB,OACvC,GAAM,CAAE,MAAA,CAAAyE,CAAO,CAAA,CAAIR,EAAAA,CACfQ,CAAAA,GAAW,QAAA,EACbxE,CAAAA,CAAoB,IAAI,CAAA,CACpBC,EAAAA,CAEFiE,EAAAA,EAAkB,CAAE,OAAA,CAAQ,IAAM,CAChCpE,CAAAA,CAAgB,KAAK,CAAA,CACrB2E,KAAAA,CAAM,OAAA,CAAQ9N,CAAAA,CAAE,6BAA6B,CAAC,EAC9CkH,EAAAA,EAAgB,CAChB6B,CAAAA,CAAe,GAAG,EACpB,CAAC,CAAA,EAEDI,CAAAA,CAAgB,KAAK,CAAA,CACrB2E,KAAAA,CAAM,OAAA,CAAQ9N,CAAAA,CAAE,6BAA6B,CAAC,CAAA,CAC9CkH,EAAAA,EAAgB,CAChB6B,CAAAA,CAAe,GAAG,CAAA,CAAA,EAAA,CAEX8E,CAAAA,GAAW,QAAA,EAAYA,CAAAA,GAAW,SAAA,IAC3C1E,CAAAA,CAAgB,KAAK,CAAA,CACrBE,CAAAA,CAAoB,IAAI,CAAA,CACxBE,EAAAA,CAA0B,IAAI,CAAA,CAC9BuE,KAAAA,CAAM,KAAA,CAAM9N,CAAAA,CAAE,2BAA2B,CAAC,CAAA,EAE9C,CAAA,CAAG,CACDqN,EAAAA,CACAjE,CAAAA,CACAE,EAAAA,CACAiE,EAAAA,CACAvN,CACF,CAAC,CAAA,CAKD,IAAM+N,EAAAA,CAAmBhN,WAAAA,CAAY,SAAY,CAC/C,GAAI,CAACwH,CAAAA,EAAiB,CAACH,CAAAA,CAAc,OAErC,GAAI,CAACsD,IAAa,CAACC,EAAAA,CAAY,CAC7BmC,KAAAA,CAAM,KAAA,CAAM,8BAA8B,CAAA,CAC1C3E,CAAAA,CAAgB,KAAK,CAAA,CACrB,MACF,CAEA,GAAI,CAACc,EAAAA,CAAoB,CACvBR,CAAAA,CAAe,IAAI,CAAA,CACnBN,CAAAA,CAAgB,KAAK,CAAA,CACrB,MACF,CAIA,IAAM6E,EAAAA,CAAAA,CAFc,MAAMnC,EAAAA,EAAa,EACb,IAAA,CAEpBoC,EAAAA,CAAcD,EAAAA,EAAa,WAAA,CAEjC,GAAI,CAACC,EAAAA,CAAa,CAChBH,KAAAA,CAAM,KAAA,CAAM9N,CAAAA,CAAE,2BAA2B,CAAC,CAAA,CAC1CmJ,CAAAA,CAAgB,KAAK,CAAA,CACrB,MACF,CAIA,GACET,CAAAA,GAAS,MAAA,EACT+C,EAAAA,EACAA,EAAAA,GAAwBX,EAAAA,CACxB,CACA,IAAMoD,EAAAA,CAAY,MAAA,CAAOF,EAAAA,EAAa,SAAA,EAAa,EAAE,CAAA,CACjDE,IAAaA,EAAAA,GAAc,GAAA,EAC7B3E,EAAAA,CAA0B,CACxB,UAAA,CAAY2E,EAAAA,CACZ,UAAA,CAAYzC,EACd,CAAC,EAEL,CAEA,IAAMkC,EAAAA,CAAU,UAAA,CAAW,IAAA,CAAK,IAAA,CAAKM,EAAW,CAAA,CAAI7L,EAAAA,EAAMA,EAAAA,CAAE,UAAA,CAAW,CAAC,CAAC,CAAA,CACnEwL,EAAAA,CAAgB,MAAMxF,CAAAA,CAAa,eAAA,CAAgBuF,EAAO,CAAA,CAE1DQ,EAAAA,CAAS,MAAMhB,EAAAA,CAAY,CAC/B,iBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,GAAGS,EAAa,CAAC,CAAA,CAC7D,YAAA,CAAc,CACZ,eAAA,CAAiBrF,CAAAA,CACjB,UAAA,CAAYmD,EAAAA,CACZ,WAAA,CAAaC,EAAAA,CACb,MAAA,CAAQhB,EAAAA,CACR,KAAA,CAAO,MAAA,CAAOP,EAAa,CAAA,CAC3B,IAAA,CAAM1B,CAAAA,GAAS,KAAA,CAAQ,KAAA,CAAQ,MAAA,CAC/B,OAAA,CAASF,IAAY,KAAA,CAAQ,KAAA,CAAQ,IAAA,CACrC,WAAA,CAAalF,CAAAA,CAAO,IAAA,CACpB,YAAA,CAAc,GAChB,CACF,CAAC,CAAA,CAED+F,CAAAA,CAAoB8E,EAAAA,CAAO,SAAS,EACtC,CAAA,CAAG,CACD5F,CAAAA,CACAH,CAAAA,CACAR,CAAAA,CACAiE,EAAAA,CACAsB,EAAAA,CACAzB,EAAAA,CACAC,EAAAA,CACAhB,EAAAA,CACAP,EAAAA,CACA1B,CAAAA,CACAF,CAAAA,CACAlF,CAAAA,CAAO,IAAA,CACPmI,EAAAA,CACAX,EAAAA,CACA9K,CACF,CAAC,CAAA,CAEKoO,EAAAA,CAAwBrN,WAAAA,CAAY,SAAY,CACpD,GAAI,CAACsH,CAAAA,EAAa,CAACP,CAAAA,CAAe,OAGlC,IAAMuG,CAAAA,CAAgBhG,CAAAA,CAAU,KAAA,CAC1BiG,CAAAA,CAAcD,CAAAA,GAAkBE,KAAAA,CAAM,OAAA,CACxCD,CAAAA,EACF,MAAM5G,CAAAA,CAAY6G,KAAAA,CAAM,OAAO,CAAA,CAGjC,GAAI,CACF,IAAMC,GAAW,MAAMnG,CAAAA,CAAU,kBAAA,EAAmB,CACpD,GAAI,CAACmG,EAAAA,CAAU,CACbV,KAAAA,CAAM,KAAA,CAAM9N,CAAAA,CAAE,2BAA2B,CAAC,CAAA,CAC1CmJ,CAAAA,CAAgB,CAAA,CAAK,CAAA,CACrB,MACF,CAEA,IAAMsF,EAAAA,CAAW,CAAC,CAACtE,EAAAA,CACbuE,EAAAA,CAA2B,CAC/B,OAAA,CAASrG,CAAAA,CAAU,OAAA,CACnB,aAAA,CAAeoG,EAAAA,CAAW,CAAA,CAAI,CAAA,CAC9B,aAAA,CAAe,MAAOE,EAAAA,CAAQC,EAAAA,CAAOC,EAAAA,CAAanI,EAAAA,GAAU,CAC1D,IAAMoI,EAAAA,CAAiD,EAAC,CACpD,MAAA,GAAUH,EAAAA,EACZG,EAAAA,CAAa,IAAA,CAAK,CAAE,IAAA,CAAM,MAAA,CAAQ,IAAA,CAAM,QAAS,CAAC,CAAA,CAChD,SAAA,GAAaH,EAAAA,EACfG,EAAAA,CAAa,IAAA,CAAK,CAAE,IAAA,CAAM,SAAA,CAAW,KAAM,QAAS,CAAC,CAAA,CACnD,SAAA,GAAaH,EAAAA,EACfG,EAAAA,CAAa,IAAA,CAAK,CAAE,IAAA,CAAM,SAAA,CAAW,IAAA,CAAM,SAAU,CAAC,CAAA,CACpD,mBAAA,GAAuBH,EAAAA,EACzBG,EAAAA,CAAa,IAAA,CAAK,CAAE,IAAA,CAAM,mBAAA,CAAqB,IAAA,CAAM,SAAU,CAAC,CAAA,CAC9D,MAAA,GAAUH,EAAAA,EACZG,EAAAA,CAAa,IAAA,CAAK,CAAE,IAAA,CAAM,MAAA,CAAQ,IAAA,CAAM,SAAU,CAAC,CAAA,CAErD,IAAMC,EAAAA,CAAY,CAAE,YAAA,CAAcD,EAAAA,CAAc,GAAGF,EAAM,CAAA,CAEzD,OAAQ,MAAMJ,EAAAA,CAAS,OAAA,CAAQ,CAC7B,MAAA,CAAQ,sBAAA,CACR,MAAA,CAAQ,CACNnG,CAAAA,CAAU,OAAA,CACV,IAAA,CAAK,SAAA,CAAU,CACb,MAAA,CAAAsG,EAAAA,CACA,KAAA,CAAOI,EAAAA,CACP,WAAA,CAAAF,EAAAA,CACA,OAAA,CAASnI,EACX,CAAC,CACH,CACF,CAAC,CACH,CACF,CAAA,CAEMsI,EAAAA,CACJlH,CAAAA,CAAc,WAAA,EAAgB,MAAMA,CAAAA,CAAc,YAAA,CAAa4G,EAAM,CAAA,CAEjEO,EAAAA,CAAWzG,CAAAA,GAAY,KAAA,CAAQ,CAAA,CAAI,CAAA,CACrC0G,EAAAA,CAAU,EAAA,CACRC,EAAAA,CAAkB7L,CAAAA,CAAO,aAAA,GAC7B,yBACF,CAAA,CACI6L,EAAAA,GAKFD,EAAAA,CAAAA,CAHE,OAAOC,EAAAA,EAAoB,QAAA,CACtB,IAAA,CAAK,KAAA,CAAMA,EAAe,CAAA,CAC3BA,EAAAA,EACQF,EAAQ,CAAA,EAAK,EAAA,CAAA,CAG7B,IAAMG,EAAAA,CACH9L,CAAAA,CAAO,aAAA,GAAgB,oBAAoB,CAAA,EAAiB,CAAA,CAAA,CAEzD+L,EAAAA,CACJzG,CAAAA,GAAc,OAAA,EAAW,CAAC,KAAA,CAAMI,CAAU,CAAA,CACtCA,CAAAA,CACAoB,EAAAA,CAEAkF,EAAAA,CACJ1G,CAAAA,GAAc,OAAA,CAAWc,CAAAA,CAAoB,MAAQ,KAAA,CAAS,KAAA,CAE1D6F,EAAAA,CACJ7G,CAAAA,GAAS,KAAA,EAAS2G,EAAAA,CAAQ,CAAA,CAAIvG,CAAAA,CAAWuG,EAAAA,CAAQvG,CAAAA,CAE7C0G,EAAAA,CAA0B,CAC9B,OAAA,CAAAN,EAAAA,CACA,KAAA,CAAAG,EAAAA,CACA,IAAA,CAAME,EAAAA,CACN,IAAA,CAAM7G,CAAAA,GAAS,KAAA,CAAQ,KAAA,CAAQ,MAAA,CAC/B,SAAA,CAAW4G,EAAAA,CACX,QAAA,CAAU,MAAA,CACV,OAAA,CAAAF,EAAAA,CACA,GAAIjF,EAAAA,EAAsB,CAAE,aAAA,CAAeA,EAAmB,CAAA,CAC9D,GAAIvB,CAAAA,GAAc,OAAA,EAChBc,CAAAA,EAAqB,CACnB,UAAA,CAAY9C,EAAAA,CACVgD,EAAAA,CACA9C,EAAAA,CACAC,EACF,CACF,CACJ,CAAA,CAEM4H,EAAAA,CAASc,sBAAAA,CAAuBL,EAAO,CAAA,CACvCM,EAAAA,CAAeC,iBAAAA,CAAkB,CACrC,GAAGH,EAAAA,CACH,aAAA,CAAed,EAAAA,CAAO,OAAA,CACtB,aAAA,CAAeA,EAAAA,CAAO,aACxB,CAAC,CAAA,CACKkB,EAAAA,CAAY,MAAMlB,EAAAA,CAAO,aAAA,CAC7BC,EAAAA,CACAkB,eAAAA,CACA,OAAA,CACAH,EACF,CAAA,CACMI,EAAAA,CAAcC,gBAAAA,CAClBL,EAAAA,CACAE,EAAAA,CACAJ,EAAAA,CAAM,SACR,CAAA,CAGMQ,EAAAA,CAAcC,gBAAAA,CAAiBH,EAAAA,CAAad,EAAAA,CAAM,MAAM,CAAA,CAExDkB,EAAAA,CAAO,IAAA,CAAK,SAAA,CAAUF,EAAW,CAAA,CACjCG,EAAAA,CAAU,MAAMC,wBAAAA,CAAyBpB,EAAAA,CAAM,OAAA,CAAS,CAC5D,MAAA,CAAQA,EAAAA,CAAM,MAAA,CACd,MAAA,CAAQA,EAAAA,CAAM,MAAA,CACd,UAAA,CAAYA,EAAAA,CAAM,UAAA,CAClB,MAAA,CAAQ,MAAA,CACR,WAAA,CAAa,QAAA,CACb,IAAA,CAAAkB,EACF,CAAC,CAAA,CAED,MAAMtI,CAAAA,CAAc,qBAAA,CAClBoI,EAAAA,CACAG,EACF,CAAA,CAEAnI,CAAAA,CAAY,iBAAA,CAAkB,CAAE,QAAA,CAAU,CAAC,SAAA,CAAW,QAAQ,CAAE,CAAC,CAAA,CACjEA,CAAAA,CAAY,iBAAA,CAAkB,CAAE,QAAA,CAAU,CAAC,SAAA,CAAW,WAAW,CAAE,CAAC,CAAA,CAEpE8F,KAAAA,CAAM,OAAA,CAAQ9N,CAAAA,CAAE,6BAA6B,CAAC,CAAA,CAC9CkH,EAAAA,EAAgB,CAChB6B,CAAAA,CAAe,GAAG,CAAA,CAClBI,CAAAA,CAAgB,CAAA,CAAK,EACvB,CAAA,OAAE,CACImF,CAAAA,EAAeD,CAAAA,EACjB3G,CAAAA,CAAY2G,CAAa,CAAA,CAAE,KAAA,CAAM,IAAM,CAAC,CAAC,EAE7C,CACF,CAAA,CAAG,CACDhG,CAAAA,CACAP,CAAAA,CACAJ,CAAAA,CACAc,CAAAA,CACAlF,CAAAA,CAAO,aAAA,CACPsF,CAAAA,CACAI,CAAAA,CACAoB,EAAAA,CACAtB,CAAAA,CACAJ,CAAAA,CACAd,CAAAA,CACAI,CAAAA,CACA0B,CAAAA,CACAE,EAAAA,CACA9C,EAAAA,CACAC,EAAAA,CACA/G,CACF,CAAC,CAAA,CAEKqQ,EAAAA,CAAStP,WAAAA,CAAY,SAAY,CACrC,GAAI,EAAA,CAACiM,EAAAA,CAAW,OAAA,EAAW,CAAC1E,CAAAA,CAAAA,CAE5B,CAAAa,CAAAA,CAAgB,IAAI,CAAA,CACpBE,CAAAA,CAAoB,IAAI,CAAA,CACxBI,CAAAA,CAAe,KAAK,CAAA,CAEpB,GAAI,CACEvB,CAAAA,GAAW,QAAA,CACb,MAAM6F,EAAAA,EAAiB,CAEvB,MAAMK,EAAAA,GAEV,CAAA,MAASkC,CAAAA,CAAK,CAEZ,IAAMC,CAAAA,CAASD,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,MAAA,CACpDxC,KAAAA,CAAM,KAAA,CAAMyC,CAAAA,EAAUvQ,CAAAA,CAAE,2BAA2B,CAAC,CAAA,CACpDmJ,CAAAA,CAAgB,KAAK,EACvB,CAAA,CACF,CAAA,CAAG,CACD6D,EAAAA,CAAW,OAAA,CACX1E,CAAAA,CACAJ,CAAAA,CACA6F,EAAAA,CACAK,EAAAA,CACApO,CACF,CAAC,EAED,OAAO,CACL,OAAA,CAAAwI,CAAAA,CACA,IAAA,CAAAE,CAAAA,CACA,SAAA,CAAAE,CAAAA,CACA,QAAA,CAAAE,CAAAA,CACA,UAAA,CAAAE,CAAAA,CACA,MAAA,CAAA0B,EAAAA,CACA,aAAA,CAAA2B,EAAAA,CACA,eAAA,CAAAE,EAAAA,CACA,eAAA,CAAAC,EAAAA,CACA,WAAA,CAAAT,EAAAA,CACA,eAAA,CAAAG,EAAAA,CACA,cAAA,CAAAC,EAAAA,CACA,gBAAA,CAAAF,EAAAA,CACA,YAAA,CAAA/C,EAAAA,CACA,UAAA,CAAA8D,EAAAA,CACA,kBAAA,CAAA7E,CAAAA,CACA,WAAA,CAAAqB,CAAAA,CACA,MAAA,CAAQU,EAAAA,CACR,iBAAA,CAAAR,CAAAA,CACA,gBAAA,CAAAE,EAAAA,CACA,cAAA,CAAA9C,EAAAA,CACA,kBAAA,CAAAC,EAAAA,CACA,UAAA,CAAAyD,CAAAA,CACA,OAAA,CAAAiC,EAAAA,CACA,YAAA,CAAAnC,EAAAA,CACA,WAAA,CAAAqC,EAAAA,CACA,aAAA,CAAAI,EAAAA,CACA,oBAAA,CAAApD,CAAAA,CACA,mBAAA,CAAAE,EAAAA,CACA,iBAAA,CAAAC,EAAAA,CACA,sBAAAC,EAAAA,CACA,MAAA,CAAAsG,EACF,CACF,CCp4BO,SAASG,EAAAA,CAAS,CAAE,MAAA,CAAAC,EAAQ,OAAA,CAAAC,CAAAA,CAAS,MAAA,CAAAC,CAAO,CAAA,CAAkB,CACnE,GAAM,CAAE,CAAA,CAAA3Q,CAAE,CAAA,CAAIa,cAAAA,EAAe,CAE7B,OACEM,GAAAA,CAACyP,WAAAA,CAAA,CACC,MAAA,CAAQH,CAAAA,CACR,YAAA,CAAeI,CAAAA,EAAS,CACjBA,CAAAA,EAAMH,CAAAA,GACb,CAAA,CACA,IAAA,CAAK,IAAA,CACL,UAAA,CAAY,CACV,IAAA,CAAM,8GAAA,CACN,IAAA,CAAM,MACR,CAAA,CAEA,QAAA,CAAAvP,GAAAA,CAAC2P,YAAAA,CAAA,CACC,QAAA,CAAA7P,IAAAA,CAAC,KAAA,CAAA,CAEC,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,oCAAA,CACX,QAAA,CAAAnB,CAAAA,CAAE,6BAA6B,CAAA,CAClC,CAAA,CACAmB,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASuP,CAAAA,CACT,SAAA,CAAU,wNAAA,CAEV,QAAA,CAAAzP,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,OAAA,CAAQ,WAAA,CACR,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAa,CAAA,CACb,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,CAAA,CACpCA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAA,CAAG,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA,CAAA,CACtC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGAF,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,0CAAA,CACV,QAAA,CAAAnB,CAAAA,CAAE,mCAAmC,CAAA,CACxC,CAAA,CAGAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,0BAAA,CAEX,QAAA,CAAA,CACE,+BAAA,CACA,+BAAA,CACA,+BACF,CAAA,CACA,GAAA,CAAK4P,CAAAA,EACL9P,IAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAU,qDAAA,CAEV,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,OAAA,CAAQ,WAAA,CACR,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAa,GAAA,CACb,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CACf,SAAA,CAAU,yBAAA,CAEV,QAAA,CAAAA,GAAAA,CAAC,UAAA,CAAA,CAAS,MAAA,CAAO,gBAAA,CAAiB,CAAA,CACpC,CAAA,CACAA,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAnB,CAAAA,CAAE+Q,CAAG,CAAA,CAAE,CAAA,CAAA,CAAA,CAhBTA,CAiBP,CACD,CAAA,CACH,CAAA,CAGCJ,CAAAA,EACC1P,IAAAA,CAAC,GAAA,CAAA,CACC,IAAA,CAAM0P,CAAAA,CACN,MAAA,CAAO,QAAA,CACP,GAAA,CAAI,qBAAA,CACJ,SAAA,CAAU,0GAAA,CAET,UAAA3Q,CAAAA,CAAE,uBAAuB,CAAA,CAAE,SAAA,CAAA,CAC9B,CAAA,CAGFmB,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,gCAAA,CACV,QAAA,CAAAnB,CAAAA,CAAE,4BAA4B,CAAA,CACjC,CAAA,CAGAmB,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASuP,CAAAA,CACT,SAAA,CAAU,4OAAA,CAET,QAAA,CAAA1Q,CAAAA,CAAE,WAAW,CAAA,CAChB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CACF,CAEJ,CC7FA,IAAMgR,EAAAA,CAAY,CAAA,4CAAA,EAA+CjG,aAAAA,CAAc,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,UAAA,CAAA,CAEjGkG,EAAAA,CAAyC,CAC7C,IAAA,CACA,IAAA,CACA,KAAA,CACA,KAAA,CACA,KAAA,CACA,QACF,CAAA,CAEMC,EAAAA,CAAyB,CAC7B,IAAA,CAAM,6BAAA,CACN,IAAA,CAAM,8BACN,KAAA,CAAO,8BAAA,CACP,KAAA,CAAO,8BAAA,CACP,GAAA,CAAK,8BAAA,CACL,MAAA,CAAQ,iCACV,CAAA,CAEMC,EAAAA,CAAiC,CAAC,SAAA,CAAW,OAAA,CAAS,MAAM,CAAA,CAE5DC,EAAAA,CAAqB,CACzB,OAAA,CAAS,kCAAA,CACT,KAAA,CAAO,gCAAA,CACP,IAAA,CAAM,+BACR,CAAA,CAkDO,SAASC,EAAAA,CAAY,CAC1B,KAAA,CAAAjO,CAAAA,CACA,MAAA,CAAAE,CAAAA,CACA,OAAA,CAAAgO,CAAAA,CAAU,UAAA,CACV,OAAA,CAAA9I,CAAAA,CACA,IAAA,CAAAE,CAAAA,CACA,SAAA,CAAAE,CAAAA,CACA,QAAA,CAAAE,CAAAA,CACA,UAAA,CAAAE,CAAAA,CACA,MAAA,CAAA0B,CAAAA,CACA,eAAA,CAAA8B,CAAAA,CACA,eAAA,CAAAD,CAAAA,CACA,aAAA,CAAAF,CAAAA,CACA,WAAA,CAAAN,CAAAA,CACA,eAAA,CAAAG,CAAAA,CACA,cAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAF,CAAAA,CACA,YAAA,CAAA/C,CAAAA,CACA,OAAA,CAAAqI,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,kBAAA,CAAArJ,CAAAA,CACA,WAAA,CAAAqB,CAAAA,CACA,MAAA,CAAAmH,CAAAA,CACA,iBAAA,CAAAjH,CAAAA,CACA,gBAAA,CAAAE,CAAAA,CACA,cAAA,CAAA9C,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CACA,eAAA,CAAA0K,CAAAA,CACA,YAAA,CAAAC,EAAAA,CACA,iBAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CACA,yBAAA,CAAAC,EAAAA,CACA,wBAAA,CAAAC,EAAAA,CACA,sBAAA,CAAAC,CAAAA,CACA,0BAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CACF,CAAA,CAAqB,CACnB,GAAM,CAAE,CAAA,CAAAlS,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB,CAACsR,EAAAA,CAAUC,EAAW,CAAA,CAAI1P,QAAAA,CAAS,KAAK,CAAA,CACxC2P,EAAAA,CAAWC,aAAAA,EAAc,CAE/B7H,SAAAA,CAAU,IAAM,CACVjB,CAAAA,EAAe,CAAC6I,EAAAA,CAAS,MAAA,EAC3BA,GAAS,MAAA,GAEb,CAAA,CAAG,CAAC7I,CAAW,CAAC,CAAA,CAEhB,IAAM+I,EAAAA,CAAoBlN,OAAAA,CAAQ,IAAM,CACtC,IAAMgK,CAAAA,CACJ3G,CAAAA,GAAS,KAAA,CACLF,CAAAA,GAAY,KAAA,CACVlF,CAAAA,CAAO,MAAA,CACPA,CAAAA,CAAO,KAAA,CACTkF,CAAAA,GAAY,KAAA,CACVlF,CAAAA,CAAO,MAAA,CACPA,CAAAA,CAAO,KAAA,CACf,OAAO+L,CAAAA,EAAS,IAAA,CAAO,UAAA,CAAA,CAAY,MAAA,CAAOA,CAAK,CAAA,CAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAI,IACxE,CAAA,CAAG,CAAC3G,CAAAA,CAAMF,CAAAA,CAASlF,CAAM,CAAC,CAAA,CAEpBkP,EAAAA,CAAY,CAAC,KAAA,CAAM1J,CAAQ,CAAA,EAAKA,CAAAA,CAAW,CAAA,CAE3C2J,EAAAA,CAAcpN,OAAAA,CAAQ,IAAM,CAChC,GAAI6D,CAAAA,CAAc,OAAOlJ,EAAE,0BAA0B,CAAA,CACrD,GAAIwJ,CAAAA,CAAa,OAAOxJ,CAAAA,CAAE,2BAA2B,CAAA,CACrD,GAAI,CAACwS,EAAAA,CAAW,OAAOxS,CAAAA,CAAE,2BAA2B,CAAA,CACpD,IAAM0S,CAAAA,CACa1S,CAAAA,CAAjB0I,CAAAA,GAAS,KAAA,CAAU,mBAAA,CAAyB,oBAAN,CAAA,CAClCiK,EAAAA,CACgB3S,CAAAA,CAApBwI,CAAAA,GAAY,KAAA,CAAU,mBAAA,CAAyB,kBAAN,CAAA,CACrCoK,EAAAA,CACJlK,CAAAA,GAAS,KAAA,EAAS8D,CAAAA,CAAkB,CAAA,CAChC,CAAA,aAAA,EAAWA,CAAAA,CAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CACrC,EAAA,CACN,OAAO,CAAA,EAAGkG,CAAS,CAAA,CAAA,EAAIC,EAAY,CAAA,EAAGC,EAAS,CAAA,CACjD,CAAA,CAAG,CAAC1J,CAAAA,CAAcM,CAAAA,CAAagJ,EAAAA,CAAW9J,CAAAA,CAAMF,CAAAA,CAASgE,CAAAA,CAAiBxM,CAAC,CAAC,CAAA,CAEtE6S,EAAAA,CAAcxN,QAAQ,IACnBmD,CAAAA,GAAY,KAAA,CAAQ,SAAA,CAAY,WAAA,CACtC,CAACA,CAAO,CAAC,CAAA,CAENsK,EAAAA,CAAa,IAAM,CAEvBlB,CAAAA,CAAiB,IAAA,CAAK,KAAA,CAAA,CADV7F,CAAAA,EAAe,CAAA,EACQ,CAAA,CAAK,GAAG,CAAA,CAAI,GAAG,EACpD,CAAA,CACMgH,EAAAA,CAAY,IAAM,CACtBnB,CAAAA,CAAiB7F,CAAAA,EAAe,CAAC,EACnC,CAAA,CAEM,CAACiH,EAAAA,CAAYC,EAAa,CAAA,CAAIvQ,QAAAA,CAAS,KAAK,CAAA,CAE5CwQ,EAAAA,CAAoB,IAAM,CAC9B,GAAI1J,CAAAA,CAAa,CACf6I,EAAAA,CAAS,MAAA,EAAO,CAChB,MACF,CACA,GAAI,CAACd,CAAAA,CAAS,CACZ0B,EAAAA,CAAc,IAAI,CAAA,CAClB,MACF,CACAA,EAAAA,CAAc,KAAK,CAAA,CACnBf,CAAAA,GACF,CAAA,CAEA,OACEjR,IAAAA,CAAAkS,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAlS,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWC,IAAAA,CACT,kCAAA,CACAoQ,CAAAA,GAAY,UAAA,EACV,kDACJ,CAAA,CAGC,QAAA,CAAA,CAAAlO,CAAAA,EACCnC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACZ,QAAA,CAAA,CAAAmC,CAAAA,CAAM,QAAA,EACLjC,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKiC,CAAAA,CAAM,QAAA,CACX,GAAA,CAAKA,CAAAA,CAAM,KAAA,CACX,SAAA,CAAU,4CAAA,CACZ,CAAA,CAEFnC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qDAAA,CACb,QAAA,CAAAiC,CAAAA,CAAM,KAAA,CACT,CAAA,CACAnC,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oDAAA,CACd,QAAA,CAAA,CAAAA,IAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CACEuH,CAAAA,GAAY,KAAA,CAAQ,cAAA,CAAiB,cAAA,CAGtC,QAAA,CAAA,CACGxI,CAAAA,CADH0I,CAAAA,GAAS,MACJ,mBAAA,CACA,oBADmB,CAAA,CACI,GAAA,CAEzB1I,CAAAA,CADHwI,CAAAA,GAAY,KAAA,CACP,mBAAA,CACA,kBADmB,CAAA,CAAA,CAE3B,CAAA,CACAvH,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CACb,QAAA,CAAA,CAAA,QAAA,CACAqC,CAAAA,CAAO,WAAA,CAAA,CACV,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAIFrC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACZ,QAAA,CAAA,CAAAkH,CAAAA,CACClH,IAAAA,CAACmS,IAAAA,CAAA,CACC,OAAA,CAAQ,YAAA,CACR,WAAA,CAAaxK,CAAAA,CACb,iBAAA,CAAoBmI,CAAAA,EAAQY,CAAAA,CAAkBZ,CAAgB,CAAA,CAC9D,UAAA,CAAY,CACV,OAAA,CAAS,SAAA,CACT,GAAA,CAAK,MACP,CAAA,CAEA,QAAA,CAAA,CAAA5P,GAAAA,CAACC,GAAAA,CAAA,CAAiB,KAAA,CAAOpB,CAAAA,CAAE,sBAAsB,CAAA,CAAA,CAAxC,QAA2C,CAAA,CACpDmB,GAAAA,CAACC,GAAAA,CAAA,CAAgB,KAAA,CAAOpB,CAAAA,CAAE,qBAAqB,CAAA,CAAA,CAAtC,OAAyC,CAAA,CAAA,CACpD,CAAA,CAEAmB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qCAAA,CACb,QAAA,CAAAnB,CAAAA,CAAE,sBAAsB,CAAA,CAC3B,CAAA,CAED4I,CAAAA,GAAc,OAAA,EAAWT,CAAAA,CACxBhH,GAAAA,CAACkS,iBAAAA,CAAA,CACC,YAAA,CAAW,aAAA,CACX,WAAA,CAAY,IAAA,CACZ,IAAA,CAAK,IAAA,CACL,MAAA,CAAO,MAAA,CACP,KAAA,CACE,KAAA,CAAMrK,CAAU,CAAA,CACZ,MAAA,CACA,UAAA,CAAA,CAAYA,CAAAA,CAAa,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAE9C,aAAA,CAAgB4D,CAAAA,EAAMiF,CAAAA,CAAmBjF,CAAAA,CAAI,GAAG,CAAA,CAChD,QAAA,CAAU,CAAA,CACV,QAAA,CAAU,EAAA,CACV,IAAA,CAAM,CAAA,CACN,aAAA,CAAe,CAAE,qBAAA,CAAuB,CAAE,CAAA,CAC1C,UAAA,CACEzL,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gDAAA,CAAiD,QAAA,CAAA,MAAA,CAEjE,EAEF,UAAA,CAAY,CACV,IAAA,CAAM,MAAA,CACN,YAAA,CACE,2GAAA,CACF,KAAA,CAAO,2CACT,CAAA,CACF,CAAA,CAEAoR,EAAAA,EAAqB,IAAA,EACnBtR,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gCAAA,CACb,QAAA,CAAA,CAAAsR,EAAAA,CAAkB,OAAA,CAAA,CACrB,CAAA,CAAA,CAGN,CAAA,CAiBApR,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAA,CACX,QAAA,CAAA,CAAC,KAAA,CAAO,IAAI,CAAA,CAAqB,GAAA,CAAKkJ,CAAAA,EAAM,CAC5C,IAAM6C,EAAAA,CACJ7C,CAAAA,GAAM,KAAA,CAAQ6B,CAAAA,CAAkBC,CAAAA,CAClC,OACElL,IAAAA,CAAC,KAAA,CAAA,CAAY,SAAA,CAAU,8BAAA,CACrB,QAAA,CAAA,CAAAA,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMwQ,CAAAA,CAAgBpH,CAAC,CAAA,CAChC,SAAA,CAAW,CAAA,mFAAA,EACT7B,CAAAA,GAAY6B,CAAAA,CACRA,CAAAA,GAAM,KAAA,CACJ,2CAAA,CACA,iDAAA,CACF,6DACN,GAEA,QAAA,CAAA,CAAAlJ,GAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CACGnB,CAAAA,CADHqK,CAAAA,GAAM,KAAA,CACD,mBAAA,CACA,kBADmB,CAAA,CAE3B,CAAA,CAAA,CACE,IAAM,CACN,IAAMgF,EAAAA,CACJ3G,CAAAA,GAAS,KAAA,CACL2B,CAAAA,GAAM,KAAA,CACJ/G,CAAAA,CAAO,MAAA,CACPA,CAAAA,CAAO,KAAA,CACT+G,CAAAA,GAAM,KAAA,CACJ/G,CAAAA,CAAO,MAAA,CACPA,CAAAA,CAAO,KAAA,CACf,OAAO+L,EAAAA,EAAS,IAAA,CACdpO,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CACb,QAAA,CAAA,CAAA,UAAA,CAAA,CAAY,MAAA,CAAOoO,EAAK,CAAA,CAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,MAAA,CAAA,CAChD,CAAA,CACE,IACN,CAAA,GAAG,CAAA,CACL,CAAA,CACC3G,CAAAA,GAAS,MAAA,EAAUF,CAAAA,GAAY6B,CAAAA,EAC9BlJ,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qCAAA,CACb,QAAA,CAAA8K,CAAAA,CAAmB,QAAA,CAAM,GAAGiB,EAAAA,EAAkB,CAAC,CAAA,OAAA,CAAA,CAClD,CAAA,CAAA,CAAA,CApCM7C,CAsCV,CAEJ,CAAC,CAAA,CACH,CAAA,CAGApJ,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4DAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qCAAA,CACb,QAAA,CACGnB,CAAAA,CADH0I,CAAAA,GAAS,KAAA,CACJ,4BAAA,CACA,yBAD4B,CAAA,CAEpC,CAAA,CACCA,CAAAA,GAAS,KAAA,EACRzH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK6P,EAAAA,CACL,GAAA,CAAI,MAAA,CACJ,SAAA,CAAU,uCAAA,CACZ,CAAA,CACA7P,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0CAAA,CACb,QAAA,CAAA4K,CAAAA,EAAe,IAAA,CAAO,CAAA,EAAGA,CAAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,KAAA,CAAA,CAAU,QAAA,CAC5D,CAAA,CACA5K,IAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS2R,EAAAA,CACT,SAAA,CAAU,kHAAA,CAET,QAAA,CAAA9S,CAAAA,CAAE,oBAAoB,CAAA,CACzB,CAAA,CACAmB,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS4R,EAAAA,CACT,SAAA,CAAU,kHAAA,CAET,QAAA,CAAA/S,CAAAA,CAAE,mBAAmB,CAAA,CACxB,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CACAmB,GAAAA,CAACkS,iBAAAA,CAAA,CAEC,YAAA,CAAW,cAAA,CACX,SAAA,CAAS,IAAA,CACT,WAAA,CAAY,GAAA,CACZ,MAAA,CAAO,IAAA,CACP,IAAA,CAAK,IAAA,CACL,KAAA,CAAO,KAAA,CAAMvK,CAAQ,CAAA,CAAI,MAAA,CAAYA,CAAAA,CACrC,aAAA,CAAgB8D,CAAAA,EAAM,CACpBqG,EAAAA,CAAc,KAAK,CAAA,CACnBrB,CAAAA,CAAiBhF,CAAC,EACpB,CAAA,CACA,QAAA,CAAU,CAAA,CACV,IAAA,CAAMlE,CAAAA,GAAS,KAAA,CAAQ,GAAA,CAAO,EAC9B,aAAA,CACEA,CAAAA,GAAS,KAAA,CACL,CAAE,qBAAA,CAAuB,CAAE,CAAA,CAC3B,CAAE,qBAAA,CAAuB,CAAE,CAAA,CAEjC,YAAA,CACEA,CAAAA,GAAS,KAAA,CACPvH,GAAAA,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,CA3BKuH,CA4BP,CAAA,CAGCA,CAAAA,GAAS,MAAA,EACRzH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CACZ,QAAA,CAAA,CAAA,CAAC,EAAA,CAAI,EAAE,CAAA,CAAE,GAAA,CAAKqS,CAAAA,EACbrS,IAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAM,CAKb2Q,CAAAA,CAAiB,IAAA,CAAK,KAAA,CAAA,CAHpBpJ,CAAAA,GAAY,KAAA,CACP0D,CAAAA,EAAmB,CAAA,CACnBC,CAAAA,EAAkB,CAAA,EACUmH,CAAAA,CAAO,GAAG,CAAC,EAChD,CAAA,CACA,SAAA,CAAU,4HAAA,CAET,QAAA,CAAA,CAAAA,CAAAA,CAAI,GAAA,CAAA,CAAA,CAXAA,CAYP,CACD,CAAA,CACDnS,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAM,CAKbyQ,CAAAA,CAHEpJ,CAAAA,GAAY,KAAA,CACP0D,CAAAA,EAAmB,CAAA,CACnBC,CAAAA,EAAkB,CACL,EACtB,CAAA,CACA,SAAA,CAAU,4HAAA,CAET,QAAA,CAAAnM,CAAAA,CAAE,YAAY,CAAA,CACjB,CAAA,CAAA,CACF,CAAA,CAGDgT,EAAAA,EAAcxB,CAAAA,CAAiB,MAAA,CAAS,CAAA,EACvCrQ,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACZ,QAAA,CAAAqQ,CAAAA,CAAiB,GAAA,CAAKlB,CAAAA,EACrBnP,GAAAA,CAAC,MAAA,CAAA,CAAe,SAAA,CAAU,qBAAA,CACvB,QAAA,CAAAmP,CAAAA,CAAAA,CADQA,CAEX,CACD,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAGC1H,CAAAA,GAAc,OAAA,EAAWT,CAAAA,EACxBlH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAnB,CAAAA,CAAE,6BAA6B,CAAA,CAClC,CAAA,CACAmB,GAAAA,CAACoS,YAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,KAAA,CAAM,SAAA,CACN,UAAA,CAAY7J,CAAAA,CACZ,aAAA,CAAeoI,EAAAA,CACf,YAAA,CAAY9R,CAAAA,CAAE,6BAA6B,CAAA,CAC7C,CAAA,CAAA,CACF,CAAA,CACC0J,CAAAA,EACCzI,IAAAA,CAAAkS,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAhS,GAAAA,CAACqS,MAAAA,CAAA,CACC,YAAA,CAAYxT,CAAAA,CAAE,6BAA6B,CAAA,CAC3C,YAAA,CAAc,CAAC4J,CAAgB,CAAA,CAC/B,iBAAA,CAAoB6J,CAAAA,EAAS,CAC3B,IAAMC,EAAAA,CAAM,KAAA,CAAM,IAAA,CAAKD,CAAI,CAAA,CAAE,CAAC,CAAA,CAG1BC,EAAAA,EAAK3B,EAAAA,CAAyB2B,EAAG,EACvC,CAAA,CACA,KAAK,IAAA,CACL,MAAA,CAAO,IAAA,CACP,UAAA,CAAY,CACV,OAAA,CACE,oDAAA,CACF,KAAA,CAAO,SACT,CAAA,CAEC,QAAA,CAAAzC,EAAAA,CAAmB,GAAA,CAAKpK,CAAAA,EACvB1F,GAAAA,CAACwS,UAAAA,CAAA,CACE,QAAA,CAAA3T,CAAAA,CAAEkR,EAAAA,CAAuBrK,CAAM,CAAC,CAAA,CAAA,CADlBA,CAEjB,CACD,CAAA,CACH,CAAA,CACC+C,CAAAA,GAAqB,QAAA,EACpB3I,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAACkS,iBAAAA,CAAA,CACC,YAAA,CAAW,iBAAA,CACX,IAAA,CAAK,IAAA,CACL,MAAA,CAAO,IAAA,CACP,KAAA,CAAO,KAAA,CAAMvM,CAAc,CAAA,CAAI,MAAA,CAAYA,CAAAA,CAC3C,aAAA,CAAekL,CAAAA,CACf,QAAA,CAAU,CAAA,CACV,IAAA,CAAM,CAAA,CACN,aAAA,CAAe,CAAE,qBAAA,CAAuB,CAAE,CAAA,CAC1C,UAAA,CAAY,CACV,KAAM,QAAA,CACN,YAAA,CACE,wFAAA,CACF,KAAA,CAAO,SACT,CAAA,CACF,CAAA,CACA7Q,GAAAA,CAACqS,MAAAA,CAAA,CACC,YAAA,CAAW,eAAA,CACX,YAAA,CAAc,CAACzM,CAAkB,CAAA,CACjC,iBAAA,CAAoB0M,CAAAA,EAAS,CAC3B,IAAMC,EAAAA,CAAM,KAAA,CAAM,IAAA,CAAKD,CAAI,CAAA,CAAE,CAAC,CAAA,CAG1BC,EAAAA,EAAKzB,CAAAA,CAA2ByB,EAAG,EACzC,CAAA,CACA,IAAA,CAAK,IAAA,CACL,MAAA,CAAO,IAAA,CACP,UAAA,CAAY,CACV,IAAA,CAAM,MAAA,CACN,OAAA,CACE,oDAAA,CACF,KAAA,CAAO,SACT,CAAA,CAEC,QAAA,CAAAvC,EAAAA,CAAe,GAAA,CAAKyC,CAAAA,EACnBzS,GAAAA,CAACwS,UAAAA,CAAA,CACE,QAAA,CAAA3T,CAAAA,CAAEoR,EAAAA,CAAmBwC,CAAC,CAAC,CAAA,CAAA,CADTA,CAEjB,CACD,CAAA,CACH,CAAA,CAAA,CACF,GAEJ,CAAA,CAAA,CAEJ,CAAA,CAIF3S,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2CAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMmR,EAAAA,CAAaxF,CAAAA,EAAM,CAACA,CAAC,CAAA,CACpC,SAAA,CAAU,mGAAA,CAEV,QAAA,CAAA,CAAAzL,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAnB,CAAAA,CAAE,oBAAoB,CAAA,CAAE,CAAA,CAC/BmB,GAAAA,CAAC0S,eAAAA,CAAA,CACC,SAAA,CAAW3S,IAAAA,CACT,kCAAA,CACAiR,EAAAA,EAAY,YACd,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACCI,EAAAA,EAAqB,IAAA,EACpBtR,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0CAAA,CACb,QAAA,CAAA,CAAAsR,EAAAA,CAAkB,UAAA,CAAA,CACrB,CAAA,CAAA,CAEJ,CAAA,CACCJ,EAAAA,EACClR,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qFAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,OAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,YAAA,CAAU,CAAA,CAChBA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,8BAAA,CACb,QAAA,CAAA,CAAC,KAAA,CAAM2H,CAAQ,CAAA,EAAKA,CAAAA,CAAW,CAAA,CAC5B,CAAA,CAAA,EAAIuD,CAAAA,CAAc,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAC5B,QAAA,CACN,CAAA,CAAA,CACF,CAAA,CACApL,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,kBAAA,CAAgB,CAAA,CACtBA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,8BAAA,CACb,QAAA,CAAA,CAAC,KAAA,CAAMuJ,CAAM,CAAA,EAAKA,CAAAA,CAAS,CAAA,CACxB,UAAA,CAAWA,CAAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAC5B,QAAA,CACN,CAAA,CAAA,CACF,CAAA,CACAzJ,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,QAAA,CAAM,EACZA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,8BAAA,CACb,QAAA,CAAA,CAAC,KAAA,CAAM2H,CAAQ,CAAA,EAAKA,CAAAA,CAAW,CAAA,CAC5B,CAAA,CAAA,EAAIyD,CAAAA,CAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAC9B,QAAA,CACN,CAAA,CAAA,CACF,CAAA,CACAtL,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,aAAA,CAAW,CAAA,CACjBA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAC,KAAA,CAAM2H,CAAQ,CAAA,EAAKA,CAAAA,CAAW,CAAA,EAAK0D,CAAAA,CAAkB,CAAA,CACnD,CAAA,EAAA,EAAKA,CAAAA,CAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAC/B,QAAA,CACN,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAGArL,GAAAA,CAAC2S,MAAAA,CAAA,CACC,KAAA,CAAOjB,EAAAA,CACP,SAAA,CAAS,IAAA,CACT,MAAA,CAAO,IAAA,CACP,IAAA,CAAK,IAAA,CACL,WAAY,CAACL,EAAAA,EAAatJ,CAAAA,CAC1B,SAAA,CAAWA,CAAAA,CACX,OAAA,CAASgK,EAAAA,CAER,QAAA,CAAAT,EAAAA,CACH,CAAA,CAAA,CACF,CAAA,CAEAtR,GAAAA,CAACqP,EAAAA,CAAA,CACC,MAAA,CAAQ6B,EAAAA,CAAS,MAAA,CACjB,OAAA,CAASA,EAAAA,CAAS,OAAA,CAClB,MAAA,CAAQ1B,CAAAA,CACV,CAAA,CAAA,CACF,CAEJ,CCpnBO,SAASoD,EAAAA,CAAgB,CAC9B,KAAA,CAAA3Q,CAAAA,CACA,MAAA,CAAAE,CAAAA,CACA,OAAA,CAAAgO,CAAAA,CACA,WAAA,CAAA/J,CAAAA,CACA,cAAA,CAAAD,CAAAA,CACA,KAAA,CAAA0M,CACF,CAAA,CAAyB,CACvB,GAAM,CACJ,OAAA,CAAAxL,CAAAA,CACA,IAAA,CAAAE,CAAAA,CACA,SAAA,CAAAE,CAAAA,CACA,QAAA,CAAAE,CAAAA,CACA,UAAA,CAAAE,CAAAA,CACA,MAAA,CAAA0B,CAAAA,CACA,aAAA,CAAA2B,CAAAA,CACA,eAAA,CAAAE,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,WAAA,CAAAT,CAAAA,CACA,eAAA,CAAAG,CAAAA,CACA,cAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAF,CAAAA,CACA,YAAA,CAAA/C,CAAAA,CACA,UAAA,CAAA8D,CAAAA,CACA,kBAAA,CAAA7E,CAAAA,CACA,WAAA,CAAAqB,CAAAA,CACA,MAAA,CAAAmH,CAAAA,CACA,iBAAA,CAAAjH,CAAAA,CACA,gBAAA,CAAAE,CAAAA,CACA,cAAA,CAAA9C,CAAAA,CACA,kBAAA,CAAAC,EAAAA,CACA,UAAA,CAAAyD,CAAAA,CACA,OAAA,CAAAiC,CAAAA,CACA,YAAA,CAAAnC,CAAAA,CACA,WAAA,CAAAqC,EAAAA,CACA,aAAA,CAAAI,EAAAA,CACA,oBAAA,CAAApD,CAAAA,CACA,mBAAA,CAAAE,CAAAA,CACA,iBAAA,CAAAC,CAAAA,CACA,qBAAA,CAAAC,CAAAA,CACA,MAAA,CAAAsG,EACF,CAAA,CAAIhJ,EAAAA,CAAa,CACf,MAAA,CAAA/D,CAAAA,CACA,WAAA,CAAAiE,CAAAA,CACA,cAAA,CAAAD,CAEF,CAAC,CAAA,CAEK2M,EAAAA,CAAsBC,eAAAA,CAAgB7D,EAAM,CAAA,CAE5C8D,EAAAA,CAAe9O,OAAAA,CACnB,IAAOjC,CAAAA,CAAQD,EAAAA,CAAuBC,CAAK,CAAA,CAAI,MAAA,CAC/C,CAACA,CAAK,CACR,CAAA,CACMgR,EAAAA,CAAgB/O,OAAAA,CACpB,IAAMhC,EAAAA,CAAwBC,CAAM,CAAA,CACpC,CAACA,CAAM,CACT,CAAA,CAEA,OACEnC,GAAAA,CAACkQ,EAAAA,CAAA,CACC,KAAA,CAAO8C,EAAAA,CACP,MAAA,CAAQC,EAAAA,CACR,OAAA,CAAS9C,CAAAA,CACT,OAAA,CAAS9I,CAAAA,CACT,IAAA,CAAME,CAAAA,CACN,SAAA,CAAWE,CAAAA,CACX,QAAA,CAAUE,CAAAA,CACV,UAAA,CAAYE,CAAAA,CACZ,MAAA,CAAQ0B,CAAAA,CACR,aAAA,CAAe2B,CAAAA,CACf,eAAA,CAAiBE,CAAAA,CACjB,eAAA,CAAiBC,CAAAA,CACjB,WAAA,CAAaT,CAAAA,CACb,eAAA,CAAiBG,CAAAA,CACjB,cAAA,CAAgBC,CAAAA,CAChB,gBAAA,CAAkBF,CAAAA,CAClB,YAAA,CAAc/C,CAAAA,CACd,OAAA,CAAS8D,EAAW,OAAA,CACpB,gBAAA,CAAkBA,CAAAA,CAAW,MAAA,CAC7B,kBAAA,CAAoB7E,CAAAA,CACpB,WAAA,CAAaqB,CAAAA,CACb,MAAA,CAAQmH,CAAAA,CACR,iBAAA,CAAmBjH,CAAAA,CACnB,gBAAA,CAAkBE,CAAAA,CAClB,cAAA,CAAgB9C,CAAAA,CAChB,kBAAA,CAAoBC,EAAAA,CACpB,eAAA,CAAiByD,CAAAA,CACjB,YAAA,CAAciC,CAAAA,CACd,iBAAA,CAAmBnC,CAAAA,CACnB,gBAAA,CAAkBqC,EAAAA,CAClB,kBAAA,CAAoBI,EAAAA,CACpB,yBAAA,CAA2BpD,CAAAA,CAC3B,wBAAA,CAA0BE,CAAAA,CAC1B,sBAAA,CAAwBC,CAAAA,CACxB,0BAAA,CAA4BC,CAAAA,CAC5B,QAAA,CAAUkK,EAAAA,CACZ,CAEJ,CCrGO,IAAMI,EAAAA,CAAyB,gBAE/B,SAASC,EAAAA,CAAkB,CAChC,EAAA,CAAAC,CAAAA,CAAKF,EACP,CAAA,CAEG,CACD,OACElT,GAAAA,CAACqT,UAAAA,CAAA,CAA6D,EAAA,CAAID,CAAAA,CAC/D,SAACE,CAAAA,EAAetT,GAAAA,CAACuT,EAAAA,CAAA,CAA0B,GAAGD,CAAAA,CAAY,CAAA,CAC7D,CAEJ,CAEA,SAASC,EAAAA,CAAyB,CAChC,MAAA,CAAAC,CAAAA,CACA,MAAA,CAAAlE,CAAAA,CACA,YAAA,CAAAmE,CACF,CAAA,CAA4E,CAC1E,GAAM,CAAE,CAAA,CAAA5U,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB,CAAE,QAAA,CAAAgU,CAAS,CAAA,CAAIC,SAAAA,EAAU,CAE/B,OAAKH,CAAAA,CAGHxT,GAAAA,CAACyP,WAAAA,CAAA,CACC,MAAA,CAAQH,CAAAA,CACR,YAAA,CAAcmE,CAAAA,CACd,IAAA,CAAMC,CAAAA,CAAW,IAAA,CAAO,IAAA,CACxB,QAAA,CAAS,MAAA,CACT,UAAA,CAAY,CACV,IAAA,CAAM,8GAAA,CACN,IAAA,CAAM,MACR,CAAA,CAEA,QAAA,CAAA1T,GAAAA,CAAC2P,YAAAA,CAAA,CACC,QAAA,CAAA7P,IAAAA,CAAC,KAAA,CAAA,CAEC,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,oCAAA,CACX,QAAA,CAAAnB,CAAAA,CAAE,sBAAsB,CAAA,CAC3B,CAAA,CACAmB,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMyT,CAAAA,CAAa,KAAK,CAAA,CACjC,SAAA,CAAU,wNAAA,CAEV,QAAA,CAAA3T,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,OAAA,CAAQ,WAAA,CACR,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAa,CAAA,CACb,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,CAAA,CACpCA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAA,CAAG,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,GAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA,CAAA,CACtC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAAA,GAAAA,CAAC4S,EAAAA,CAAA,CACC,KAAA,CAAOY,CAAAA,CAAO,KAAA,CACd,MAAA,CAAQA,CAAAA,CAAO,MAAA,CACf,cAAA,CAAgBA,CAAAA,CAAO,cAAA,CACvB,WAAA,CAAaA,CAAAA,CAAO,WAAA,EAAe,KAAA,CACnC,KAAA,CAAOA,CAAAA,CAAO,KAAA,CACd,OAAA,CAAQ,MAAA,CACV,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CACF,CAAA,CAtDkB,IAwDtB,CCnEO,IAAMI,EAAAA,CAA0C,CACrD,UAAA,CAAY,QAAA,CACZ,OAAA,CAAS,KAAA,CACT,MAAA,CAAQ,MAAA,CACR,aAAA,CAAe,MAAA,CACf,SAAA,CAAW,MAAA,CACX,YAAA,CAAc,MAChB,EAGO,SAASC,EAAAA,CAAmBC,CAAAA,CAAkC,CACnE,IAAInT,CAAAA,CAAQ,CAAA,CACZ,OAAImT,CAAAA,CAAM,MAAA,EAAQnT,CAAAA,EAAAA,CACdmT,CAAAA,CAAM,aAAA,EAAenT,CAAAA,EAAAA,CACrBmT,CAAAA,CAAM,SAAA,EAAWnT,CAAAA,EAAAA,CACjBmT,CAAAA,CAAM,YAAA,EAAcnT,CAAAA,EAAAA,CACjBA,CACT,CAqBO,SAASoT,EAAAA,CAAe,CAC7B,MAAA,CAAAzE,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,KAAA,CAAAhK,CAAAA,CACA,QAAA,CAAAyO,CACF,CAAA,CAAwB,CACtB,GAAM,CAAE,CAAA,CAAAnV,CAAE,CAAA,CAAIa,cAAAA,EAAe,CAEvB,CAACuU,CAAAA,CAAOC,CAAQ,EAAI3S,QAAAA,CAA4BgE,CAAK,CAAA,CAErD4O,CAAAA,CAAmBvU,WAAAA,CACtB8P,CAAAA,EAAkB,CACbA,CAAAA,CACFwE,CAAAA,CAAS3O,CAAK,CAAA,CAEdgK,CAAAA,GAEJ,CAAA,CACA,CAAChK,CAAAA,CAAOgK,CAAO,CACjB,CAAA,CAEM6E,CAAAA,CAAcxU,WAAAA,CAAY,IAAM,CACpCsU,CAAAA,CAASN,EAAoB,EAC/B,CAAA,CAAG,EAAE,CAAA,CAECS,CAAAA,CAAczU,WAAAA,CAAY,IAAM,CACpCoU,CAAAA,CAASC,CAAK,CAAA,CACd1E,CAAAA,GACF,CAAA,CAAG,CAAC0E,CAAAA,CAAOD,CAAAA,CAAUzE,CAAO,CAAC,CAAA,CAEvB+E,CAAAA,CAAc1U,WAAAA,CAClB,CAAoCgQ,CAAAA,CAAQ2C,CAAAA,GAA8B,CACxE2B,CAAAA,CAAUK,CAAAA,GAAU,CAAE,GAAGA,CAAAA,CAAM,CAAC3E,CAAG,EAAG2C,CAAI,CAAA,CAAE,EAC9C,CAAA,CACA,EACF,CAAA,CAEMiC,CAAAA,CAActQ,OAAAA,CAAQ,IAAM2P,EAAAA,CAAmBI,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAE9DQ,CAAAA,CAAkBvQ,OAAAA,CACtB,IAAM,CACJ,CAAE,KAAA,CAAO,MAAA,CAAW,KAAA,CAAOrF,CAAAA,CAAE,oBAAoB,CAAE,CAAA,CACnD,CAAE,KAAA,CAAO,YAAA,CAAuB,KAAA,CAAOA,CAAAA,CAAE,6BAA6B,CAAE,CAAA,CACxE,CAAE,KAAA,CAAO,QAAA,CAAmB,KAAA,CAAOA,CAAAA,CAAE,yBAAyB,CAAE,CAClE,CAAA,CACA,CAACA,CAAC,CACJ,CAAA,CAEM6V,CAAAA,CAAuBxQ,OAAAA,CAC3B,IAAM,CACJ,CAAE,KAAA,CAAO,MAAA,CAAW,KAAA,CAAOrF,CAAAA,CAAE,oBAAoB,CAAE,CAAA,CACnD,CAAE,KAAA,CAAO,IAAA,CAAM,KAAA,CAAOA,EAAE,4BAA4B,CAAE,CAAA,CACtD,CAAE,KAAA,CAAO,IAAA,CAAM,KAAA,CAAOA,CAAAA,CAAE,6BAA6B,CAAE,CAAA,CACvD,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAOA,CAAAA,CAAE,8BAA8B,CAAE,CAC3D,CAAA,CACA,CAACA,CAAC,CACJ,CAAA,CAEM8V,CAAAA,CAAgBzQ,OAAAA,CACpB,IAAM,CACJ,CAAE,KAAA,CAAO,MAAA,CAAW,KAAA,CAAOrF,CAAAA,CAAE,oBAAoB,CAAE,CAAA,CACnD,CAAE,KAAA,CAAO,MAAA,CAAQ,KAAA,CAAO,MAAO,CAAA,CAC/B,CAAE,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,OAAQ,CAAA,CACjC,CAAE,KAAA,CAAO,QAAA,CAAU,KAAA,CAAO,QAAS,CAAA,CACnC,CAAE,KAAA,CAAO,SAAA,CAAW,KAAA,CAAO,MAAO,CACpC,CAAA,CACA,CAACA,CAAC,CACJ,CAAA,CAEM+V,CAAAA,CAAmB1Q,OAAAA,CACvB,IAAM,CACJ,CAAE,KAAA,CAAO,MAAA,CAAW,KAAA,CAAOrF,CAAAA,CAAE,oBAAoB,CAAE,CAAA,CACnD,CAAE,KAAA,CAAO,MAAA,CAAQ,KAAA,CAAO,MAAO,CAAA,CAC/B,CAAE,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,OAAQ,CAAA,CACjC,CAAE,KAAA,CAAO,QAAA,CAAU,KAAA,CAAO,QAAS,CAAA,CACnC,CAAE,KAAA,CAAO,SAAA,CAAW,KAAA,CAAO,MAAO,CACpC,CAAA,CACA,CAACA,CAAC,CACJ,CAAA,CAEA,OACEmB,GAAAA,CAACyP,WAAAA,CAAA,CACC,MAAA,CAAQH,CAAAA,CACR,YAAA,CAAc6E,CAAAA,CACd,IAAA,CAAK,IAAA,CACL,QAAA,CAAS,MAAA,CACT,cAAA,CAAe,QAAA,CACf,UAAA,CAAY,CACV,IAAA,CAAM,8GAAA,CACN,IAAA,CAAM,MACR,CAAA,CAEA,QAAA,CAAAnU,GAAAA,CAAC2P,YAAAA,CAAA,CACC,QAAA,CAAA7P,IAAAA,CAAC,KAAA,CAAA,CAEC,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,oCAAA,CACX,QAAA,CAAAnB,CAAAA,CAAE,sBAAsB,CAAA,CAC3B,CAAA,CACAmB,GAAAA,CAAC6U,EAAAA,CAAA,CAAY,OAAA,CAAS,IAAMV,CAAAA,CAAiB,KAAK,CAAA,CAAG,CAAA,CAAA,CACvD,CAAA,CAGArU,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,aAAA,CACT,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,QAAA,CACf,GAAA,CAAK,EACP,CAAA,CAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC8U,EAAAA,CAAA,CAAc,KAAA,CAAOjW,CAAAA,CAAE,yBAAyB,CAAA,CAC/C,QAAA,CAAAmB,GAAAA,CAAC+U,EAAAA,CAAA,CACC,OAAA,CAASN,CAAAA,CACT,QAAA,CAAUR,CAAAA,CAAM,MAAA,CAChB,QAAA,CAAWxI,CAAAA,EACT6I,CAAAA,CAAY,QAAA,CAAU7I,CAA+B,CAAA,CAEzD,CAAA,CACF,CAAA,CAEAzL,GAAAA,CAAC8U,EAAAA,CAAA,CAAc,KAAA,CAAOjW,CAAAA,CAAE,8BAA8B,CAAA,CACpD,QAAA,CAAAmB,GAAAA,CAAC+U,EAAAA,CAAA,CACC,OAAA,CAASL,CAAAA,CACT,QAAA,CAAUT,CAAAA,CAAM,aAAA,CAChB,QAAA,CAAWxI,CAAAA,EAAM6I,CAAAA,CAAY,eAAA,CAAiB7I,CAAC,CAAA,CACjD,CAAA,CACF,CAAA,CAEAzL,GAAAA,CAAC8U,EAAAA,CAAA,CAAc,KAAA,CAAOjW,CAAAA,CAAE,0BAA0B,CAAA,CAChD,QAAA,CAAAmB,GAAAA,CAAC+U,EAAAA,CAAA,CACC,OAAA,CAASJ,CAAAA,CACT,QAAA,CAAUV,CAAAA,CAAM,SAAA,CAChB,QAAA,CAAWxI,CAAAA,EAAM6I,CAAAA,CAAY,WAAA,CAAa7I,CAAC,CAAA,CAC7C,CAAA,CACF,CAAA,CAEAzL,GAAAA,CAAC8U,EAAAA,CAAA,CAAc,KAAA,CAAOjW,CAAAA,CAAE,6BAA6B,CAAA,CACnD,SAAAmB,GAAAA,CAAC+U,EAAAA,CAAA,CACC,OAAA,CAASH,CAAAA,CACT,QAAA,CAAUX,CAAAA,CAAM,YAAA,CAChB,QAAA,CAAWxI,CAAAA,EAAM6I,CAAAA,CAAY,cAAA,CAAgB7I,CAAC,CAAA,CAChD,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGA3L,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,mCAAA,CACV,KAAA,CAAO,CAAE,SAAA,CAAW,8BAA+B,CAAA,CAEnD,QAAA,CAAA,CAAAE,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,wJAAA,CACV,OAAA,CAASoU,CAAAA,CAER,QAAA,CAAAvV,CAAAA,CAAE,sBAAsB,CAAA,CAC3B,CAAA,CACAiB,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,oLAAA,CACV,OAAA,CAASuU,CAAAA,CAER,QAAA,CAAA,CAAAxV,CAAAA,CAAE,4BAA4B,CAAA,CAC9B2V,CAAAA,CAAc,CAAA,EACb1U,IAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,OAAA,CAAS,EAAI,CAAA,CAAG,QAAA,CAAA,CAAA,GAAA,CAAE0U,EAAY,GAAA,CAAA,CAAC,CAAA,CAAA,CAElD,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CACF,CAEJ,CAMA,SAASM,EAAAA,CAAc,CACrB,KAAA,CAAAnW,CAAAA,CACA,QAAA,CAAAmF,CACF,CAAA,CAGG,CACD,OACEhE,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,aAAA,CAAe,QAAA,CAAU,GAAA,CAAK,EAAG,CAAA,CAC9D,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,KAAA,CAAO,SAAA,CACP,aAAA,CAAe,WAAA,CACf,aAAA,CAAe,QACjB,CAAA,CAEC,QAAA,CAAArB,CAAAA,CACH,CAAA,CACCmF,CAAAA,CAAAA,CACH,CAEJ,CAsBA,SAAS+Q,EAAAA,CAAY,CAAE,OAAA,CAAAG,CAAQ,CAAA,CAA4B,CACzD,OACEhV,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAASgV,CAAAA,CACT,SAAA,CAAU,wNAAA,CAEV,QAAA,CAAAlV,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,OAAA,CAAQ,WAAA,CACR,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAa,CAAA,CACb,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,CAAA,CACpCA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAA,CAAG,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA,CAAA,CACtC,CAAA,CACF,CAEJ,CAMA,SAAS+U,EAAAA,CAAgB,CACvB,OAAA,CAAAE,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,QAAA,CAAA9T,CAAAA,CACA,aAAA,CAAA+T,CAAAA,CAAgB,IAClB,CAAA,CAAyB,CACvB,OACEnV,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,QAAA,CAAU,MAAA,CAAQ,GAAA,CAAK,CAAE,CAAA,CACrD,QAAA,CAAAiV,CAAAA,CAAQ,GAAA,CAAKG,CAAAA,EAAQ,CACpB,IAAMC,CAAAA,CAAWH,CAAAA,GAAaE,CAAAA,CAAI,KAAA,CAClC,OACEpV,GAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAM,CAEXoB,CAAAA,CADEiU,CAAAA,EAAYF,CAAAA,CACL,MAAA,CAEAC,CAAAA,CAAI,KAFK,EAItB,CAAA,CACA,KAAA,CAAO,CACL,UAAA,CAAY,CAAA,CACZ,YAAA,CAAc,EAAA,CACd,OAAA,CAAS,UAAA,CACT,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,MAAA,CAAQ,SAAA,CACR,UAAA,CAAY,WAAA,CACZ,MAAA,CAAQC,CAAAA,CACJ,gCAAA,CACA,8BAAA,CACJ,UAAA,CAAYA,CAAAA,CACR,uBAAA,CACA,oBAAA,CACJ,KAAA,CAAOA,EAAW,SAAA,CAAY,SAChC,CAAA,CACA,YAAA,CAAeC,CAAAA,EAAM,CACdD,CAAAA,GACHC,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,UAAA,CAAa,oBAAA,CACnCA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,KAAA,CAAQ,MAAA,EAElC,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAM,CACdD,CAAAA,GACHC,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,UAAA,CAAa,oBAAA,CACnCA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,KAAA,CAAQ,SAAA,EAElC,CAAA,CAEC,QAAA,CAAAF,CAAAA,CAAI,KAAA,CAAA,CAtCAA,CAAAA,CAAI,KAAA,EAAS,OAuCpB,CAEJ,CAAC,CAAA,CACH,CAEJ,CCjWO,IAAMG,EAAAA,CAAgE,CAC3E,UAAA,CAAY,CAAE,OAAA,CAAS,YAAa,CAAA,CACpC,MAAA,CAAQ,CAAE,OAAA,CAAS,QAAS,CAAA,CAC5B,SAAA,CAAW,CAAE,OAAA,CAAS,WAAY,CAAA,CAClC,WAAA,CAAa,CAAE,OAAA,CAAS,QAAS,CACnC,CAAA,CAEMC,EAAAA,CAAkB,CACtB,UAAA,CAAY,wBAAA,CACZ,MAAA,CAAQ,qBAAA,CACR,SAAA,CAAW,wBAAA,CACX,WAAA,CAAa,yBACf,CAAA,CAEMC,EAAAA,CAA2B,CAC/B,YAAA,CACA,QAAA,CACA,WAAA,CACA,aACF,CAAA,CAMMC,EAAAA,CAA+B,CACnC,OAAA,CAAS,aAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,YAAA,CAAc,GACd,MAAA,CAAQ,8BAAA,CACR,UAAA,CAAY,oBAAA,CACZ,OAAA,CAAS,UAAA,CACT,QAAA,CAAU,EAAA,CACV,KAAA,CAAO,SAAA,CACP,MAAA,CAAQ,SAAA,CACR,UAAA,CAAY,WACd,CAAA,CAEMC,EAAAA,CAAoC,CACxC,QAAA,CAAU,UAAA,CACV,IAAA,CAAM,CAAA,CACN,GAAA,CAAK,MAAA,CACL,MAAA,CAAQ,EAAA,CACR,SAAA,CAAW,CAAA,CACX,YAAA,CAAc,EAAA,CACd,MAAA,CAAQ,4BAAA,CACR,UAAA,CAAY,kBAAA,CACZ,SAAA,CAAW,mCAAA,CACX,QAAA,CAAU,QACZ,EA2BO,SAASC,EAAAA,CAAgB,CAC9B,UAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CAAc,CAAA,CACd,SAAA,CAAAzW,CACF,CAAA,CAAyB,CACvB,GAAM,CAAE,CAAA,CAAAZ,CAAE,EAAIa,cAAAA,EAAe,CACvB,CAAC4P,CAAAA,CAAQ6G,CAAS,CAAA,CAAI5U,QAAAA,CAAS,KAAK,CAAA,CACpC6U,CAAAA,CAAcC,MAAAA,CAAuB,IAAI,CAAA,CAEzCC,CAAAA,CAAqB1W,WAAAA,CAAa0V,CAAAA,EAAkB,CAEtDc,CAAAA,CAAY,OAAA,EACZ,CAACA,CAAAA,CAAY,OAAA,CAAQ,QAAA,CAASd,CAAAA,CAAE,MAAc,CAAA,EAE9Ca,CAAAA,CAAU,KAAK,EAEnB,CAAA,CAAG,EAAE,CAAA,CAEL7M,SAAAA,CAAU,KACR,QAAA,CAAS,gBAAA,CAAiB,WAAA,CAAagN,CAAkB,CAAA,CAClD,IAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,CAAaA,CAAkB,CAAA,CAAA,CACxE,CAACA,CAAkB,CAAC,CAAA,CAEvBhN,SAAAA,CAAU,IAAM,CACd,GAAI,CAACgG,CAAAA,CAAQ,OACb,IAAMiH,CAAAA,CAAYjB,CAAAA,EAAqB,CACjCA,CAAAA,CAAE,MAAQ,QAAA,EAAUa,CAAAA,CAAU,KAAK,EACzC,CAAA,CACA,OAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,CAAWI,CAAQ,CAAA,CACtC,IAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,CAAWA,CAAQ,CAC/D,CAAA,CAAG,CAACjH,CAAM,CAAC,CAAA,CAEX,IAAMkH,CAAAA,CAAaC,EAAAA,CAAWZ,CAAU,CAAA,CAExC,OACE/V,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWL,CAAAA,CACX,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,GAAA,CAAK,CAAE,CAAA,CAGvD,QAAA,CAAA,CAAAK,IAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKsW,CAAAA,CAAa,KAAA,CAAO,CAAE,QAAA,CAAU,UAAW,CAAA,CACnD,QAAA,CAAA,CAAAtW,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,KAAA,CAAO4V,EAAAA,CACP,YAAA,CAAeJ,CAAAA,EAAM,CACnBA,CAAAA,CAAE,aAAA,CAAc,MAAM,UAAA,CAAa,mBACrC,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAM,CACnBA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,UAAA,CAAa,qBACrC,CAAA,CACA,OAAA,CAAS,IAAMa,CAAAA,CAAW1K,CAAAA,EAAM,CAACA,CAAC,CAAA,CAElC,QAAA,CAAA,CAAAzL,GAAAA,CAAC0W,EAAAA,CAAA,EAAS,CAAA,CACV1W,GAAAA,CAACwW,CAAAA,CAAA,CACC,SAAA,CAAU,iBAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAO,SAAU,CAAA,CAC5B,CAAA,CACAxW,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CAAkB,KAAA,CAAO,CAAE,KAAA,CAAO,SAAU,CAAA,CACzD,QAAA,CAAAnB,CAAAA,CAAE2W,EAAAA,CAAgBK,CAAU,CAAC,CAAA,CAChC,CAAA,CACA7V,GAAAA,CAAC2W,EAAAA,CAAA,CAAY,IAAA,CAAMrH,CAAAA,CAAQ,CAAA,CAAA,CAC7B,CAAA,CAECA,CAAAA,EACCtP,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,GAAG2V,EAAAA,CAAc,KAAA,CAAO,GAAA,CAAK,OAAA,CAAS,CAAE,CAAA,CACnD,QAAA,CAAAF,EAAAA,CAAW,GAAA,CAAK7F,CAAAA,EAAQ,CACvB,IAAMgH,CAAAA,CAAOH,EAAAA,CAAW7G,CAAG,CAAA,CACrByF,CAAAA,CAAWQ,CAAAA,GAAejG,CAAAA,CAChC,OACE9P,IAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,KAAA,CAAO,MAAA,CACP,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,EAAA,CACL,OAAA,CAAS,WAAA,CACT,SAAA,CAAW,MAAA,CACX,QAAA,CAAU,EAAA,CACV,MAAA,CAAQ,MAAA,CACR,MAAA,CAAQ,SAAA,CACR,UAAA,CAAY,WAAA,CACZ,UAAA,CAAYuV,CAAAA,CACR,uBAAA,CACA,aAAA,CACJ,KAAA,CAAOA,CAAAA,CAAW,SAAA,CAAY,SAAA,CAC9B,YAAA,CAAc,EAChB,CAAA,CACA,YAAA,CAAeC,CAAAA,EAAM,CACdD,CAAAA,GACHC,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,UAAA,CAAa,oBAAA,CACnCA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,KAAA,CAAQ,MAAA,EAElC,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAM,CACdD,CAAAA,GACHC,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,UAAA,CAAa,aAAA,CACnCA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,KAAA,CAAQ,SAAA,EAElC,CAAA,CACA,OAAA,CAAS,IAAM,CACTO,CAAAA,GAAejG,CAAAA,CACjBoG,CAAAA,CAAgB,CAACD,CAAO,CAAA,CAExBD,CAAAA,CAAalG,CAAG,CAAA,CAElBuG,CAAAA,CAAU,KAAK,EACjB,CAAA,CAEA,QAAA,CAAA,CAAAnW,GAAAA,CAAC4W,CAAAA,CAAA,CACC,SAAA,CAAU,iBAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAOvB,CAAAA,CAAW,SAAA,CAAY,SAAU,CAAA,CACnD,CAAA,CACArV,GAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,IAAA,CAAM,CAAA,CAAG,UAAA,CAAY,GAAI,EACrC,QAAA,CAAAnB,CAAAA,CAAE2W,EAAAA,CAAgB5F,CAAG,CAAC,CAAA,CACzB,CAAA,CACCyF,CAAAA,EACCrV,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CACL,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,KAAA,CAAO,SAAA,CACP,UAAA,CAAY,CACd,CAAA,CACA,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,iBAAA,CAAkB,CAAA,CAC5B,CAAA,CAAA,CAAA,CA/DG4P,CAiEP,CAEJ,CAAC,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAGA5P,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,KAAA,CAAO,CACL,YAAA,CAAc,EAAA,CACd,MAAA,CAAQ,8BAAA,CACR,UAAA,CAAY,oBAAA,CACZ,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,MAAO,SAAA,CACP,MAAA,CAAQ,SAAA,CACR,UAAA,CAAY,WAAA,CACZ,OAAA,CAAS,aAAA,CACT,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,QAAA,CAChB,QAAA,CAAU,EACZ,CAAA,CACA,YAAA,CAAesV,CAAAA,EAAM,CACnBA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,UAAA,CAAa,kBAAA,CACnCA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,KAAA,CAAQ,OAChC,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAM,CACnBA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,UAAA,CAAa,oBAAA,CACnCA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,KAAA,CAAQ,UAChC,CAAA,CACA,OAAA,CAAS,IAAMU,CAAAA,CAAgB,CAACD,CAAO,CAAA,CAEtC,QAAA,CAAAA,CAAAA,CAAU,QAAA,CAAM,QAAA,CACnB,CAAA,CAGAjW,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,QAAA,CAAU,UAAA,CAAY,OAAA,CAAS,aAAc,CAAA,CACzD,UAAAA,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,KAAA,CAAO4V,EAAAA,CACP,YAAA,CAAeJ,CAAAA,EAAM,CACnBA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,UAAA,CAAa,mBACrC,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAM,CACnBA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,UAAA,CAAa,qBACrC,CAAA,CACA,OAAA,CAASW,CAAAA,CAET,QAAA,CAAA,CAAAjW,GAAAA,CAAC6W,EAAAA,CAAA,EAAc,CAAA,CACf7W,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CAAkB,KAAA,CAAO,CAAE,KAAA,CAAO,SAAU,CAAA,CACzD,QAAA,CAAAnB,CAAAA,CAAE,sBAAsB,CAAA,CAC3B,CAAA,CAAA,CACF,CAAA,CACCqX,CAAAA,CAAc,CAAA,EACblW,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,EAAA,CACL,KAAA,CAAO,EAAA,CACP,QAAA,CAAU,EAAA,CACV,MAAA,CAAQ,EAAA,CACR,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,QAAA,CAChB,YAAA,CAAc,CAAA,CACd,UAAA,CAAY,SAAA,CACZ,KAAA,CAAO,MAAA,CACP,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,OAAA,CAAS,OACX,CAAA,CAEC,QAAA,CAAAkW,CAAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CAMA,IAAMO,EAAAA,CAGF,CACF,UAAA,CAAYK,YAAAA,CACZ,MAAA,CAAQC,aAAAA,CACR,SAAA,CAAWC,WAAAA,CACX,WAAA,CAAaC,SACf,CAAA,CAMA,SAASP,EAAAA,EAAW,CAClB,OACE5W,IAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CAAE,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAO,SAAU,CAAA,CACjD,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,UAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,gBAAA,CAAiB,CAAA,CACzBA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,UAAA,CAAW,CAAA,CACnBA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,cAAA,CAAe,CAAA,CACvBA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,SAAA,CAAU,CAAA,CAAA,CACpB,CAEJ,CAEA,SAAS6W,EAAAA,EAAgB,CACvB,OACE7W,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CAAE,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAO,SAAU,CAAA,CACjD,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,oJAAA,CAAqJ,CAAA,CAC/J,CAEJ,CAEA,SAAS2W,EAAAA,CAAY,CAAE,IAAA,CAAAjH,CAAK,EAAsB,CAChD,OACE1P,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CACL,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,KAAA,CAAO,SAAA,CACP,UAAA,CAAY,iBAAA,CACZ,SAAA,CAAW0P,CAAAA,CAAO,gBAAA,CAAmB,MACvC,CAAA,CACA,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA1P,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,cAAA,CAAe,CAAA,CACzB,CAEJ,CCpVO,SAASkX,EAAAA,CACd1D,CAAAA,CAAkC,EAAC,CACV,CACzB,IAAM2D,CAAAA,CAAajT,OAAAA,CACjB,IAAMkT,mBAAAA,CAAoB5D,CAAM,CAAA,CAChC,CACEA,CAAAA,CAAO,gBAAA,CACPA,CAAAA,CAAO,KAAA,CACPA,CAAAA,CAAO,MAAA,CACPA,CAAAA,CAAO,OAAA,CACPA,CAAAA,CAAO,QAAA,CACPA,CAAAA,CAAO,MAAA,CACPA,CAAAA,CAAO,YAAA,CACPA,CAAAA,CAAO,SAAA,CACPA,CAAAA,CAAO,YAAA,CACPA,CAAAA,CAAO,aACT,CACF,CAAA,CAEM,CACJ,IAAA,CAAM6D,CAAAA,CACN,SAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,kBAAA,CAAoBC,CAAAA,CACpB,OAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,WAAA,CAAaC,CAAAA,CACb,aAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CACF,CAAA,CAAIC,iBAAAA,CAAyBX,CAAU,CAAA,CAEjCY,CAAAA,CAAO7T,OAAAA,CACX,IACEmT,CAAAA,EAAc,KAAA,CACX,OAAA,CAASW,CAAAA,EAASA,CAAAA,CAAK,KAAK,CAAA,CAC5B,MAAA,CAAQC,CAAAA,EAA+BA,CAAAA,EAAQ,IAAI,CAAA,EAAK,EAAC,CAC9D,CAACZ,CAAY,CACf,CAAA,CAEMa,CAAAA,CAAYtY,WAAAA,CAAY,IAAM,CAC7BgY,CAAAA,GACP,CAAA,CAAG,CAACA,CAAa,CAAC,CAAA,CAEZO,CAAAA,CAAavY,WAAAA,CAAY,IAAM,CAC9BiY,CAAAA,GACP,CAAA,CAAG,CAACA,CAAO,CAAC,CAAA,CAEZ,OAAO,CACL,IAAA,CAAAE,CAAAA,CACA,SAAA,CAAAT,CAAAA,CACA,UAAA,CAAYC,CAAAA,EAAc,CAACC,CAAAA,CAC3B,cAAA,CAAAA,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,KAAA,CAAOC,CAAAA,EAAS,IAAA,CAChB,OAAA,CAASC,CAAAA,EAAW,KAAA,CACpB,SAAA,CAAAO,CAAAA,CACA,OAAA,CAASC,CACX,CACF,CC7GA,IAAMC,EAAAA,CAAc,kVAAA,CAUb,SAASC,EAAAA,CAAe,CAAE,KAAA,CAAA1X,CAAAA,CAAQ,CAAE,CAAA,CAAwB,CACjE,OACEb,IAAAA,CAAAkS,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAhS,GAAAA,CAAC,OAAA,CAAA,CAAO,QAAA,CAAAoY,EAAAA,CAAY,CAAA,CACpBpY,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,eAAA,CACV,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,mBAAA,CAAqB,gBAAA,CACrB,KAAA,CAAO,MACT,CAAA,CAEC,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQW,CAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAACC,CAAAA,CAAGC,CAAAA,GACrCb,GAAAA,CAACsY,EAAAA,CAAA,CAAqB,KAAA,CAAOzX,CAAAA,CAAAA,CAAVA,CAAa,CACjC,CAAA,CACH,CAAA,CAAA,CACF,CAEJ,CAMA,SAASyX,EAAAA,CAAa,CAAE,KAAA,CAAAC,CAAM,CAAA,CAAsB,CAElD,IAAMC,CAAAA,CAA+B,CACnC,WACE,4GAAA,CACF,cAAA,CAAgB,WAAA,CAChB,SAAA,CAAW,CAAA,qCAAA,EALCD,CAAAA,CAAQ,GAKoC,CAAA,EAAA,CAAA,CACxD,YAAA,CAAc,CAChB,CAAA,CAEME,CAAAA,CAAaF,CAAAA,CAAQ,CAAA,GAAM,CAAA,CAAI,KAAA,CAAQA,CAAAA,CAAQ,CAAA,GAAM,CAAA,CAAI,KAAA,CAAQ,KAAA,CAEvE,OACEvY,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,OAAA,CAAS,CAAE,CAAA,CACvB,QAAA,CAAAF,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,QAAA,CACf,MAAA,CAAQ,MAAA,CACR,YAAA,CAAc,EAAA,CACd,MAAA,CAAQ,8BAAA,CACR,UAAA,CAAY,oBAAA,CACZ,QAAA,CAAU,QACZ,CAAA,CAGA,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,EAAA,CACL,OAAA,CAAS,eACX,EAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,GAAGwY,CAAAA,CACH,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,YAAA,CAAc,EAAA,CACd,UAAA,CAAY,CACd,CAAA,CACF,CAAA,CACA1Y,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,IAAA,CAAM,CAAA,CACN,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,QAAA,CACf,GAAA,CAAK,CACP,CAAA,CAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,GAAGwY,CAAAA,CAAS,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAOC,CAAW,CAAA,CAAG,CAAA,CAC3DzY,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,GAAGwY,CAAAA,CAAS,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAO,KAAM,CAAA,CAAG,CAAA,CAAA,CACxD,CAAA,CAAA,CACF,CAAA,CAGAxY,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,OACT,aAAA,CAAe,QAAA,CACf,GAAA,CAAK,CAAA,CACL,OAAA,CAAS,eAAA,CACT,IAAA,CAAM,CACR,CAAA,CAEC,QAAA,CAAA,CAAC,CAAA,CAAG,CAAA,CAAG,CAAC,CAAA,CAAE,GAAA,CAAK0Y,CAAAA,EACd5Y,IAAAA,CAAC,KAAA,CAAA,CAEC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,eAAA,CAChB,GAAA,CAAK,CACP,CAAA,CAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,GAAGwY,CAAAA,CACH,MAAA,CAAQ,EAAA,CACR,KAAA,CAAOE,CAAAA,GAAM,CAAA,CAAI,KAAA,CAAQA,CAAAA,GAAM,CAAA,CAAI,KAAA,CAAQ,KAC7C,CAAA,CACF,CAAA,CACA5Y,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,GAAA,CAAK,CAAE,CAAA,CAC1D,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,GAAGwY,CAAAA,CAAS,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAO,EAAG,CAAA,CAAG,CAAA,CACnDxY,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,GAAGwY,CAAAA,CACH,MAAA,CAAQ,EAAA,CACR,KAAA,CAAO,EAAA,CACP,YAAA,CAAc,CAChB,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAzBKE,CA0BP,CACD,CAAA,CACH,CAAA,CAGA5Y,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,eAAA,CAChB,SAAA,CAAW,8BAAA,CACX,UAAA,CAAY,qBAAA,CACZ,OAAA,CAAS,UACX,CAAA,CAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,GAAGwY,CAAAA,CAAS,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAO,EAAG,CAAA,CAAG,CAAA,CACnDxY,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,GAAGwY,CAAAA,CAAS,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAO,EAAG,CAAA,CAAG,CAAA,CAAA,CACrD,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CAQO,SAASG,EAAAA,CAAmB,CACjC,KAAA,CAAAhY,CAAAA,CAAQ,EACV,CAAA,CAA4B,CAC1B,IAAMiY,CAAAA,CAA2B,CAC/B,UAAA,CACE,4GAAA,CACF,cAAA,CAAgB,WAAA,CAChB,SAAA,CAAW,sCAAA,CACX,YAAA,CAAc,CAChB,CAAA,CAEA,OACE9Y,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,QAAA,CACf,MAAA,CAAQ,MAAA,CACR,KAAA,CAAO,MAAA,CACP,QAAA,CAAU,IAAA,CACV,MAAA,CAAQ,QAAA,CACR,GAAA,CAAK,EACP,CAAA,CAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,OAAA,CAAA,CAAO,QAAA,CAAAoY,EAAAA,CAAY,CAAA,CAGpBpY,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,OAAA,CAAS,OAAQ,UAAA,CAAY,QAAA,CAAU,GAAA,CAAK,CAAE,CAAA,CACzD,QAAA,CAAA,CAAC,EAAA,CAAI,EAAA,CAAI,EAAA,CAAI,EAAA,CAAI,EAAA,CAAI,EAAE,CAAA,CAAE,GAAA,CAAI,CAACmE,CAAAA,CAAGtD,CAAAA,GAChCb,GAAAA,CAAC,KAAA,CAAA,CAAY,KAAA,CAAO,CAAE,GAAG4Y,CAAAA,CAAK,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAOzU,CAAE,CAAA,CAAA,CAAzCtD,CAA4C,CACvD,CAAA,CACH,CAAA,CAGAf,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,UAAA,CAChB,GAAA,CAAK,CAAA,CACL,SAAA,CAAW,EACb,CAAA,CAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,GAAG4Y,CAAAA,CAAK,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAO,GAAA,CAAK,YAAA,CAAc,EAAG,CAAA,CAAG,CAAA,CAClE5Y,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,GAAG4Y,CAAAA,CAAK,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAO,EAAA,CAAI,YAAA,CAAc,EAAG,CAAA,CAAG,CAAA,CACjE5Y,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,GAAG4Y,CAAAA,CAAK,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAO,EAAA,CAAI,YAAA,CAAc,EAAG,CAAA,CAAG,CAAA,CAAA,CACnE,CAAA,CAGA5Y,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,IAAA,CAAM,CAAA,CAAG,SAAA,CAAW,CAAE,CAAA,CAClC,QAAA,CAAAA,GAAAA,CAACqY,EAAAA,CAAA,CAAe,KAAA,CAAO1X,CAAAA,CAAO,CAAA,CAChC,CAAA,CAAA,CACF,CAEJ,CCjKA,IAAMkY,EAAAA,CAAyB,CAAA,CAQzBC,EAAAA,CAAyC,CAC7C,UAAA,CAAY,CACV,MAAA,CAAQ,sBAAA,CACR,MAAA,CAAQ,kCACV,CAAA,CACA,MAAA,CAAQ,CACN,MAAA,CAAQ,qBAAA,CACR,MAAA,CAAQ,iCACV,CACF,EAEMC,EAAAA,CAA2B,CAC/B,MAAA,CAAQ,kCAAA,CACR,MAAA,CAAQ,8CACV,CAAA,CAQMC,EAAAA,CAA0B,CAC9B,EAAA,CAAI,mCAAA,CACJ,IAAA,CAAM,4BAAA,CACN,MAAA,CAAQ,mCACV,CAAA,CAEMC,EAAAA,CAA4B,CAChC,EAAA,CAAI,qCAAA,CACJ,IAAA,CAAM,8BAAA,CACN,MAAA,CAAQ,qCACV,CAAA,CAEMC,EAAAA,CAAsB,CAC1B,EAAA,CAAI,yBAAA,CACJ,IAAA,CAAM,kBAAA,CACN,MAAA,CAAQ,yBACV,CAAA,CAEMC,EAAAA,CAA+B,CACnC,CACE,EAAA,CAAI,uBAAA,CACJ,IAAA,CAAM,iBAAA,CACN,MAAA,CAAQ,uBACV,CAAA,CACA,CACE,EAAA,CAAI,sBAAA,CACJ,IAAA,CAAM,gBAAA,CACN,MAAA,CAAQ,sBACV,CAAA,CACA,CACE,EAAA,CAAI,sBAAA,CACJ,IAAA,CAAM,gBAAA,CACN,MAAA,CAAQ,sBACV,CAAA,CACA,CACE,EAAA,CAAI,wBACJ,IAAA,CAAM,iBAAA,CACN,MAAA,CAAQ,uBACV,CAAA,CACA,CACE,EAAA,CAAI,sBAAA,CACJ,IAAA,CAAM,gBAAA,CACN,MAAA,CAAQ,sBACV,CAAA,CACA,CACE,EAAA,CAAI,uBAAA,CACJ,IAAA,CAAM,iBAAA,CACN,MAAA,CAAQ,uBACV,CAAA,CACA,CACE,EAAA,CAAI,uBAAA,CACJ,IAAA,CAAM,iBAAA,CACN,MAAA,CAAQ,uBACV,CAAA,CACA,CACE,EAAA,CAAI,uBAAA,CACJ,IAAA,CAAM,iBAAA,CACN,MAAA,CAAQ,uBACV,CACF,CAAA,CAEA,SAASC,EAAAA,CAAW7N,CAAAA,CAAmB,CACrC,IAAI8N,CAAAA,CAAO,CAAA,CACX,IAAA,IAASxY,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI0K,CAAAA,CAAE,MAAA,CAAQ1K,CAAAA,EAAAA,CAC5BwY,CAAAA,CAAAA,CAASA,CAAAA,EAAQ,CAAA,EAAKA,CAAAA,CAAO9N,CAAAA,CAAE,UAAA,CAAW1K,CAAC,CAAA,CAAK,CAAA,CAElD,OAAO,IAAA,CAAK,GAAA,CAAIwY,CAAI,CACtB,CAEA,SAASC,EAAAA,CAAiBnX,CAAAA,CAAqD,CAC7E,IAAMoX,CAAAA,CACJpX,CAAAA,CAAO,QAAA,EAAU,GAAA,CAAK+G,CAAAA,EAAMA,CAAAA,CAAE,KAAA,EAAO,WAAA,EAAY,CAAE,IAAA,EAAK,EAAK,EAAE,CAAA,EAAK,EAAC,CAEvE,GAAIqQ,CAAAA,CAAO,IAAA,CAAMC,CAAAA,EAAMA,CAAAA,GAAM,IAAI,CAAA,EAAKD,CAAAA,CAAO,IAAA,CAAMC,CAAAA,EAAMA,CAAAA,GAAM,MAAM,CAAA,CACnE,OAAO,CAACR,EAAAA,CAAWE,EAAK,CAAA,CAG1B,GAAIK,CAAAA,CAAO,IAAA,CAAMC,CAAAA,EAAMA,CAAAA,GAAM,KAAK,CAAA,EAAKD,CAAAA,CAAO,IAAA,CAAMC,CAAAA,EAAMA,CAAAA,GAAM,IAAI,CAAA,CAClE,OAAO,CAACR,EAAAA,CAAWC,EAAW,CAAA,CAGhC,IAAMQ,CAAAA,CAASF,CAAAA,CAAO,CAAC,CAAA,EAAK,EAAA,CACtBG,CAAAA,CAASH,CAAAA,CAAO,CAAC,CAAA,EAAK,EAAA,CACtBI,CAAAA,CAAOP,EAAAA,CAAWK,CAAM,CAAA,CAAIN,EAAAA,CAAa,MAAA,CAC3CS,CAAAA,CAAOR,EAAAA,CAAWM,CAAM,CAAA,CAAIP,EAAAA,CAAa,MAAA,CAC7C,OAAIS,CAAAA,GAASD,CAAAA,GAAMC,CAAAA,CAAAA,CAAQA,CAAAA,CAAO,CAAA,EAAKT,EAAAA,CAAa,MAAA,CAAA,CAE7C,CAACA,EAAAA,CAAaQ,CAAI,CAAA,CAAGR,EAAAA,CAAaS,CAAI,CAAC,CAChD,CAMA,SAASC,EAAAA,CAAU1X,CAAAA,CAAsC,CACvD,IAAMC,CAAAA,CAAMD,CAAAA,CAAO,QAAA,GAAW,CAAC,CAAA,CAC/B,OAAKC,CAAAA,CACEA,CAAAA,CAAI,QAAA,EAAYA,CAAAA,CAAI,KAAA,EAAS,IAAA,CADnB,IAEnB,CAEA,SAAS0X,EAAAA,CAAc3X,CAAAA,CAA+B,CACpD,IAAM+L,CAAAA,CAAQ2L,EAAAA,CAAU1X,CAAM,CAAA,CAC9B,OAAO+L,CAAAA,EAAS,IAAA,CAAO,UAAA,CAAA,CAAYA,CAAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAI,CAChE,CAEA,SAAS6L,EAAAA,CAAcxU,CAAAA,CAAuB,CAC5C,OAAIA,CAAAA,EAAS,CAAA,EAAKA,CAAAA,CAAQ,CAAA,CAAU,MAAA,CAChCA,CAAAA,EAAS,EAAA,EAAMA,CAAAA,CAAQ,GAAA,CAAY,OAAA,CAChC,CAAA,EAAGA,CAAK,CAAA,CAAA,CACjB,CAEA,SAASyU,EAAAA,CAAY7X,CAAAA,CAA+B,CAClD,IAAMC,CAAAA,CAAMD,CAAAA,CAAO,QAAA,GAAW,CAAC,CAAA,CACzB+L,CAAAA,CAAQ9L,CAAAA,EAAK,QAAA,EAAYA,CAAAA,EAAK,KAAA,EAAS,CAAA,CAC7C,OAAO,UAAA,CAAA,CAAY8L,CAAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,QAAA,EAC9C,CAEA,SAAS+L,EAAAA,CAAW9X,CAAAA,CAA+B,CACjD,IAAME,CAAAA,CAAKF,CAAAA,CAAO,QAAA,GAAW,CAAC,CAAA,CAC9B,GAAIE,CAAAA,CAAI,CACN,IAAM6L,CAAAA,CAAQ7L,CAAAA,CAAG,QAAA,EAAYA,CAAAA,CAAG,KAAA,EAAS,CAAA,CACzC,OAAO,UAAA,CAAA,CAAY6L,CAAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,QAAA,EAC9C,CACA,IAAM9L,CAAAA,CAAMD,CAAAA,CAAO,QAAA,GAAW,CAAC,CAAA,CACzB+X,CAAAA,CAAW9X,CAAAA,EAAK,QAAA,EAAYA,CAAAA,EAAK,KAAA,EAAS,CAAA,CAChD,OAAO,UAAA,CAAA,CAAA,CAAa,CAAA,CAAI8X,CAAAA,EAAY,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,QAAA,EACvD,CAMA,SAASC,EAAAA,CAAgBC,CAAAA,CAAgC,CACvD,IAAMC,CAAAA,CAAO,IAAI,IAAA,CAAKD,CAAO,CAAA,CAAE,OAAA,EAAQ,CAAI,IAAA,CAAK,GAAA,EAAI,CACpD,GAAIC,CAAAA,EAAQ,CAAA,CAAG,OAAO,IAAA,CAEtB,IAAMC,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAMD,CAAAA,CAAO,KAAU,CAAA,CAChCE,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAOF,CAAAA,CAAO,KAAA,CAAc,IAAS,CAAA,CAC9CG,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAOH,CAAAA,CAAO,IAAA,CAAa,GAAM,CAAA,CAE1CI,CAAAA,CAAkB,EAAC,CACzB,OAAIH,CAAAA,CAAI,CAAA,EAAGG,CAAAA,CAAM,IAAA,CAAK,CAAA,EAAGH,CAAC,CAAA,CAAA,CAAG,CAAA,CACzBC,CAAAA,CAAI,CAAA,EAAGE,CAAAA,CAAM,IAAA,CAAK,CAAA,EAAGF,CAAC,CAAA,CAAA,CAAG,CAAA,CAC7BE,CAAAA,CAAM,IAAA,CAAK,CAAA,EAAGD,CAAC,CAAA,CAAA,CAAG,CAAA,CAEXC,CAAAA,CAAM,IAAA,CAAK,GAAG,CACvB,CAMA,IAAMC,EAAAA,CAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAoBb,SAASC,EAAAA,CAAU,CACxB,KAAA,CAAA1Y,CAAAA,CACA,KAAA2Y,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,QAAA,CAAAzZ,EACA,eAAA,CAAA0Z,CAAAA,CACA,OAAA,CAAAC,CACF,EAAmB,CACjB,GAAM,CAACC,CAAAA,CAAcC,CAAe,CAAA,CAAI1Z,QAAAA,CAAwB,IAAI,CAAA,CAE9D2Z,EAAajZ,CAAAA,CAAM,OAAA,EAAW,EAAC,CAY/BkZ,EAXUjX,OAAAA,CACd,IACEgX,EAAW,MAAA,CAAS,CAAA,CAChB,CAAC,GAAGA,CAAU,CAAA,CAAE,IAAA,CACd,CAACpc,CAAAA,CAAGC,CAAAA,GAAAA,CACDA,CAAAA,CAAE,QAAA,GAAW,CAAC,CAAA,EAAG,KAAA,EAAS,CAAA,GAAMD,CAAAA,CAAE,WAAW,CAAC,CAAA,EAAG,KAAA,EAAS,CAAA,CAC/D,EACAoc,CAAAA,CACN,CAACA,CAAU,CACb,EAE4B,MAAA,CAAQV,CAAAA,EAAMA,CAAAA,CAAE,MAAA,GAAW,MAAM,CAAA,CACvDY,CAAAA,CAAeD,CAAAA,CAAY,MAAA,GAAW,EACtCE,CAAAA,CAAmBF,CAAAA,CAAY,MAAM,CAAA,CAAGtC,EAAsB,EAC9DyC,CAAAA,CAAYH,CAAAA,CAAY,MAAA,CAAStC,EAAAA,CAEjC0C,EAAkBrX,OAAAA,CAAQ,IAEvB,CAAA,CAAA,EADK,IAAA,CAAK,MAAMjC,CAAAA,CAAM,MAAA,EAAU,CAAC,CAAA,CACzB,eAAe,OAAO,CAAC,CAAA,CAAA,CACrC,CAACA,EAAM,MAAM,CAAC,CAAA,CAEXuZ,CAAAA,CAAiBR,EAClBG,CAAAA,CAAY,IAAA,CAAMX,CAAAA,EAAMA,CAAAA,CAAE,OAASQ,CAAY,CAAA,EAAK,IAAA,CACrD,IAAA,CAEES,EAAa,CAAC,CAACD,GAAkBJ,CAAAA,CAIjCM,CAAAA,CAAkB,IAAM,CACvBD,CAAAA,EACHra,CAAAA,GAAWa,CAAK,EAEpB,CAAA,CAEM0Z,CAAAA,CAAqBrG,CAAAA,EAAwB,CACjDA,EAAE,eAAA,EAAgB,CACdkG,CAAAA,GACFlG,CAAAA,CAAE,gBAAe,CACjB2F,CAAAA,CAAgB,IAAI,CAAA,EAExB,CAAA,CAEMW,EAAkBtG,CAAAA,EAAwB,CAC9CA,CAAAA,CAAE,eAAA,GACGsF,CAAAA,GACHtF,CAAAA,CAAE,cAAA,EAAe,CACjBlU,IAAWa,CAAK,CAAA,EAEpB,CAAA,CAEM4Z,CAAAA,CAAgBT,EACpBpb,GAAAA,CAAC8b,EAAAA,CAAA,CACC,KAAA,CAAO7Z,CAAAA,CACP,gBAAiBsZ,CAAAA,CACjB,IAAA,CAAMX,CAAAA,CACN,aAAA,CAAeC,EACf,QAAA,CAAUzZ,CAAAA,CACZ,CAAA,CACEoa,CAAAA,CACFxb,IAAC+b,EAAAA,CAAA,CAAqB,UAAA,CAAY,IAAMd,EAAgB,IAAI,CAAA,CAAG,CAAA,CAE/Djb,GAAAA,CAACgc,GAAA,CACC,SAAA,CAAWV,CAAAA,CACX,eAAA,CAAiBC,EACjB,MAAA,CAAQtZ,CAAAA,CAAM,MAAA,CACd,IAAA,CAAM2Y,EACN,aAAA,CAAeC,CAAAA,CACf,UAAA,CAAYe,CAAAA,CACd,EAGF,OACE9b,IAAAA,CAAC,OACC,SAAA,CAAU,OAAA,CACV,MAAO,CACL,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,SACf,MAAA,CAAQ,MAAA,CACR,KAAA,CAAO,MAAA,CACP,aAAc,EAAA,CACd,MAAA,CAAQ,8BAAA,CACR,UAAA,CAAY,qBACZ,QAAA,CAAU,QAAA,CACV,UAAA,CAAY,UAAA,CACZ,OAAS2b,CAAAA,CAAyB,MAAA,CAAZ,SACxB,CAAA,CACA,aAAenG,CAAAA,EAAM,CACnB,IAAM2G,CAAAA,CAAK3G,EAAE,aAAA,CACP4G,CAAAA,CAAYpD,EAAAA,CAAY7W,CAAAA,CAAM,MAAM,CAAA,EAAK8W,EAAAA,CAC/CkD,EAAG,KAAA,CAAM,WAAA,CAAcC,EAAU,MAAA,CACjCD,CAAAA,CAAG,KAAA,CAAM,SAAA,CAAYC,EAAU,MAAA,CAC/BnB,CAAAA,GAAU9Y,CAAK,EACjB,EACA,YAAA,CAAeqT,CAAAA,EAAM,CACnB,IAAM2G,EAAK3G,CAAAA,CAAE,aAAA,CACb2G,CAAAA,CAAG,KAAA,CAAM,YAAc,oBAAA,CACvBA,CAAAA,CAAG,KAAA,CAAM,SAAA,CAAY,OACvB,CAAA,CACA,OAAA,CAASP,CAAAA,CAET,QAAA,CAAA,CAAA1b,IAAC,OAAA,CAAA,CAAO,QAAA,CAAA0a,EAAAA,CAAY,CAAA,CAGpB5a,KAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,cAAe,QAAA,CACf,IAAA,CAAM,CAAA,CACN,OAAA,CAAS,iBACT,GAAA,CAAK,CACP,CAAA,CAEA,QAAA,CAAA,CAAAE,IAACmc,EAAAA,CAAA,CACC,KAAA,CAAOla,CAAAA,CACP,KAAM2Y,CAAAA,CACN,aAAA,CAAeC,EACf,OAAA,CAASc,CAAAA,CACT,WAAYF,CAAAA,CACd,CAAA,CAEAzb,GAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,aAAA,CAAe,SAAU,IAAA,CAAM,CAAE,CAAA,CAC7D,QAAA,CAAAob,EACCpb,GAAAA,CAACoc,EAAAA,CAAA,CACC,MAAA,CAAQjB,CAAAA,CAAY,CAAC,CAAA,CACrB,KAAA,CAAOlZ,CAAAA,CACP,eAAA,CAAiB6Y,EACnB,CAAA,CACEU,CAAAA,CACFxb,GAAAA,CAACqc,EAAAA,CAAA,CACC,MAAA,CAAQb,CAAAA,CACR,KAAA,CAAOvZ,CAAAA,CACP,WAAY,IAAMgZ,CAAAA,CAAgB,IAAI,CAAA,CACtC,gBAAiBH,CAAAA,CACnB,CAAA,CAEA9a,GAAAA,CAACsc,EAAAA,CAAA,CACC,gBAAA,CAAkBjB,CAAAA,CAClB,aAAA,CAAgBb,CAAAA,EAAMS,EAAgBT,CAAAA,CAAE,IAAI,CAAA,CAC9C,CAAA,CAEJ,GACF,CAAA,CAGAxa,GAAAA,CAACuc,GAAA,CAAY,QAAA,CAAAV,EAAc,CAAA,CAAA,CAC7B,CAEJ,CAMA,SAASM,GAAW,CAClB,KAAA,CAAAla,CAAAA,CACA,IAAA,CAAA2Y,EACA,aAAA,CAAAC,CAAAA,CACA,OAAA,CAAA7F,CAAAA,CACA,WAAAyG,CACF,CAAA,CAMG,CACD,IAAMe,EAAYva,CAAAA,CAAM,QAAA,CAAWkY,EAAAA,CAAgBlY,CAAAA,CAAM,QAAQ,CAAA,CAAI,IAAA,CAKrE,OACEnC,IAAAA,CAAC2c,SAAA,CACC,IAAA,CAAM7B,CAAAA,CACN,aAAA,CAAeC,EACf,EAAA,CAAG,QAAA,CACH,UAPF,mFAAA,CAQE,OAAA,CAAS7F,EAET,QAAA,CAAA,CAAAhV,GAAAA,CAAC0c,MAAAA,CAAA,CACC,IAAKza,CAAAA,CAAM,SAAA,EAAa,MAAA,CACxB,IAAA,CAAMA,EAAM,KAAA,EAAS,OAAA,CACrB,MAAA,CAAO,IAAA,CACP,UAAU,sGAAA,CACV,UAAA,CAAY,CAAE,IAAA,CAAM,gBAAiB,CAAA,CACvC,CAAA,CACAnC,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,uDAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,GAAA,CAAA,CACC,UAAWD,IAAAA,CACT,qFAAA,CACA0b,CAAAA,EAAc,qCAChB,EAEC,QAAA,CAAAxZ,CAAAA,CAAM,MACT,CAAA,CACCua,CAAAA,EACC1c,KAAC,MAAA,CAAA,CAAK,SAAA,CAAU,wCAAA,CAAyC,QAAA,CAAA,CAAA,UAAA,CAC9C0c,GACX,CAAA,CAAA,CAEJ,CAAA,CACAxc,GAAAA,CAAC2c,EAAAA,CAAA,CAAgB,KAAA,CAAO1a,CAAAA,CAAO,CAAA,CAAA,CACjC,CAEJ,CAWA,SAAS2a,EAAAA,CAAe3a,EAAkC,CACxD,IAAM4a,EAAsB,EAAC,CAE7B,GAAI5a,CAAAA,CAAM,SAAW,QAAA,CACnB,OAAA4a,CAAAA,CAAO,IAAA,CAAK,CAAE,IAAA,CAAM,QAAS,CAAC,CAAA,CACvBA,EAAO,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CAG1B,IAAMC,EAAW7a,CAAAA,CAAM,IAAA,EAAM,IAAA,CAAMpD,CAAAA,EAAMA,EAAE,KAAA,EAAO,WAAA,EAAY,GAAM,QAAQ,EACtEke,CAAAA,CAAS9a,CAAAA,CAAM,IAAA,EAAM,IAAA,CAAMpD,GAAMA,CAAAA,CAAE,KAAA,EAAO,WAAA,EAAY,GAAM,MAAM,CAAA,CAExE,GAAIie,CAAAA,EAAY7a,CAAAA,CAAM,OAAQ,CAC5B,IAAM+a,CAAAA,CAAY,IAAI,KAAK/a,CAAAA,CAAM,MAAM,CAAA,CAAE,OAAA,GAAY,IAAA,CAAK,GAAA,GACpDgb,CAAAA,CAAU,GAAA,CAAS,IACnBC,CAAAA,CAAa,GAAA,CAAU,GAAA,CAE7B,GAAIF,EAAY,CAAA,EAAKA,CAAAA,EAAaE,CAAAA,CAAY,CAC5C,IAAMC,CAAAA,CAAcH,CAAAA,EAAaC,CAAAA,CAAU,SAAA,CAAY,UACvDJ,CAAAA,CAAO,IAAA,CAAK,CACV,IAAA,CAAM,cAAA,CACN,MAAOG,CAAAA,EAAaC,CAAAA,CAAU,IAAA,CAAO,KAAA,CACrC,MAAOE,CACT,CAAC,EACH,CACF,CAEA,OAAIJ,CAAAA,EACFF,CAAAA,CAAO,IAAA,CAAK,CAAE,IAAA,CAAM,MAAO,CAAC,CAAA,CAGvBA,CAAAA,CAAO,MAAM,CAAA,CAAG,CAAC,CAC1B,CAEA,SAASF,EAAAA,CAAgB,CAAE,KAAA,CAAA1a,CAAM,EAA4B,CAC3D,IAAM4a,CAAAA,CAAS3Y,OAAAA,CAAQ,IAAM0Y,EAAAA,CAAe3a,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAE3D,OAAI4a,CAAAA,CAAO,SAAW,CAAA,CAAU,IAAA,CAG9B7c,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,6CAAA,CACZ,QAAA,CAAA6c,CAAAA,CAAO,GAAA,CAAI,CAACtc,CAAAA,CAAOM,CAAAA,GAAM,CACxB,OAAQN,CAAAA,CAAM,MACZ,KAAK,MAAA,CACH,OAAOP,IAACod,EAAAA,CAAA,EAAA,CAAevc,CAAG,CAAA,CAC5B,KAAK,cAAA,CACH,OACEb,GAAAA,CAACqd,EAAAA,CAAA,CAEC,KAAA,CAAO9c,CAAAA,CAAM,MACb,KAAA,CAAOA,CAAAA,CAAM,OAFRM,CAGP,CAAA,CAEJ,KAAK,QAAA,CACH,OAAOb,GAAAA,CAACsd,EAAAA,CAAA,EAAA,CAAiBzc,CAAG,CAChC,CACF,CAAC,CAAA,CACH,CAEJ,CAEA,SAASuc,EAAAA,EAAY,CACnB,GAAM,CAAE,EAAAve,CAAE,CAAA,CAAIa,cAAAA,EAAe,CAC7B,OACEI,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iKAAA,CACd,UAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+CAAA,CAAgD,EAC/DnB,CAAAA,CAAE,2BAA2B,CAAA,CAAA,CAChC,CAEJ,CAEA,SAASwe,EAAAA,CAAqB,CAC5B,KAAA,CAAA1e,EACA,KAAA,CAAA4e,CACF,CAAA,CAGG,CACD,OACEzd,IAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAU,oHAAA,CACV,MAAO,CACL,eAAA,CAAiB,GAAGyd,CAAK,CAAA,EAAA,CAAA,CACzB,MAAAA,CACF,CAAA,CAEA,QAAA,CAAA,CAAAvd,GAAAA,CAACiX,UAAA,CAAU,SAAA,CAAU,iBAAA,CAAkB,CAAA,CACtCtY,GACH,CAEJ,CAEA,SAAS2e,EAAAA,EAAc,CACrB,GAAM,CAAE,CAAA,CAAAze,CAAE,EAAIa,cAAAA,EAAe,CAC7B,OACEM,GAAAA,CAAC,QAAK,SAAA,CAAU,4GAAA,CACb,QAAA,CAAAnB,CAAAA,CAAE,6BAA6B,CAAA,CAClC,CAEJ,CAMA,SAASyd,GAAe,CACtB,gBAAA,CAAAjB,EACA,aAAA,CAAAmC,CACF,EAGG,CACD,OAAOnC,CAAAA,CAAiB,MAAA,CAAS,EAC/Brb,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACZ,SAAAqb,CAAAA,CAAiB,GAAA,CAAKlZ,CAAAA,EAAW,CAChC,IAAMgQ,CAAAA,CAAM2H,EAAAA,CAAc3X,CAAM,CAAA,CAChC,OACErC,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CAEL,UAAU,+GAAA,CACV,OAAA,CAAUwV,CAAAA,EAAM,CACdA,EAAE,eAAA,EAAgB,CAClBkI,CAAAA,CAAcrb,CAAM,EACtB,CAAA,CAEA,QAAA,CAAA,CAAAnC,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0EACb,QAAA,CAAAmC,CAAAA,CAAO,QAAA,GAAW,CAAC,GAAG,KAAA,EAASA,CAAAA,CAAO,QAAA,CACzC,CAAA,CACArC,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAAE,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kDACb,QAAA,CAAA+Z,EAAAA,CAAc5H,CAAG,CAAA,CACpB,CAAA,CACAnS,GAAAA,CAACyd,EAAAA,CAAA,EAAU,CAAA,CAAA,CACb,CAAA,CAAA,CAAA,CAfKtb,CAAAA,CAAO,EAAA,EAAM,GAAGA,CAAAA,CAAO,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAO,IAAI,CAAA,CAgBnD,CAEJ,CAAC,CAAA,CACH,CAAA,CACE,IACN,CAMA,SAAS6Z,EAAAA,CAAiB,CACxB,UAAAV,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,MAAA,CAAAxU,EACA,IAAA,CAAA6T,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,WAAA6C,CACF,CAAA,CAOG,CACD,GAAM,CAAE,CAAA,CAAA7e,CAAE,CAAA,CAAIa,cAAAA,GAEd,OACEI,IAAAA,CAAAkS,QAAAA,CAAA,CACG,UAAAsJ,CAAAA,CAAY,CAAA,CACXxb,IAAAA,CAAC2c,QAAAA,CAAA,CACC,IAAA,CAAM7B,CAAAA,CACN,cAAeC,CAAAA,CACf,EAAA,CAAG,SACH,SAAA,CAAU,gIAAA,CACV,OAAA,CAAS6C,CAAAA,CAER,UAAA7e,CAAAA,CAAE,wBAAwB,CAAA,CAC3BmB,GAAAA,CAAC2d,GAAA,CAAiB,SAAA,CAAU,SAAA,CAAU,CAAA,CAAA,CACxC,EAEA3d,GAAAA,CAAC,KAAA,CAAA,EAAI,CAAA,CAEPF,IAAAA,CAAC,QACC,KAAA,CAAO,CACL,OAAA,CAAS,aAAA,CACT,WAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,QAAA,CAAU,GACV,KAAA,CAAO,SACT,CAAA,CAEC,QAAA,CAAA,CAAAyb,EAAgB,GAAA,CAAE1c,CAAAA,CAAE,sBAAsB,CAAA,CAC3CmB,GAAAA,CAAC4d,GAAA,CAAW,MAAA,CAAQ7W,CAAAA,CAAQ,CAAA,CAAA,CAC9B,GACF,CAEJ,CAMA,SAASwV,EAAAA,CAAW,CAAE,QAAA,CAAAzY,CAAS,CAAA,CAAkC,CAC/D,OACE9D,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,gBAChB,SAAA,CAAW,8BAAA,CACX,UAAA,CAAY,qBAAA,CACZ,QAAS,UAAA,CACT,SAAA,CAAW,MACb,CAAA,CAEC,SAAA8D,CAAAA,CACH,CAEJ,CAMA,SAAS+Z,EAAAA,CAAe,CACtB,OAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,YAAAC,CAAAA,CACA,OAAA,CAAAhJ,CAAAA,CACA,QAAA,CAAAlR,CACF,CAAA,CAMG,CAaD,OACE9D,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,UAAU,uMAAA,CACV,KAAA,CACE,CACE,eAAA,CAAiB8d,CAAAA,CACjB,KAAA,CAAOC,CAAAA,CACP,iBAAkBC,CAAAA,CAClB,iBAAA,CAAmB,KAAA,CACnB,SAAA,CACE,6GACF,UAAA,CAAY,+CACd,CAAA,CAEF,YAAA,CA3BiB1I,GAA2C,CAC9D,IAAM2G,EAAK3G,CAAAA,CAAE,aAAA,CACb2G,EAAG,KAAA,CAAM,WAAA,CAAY,iBAAA,CAAmB,KAAK,EAC7CA,CAAAA,CAAG,KAAA,CAAM,SAAA,CAAY,kBACvB,EAwBI,YAAA,CAtBiB3G,CAAAA,EAA2C,CAC9D,IAAM2G,EAAK3G,CAAAA,CAAE,aAAA,CACb2G,CAAAA,CAAG,KAAA,CAAM,YAAY,iBAAA,CAAmB,KAAK,CAAA,CAC7CA,CAAAA,CAAG,MAAM,SAAA,CAAY,kBACvB,CAAA,CAmBI,OAAA,CAASjH,EAER,QAAA,CAAAlR,CAAAA,CACH,CAEJ,CAMA,SAASma,EAAAA,CAAe,CACtB,OAAA9b,CAAAA,CACA,KAAA,CAAAF,EACA,eAAA,CAAA6Y,CAAAA,CACA,aAAA,CAAAoD,CAAAA,CAAgB,MAChB,WAAA,CAAAC,CAAAA,CAAc,QAChB,CAAA,CAWG,CACD,GAAM,CAAE,CAAA,CAAAtf,CAAE,EAAIa,cAAAA,EAAe,CACvB,CAAC0e,CAAAA,CAAIC,CAAE,CAAA,CAAIH,CAAAA,CACb5E,EAAAA,CAAiBnX,CAAM,EACvB,CAAC6W,EAAAA,CAAWC,EAAW,CAAA,CAErBQ,EAAStX,CAAAA,CAAO,QAAA,GAAW,CAAC,CAAA,EAAG,OAAO,WAAA,EAAY,CAAE,MAAK,EAAK,EAAA,CAC9DuX,EAASvX,CAAAA,CAAO,QAAA,GAAW,CAAC,CAAA,EAAG,OAAO,WAAA,EAAY,CAAE,IAAA,EAAK,EAAK,GAC9Dmc,CAAAA,CACJH,CAAAA,GAAgB,OAAA,EAAW1E,CAAAA,GAAWC,EAAS,QAAA,CAAWyE,CAAAA,CAEtDI,CAAAA,CACJD,CAAAA,GAAoB,QAChB,CAAA,EAAGnc,CAAAA,CAAO,QAAA,GAAW,CAAC,GAAG,KAAA,EAAS,KAAK,CAAA,CAAA,EAAI6X,EAAAA,CAAY7X,CAAM,CAAC,CAAA,IAAA,CAAA,CAC9DtD,CAAAA,CAAE,2BAAA,CAA6B,CAAE,KAAA,CAAOmb,EAAAA,CAAY7X,CAAM,CAAE,CAAC,EAE7Dqc,CAAAA,CACJF,CAAAA,GAAoB,OAAA,CAChB,CAAA,EAAGnc,EAAO,QAAA,GAAW,CAAC,CAAA,EAAG,KAAA,EAAS,IAAI,CAAA,CAAA,EAAI8X,EAAAA,CAAW9X,CAAM,CAAC,OAC5DtD,CAAAA,CAAE,0BAAA,CAA4B,CAAE,KAAA,CAAOob,EAAAA,CAAW9X,CAAM,CAAE,CAAC,CAAA,CAEjE,OACErC,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YAAA,CACb,QAAA,CAAA,CAAAE,IAAC6d,EAAAA,CAAA,CACC,OAAA,CAASO,CAAAA,CAAG,GACZ,SAAA,CAAWA,CAAAA,CAAG,KACd,WAAA,CAAaA,CAAAA,CAAG,OAChB,OAAA,CAAU9I,CAAAA,EAAM,CACdA,CAAAA,CAAE,iBAAgB,CAClBwF,CAAAA,GAAkB7Y,CAAAA,CAAOE,CAAAA,CAAQ,KAAK,EACxC,CAAA,CAEC,QAAA,CAAAoc,CAAAA,CACH,EACAve,GAAAA,CAAC6d,EAAAA,CAAA,CACC,OAAA,CAASQ,EAAG,EAAA,CACZ,SAAA,CAAWA,CAAAA,CAAG,IAAA,CACd,YAAaA,CAAAA,CAAG,MAAA,CAChB,OAAA,CAAU/I,CAAAA,EAAM,CACdA,CAAAA,CAAE,eAAA,EAAgB,CAClBwF,CAAAA,GAAkB7Y,EAAOE,CAAAA,CAAQ,IAAI,EACvC,CAAA,CAEC,QAAA,CAAAqc,EACH,CAAA,CAAA,CACF,CAEJ,CAMA,SAASf,IAAY,CACnB,GAAM,CAAE,CAAA,CAAA5e,CAAE,CAAA,CAAIa,cAAAA,EAAe,CAE7B,OACEI,KAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iNACd,QAAA,CAAA,CAAAE,GAAAA,CAAC,QAAK,SAAA,CAAU,cAAA,CAAgB,QAAA,CAAAnB,CAAAA,CAAE,oBAAoB,CAAA,CAAE,CAAA,CACxDmB,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,kBAAA,CAAmB,QAAA,CAAA,GAAA,CAAC,CAAA,CACpCA,GAAAA,CAAC,QAAK,SAAA,CAAU,gBAAA,CAAkB,SAAAnB,CAAAA,CAAE,mBAAmB,EAAE,CAAA,CAAA,CAC3D,CAEJ,CAMA,SAASud,GAAiB,CACxB,MAAA,CAAAja,CAAAA,CACA,KAAA,CAAAF,EACA,eAAA,CAAA6Y,CACF,CAAA,CAQG,CACD,OACE9a,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,KAAM,CAAE,CAAA,CACpB,QAAA,CAAAA,GAAAA,CAACie,GAAA,CACC,MAAA,CAAQ9b,CAAAA,CACR,KAAA,CAAOF,EACP,eAAA,CAAiB6Y,CAAAA,CACjB,aAAA,CAAa,IAAA,CACb,YAAY,OAAA,CACd,CAAA,CACF,CAEJ,CAMA,SAASgB,GAAmB,CAC1B,KAAA,CAAA7Z,CAAAA,CACA,eAAA,CAAAsZ,EACA,IAAA,CAAAX,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,SAAAzZ,CACF,CAAA,CAMG,CACD,GAAM,CAAE,CAAA,CAAAvC,CAAE,EAAIa,cAAAA,EAAe,CAU7B,OACEI,IAAAA,CAAAkS,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAlS,KAAC2c,QAAAA,CAAA,CACC,IAAA,CAAM7B,CAAAA,CACN,cAAeC,CAAAA,CACf,EAAA,CAAG,QAAA,CACH,SAAA,CAAU,iIACV,OAAA,CAfmBvF,CAAAA,EAAwB,CAC/CA,CAAAA,CAAE,eAAA,GACGsF,CAAAA,GACHtF,CAAAA,CAAE,cAAA,EAAe,CACjBlU,IAAWa,CAAK,CAAA,EAEpB,CAAA,CAWO,QAAA,CAAA,CAAApD,EAAE,yBAAyB,CAAA,CAC5BmB,GAAAA,CAAC2d,EAAAA,CAAA,CAAiB,SAAA,CAAU,SAAA,CAAU,CAAA,CAAA,CACxC,CAAA,CACA7d,KAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,cACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,SAAU,EAAA,CACV,KAAA,CAAO,SACT,CAAA,CAEC,UAAAyb,CAAAA,CAAgB,GAAA,CAAE1c,EAAE,sBAAsB,CAAA,CAC3CmB,IAAC4d,EAAAA,CAAA,CAAW,MAAA,CAAQ3b,CAAAA,CAAM,OAAQ,CAAA,CAAA,CACpC,CAAA,CAAA,CACF,CAEJ,CAMA,SAASoa,EAAAA,CAAmB,CAC1B,MAAA,CAAAla,CAAAA,CACA,MAAAF,CAAAA,CACA,UAAA,CAAAwc,CAAAA,CACA,eAAA,CAAA3D,CACF,CAAA,CASG,CACD,IAAM3I,CAAAA,CAAM2H,GAAc3X,CAAM,CAAA,CAEhC,OACErC,IAAAA,CAAC,OAAI,KAAA,CAAO,CAAE,IAAA,CAAM,CAAE,EACpB,QAAA,CAAA,CAAAA,IAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,UAAU,6DAAA,CACV,OAAA,CAAUwV,CAAAA,EAAM,CACdA,EAAE,eAAA,EAAgB,CAClBmJ,CAAAA,GACF,EAEA,QAAA,CAAA,CAAAze,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,6DACb,QAAA,CAAAmC,CAAAA,CAAO,QAAA,GAAW,CAAC,GAAG,KAAA,EAASA,CAAAA,CAAO,QAAA,CACzC,CAAA,CACArC,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yCAAA,CACb,QAAA,CAAA,CAAAE,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iDAAA,CACb,QAAA,CAAA+Z,GAAc5H,CAAG,CAAA,CACpB,EACAnS,GAAAA,CAAC0e,aAAAA,CAAA,CAAc,SAAA,CAAU,0BAAA,CAA2B,CAAA,CAAA,CACtD,CAAA,CAAA,CACF,EACA1e,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,UAAW,EAAG,CAAA,CAC1B,QAAA,CAAAA,GAAAA,CAACie,GAAA,CACC,MAAA,CAAQ9b,EACR,KAAA,CAAOF,CAAAA,CACP,gBAAiB6Y,CAAAA,CACjB,WAAA,CAAY,QAAA,CACd,CAAA,CACF,GACF,CAEJ,CAMA,SAASiB,EAAAA,CAAqB,CAAE,UAAA,CAAA0C,CAAW,CAAA,CAA+B,CACxE,GAAM,CAAE,CAAE,EAAI/e,cAAAA,EAAe,CAE7B,OACEI,IAAAA,CAAAkS,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAlS,KAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,qHACV,KAAA,CAAO,CAAE,KAAA,CAAO,SAAU,EAC1B,OAAA,CAAUwV,CAAAA,EAAM,CACdA,CAAAA,CAAE,iBAAgB,CAClBmJ,CAAAA,GACF,CAAA,CAEA,UAAAze,GAAAA,CAAC2e,EAAAA,CAAA,CAAgB,SAAA,CAAU,UAAU,CAAA,CACpC,CAAA,CAAE,oBAAoB,CAAA,CAAA,CACzB,EACA3e,GAAAA,CAAC,KAAA,CAAA,EAAI,GACP,CAEJ,CAMA,SAAS2d,EAAAA,CAAiB,CAAE,SAAA,CAAAle,CAAU,EAA2B,CAC/D,OACEO,GAAAA,CAAC,KAAA,CAAA,CACC,QAAQ,WAAA,CACR,IAAA,CAAK,MAAA,CACL,KAAA,CAAM,6BACN,SAAA,CAAWP,CAAAA,CAEX,QAAA,CAAAO,GAAAA,CAAC,QACC,CAAA,CAAE,uBAAA,CACF,MAAA,CAAO,cAAA,CACP,YAAY,KAAA,CACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,QACjB,CAAA,CACF,CAEJ,CAEA,SAAS2e,GAAgB,CAAE,SAAA,CAAAlf,CAAU,CAAA,CAA2B,CAC9D,OACEO,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,KAAK,MAAA,CACL,KAAA,CAAM,4BAAA,CACN,SAAA,CAAWP,EAEX,QAAA,CAAAO,GAAAA,CAAC,MAAA,CAAA,CACC,CAAA,CAAE,uBACF,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,KAAA,CACZ,cAAc,OAAA,CACd,cAAA,CAAe,OAAA,CACjB,CAAA,CACF,CAEJ,CAMA,SAAS4d,EAAAA,CAAW,CAAE,OAAA7W,CAAO,CAAA,CAA+B,CAE1D,OACEjH,KAAC,MAAA,CAAA,CACC,SAAA,CAAU,oDACV,KAAA,CAJUiH,CAAAA,GAAW,aAAe,YAAA,CAAe,QAAA,CAMnD,QAAA,CAAA,CAAA/G,GAAAA,CAAC,QAAK,SAAA,CAAU,kBAAA,CAAmB,QAAA,CAAA,MAAA,CAAC,CAAA,CACnC+G,IAAW,YAAA,CACV/G,GAAAA,CAAC4e,cAAAA,CAAA,CAAe,UAAU,qBAAA,CAAsB,CAAA,CAEhD5e,IAAC6e,UAAAA,CAAA,CAAW,UAAU,qBAAA,CAAsB,CAAA,CAAA,CAEhD,CAEJ,CCnhCA,IAAMC,EAAAA,CAAK,GAAA,CACLC,EAAAA,CAAK,KACLC,EAAAA,CAAK,IAAA,CAELC,GAAa,CAAA,CAEbC,EAAAA,CAAgB,IAChBC,EAAAA,CAAgB,GAAA,CAEhBC,EAAAA,CAAiB,GAAA,CAEvB,SAASC,EAAAA,CAAeC,CAAAA,CAAuB,CAC7C,OAAIA,GAASN,EAAAA,CAAW,CAAA,CACpBM,CAAAA,EAASP,EAAAA,CAAW,EACpBO,CAAAA,EAASR,EAAAA,CAAW,CAAA,CACjB,CACT,CAEA,SAASS,EAAAA,CAAaD,CAAAA,CAAuB,CAC3C,OAAIA,CAAAA,EAASP,EAAAA,CAAWI,EAAAA,CACjBD,EACT,CAqBO,SAASM,EAAAA,CAAS,CACvB,MAAA,CAAAC,EACA,OAAA,CAAA9H,CAAAA,CAAU,MACV,WAAA,CAAA+H,CAAAA,CACA,SAAAte,CAAAA,CACA,eAAA,CAAA0Z,CAAAA,CACA,YAAA,CAAA6E,EACA,aAAA,CAAA9E,CAAAA,CACA,OAAA,CAAAE,CACF,EAAkB,CAChB,IAAM6E,CAAAA,CAAevJ,MAAAA,CAAuB,IAAI,CAAA,CAC1CwJ,CAAAA,CAAUxJ,MAAAA,CAA0B,IAAI,EACxC,CAAE,KAAA,CAAOyJ,CAAAA,CAAiB,CAAA,CAAG,OAAQC,CAAAA,CAAkB,CAAE,CAAA,CAC7DC,iBAAAA,CAAkB,CAAE,GAAA,CAAKJ,CAAa,CAAC,CAAA,CAEnCK,EAAcZ,EAAAA,CAAeS,CAAc,EAC3CI,CAAAA,CAAYX,EAAAA,CAAaO,CAAc,CAAA,CACvCK,CAAAA,CAAe,IAAA,CAAK,IAAA,CAAKV,EAAO,MAAA,CAASQ,CAAW,CAAA,EAAK,CAAA,CACzDG,EAAgB,CAACzI,CAAAA,EAAW8H,CAAAA,CAAO,MAAA,CAAS,EAC5CY,CAAAA,CACJF,CAAAA,EAAgBxI,CAAAA,CAAU,CAAA,CAAI,IAAMyI,CAAAA,CAAgB,CAAA,CAAI,CAAA,CAAA,CAEpDE,CAAAA,CAAc1gB,YACjB2Y,CAAAA,EAAkBA,CAAAA,CAAQ4H,CAAAA,CAC3B,CAACA,CAAY,CACf,CAAA,CAEMI,CAAAA,CAAe3gB,WAAAA,CAAY,SAAY,CAC3C8f,CAAAA,KACF,CAAA,CAAG,CAACA,CAAW,CAAC,CAAA,CAEVc,CAAAA,CAAiBC,iBAAAA,CAAkB,CACvC,WAAA,CAAAH,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,SAAUF,CAAAA,CACV,SAAA,CAAW,CACb,CAAC,EAEKK,CAAAA,CAAoB9gB,WAAAA,CAAY,IAAM,CAC1CigB,CAAAA,CAAQ,SAAS,WAAA,CAAY,CAAE,KAAA,CAAO,CAAA,CAAG,SAAU,QAAS,CAAC,EAC/D,CAAA,CAAG,EAAE,CAAA,CAEL,OACE/f,IAAAA,CAAC,OAAI,GAAA,CAAK8f,CAAAA,CAAc,UAAU,0BAAA,CAChC,QAAA,CAAA,CAAA5f,IAAC,OAAA,CAAA,CAAO,QAAA,CAAA,4GAAA,CAA6G,CAAA,CACpH+f,CAAAA,CAAkB,GACjB/f,GAAAA,CAAC2gB,IAAAA,CAAA,CACC,OAAA,CAASd,EACT,SAAA,CAAU,cAAA,CACV,KAAA,CAAO,CAAE,OAAQE,CAAgB,CAAA,CACjC,cAAA,CAAgBS,CAAAA,CAChB,aAAcI,EAAAA,CACd,QAAA,CAAUP,CAAAA,CACV,SAAA,CAAY9H,GACN6H,CAAAA,EAAiB7H,CAAAA,GAAU8H,CAAAA,CAAgB,CAAA,CACtCjB,IACoCc,CAAAA,CAAAA,CAG/C,SAAU,CACR,MAAA,CAAAT,EACA,WAAA,CAAAQ,CAAAA,CACA,aAAAE,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,aAAA,CAAAC,EACA,QAAA,CAAAjf,CAAAA,CACA,eAAA,CAAA0Z,CAAAA,CACA,aAAA6E,CAAAA,CACA,aAAA,CAAA9E,CAAAA,CACA,OAAA,CAAAE,EACA,aAAA,CAAe2F,CACjB,EACF,CAAA,CAAA,CAEJ,CAEJ,CAwBA,SAASE,EAAAA,CAAa,CACpB,KAAA,CAAArI,EACA,KAAA,CAAAsI,CAAAA,CACA,MAAA,CAAApB,CAAAA,CACA,YAAAQ,CAAAA,CACA,YAAA,CAAAE,CAAAA,CACA,aAAA,CAAAC,EACA,aAAA,CAAAC,CAAAA,CACA,SAAAjf,CAAAA,CACA,eAAA,CAAA0Z,EACA,YAAA,CAAA6E,CAAAA,CACA,aAAA,CAAA9E,CAAAA,CACA,QAAAE,CAAAA,CACA,aAAA,CAAA+F,CACF,CAAA,CAAwC,CACtC,GAAIV,CAAAA,EAAiB7H,CAAAA,GAAU8H,CAAAA,CAAgB,EAC7C,OACErgB,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO6gB,EACV,QAAA,CAAA7gB,GAAAA,CAAC+gB,EAAAA,CAAA,CAAa,cAAeD,CAAAA,CAAe,CAAA,CAC9C,CAAA,CAIJ,GAAIvI,GAAS4H,CAAAA,CACX,OACEngB,GAAAA,CAAC,KAAA,CAAA,CAAI,MAAO6gB,CAAAA,CAAO,SAAA,CAAU,uCAC3B,QAAA,CAAA7gB,GAAAA,CAACghB,QAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAA,CACrB,EAIJ,IAAMC,CAAAA,CAAW1I,CAAAA,CAAQ0H,CAAAA,CACnBiB,EAAYzB,CAAAA,CAAO,KAAA,CAAMwB,CAAAA,CAAUA,CAAAA,CAAWhB,CAAW,CAAA,CACzDkB,CAAAA,CAAalB,EAAciB,CAAAA,CAAU,MAAA,CAE3C,OACElhB,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO6gB,CAAAA,CACV,SAAA/gB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oBAAA,CACZ,UAAAohB,CAAAA,CAAU,GAAA,CAAI,CAACjf,CAAAA,CAAOpB,IACrBoB,CAAAA,EAAS,IAAA,CAAO,KACdjC,GAAAA,CAAC,KAAA,CAAA,CACC,UAAU,qBAAA,CAEV,KAAA,CAAO,CACL,OAAA,CAASif,GACT,SAAA,CAAW,CAAA,oDAAA,EAAuDpe,CAAAA,CAAI,EAAE,SAC1E,CAAA,CAEA,QAAA,CAAAb,GAAAA,CAAC2a,EAAAA,CAAA,CACC,KAAA,CAAO1Y,CAAAA,CACP,IAAA,CAAM0d,CAAAA,GAAe1d,CAAK,CAAA,CAC1B,aAAA,CAAe4Y,CAAAA,CACf,QAAA,CAAUzZ,EACV,eAAA,CAAiB0Z,CAAAA,CACjB,OAAA,CAASC,CAAAA,CACX,GAbK,CAAA,EAAGkG,CAAAA,CAAWpgB,CAAC,CAAA,CAAA,EAAIoB,EAAM,MAAM,CAAA,CAAA,EAAIA,EAAM,IAAI,CAAA,CAcpD,CAEJ,CAAA,CACCkf,CAAAA,CAAa,CAAA,EACZ,KAAA,CAAM,KAAK,CAAE,MAAA,CAAQA,CAAW,CAAC,EAAE,GAAA,CAAI,CAACvgB,CAAAA,CAAGC,CAAAA,GACzCb,IAAC,KAAA,CAAA,CAAwB,KAAA,CAAO,CAAE,IAAA,CAAM,EAAG,QAAA,CAAU,CAAE,CAAA,CAAA,CAA7C,CAAA,OAAA,EAAUa,CAAC,CAAA,CAAqC,CAC3D,CAAA,CAAA,CACL,CAAA,CACF,CAEJ,CAMA,SAASkgB,EAAAA,CAAa,CAAE,cAAAD,CAAc,CAAA,CAAmC,CACvE,GAAM,CAAE,CAAE,CAAA,CAAIphB,cAAAA,EAAe,CAE7B,OACEI,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+DAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iDAAA,CACb,QAAA,CAAA,CAAAE,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CAA2B,CAAA,CAC1CA,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sCAAA,CACb,QAAA,CAAA,CAAA,CAAE,yBAAyB,CAAA,CAC9B,CAAA,CACAA,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,0BAAA,CAA2B,CAAA,CAAA,CAC5C,CAAA,CAEAF,IAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,UAAU,+EAAA,CACV,OAAA,CAASghB,EAET,QAAA,CAAA,CAAA9gB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mCAAmC,CAAA,CACnDA,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAA,CAAA,CAAE,yBAAyB,CAAA,CAAE,CAAA,CAAA,CACtC,CAAA,CAAA,CACF,CAEJ,CC5LO,SAASohB,EAAAA,CAAa,CAC3B,gBAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CAAQ,GACR,MAAA,CAAA5U,CAAAA,CACA,OAAA,CAAA6U,CAAAA,CACA,SAAAC,CAAAA,CACA,MAAA,CAAAza,CAAAA,CACA,YAAA,CAAA0a,EACA,aAAA,CAAAC,CAAAA,CACA,UAAAC,CAAAA,CACA,YAAA,CAAAC,EACA,QAAA,CAAAxgB,CAAAA,CACA,eAAA,CAAA0Z,CAAAA,CACA,aAAA6E,CAAAA,CACA,aAAA,CAAA9E,CAAAA,CACA,OAAA,CAAAE,CACF,CAAA,CAAsB,CACpB,GAAM,CACJ,KAAM0E,CAAAA,CACN,OAAA,CAAA9H,CAAAA,CACA,SAAA,CAAAO,EACA,UAAA,CAAAX,CACF,CAAA,CAAIL,EAAAA,CAAkB,CACpB,gBAAA,CAAAmK,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,OAAA5U,CAAAA,CACA,OAAA,CAAA6U,CAAAA,CACA,QAAA,CAAAC,EACA,MAAA,CAAAza,CAAAA,CACA,aAAA0a,CAAAA,CACA,aAAA,CAAAC,EACA,SAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CACF,CAAC,CAAA,CAED,OAAIrK,CAAAA,CACKvX,GAAAA,CAACqY,GAAA,CAAe,KAAA,CAAO,EAAA,CAAmB,CAAA,CAIjDrY,IAACwf,EAAAA,CAAA,CACC,OAAQC,CAAAA,CACR,OAAA,CAAS9H,EACT,WAAA,CAAaO,CAAAA,CACb,QAAA,CAAU9W,CAAAA,CACV,gBAAiB0Z,CAAAA,CACjB,YAAA,CAAc6E,CAAAA,CACd,aAAA,CAAe9E,EACf,OAAA,CAASE,CAAAA,CACX,CAEJ,CCtDO,SAAS8G,GAAW,CACzB,QAAA,CAAAzgB,CAAAA,CACA,eAAA,CAAA0Z,EACA,YAAA,CAAA6E,CAAAA,CACA,aAAA,CAAA9E,CAAAA,CACA,QAAAE,CACF,CAAA,CAAoB,CAClB,GAAM,CAACsG,CAAAA,CAAkBS,CAAmB,CAAA,CAAIvgB,QAAAA,CAA2B,CACzE,YAAA,CAAc,IAAA,CACd,OAAA,CAAS,IACX,CAAC,CAAA,CAEK,CAACwgB,CAAAA,CAAaC,CAAc,EAChCzgB,QAAAA,CAA4BqS,EAAoB,CAAA,CAE5C,CACJ,OAAQqO,CAAAA,CACR,MAAA,CAAQC,EACR,OAAA,CAASC,CACX,EAAIhR,aAAAA,EAAc,CAEZ,CAAE,MAAA,CAAQiR,CAAe,CAAA,CAAIC,aAAAA,CACjCnP,EACF,CAAA,CAEMoP,EAAsB1iB,WAAAA,CAC1B,CAACqC,CAAAA,CAAqBE,CAAAA,CAAuBoF,IAAuB,CAClEuT,CAAAA,GAAkB7Y,EAAOE,CAAAA,CAAQoF,CAAI,EACrC6a,CAAAA,CAAe,CACb,MAAA,CAAQ,CAAE,MAAAngB,CAAAA,CAAO,MAAA,CAAAE,CAAAA,CAAQ,cAAA,CAAgBoF,CAAK,CAChD,CAAC,EACH,CAAA,CACA,CAACuT,CAAAA,CAAiBsH,CAAc,CAClC,CAAA,CAEM1gB,CAAAA,CAAuB9B,YAAa2iB,CAAAA,EAAgC,CACxET,CAAAA,CAAoBS,CAAS,EAC/B,CAAA,CAAG,EAAE,CAAA,CAECC,EAAmB5iB,WAAAA,CAAa8F,CAAAA,EAAuB,CAC3Dsc,CAAAA,CAAgBzN,IAAU,CAAE,GAAGA,CAAAA,CAAM,UAAA,CAAY7O,CAAO,CAAA,CAAE,EAC5D,CAAA,CAAG,EAAE,CAAA,CAEC+c,CAAAA,CAAsB7iB,WAAAA,CAAa8iB,CAAAA,EAAiB,CACxDV,CAAAA,CAAgBzN,CAAAA,GAAU,CAAE,GAAGA,EAAM,OAAA,CAASmO,CAAI,EAAE,EACtD,CAAA,CAAG,EAAE,CAAA,CAECC,CAAAA,CAAqB/iB,WAAAA,CAAakU,GAA6B,CACnEkO,CAAAA,CAAelO,CAAK,EACtB,EAAG,EAAE,CAAA,CAEC8O,CAAAA,CAAS1e,QACb,IAAMqR,EAAAA,CAAawM,CAAAA,CAAY,UAAU,EAAE,OAAA,CAC3C,CAACA,CAAAA,CAAY,UAAU,CACzB,CAAA,CAEM7L,CAAAA,CAAchS,OAAAA,CAClB,IAAM2P,GAAmBkO,CAAW,CAAA,CACpC,CAACA,CAAW,CACd,CAAA,CAEMc,CAAAA,CAAU3e,QACd,IACElE,GAAAA,CAAC4V,GAAA,CACC,UAAA,CAAYmM,CAAAA,CAAY,UAAA,CACxB,aAAcS,CAAAA,CACd,OAAA,CAAST,CAAAA,CAAY,OAAA,CACrB,gBAAiBU,CAAAA,CACjB,aAAA,CAAeP,CAAAA,CACf,WAAA,CAAahM,EACf,CAAA,CAEF,CACE6L,CAAAA,CAAY,UAAA,CACZA,EAAY,OAAA,CACZ7L,CAAAA,CACAsM,CAAAA,CACAC,CAAAA,CACAP,CACF,CACF,CAAA,CAEA,OACEpiB,IAAAA,CAAC,OAAI,SAAA,CAAU,4DAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAACmB,GAAA,CAAiB,QAAA,CAAUO,EAAsB,QAAA,CAAUmhB,CAAAA,CAAS,EAErE7iB,GAAAA,CAAC+T,EAAAA,CAAA,CACC,MAAA,CAAQkO,EACR,OAAA,CAASE,CAAAA,CACT,KAAA,CAAOJ,CAAAA,CACP,SAAUY,CAAAA,CACZ,CAAA,CAEA3iB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gBAAA,CACb,QAAA,CAAAA,IAACohB,EAAAA,CAAA,CACC,iBAAkBC,CAAAA,CAClB,OAAA,CAASuB,CAAAA,CACT,QAAA,CAAUb,EAAY,OAAA,CACtB,MAAA,CAAQA,CAAAA,CAAY,MAAA,CACpB,cAAeA,CAAAA,CAAY,aAAA,CAC3B,SAAA,CAAWA,CAAAA,CAAY,UACvB,YAAA,CAAcA,CAAAA,CAAY,aAC1B,QAAA,CAAU3gB,CAAAA,CACV,gBAAiBkhB,CAAAA,CACjB,YAAA,CAAc3C,CAAAA,CACd,aAAA,CAAe9E,EACf,OAAA,CAASE,CAAAA,CACX,CAAA,CACF,CAAA,CAEA/a,IAACmT,EAAAA,CAAA,EAAkB,CAAA,CAAA,CACrB,CAEJ,CClKA,IAAM2P,GAAa,EAAA,CACbC,EAAAA,CAAgB,EAAA,CAChBC,EAAAA,CAAiB,IACjBC,EAAAA,CAAcD,EAAAA,CAAiBD,EAAAA,CAoB9B,SAASG,GAAoB,CAClC,KAAA,CAAAjhB,CAAAA,CACA,aAAA,CAAAkhB,EACA,aAAA,CAAAC,CACF,CAAA,CAA6B,CAC3B,GAAM,CAAE,CAAA,CAAAvkB,CAAE,CAAA,CAAIa,gBAAe,CACvB,CAAC2jB,CAAAA,CAAWC,CAAY,EAAI/hB,QAAAA,CAAsB,WAAW,EAE7DgiB,CAAAA,CAAcrf,OAAAA,CAClB,IAAMjC,CAAAA,CAAM,OAAA,EAAS,GAAA,CAAKuY,CAAAA,EAAMA,EAAE,IAAI,CAAA,EAAK,EAAC,CAC5C,CAACvY,CAAAA,CAAM,OAAO,CAChB,CAAA,CAEM,CAAE,IAAA,CAAM+H,CAAc,EAAIE,YAAAA,CAAa,CAC3C,OAAQjI,CAAAA,CAAM,MAAA,CACd,IAAA,CAAMkhB,CAAAA,EAAiB,EACzB,CAAC,CAAA,CACKK,CAAAA,CAAiBtf,OAAAA,CAAQ,IACzB,CAAC8F,CAAAA,EAAe,SAAA,EAAa,CAACmZ,EAAsB,CAAA,CACpDI,CAAAA,CAAY,SAAW,CAAA,CAAUvZ,CAAAA,CAAc,UAAU,MAAA,CACtDA,CAAAA,CAAc,SAAA,CAAU,MAAA,CAC5BI,GAAMA,CAAAA,CAAE,MAAA,EAAUmZ,CAAAA,CAAY,QAAA,CAASnZ,EAAE,MAAA,CAAO,IAAI,CACvD,CAAA,CAAE,OACD,CAACJ,CAAAA,EAAe,SAAA,CAAWuZ,CAAAA,CAAaJ,CAAa,CAAC,CAAA,CAOnDM,CAAAA,CAA8C,CAClD,CAAE,GAAA,CAAK,WAAA,CAAa,KAAA,CALpBD,CAAAA,CAAiB,EACb,CAAA,EAAG3kB,CAAAA,CAAE,yBAAyB,CAAC,KAAK2kB,CAAc,CAAA,CAAA,CAAA,CAClD3kB,EAAE,yBAAyB,CAGW,EAC1C,CAAE,GAAA,CAAK,QAAA,CAAU,KAAA,CAAOA,EAAE,0BAA0B,CAAE,CAAA,CACtD,CAAE,IAAK,QAAA,CAAU,KAAA,CAAOA,CAAAA,CAAE,4BAA4B,CAAE,CAC1D,CAAA,CAEA,OACEiB,IAAAA,CAAC,OAAI,SAAA,CAAU,yCAAA,CAEb,QAAA,CAAA,CAAAE,GAAAA,CAAC,OAAI,SAAA,CAAU,kDAAA,CACZ,QAAA,CAAAyjB,CAAAA,CAAK,IAAKC,CAAAA,EACT1jB,GAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,SACL,OAAA,CAAS,IAAMsjB,EAAaI,CAAAA,CAAI,GAAG,EACnC,SAAA,CAAW3jB,IAAAA,CACT,gEAAA,CACAsjB,CAAAA,GAAcK,EAAI,GAAA,CACd,2CAAA,CACA,oCACN,CAAA,CAEC,SAAAA,CAAAA,CAAI,KAAA,CAAA,CAVAA,CAAAA,CAAI,GAWX,CACD,CAAA,CACH,CAAA,CAGEP,CAAAA,CAQArjB,IAAAA,CAAC,OAAI,KAAA,CAAO,CAAE,MAAA,CAAQkjB,EAAe,EAClC,QAAA,CAAA,CAAAK,CAAAA,GAAc,WAAA,EACbrjB,GAAAA,CAAC2jB,GAAA,CACC,MAAA,CAAQ1hB,CAAAA,CAAM,MAAA,CACd,cAAekhB,CAAAA,CACf,WAAA,CAAaI,EACf,CAAA,CAEDF,CAAAA,GAAc,UACbrjB,GAAAA,CAAC4jB,EAAAA,CAAA,CACC,MAAA,CAAQ3hB,EAAM,MAAA,CACd,aAAA,CAAekhB,CAAAA,CACf,WAAA,CAAaI,EACb,aAAA,CAAeH,CAAAA,CACjB,CAAA,CAEDC,CAAAA,GAAc,UACbrjB,GAAAA,CAAC6jB,EAAAA,CAAA,CAAU,MAAA,CAAQ5hB,CAAAA,CAAM,OAAQ,aAAA,CAAekhB,CAAAA,CAAe,CAAA,CAAA,CAEnE,CAAA,CA1BAnjB,IAAC,KAAA,CAAA,CACC,SAAA,CAAU,uDAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAQgjB,EAAe,CAAA,CAE/B,QAAA,CAAAnkB,EAAE,6BAA6B,CAAA,CAClC,GAuBJ,CAEJ,CAMA,SAAS8kB,EAAAA,CAAa,CACpB,MAAA,CAAA5c,CAAAA,CACA,cAAAoc,CAAAA,CACA,WAAA,CAAAI,CACF,CAAA,CAIG,CACD,GAAM,CAAE,CAAA,CAAA1kB,CAAE,EAAIa,cAAAA,EAAe,CACvB,CAAE,IAAA,CAAAqY,EAAM,SAAA,CAAAT,CAAU,CAAA,CAAIpN,YAAAA,CAAa,CACvC,MAAA,CAAAnD,CAAAA,CACA,IAAA,CAAMoc,CACR,CAAC,CAAA,CAEKW,CAAAA,CAAY5f,OAAAA,CAAQ,IACnB6T,GAAM,SAAA,CACPwL,CAAAA,CAAY,SAAW,CAAA,CAAUxL,CAAAA,CAAK,UACnCA,CAAAA,CAAK,SAAA,CAAU,MAAA,CACnB3N,CAAAA,EAAMA,EAAE,MAAA,EAAUmZ,CAAAA,CAAY,QAAA,CAASnZ,CAAAA,CAAE,OAAO,IAAI,CACvD,CAAA,CAJ6B,GAK5B,CAAC2N,CAAAA,EAAM,SAAA,CAAWwL,CAAW,CAAC,CAAA,CAEjC,OAAIjM,CAAAA,CAAkBtX,GAAAA,CAAC+jB,GAAA,EAAY,CAAA,CAE/BD,CAAAA,CAAU,MAAA,GAAW,EAChB9jB,GAAAA,CAACgkB,EAAAA,CAAA,CAAW,OAAA,CAASnlB,EAAE,yBAAyB,CAAA,CAAG,EAI1DiB,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,sBAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,UAAU,wEAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAQijB,EAAc,CAAA,CAE/B,QAAA,CAAA,CAAA/iB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,yCAAA,CACZ,QAAA,CAAAnB,CAAAA,CAAE,yBAAyB,EAC9B,CAAA,CACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2CACZ,QAAA,CAAAnB,CAAAA,CAAE,6BAA6B,CAAA,CAClC,EACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0CAAA,CACZ,SAAAnB,CAAAA,CAAE,yBAAyB,EAC9B,CAAA,CACAmB,GAAAA,CAAC,OAAI,SAAA,CAAU,0CAAA,CACZ,QAAA,CAAAnB,CAAAA,CAAE,4BAA4B,CAAA,CACjC,CAAA,CACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,0CAAA,CACZ,QAAA,CAAAnB,CAAAA,CAAE,6BAA6B,EAClC,CAAA,CACAmB,GAAAA,CAAC,OAAI,SAAA,CAAU,8CAAA,CACZ,SAAAnB,CAAAA,CAAE,uBAAuB,CAAA,CAC5B,CAAA,CACAmB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0CAAA,CACZ,QAAA,CAAAnB,EAAE,iCAAiC,CAAA,CACtC,CAAA,CACAmB,GAAAA,CAAC,OAAI,SAAA,CAAU,8CAAA,CACZ,SAAAnB,CAAAA,CAAE,iCAAiC,EACtC,CAAA,CACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAgB,CAAA,CAAA,CACjC,CAAA,CAEAA,GAAAA,CAAC2gB,IAAAA,CAAA,CACC,KAAA,CAAO,CAAE,MAAA,CAAQsC,EAAY,EAC7B,YAAA,CAAcgB,EAAAA,CACd,QAAA,CAAUH,CAAAA,CAAU,OACpB,SAAA,CAAWhB,EAAAA,CACX,QAAA,CAAU,CACR,UAAAgB,CAAAA,CACA,UAAA,CAAYjlB,CAAAA,CAAE,yBAAyB,CACzC,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAOA,SAASolB,EAAAA,CAAmB,CAC1B,MAAA1L,CAAAA,CACA,KAAA,CAAAsI,EACA,SAAA,CAAAiD,CAAAA,CACA,UAAA,CAAAI,CACF,EAAuC,CACrC,IAAMC,CAAAA,CAAWL,CAAAA,CAAUvL,CAAK,CAAA,CAChC,GAAI,CAAC4L,CAAAA,CAAU,OAAO,IAAA,CAEtB,IAAMC,CAAAA,CAAMD,CAAAA,CAAS,KAAO,CAAA,CACtBE,CAAAA,CAAaF,CAAAA,CAAS,WAAA,EAAe,EACrCG,CAAAA,CAAWH,CAAAA,CAAS,SAAA,EAAa,CAAA,CACjCI,EAAeJ,CAAAA,CAAS,aAAA,EAAiB,CAAA,CAEzCK,CAAAA,CACJJ,EAAM,CAAA,CAAI,cAAA,CAAiBA,EAAM,CAAA,CAAI,aAAA,CAAgB,kBACjDK,CAAAA,CAAUL,CAAAA,CAAM,CAAA,CAAI,GAAA,CAAM,GAE1BM,CAAAA,CACJP,CAAAA,CAAS,MAAA,EAAQ,QAAA,GAAW,CAAC,CAAA,EAAG,KAAA,EAASA,CAAAA,CAAS,MAAA,EAAQ,UAAY,QAAA,CAClE5S,CAAAA,CAAY4S,CAAAA,CAAS,IAAA,CACrBQ,EAAgBR,CAAAA,CAAS,IAAA,CACzB5e,CAAAA,CAAQ4e,CAAAA,CAAS,KAAOI,CAAAA,CACxBK,CAAAA,CAAgBT,CAAAA,CAAS,MAAA,EAAQ,OACnCU,EAAAA,CAAqBV,CAAAA,CAAS,MAAA,CAAO,MAAM,EAC3C,QAAA,CAEJ,OACErkB,KAAC,KAAA,CAAA,CACC,KAAA,CAAO+gB,EACP,SAAA,CAAU,uGAAA,CAEV,QAAA,CAAA,CAAA7gB,GAAAA,CAAC,OAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAAF,IAAAA,CAAC,OAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,QAAK,SAAA,CAAU,sCAAA,CACb,SAAA0kB,CAAAA,CACH,CAAA,CACA1kB,IAAC,MAAA,CAAA,CACC,SAAA,CAAWD,IAAAA,CACT,yBAAA,CACAwR,EAAU,WAAA,EAAY,GAAM,KAAA,CACxB,cAAA,CACA,gBACN,CAAA,CAEC,QAAA,CAAAA,CAAAA,CACH,CAAA,CAAA,CACF,EACF,CAAA,CACAvR,GAAAA,CAAC,OAAI,SAAA,CAAU,oEAAA,CACZ,SAAAmkB,CAAAA,CAAS,IAAA,CACZ,CAAA,CACArkB,IAAAA,CAAC,OAAI,SAAA,CAAU,oEAAA,CAAqE,QAAA,CAAA,CAAA,GAAA,CAChFyF,CAAAA,CAAM,QAAQ,CAAC,CAAA,CAAA,CACnB,CAAA,CACAvF,GAAAA,CAAC,OAAI,SAAA,CAAU,oEAAA,CACZ,QAAA,CAAA8kB,EAAAA,CAAYR,CAAQ,CAAA,CACvB,CAAA,CACAtkB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,oEAAA,CACZ,QAAA,CAAA8kB,EAAAA,CAAYP,CAAY,EAC3B,CAAA,CACAzkB,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWC,KACT,wDAAA,CACAykB,CACF,EAEC,QAAA,CAAA,CAAAC,CAAAA,CAAQ,IAAE,IAAA,CAAK,GAAA,CAAIL,CAAG,CAAA,CAAE,QAAQ,CAAC,CAAA,CAClCtkB,IAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,+BAAA,CAAgC,QAAA,CAAA,CAAA,GAAA,CAC5C2kB,CAAAA,CACDJ,CAAAA,CAAW,QAAQ,CAAC,CAAA,CAAE,MACzB,CAAA,CAAA,CACF,CAAA,CACAvkB,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oEAAA,CAAqE,QAAA,CAAA,CAAA,GAAA,CAChF6kB,EAAc,OAAA,CAAQ,CAAC,CAAA,CAAA,CAC3B,CAAA,CACA3kB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CACZ,QAAA,CAAA4kB,EACH,CAAA,CACA5kB,GAAAA,CAAC,OAAI,SAAA,CAAU,0BAAA,CACb,SAAAA,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,UAAU,iJAAA,CAET,QAAA,CAAAkkB,CAAAA,CACH,CAAA,CACF,GACF,CAEJ,CAMA,SAASN,EAAAA,CAAU,CACjB,MAAA,CAAA7c,CAAAA,CACA,aAAA,CAAAoc,CAAAA,CACA,YAAAI,CAAAA,CACA,aAAA,CAAAH,CACF,CAAA,CAKG,CACD,GAAM,CAAE,CAAA,CAAAvkB,CAAE,EAAIa,cAAAA,EAAe,CACvB,CAAE,IAAA,CAAAqY,EAAM,SAAA,CAAAT,CAAAA,CAAW,cAAAM,CAAAA,CAAe,WAAA,CAAAmN,CAAY,CAAA,CAAIC,iBAAAA,CAAkB,CACxE,MAAA,CAAAje,EACA,cAAA,CAAgBoc,CAClB,CAAC,CAAA,CAEK8B,EAAiBC,cAAAA,EAAe,CAEhCC,CAAAA,CAASjhB,OAAAA,CAAQ,IAAM,CAC3B,IAAMkhB,EAAWrN,CAAAA,EAAM,KAAA,EAAO,QAAS3N,CAAAA,EAAMA,CAAAA,CAAE,KAAK,CAAA,EAAK,EAAC,CACpDib,CAAAA,CAAe,IAAI,GAAA,CAAI,CAAC,MAAA,CAAQ,MAAA,CAAQ,WAAA,CAAa,SAAS,CAAC,CAAA,CACjEC,CAAAA,CAAWF,EAAS,MAAA,CAAQlc,CAAAA,EAAMmc,EAAa,GAAA,CAAInc,CAAAA,CAAE,MAAM,CAAC,EAChE,OAAIqa,CAAAA,CAAY,MAAA,CAAS,CAAA,GACvB+B,EAAWA,CAAAA,CAAS,MAAA,CACjBpc,CAAAA,EAAMA,CAAAA,CAAE,WAAaqa,CAAAA,CAAY,QAAA,CAASra,CAAAA,CAAE,SAAS,CACxD,CAAA,CAAA,CAEKoc,CACT,CAAA,CAAG,CAACvN,GAAM,KAAA,CAAOwL,CAAW,CAAC,CAAA,CAEvBgC,EAAe3lB,WAAAA,CAClB4lB,CAAAA,EAAwB,CACnBpC,CAAAA,CACFA,EAAcoC,CAAAA,CAAM,EAAE,EAEtBP,CAAAA,CAAe,MAAA,CAAO,CAAE,MAAA,CAAQO,CAAAA,CAAM,MAAA,CAAQ,EAAA,CAAIA,EAAM,EAAG,CAAC,EAEhE,CAAA,CACA,CAACpC,CAAAA,CAAe6B,CAAc,CAChC,CAAA,CAEMQ,EAAYN,CAAAA,CAAO,MAAA,CACnBO,CAAAA,CAAWD,CAAAA,EAAaV,EAAc,CAAA,CAAI,CAAA,CAAA,CAE1CzE,CAAAA,CAAc1gB,WAAAA,CACjB2Y,GAAkBA,CAAAA,CAAQkN,CAAAA,CAC3B,CAACA,CAAS,CACZ,CAAA,CAEMlF,CAAAA,CAAe3gB,WAAAA,CAAY,SAAY,CAC3C,MAAMgY,CAAAA,GACR,CAAA,CAAG,CAACA,CAAa,CAAC,CAAA,CAEZ4I,CAAAA,CAAiBC,iBAAAA,CAAkB,CACvC,WAAA,CAAAH,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,SAAAmF,CAAAA,CACA,SAAA,CAAW,CACb,CAAC,EAED,OAAIpO,CAAAA,CAAkBtX,GAAAA,CAAC+jB,EAAAA,CAAA,EAAY,CAAA,CAE/BoB,CAAAA,CAAO,MAAA,GAAW,CAAA,EAAK,CAACJ,CAAAA,CACnB/kB,GAAAA,CAACgkB,EAAAA,CAAA,CAAW,QAASnlB,CAAAA,CAAE,0BAA0B,CAAA,CAAG,CAAA,CAI3DiB,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,OACC,SAAA,CAAU,wEAAA,CACV,KAAA,CAAO,CAAE,OAAQijB,EAAc,CAAA,CAE/B,QAAA,CAAA,CAAA/iB,GAAAA,CAAC,OAAI,SAAA,CAAU,oBAAA,CAAsB,QAAA,CAAAnB,CAAAA,CAAE,yBAAyB,CAAA,CAAE,CAAA,CAClEmB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAe,QAAA,CAAAnB,CAAAA,CAAE,4BAA4B,CAAA,CAAE,EAC9DmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,aAAA,CAAe,SAAAnB,CAAAA,CAAE,yBAAyB,CAAA,CAAE,CAAA,CAC3DmB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBACZ,QAAA,CAAAnB,CAAAA,CAAE,0BAA0B,CAAA,CAC/B,CAAA,CACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wBAAA,CACZ,QAAA,CAAAnB,CAAAA,CAAE,2BAA2B,EAChC,CAAA,CACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBACZ,QAAA,CAAAnB,CAAAA,CAAE,2BAA2B,CAAA,CAChC,EACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CAAgB,GACjC,CAAA,CAEAA,GAAAA,CAAC2gB,IAAAA,CAAA,CACC,MAAO,CAAE,MAAA,CAAQsC,EAAY,CAAA,CAC7B,eAAgBzC,CAAAA,CAChB,YAAA,CAAcmF,GACd,QAAA,CAAUD,CAAAA,CACV,UAAW5C,EAAAA,CACX,QAAA,CAAU,CACR,MAAA,CAAAqC,EACA,SAAA,CAAAM,CAAAA,CACA,QAAA,CAAUF,CAAAA,CACV,aAAcN,CAAAA,CAAe,SAAA,CAC7B,WAAA,CAAapmB,CAAAA,CAAE,2BAA2B,CAC5C,CAAA,CACF,GACF,CAEJ,CAUA,SAAS8mB,EAAAA,CAAgB,CACvB,KAAA,CAAApN,CAAAA,CACA,MAAAsI,CAAAA,CACA,MAAA,CAAAsE,CAAAA,CACA,SAAA,CAAAM,EACA,QAAA,CAAAG,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,YAAAC,CACF,CAAA,CAAoC,CAClC,GAAIvN,CAAAA,EAASkN,EACX,OACEzlB,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO6gB,EAAO,SAAA,CAAU,kCAAA,CAC3B,QAAA,CAAA7gB,GAAAA,CAACghB,QAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAA,CACrB,EAIJ,IAAMwE,CAAAA,CAAQL,CAAAA,CAAO5M,CAAK,EAC1B,GAAI,CAACiN,CAAAA,CAAO,OAAO,KAEnB,IAAMO,CAAAA,CAAQP,CAAAA,CAAM,IAAA,GAAS,MAE7B,OACE1lB,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO+gB,EACP,SAAA,CAAU,gEAAA,CAEV,UAAA7gB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,oBAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CACC,UAAWD,IAAAA,CACT,4DAAA,CACAgmB,CAAAA,CAAQ,4BAAA,CAA+B,0BACzC,CAAA,CAEC,QAAA,CAAAP,CAAAA,CAAM,IAAA,CACT,EACF,CAAA,CACAxlB,GAAAA,CAAC,OAAI,SAAA,CAAU,wCAAA,CACZ,SAAAwlB,CAAAA,CAAM,OAAA,EAAW,QAAA,CACpB,CAAA,CACAxlB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qCAAA,CACZ,QAAA,CAAAwlB,EAAM,UAAA,EAAc,OAAA,CACvB,CAAA,CACAxlB,GAAAA,CAAC,OAAI,SAAA,CAAU,kDAAA,CACZ,SAAAwlB,CAAAA,CAAM,KAAA,CAAQV,GAAY,UAAA,CAAWU,CAAAA,CAAM,KAAK,CAAC,EAAI,QAAA,CACxD,CAAA,CACA1lB,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,kDAAA,CACZ,QAAA,CAAA,CAAA0lB,CAAAA,CAAM,YAAA,EAAgB,IAAI,GAAA,CAAEA,CAAAA,CAAM,aAAA,EAAiB,QAAA,CAAA,CACtD,EACAxlB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oBAAA,CACb,SAAAA,GAAAA,CAACgmB,EAAAA,CAAA,CAAiB,MAAA,CAAQR,EAAM,MAAA,CAAQ,CAAA,CAC1C,CAAA,CACAxlB,GAAAA,CAAC,OAAI,SAAA,CAAU,0BAAA,CACb,SAAAA,GAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,OAAA,CAAS,IAAM4lB,CAAAA,CAASJ,CAAK,CAAA,CAC7B,QAAA,CAAUK,CAAAA,CACV,SAAA,CAAU,oGAET,QAAA,CAAAA,CAAAA,CAAe7lB,GAAAA,CAACghB,OAAAA,CAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAA,CAAK8E,CAAAA,CAC1C,EACF,CAAA,CAAA,CACF,CAEJ,CAEA,SAASE,GAAiB,CAAE,MAAA,CAAAtZ,CAAO,CAAA,CAA4B,CAY7D,OACE1M,GAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAWD,KACT,uEAAA,CAdmC,CACvC,KAAM,4BAAA,CACN,IAAA,CAAM,6BACN,SAAA,CAAW,4BAAA,CACX,OAAA,CAAS,4BAAA,CACT,QAAS,4BAAA,CACT,SAAA,CAAW,4BAAA,CACX,MAAA,CAAQ,2BACR,OAAA,CAAS,4BACX,CAAA,CAMe2M,CAAM,GAAK,4BACtB,CAAA,CAEC,QAAA,CAAAA,CAAAA,CACH,CAEJ,CAMA,SAASmX,EAAAA,CAAU,CACjB,OAAA9c,CAAAA,CACA,aAAA,CAAAoc,CACF,CAAA,CAGG,CACD,GAAM,CAAE,CAAA,CAAAtkB,CAAE,EAAIa,cAAAA,EAAe,CACvB,CAAE,IAAA,CAAAqY,CAAAA,CAAM,UAAAT,CAAAA,CAAW,aAAA,CAAAM,CAAAA,CAAe,WAAA,CAAAmN,CAAY,CAAA,CAAIkB,iBAAAA,CAAkB,CACxE,MAAA,CAAAlf,EACA,MAAA,CAAQoc,CAAAA,CACR,KAAA,CAAO,EACT,CAAC,CAAA,CAEK+C,CAAAA,CAAShiB,QACb,IAAM6T,CAAAA,EAAM,OAAO,OAAA,CAAS3N,CAAAA,EAAMA,CAAAA,CAAE,KAAK,GAAK,EAAC,CAC/C,CAAC2N,CAAAA,EAAM,KAAK,CACd,CAAA,CAEM0N,CAAAA,CAAYS,CAAAA,CAAO,OACnBR,CAAAA,CAAWD,CAAAA,EAAaV,EAAc,CAAA,CAAI,CAAA,CAAA,CAE1CzE,EAAc1gB,WAAAA,CACjB2Y,CAAAA,EAAkBA,CAAAA,CAAQkN,CAAAA,CAC3B,CAACA,CAAS,CACZ,CAAA,CAEMlF,CAAAA,CAAe3gB,YAAY,SAAY,CAC3C,MAAMgY,CAAAA,GACR,CAAA,CAAG,CAACA,CAAa,CAAC,EAEZ4I,CAAAA,CAAiBC,iBAAAA,CAAkB,CACvC,WAAA,CAAAH,EACA,YAAA,CAAAC,CAAAA,CACA,QAAA,CAAAmF,CAAAA,CACA,UAAW,CACb,CAAC,CAAA,CAED,OAAIpO,EAAkBtX,GAAAA,CAAC+jB,EAAAA,CAAA,EAAY,CAAA,CAE/BmC,CAAAA,CAAO,SAAW,CAAA,EAAK,CAACnB,CAAAA,CACnB/kB,GAAAA,CAACgkB,GAAA,CAAW,OAAA,CAASnlB,CAAAA,CAAE,4BAA4B,EAAG,CAAA,CAI7DiB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,OACC,SAAA,CAAU,wEAAA,CACV,MAAO,CAAE,MAAA,CAAQijB,EAAc,CAAA,CAE/B,UAAA/iB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oBAAA,CACZ,SAAAnB,CAAAA,CAAE,2BAA2B,CAAA,CAChC,CAAA,CACAmB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAe,QAAA,CAAAnB,CAAAA,CAAE,8BAA8B,CAAA,CAAE,CAAA,CAChEmB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wBAAA,CACZ,QAAA,CAAAnB,CAAAA,CAAE,4BAA4B,EACjC,CAAA,CACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBACZ,QAAA,CAAAnB,CAAAA,CAAE,0BAA0B,CAAA,CAC/B,EACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CACZ,SAAAnB,CAAAA,CAAE,4BAA4B,CAAA,CACjC,CAAA,CACAmB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAAA,CACZ,QAAA,CAAAnB,EAAE,2BAA2B,CAAA,CAChC,GACF,CAAA,CAEAmB,GAAAA,CAAC2gB,KAAA,CACC,KAAA,CAAO,CAAE,MAAA,CAAQsC,EAAY,CAAA,CAC7B,cAAA,CAAgBzC,CAAAA,CAChB,YAAA,CAAc2F,GACd,QAAA,CAAUT,CAAAA,CACV,SAAA,CAAW5C,EAAAA,CACX,SAAU,CAAE,MAAA,CAAAoD,EAAQ,SAAA,CAAAT,CAAU,EAChC,CAAA,CAAA,CACF,CAEJ,CAOA,SAASU,GAAgB,CACvB,KAAA,CAAA5N,CAAAA,CACA,KAAA,CAAAsI,EACA,MAAA,CAAAqF,CAAAA,CACA,SAAA,CAAAT,CACF,EAAoC,CAClC,GAAIlN,GAASkN,CAAAA,CACX,OACEzlB,IAAC,KAAA,CAAA,CAAI,KAAA,CAAO6gB,CAAAA,CAAO,SAAA,CAAU,mCAC3B,QAAA,CAAA7gB,GAAAA,CAACghB,OAAAA,CAAA,CAAQ,KAAK,IAAA,CAAK,CAAA,CACrB,CAAA,CAIJ,IAAMoF,EAAQF,CAAAA,CAAO3N,CAAK,CAAA,CAC1B,GAAI,CAAC6N,CAAAA,CAAO,OAAO,IAAA,CAEnB,IAAML,EAAQK,CAAAA,CAAM,IAAA,EAAM,WAAA,EAAY,GAAM,MACtCC,CAAAA,CAAUC,EAAAA,CAAgBF,CAAAA,CAAM,SAAS,EACzClY,CAAAA,CAAQkY,CAAAA,CAAM,OAAS,CAAA,CACvBG,CAAAA,CAAUH,EAAM,QAAA,EAAY,CAAA,CAElC,OACEtmB,IAAAA,CAAC,OACC,KAAA,CAAO+gB,CAAAA,CACP,SAAA,CAAU,gEAAA,CAEV,UAAA7gB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oBAAA,CACb,SAAAA,GAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAWD,IAAAA,CACT,6DACAgmB,CAAAA,CAAQ,4BAAA,CAA+B,0BACzC,CAAA,CAEC,SAAAK,CAAAA,CAAM,IAAA,CACT,CAAA,CACF,CAAA,CACApmB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wCAAA,CACZ,QAAA,CAAAomB,EAAM,OAAA,EAAW,QAAA,CACpB,EACApmB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,kDAAA,CACZ,QAAA,CAAA8kB,EAAAA,CAAY5W,CAAK,EACpB,CAAA,CACAlO,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mDACZ,QAAA,CAAAomB,CAAAA,CAAM,IAAA,CACT,CAAA,CACAtmB,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CAAmD,QAAA,CAAA,CAAA,GAAA,CAC9DymB,EAAQ,OAAA,CAAQ,CAAC,CAAA,CAAA,CACrB,CAAA,CACAvmB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CACZ,QAAA,CAAAqmB,EACH,CAAA,CAAA,CACF,CAEJ,CAMA,SAASrC,GAAW,CAAE,OAAA,CAAAwC,CAAQ,CAAA,CAAwB,CACpD,OACExmB,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,uDAAA,CACV,MAAO,CAAE,MAAA,CAAQgjB,EAAe,CAAA,CAE/B,SAAAwD,CAAAA,CACH,CAEJ,CAEA,SAASzC,IAAc,CACrB,OACE/jB,IAAC,KAAA,CAAA,CACC,SAAA,CAAU,2CACV,KAAA,CAAO,CAAE,MAAA,CAAQgjB,EAAe,EAE/B,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAACpiB,EAAGC,CAAAA,GACjCb,GAAAA,CAACc,SAAA,CAAiB,SAAA,CAAU,yBAAbD,CAAqC,CACrD,CAAA,CACH,CAEJ,CAEA,SAASikB,EAAAA,CAAY5W,CAAAA,CAAuB,CAC1C,IAAMuY,CAAAA,CAAQvY,CAAAA,CAAQ,GAAA,CACtB,OAAIuY,EAAQ,CAAA,EAAKA,CAAAA,CAAQ,CAAA,CAAU,SAAA,CAC5B,GAAGA,CAAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,MAC5B,CAEA,SAASH,EAAAA,CAAgBI,CAAAA,CAA6B,CACpD,IAAMC,CAAAA,CAAO,IAAI,IAAA,CAAKD,EAAc,GAAI,CAAA,CAClCE,GAASD,CAAAA,CAAK,QAAA,GAAa,CAAA,EAAG,QAAA,EAAS,CAAE,QAAA,CAAS,EAAG,GAAG,CAAA,CACxDE,CAAAA,CAAMF,CAAAA,CAAK,SAAQ,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,EAAG,GAAG,CAAA,CAC/CG,CAAAA,CAAQH,CAAAA,CAAK,UAAS,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,EAAG,GAAG,CAAA,CAClDI,CAAAA,CAAOJ,CAAAA,CAAK,YAAW,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,EAAG,GAAG,CAAA,CACzD,OAAO,CAAA,EAAGC,CAAK,IAAIC,CAAG,CAAA,CAAA,EAAIC,CAAK,CAAA,CAAA,EAAIC,CAAI,CAAA,CACzC,CAEA,SAASlC,EAAAA,CAAqBmC,EAA2B,CACvD,GAAI,CAEF,OADa,IAAI,IAAA,CAAKA,CAAS,CAAA,CACnB,kBAAA,CAAmB,QAAS,CACtC,KAAA,CAAO,OAAA,CACP,GAAA,CAAK,UACL,IAAA,CAAM,SACR,CAAC,CACH,MAAQ,CACN,OAAO,QACT,CACF,CCpsBO,SAASC,GAAoB,CAClC,WAAA,CAAAC,CAAAA,CAAc,CAAA,CACd,SAAAC,CACF,CAAA,CAA6B,CAC3B,OACErnB,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oDAEZ,QAAA,CAAA,CAAAqnB,CAAAA,EAAYnnB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,KAAA,CAAM,CAAA,CAGlCF,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mDAAA,CACb,QAAA,CAAA,CAAAE,IAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,wCAAA,CAAyC,EAC7DhB,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,sCAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAAE,IAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,oBAAA,CAAqB,EACzCd,GAAAA,CAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,qBAAqB,CAAA,CACzCd,GAAAA,CAACc,QAAAA,CAAA,CAAS,UAAU,oBAAA,CAAqB,CAAA,CAAA,CAC3C,CAAA,CACAd,GAAAA,CAACc,SAAA,CAAS,SAAA,CAAU,oCAAA,CAAqC,CAAA,CAAA,CAC3D,GACF,CAAA,CAGAd,GAAAA,CAACc,QAAAA,CAAA,CAAS,UAAU,kBAAA,CAAmB,CAAA,CAGvChB,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAEb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BACb,QAAA,CAAA,CAAAE,GAAAA,CAACc,QAAAA,CAAA,CAAS,UAAU,kBAAA,CAAmB,CAAA,CACvCd,GAAAA,CAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,kBAAA,CAAmB,CAAA,CAAA,CACzC,CAAA,CAEAd,IAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,6BAAA,CAA8B,EAElDhB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,UAAAE,GAAAA,CAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,mBAAmB,CAAA,CACvChB,IAAAA,CAAC,OAAI,SAAA,CAAU,yBAAA,CACb,UAAAE,GAAAA,CAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,2BAA2B,CAAA,CAC/Cd,GAAAA,CAACc,QAAAA,CAAA,CAAS,UAAU,qBAAA,CAAsB,CAAA,CAAA,CAC5C,CAAA,CAAA,CACF,CAAA,CAAA,CACF,EAGAhB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CAEb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CACb,UAAAE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,QAAA,CAAS,EACxBA,GAAAA,CAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,qBAAqB,CAAA,CACzCd,GAAAA,CAAC,OAAI,SAAA,CAAU,QAAA,CAAS,GAC1B,CAAA,CAEC,KAAA,CAAM,IAAA,CAAK,CAAE,OAAQknB,CAAY,CAAC,CAAA,CAAE,GAAA,CAAI,CAACtmB,CAAAA,CAAGC,CAAAA,GAC3Cf,IAAAA,CAAC,KAAA,CAAA,CAEC,UAAU,oEAAA,CAEV,QAAA,CAAA,CAAAE,IAACc,QAAAA,CAAA,CAAS,UAAU,sCAAA,CAAuC,CAAA,CAC3DhB,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,oCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,mCAAA,CAAoC,CAAA,CACxDd,GAAAA,CAACc,SAAA,CAAS,SAAA,CAAU,qBAAqB,CAAA,CAAA,CAC3C,CAAA,CACAd,IAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,kBAAA,CAAmB,EACvChB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,UAAAE,GAAAA,CAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,8BAA8B,CAAA,CAClDd,GAAAA,CAACc,QAAAA,CAAA,CAAS,UAAU,6BAAA,CAA8B,CAAA,CAAA,CACpD,CAAA,CAAA,CAAA,CAZKD,CAaP,CACD,CAAA,CAAA,CACH,CAAA,CAGAf,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,qBAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,kBAAA,CAAmB,EACvCd,GAAAA,CAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,sBAAA,CAAuB,CAAA,CAC3Cd,GAAAA,CAACc,SAAA,CAAS,SAAA,CAAU,qBAAA,CAAsB,CAAA,CAC1Cd,IAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,qBAAA,CAAsB,GAC5C,CAAA,CAAA,CACF,CAEJ,CAEO,SAASsmB,EAAAA,EAAoB,CAClC,OACEtnB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wEACb,QAAA,CAAA,CAAAE,GAAAA,CAACc,QAAAA,CAAA,CAAS,UAAU,wBAAA,CAAyB,CAAA,CAC7Cd,GAAAA,CAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,wBAAA,CAAyB,EAC7Cd,GAAAA,CAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,wBAAA,CAAyB,CAAA,CAAA,CAC/C,CAEJ,CC3DA,IAAMumB,EAAAA,CAAY,sBAAA,CAEZC,GAAY,sBAAA,CAUX,SAASC,EAAAA,CAAUC,CAAAA,CAAmB,CAC3C,IAAMC,CAAAA,CAAM,IAAA,CAAK,GAAA,CAAID,CAAC,CAAA,CACtB,OAAIC,CAAAA,EAAO,GAAA,CACF,GAAG,UAAA,CAAA,CAAYD,CAAAA,CAAI,GAAA,EAAe,OAAA,CAAQ,CAAC,CAAC,CAAC,IAElDC,CAAAA,EAAO,GAAA,CACF,GAAG,UAAA,CAAA,CAAYD,CAAAA,CAAI,GAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAE9CC,CAAAA,EAAO,IACF,CAAA,EAAG,UAAA,CAAA,CAAYD,CAAAA,CAAI,GAAA,EAAO,QAAQ,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAEvCA,EAAE,cAAA,EACX,CAyBA,SAASE,GAAUC,CAAAA,CAAoBC,CAAAA,CAA+B,CACpE,OAAID,GAAc,CAAA,EAAKC,CAAAA,EAAiB,CAAA,CAAU,CAAA,CAC3C,KAAK,GAAA,CAAID,CAAAA,CAAaC,EAAe,EAAG,CACjD,CAEA,SAASC,EAAAA,CAAeC,CAAAA,CAAoBC,CAAAA,CAAiC,CAC3E,IAAMC,CAAAA,CAAY,IAAI,YAAA,CAAa,GAAG,CAAA,CAChCC,CAAAA,CAAY,IAAI,YAAA,CAAa,GAAG,CAAA,CAEtC,IAAA,IAAWC,CAAAA,IAAOJ,CAAAA,CAAM,CACtB,IAAMK,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMD,EAAI,KAAA,CAAQ,GAAG,CAAA,CACnCC,CAAAA,EAAQ,GAAKA,CAAAA,EAAQ,GAAA,GAAKH,CAAAA,CAAUG,CAAI,GAAKD,CAAAA,CAAI,QAAA,EACvD,CACA,IAAA,IAAWE,CAAAA,IAAOL,EAAM,CACtB,IAAMI,CAAAA,CAAO,IAAA,CAAK,MAAMC,CAAAA,CAAI,KAAA,CAAQ,GAAG,CAAA,CACnCD,GAAQ,CAAA,EAAKA,CAAAA,EAAQ,GAAA,GAAKF,CAAAA,CAAUE,CAAI,CAAA,EAAKC,CAAAA,CAAI,UACvD,CAGA,IAAIC,EAAS,CAAA,CACTC,CAAAA,CAAa,CAAA,CACXC,CAAAA,CAAW,IAAI,YAAA,CAAa,GAAG,CAAA,CAC/BC,CAAAA,CAAgB,IAAI,YAAA,CAAa,GAAG,CAAA,CAC1C,IAAA,IAAS3nB,EAAI,GAAA,CAAKA,CAAAA,EAAK,EAAGA,CAAAA,EAAAA,CACxBwnB,CAAAA,EAAUL,EAAUnnB,CAAC,CAAA,CACrBynB,CAAAA,EAAeN,CAAAA,CAAUnnB,CAAC,CAAA,CAAIA,CAAAA,CAAK,GAAA,CACnC0nB,CAAAA,CAAS1nB,CAAC,CAAA,CAAIwnB,CAAAA,CACdG,CAAAA,CAAc3nB,CAAC,EAAIynB,CAAAA,CAIrB,IAAIG,CAAAA,CAAS,CAAA,CACTC,EAAa,CAAA,CACXC,CAAAA,CAAW,IAAI,YAAA,CAAa,GAAG,CAAA,CAC/BC,CAAAA,CAAgB,IAAI,YAAA,CAAa,GAAG,CAAA,CAC1C,IAAA,IAAS/nB,CAAAA,CAAI,CAAA,CAAGA,GAAK,GAAA,CAAKA,CAAAA,EAAAA,CACxB4nB,GAAUR,CAAAA,CAAUpnB,CAAC,EACrB6nB,CAAAA,EAAeT,CAAAA,CAAUpnB,CAAC,CAAA,CAAIA,EAAK,GAAA,CACnC8nB,CAAAA,CAAS9nB,CAAC,CAAA,CAAI4nB,EACdG,CAAAA,CAAc/nB,CAAC,CAAA,CAAI6nB,CAAAA,CAGrB,IAAMd,CAAAA,CAAgB,IAAA,CAAK,IAAIW,CAAAA,CAAS,CAAC,GAAK,CAAA,CAAGI,CAAAA,CAAS,GAAG,CAAA,EAAK,CAAC,CAAA,CAEnE,OAAO,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,GAAI,CAAA,CAAG,CAAC/nB,EAAGC,CAAAA,GAAM,CAC3C,IAAMgoB,CAAAA,CAAQN,CAAAA,CAAS1nB,CAAC,CAAA,CAAI,CAAA,CACtBioB,CAAAA,CAAQH,CAAAA,CAAS9nB,CAAC,CAAA,CAAI,CAAA,CACtB8mB,CAAAA,CAAaY,CAAAA,CAAS1nB,CAAC,CAAA,EAAK8nB,CAAAA,CAAS9nB,CAAC,CAAA,CACtCkoB,EAAWf,CAAAA,CAAUnnB,CAAC,CAAA,CAAI,CAAA,EAAKonB,EAAUpnB,CAAC,CAAA,CAAI,CAAA,CAEpD,OAAO,CACL,UAAA,CAAYA,CAAAA,CACZ,aAAA,CAAe6mB,EAAAA,CAAUC,EAAYC,CAAa,CAAA,CAClD,OAAA,CAASD,CAAAA,CAAa,EAAKoB,CAAAA,CAAW,CAAA,CAAI,GAAO,CAAA,CACjD,KAAA,CAAAF,EACA,KAAA,CAAAC,CAAAA,CACA,WAAA,CAAaP,CAAAA,CAAS1nB,CAAC,CAAA,CACvB,WAAA,CAAa8nB,CAAAA,CAAS9nB,CAAC,EACvB,UAAA,CAAY2nB,CAAAA,CAAc3nB,CAAC,CAAA,CAC3B,WAAY+nB,CAAAA,CAAc/nB,CAAC,CAC7B,CACF,CAAC,CACH,CAcA,SAASmoB,EAAAA,CAAkB,CAAE,KAAAC,CAAK,CAAA,CAA0B,CAC1D,GAAM,CAAE,CAAE,CAAA,CAAIvpB,cAAAA,EAAe,CACvB6d,EAAQ0L,CAAAA,CAAK,KAAA,CAAQ5B,GAAYC,EAAAA,CACjC4B,CAAAA,CAAOD,EAAK,OAAA,CAAU,EAAA,CAAK,MAAA,CAAY,CAAA,EAAGA,EAAK,OAAO,CAAA,CAAA,CAAA,CACtDE,CAAAA,CAAQF,CAAAA,CAAK,QAAU,EAAA,CAAK,CAAA,EAAG,GAAA,CAAMA,CAAAA,CAAK,OAAO,CAAA,CAAA,CAAA,CAAM,MAAA,CAE7D,OACEnpB,IAAAA,CAAC,OACC,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,IAAK,CAAA,CACL,IAAA,CAAAopB,CAAAA,CACA,KAAA,CAAAC,EACA,MAAA,CAAQ,EAAA,CACR,UAAA,CAAY,qBAAA,CACZ,OAAQ,kCAAA,CACR,YAAA,CAAc,EACd,OAAA,CAAS,UAAA,CACT,SAAU,EAAA,CACV,KAAA,CAAO,SAAA,CACP,QAAA,CAAU,IACV,aAAA,CAAe,MACjB,CAAA,CAEA,QAAA,CAAA,CAAAnpB,IAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,YAAA,CAAc,EAAG,UAAA,CAAY,GAAI,CAAA,CAC5C,QAAA,CAAA,CAAA,CAAE,iCAAkC,CAAE,KAAA,CAAOipB,CAAAA,CAAK,UAAW,CAAC,CAAA,CACjE,CAAA,CACAjpB,GAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,KAAA,CAAAud,CAAM,CAAA,CACjB,WAAE,kCAAA,CAAoC,CACrC,OAAQgK,EAAAA,CAAU,IAAA,CAAK,MAAM0B,CAAAA,CAAK,QAAQ,CAAC,CAC7C,CAAC,CAAA,CACH,CAAA,CACAnpB,IAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,KAAA,CAAAyd,CAAM,CAAA,CAAG,cAAEgK,EAAAA,CAAU,IAAA,CAAK,KAAA,CAAM0B,CAAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAE,CAAA,CAAA,CAC/D,CAEJ,CAYA,IAAMG,EAAAA,CAAcC,IAAAA,CAAK,SAAqB,CAC5C,IAAA,CAAAlB,CAAAA,CACA,OAAA,CAAAmB,CAAAA,CACA,QAAAC,CACF,CAAA,CAAqB,CACnB,IAAMC,CAAAA,CAASnT,OAAuB,IAAI,CAAA,CACpCoT,CAAAA,CAAYtB,CAAAA,CAAK,OAASA,CAAAA,CAAK,KAAA,CAC/BrK,CAAAA,CAAUqK,CAAAA,CAAK,MAAQd,EAAAA,CAAYc,CAAAA,CAAK,KAAA,CAAQb,EAAAA,CAAY,OAElE,OACEtnB,GAAAA,CAAC,OACC,KAAA,CAAO,CACL,SAAU,UAAA,CACV,IAAA,CAAM,CAAA,EAAGmoB,CAAAA,CAAK,UAAU,CAAA,CAAA,CAAA,CAGxB,KAAA,CAAO,IAAA,CACP,MAAA,CAAQ,OACR,SAAA,CAAW,YAAA,CACX,WAAA,CAAaA,CAAAA,CAAK,WAAa,GAAA,CAAM,uBAAA,CAA0B,OAC/D,MAAA,CAAQsB,CAAAA,CAAY,YAAc,SACpC,CAAA,CACA,YAAA,CAAc,IAAMH,EAAQnB,CAAAA,CAAMqB,CAAAA,CAAO,OAAO,CAAA,CAChD,aAAcD,CAAAA,CAEb,QAAA,CAAAE,CAAAA,EACCzpB,GAAAA,CAAC,OACC,GAAA,CAAKwpB,CAAAA,CACL,KAAA,CAAO,CACL,SAAU,UAAA,CACV,MAAA,CAAQ,CAAA,CACR,IAAA,CAAM,EACN,KAAA,CAAO,MAAA,CACP,MAAA,CAAQ,CAAA,EAAGrB,EAAK,aAAA,CAAgB,GAAG,CAAA,CAAA,CAAA,CACnC,eAAA,CAAiBrK,EACjB,OAAA,CAASqK,CAAAA,CAAK,OAChB,CAAA,CACF,CAAA,CAEJ,CAEJ,CAAC,CAAA,CAMKuB,EAAAA,CAAU,CAAC,EAAG,EAAA,CAAI,EAAA,CAAI,EAAA,CAAI,EAAA,CAAI,GAAI,EAAA,CAAI,EAAA,CAAI,EAAA,CAAI,EAAA,CAAI,GAAG,CAAA,CAE3D,SAASC,IAAa,CACpB,OAEE3pB,IAAC,KAAA,CAAA,CACC,SAAA,CAAU,qEAAA,CACV,KAAA,CAAO,CAAE,UAAA,CAAY,kBAAmB,CAAA,CAEvC,QAAA,CAAA0pB,GAAQ,GAAA,CAAKE,CAAAA,EACZ5pB,GAAAA,CAAC,MAAA,CAAA,CAEC,UAAU,mCAAA,CACV,KAAA,CAAO,CACL,QAAA,CAAU,EAAA,CACV,KAAM,CAAA,EAAG4pB,CAAI,CAAA,CAAA,CAAA,CAEb,SAAA,CACEA,IAAS,CAAA,CACL,iBAAA,CACAA,CAAAA,GAAS,GAAA,CACP,oBACA,kBACV,CAAA,CAEC,QAAA,CAAAA,CAAAA,CAAAA,CAdIA,CAeP,CACD,CAAA,CACH,CAEJ,CAMO,SAASC,EAAAA,CAAwB,CACtC,IAAA,CAAA/B,CAAAA,CACA,KAAAC,CACF,CAAA,CAAiC,CAC/B,GAAM,CAAE,CAAA,CAAAlpB,CAAE,CAAA,CAAIa,cAAAA,GACRqY,CAAAA,CAAO7T,OAAAA,CAAQ,IAAM2jB,EAAAA,CAAeC,CAAAA,CAAMC,CAAI,CAAA,CAAG,CAACD,CAAAA,CAAMC,CAAI,CAAC,CAAA,CAE7D+B,CAAAA,CAAW5lB,OAAAA,CAAQ,IAAM,CAC7B,IAAM6lB,CAAAA,CAAUjC,CAAAA,CAAK,MAAA,CAAS,EAAI,IAAA,CAAK,GAAA,CAAI,GAAGA,CAAAA,CAAK,GAAA,CAAK/oB,GAAMA,CAAAA,CAAE,KAAK,CAAC,CAAA,CAAI,EACpEirB,CAAAA,CAAUjC,CAAAA,CAAK,MAAA,CAAS,CAAA,CAAI,KAAK,GAAA,CAAI,GAAGA,CAAAA,CAAK,GAAA,CAAKjpB,GAAMA,CAAAA,CAAE,KAAK,CAAC,CAAA,CAAI,CAAA,CAC1E,OAAO,IAAA,CAAK,KAAA,CAAA,CAAQirB,CAAAA,CAAUC,CAAAA,EAAW,EAAK,GAAG,CACnD,CAAA,CAAG,CAAClC,EAAMC,CAAI,CAAC,CAAA,CAETkC,CAAAA,CAAU/lB,QAAQ,IAAM6T,CAAAA,CAAK,IAAA,CAAMuC,CAAAA,EAAMA,EAAE,KAAA,EAASA,CAAAA,CAAE,KAAK,CAAA,CAAG,CAACvC,CAAI,CAAC,CAAA,CAGpE,CAACmS,EAASC,CAAU,CAAA,CAAI5oB,QAAAA,CAA6B,IAAI,EAGzD6oB,CAAAA,CAAe/T,MAAAA,CAA8B,IAAI,CAAA,CAEjDgU,CAAAA,CAAoBzqB,YACxB,CAACuoB,CAAAA,CAAiBmC,CAAAA,GAAiC,CAE7CF,EAAa,OAAA,GACfA,CAAAA,CAAa,OAAA,CAAQ,KAAA,CAAM,OAAS,EAAA,CAAA,CAGlCE,CAAAA,EACFA,CAAAA,CAAM,KAAA,CAAM,OAAS,iBAAA,CACrBF,CAAAA,CAAa,OAAA,CAAUE,CAAAA,EAEvBF,EAAa,OAAA,CAAU,IAAA,CAIrBjC,CAAAA,CAAK,KAAA,EAASA,EAAK,KAAA,CACrBgC,CAAAA,CAAW,CACT,UAAA,CAAYhC,EAAK,UAAA,CACjB,KAAA,CAAOA,CAAAA,CAAK,KAAA,CACZ,SAAUA,CAAAA,CAAK,KAAA,CAAQA,EAAK,WAAA,CAAcA,CAAAA,CAAK,YAC/C,OAAA,CAASA,CAAAA,CAAK,KAAA,CAAQA,CAAAA,CAAK,WAAaA,CAAAA,CAAK,UAAA,CAC7C,OAAA,CAASA,CAAAA,CAAK,UAChB,CAAC,CAAA,CAEDgC,CAAAA,CAAW,IAAI,EAEnB,CAAA,CACA,EACF,CAAA,CAEMI,EAAoB3qB,WAAAA,CAAY,IAAM,CACtCwqB,CAAAA,CAAa,UACfA,CAAAA,CAAa,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAS,GACpCA,CAAAA,CAAa,OAAA,CAAU,IAAA,CAAA,CAEzBD,CAAAA,CAAW,IAAI,EACjB,CAAA,CAAG,EAAE,CAAA,CAEL,OAAKF,CAAAA,CAuBHnqB,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,QAAA,CACf,MAAO,MAAA,CACP,MAAA,CAAQ,MAAA,CACR,UAAA,CAAY,OACZ,QAAA,CAAU,QACZ,EAGA,QAAA,CAAA,CAAAA,IAAAA,CAAC,OACC,KAAA,CAAO,CACL,IAAA,CAAM,CAAA,CACN,SAAU,UAAA,CACV,KAAA,CAAO,MAAA,CACP,QAAA,CAAU,QACZ,CAAA,CAGC,QAAA,CAAA,CAAAgqB,CAAAA,CAAW,CAAA,EACV9pB,IAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,KAAM,CAAA,EAAG8pB,CAAQ,CAAA,CAAA,CAAA,CACjB,GAAA,CAAK,EACL,MAAA,CAAQ,CAAA,CACR,KAAA,CAAO,CAAA,CACP,gBACE,gGAAA,CACF,MAAA,CAAQ,CAAA,CACR,aAAA,CAAe,MACjB,CAAA,CACF,CAAA,CAIDI,CAAAA,EAAWlqB,GAAAA,CAACgpB,GAAA,CAAkB,IAAA,CAAMkB,CAAAA,CAAS,CAAA,CAG7CnS,EAAK,GAAA,CAAKoQ,CAAAA,EACTnoB,GAAAA,CAACopB,EAAAA,CAAA,CAEC,IAAA,CAAMjB,CAAAA,CACN,OAAA,CAASkC,CAAAA,CACT,QAASE,CAAAA,CAAAA,CAHJpC,CAAAA,CAAK,UAIZ,CACD,CAAA,CAAA,CACH,EAGAnoB,GAAAA,CAAC2pB,EAAAA,CAAA,EAAW,CAAA,CAAA,CACd,EAzEE3pB,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,MAAO,MAAA,CACP,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,OACT,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,QAAA,CAChB,MAAO,SAAA,CACP,QAAA,CAAU,EACZ,CAAA,CAEC,SAAAnB,CAAAA,CAAE,0BAA0B,CAAA,CAC/B,CA+DN,CCpZA,SAAS2rB,EAAAA,CAAiBtc,EAAuB,CAC/C,IAAMuY,CAAAA,CAAQvY,CAAAA,CAAQ,IAChBvC,CAAAA,CAAU,IAAA,CAAK,KAAA,CAAM8a,CAAAA,CAAQ,EAAE,CAAA,CAAI,EAAA,CACzC,OAAO,MAAA,CAAO,UAAU9a,CAAO,CAAA,CAAI,CAAA,EAAGA,CAAO,OAAM,CAAA,EAAGA,CAAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,CAC1E,CAuBA,SAAS8e,EAAAA,EAAoB,CAC3B,GAAM,CAAE,CAAA,CAAA5rB,CAAE,EAAIa,cAAAA,EAAe,CAC7B,OACEI,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,sEAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAACghB,OAAAA,CAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAA,CACnBhhB,GAAAA,CAAC,QAAM,QAAA,CAAAnB,CAAAA,CAAE,2BAA2B,CAAA,CAAE,GACxC,CAEJ,CAMO,SAAS6rB,EAAAA,CAAwB,CACtC,OAAAvoB,CAAAA,CACA,OAAA,CAAAkF,CAAAA,CAAU,KAAA,CACV,cAAAsjB,CACF,CAAA,CAAiC,CAC/B,GAAM,CAAE,CAAA,CAAA9rB,CAAE,CAAA,CAAIa,cAAAA,GACR,CAACkrB,CAAAA,CAAUC,CAAW,CAAA,CAAItpB,QAAAA,CAAmB,OAAO,CAAA,CACpDupB,CAAAA,CAAOzjB,CAAAA,GAAY,IAAA,CAEnBN,EAAS5E,CAAAA,CAAO,MAAA,CAEhB,CAAE,IAAA,CAAM4oB,EAAW,SAAA,CAAWC,CAAmB,CAAA,CAAIC,YAAAA,CAAa,CACtE,IAAA,CAAM9oB,CAAAA,CAAO,IAAA,CACb,MAAA,CAAA4E,CACF,CAAC,CAAA,CAEK+gB,CAAAA,CAAO5jB,OAAAA,CAAQ,MACP4mB,CAAAA,CAAOC,CAAAA,EAAW,IAAA,CAAOA,CAAAA,EAAW,OACjC,EAAC,EAAG,GAAA,CAAK7hB,CAAAA,GAAO,CAC7B,KAAA,CAAO4hB,CAAAA,CAAO,EAAI5hB,CAAAA,CAAE,KAAA,CAAQA,EAAE,KAAA,CAC9B,QAAA,CAAUA,CAAAA,CAAE,IACd,EAAE,CAAA,CACD,CAAC6hB,CAAAA,EAAW,IAAA,CAAMA,GAAW,IAAA,CAAMD,CAAI,CAAC,CAAA,CAErC/C,EAAO7jB,OAAAA,CAAQ,IAAA,CAAA,CACP4mB,CAAAA,CAAOC,CAAAA,EAAW,KAAOA,CAAAA,EAAW,IAAA,GACjC,EAAC,EAAG,IAAK7hB,CAAAA,GAAO,CAC7B,KAAA,CAAO4hB,CAAAA,CAAO,EAAI5hB,CAAAA,CAAE,KAAA,CAAQA,CAAAA,CAAE,KAAA,CAC9B,SAAUA,CAAAA,CAAE,IACd,EAAE,CAAA,CACD,CAAC6hB,GAAW,IAAA,CAAMA,CAAAA,EAAW,IAAA,CAAMD,CAAI,CAAC,CAAA,CAErCf,CAAAA,CAAU7lB,OAAAA,CACd,IAAO4jB,EAAK,MAAA,CAAS,CAAA,CAAI,IAAA,CAAK,GAAA,CAAI,GAAGA,CAAAA,CAAK,GAAA,CAAK/oB,CAAAA,EAAMA,CAAAA,CAAE,KAAK,CAAC,CAAA,CAAI,IAAA,CACjE,CAAC+oB,CAAI,CACP,CAAA,CACMkC,CAAAA,CAAU9lB,OAAAA,CACd,IAAO6jB,CAAAA,CAAK,MAAA,CAAS,CAAA,CAAI,IAAA,CAAK,IAAI,GAAGA,CAAAA,CAAK,IAAKjpB,CAAAA,EAAMA,CAAAA,CAAE,KAAK,CAAC,CAAA,CAAI,IAAA,CACjE,CAACipB,CAAI,CACP,CAAA,CACMmD,CAAAA,CAAShnB,OAAAA,CAAQ,IAAM,CAC3B,GAAI6lB,CAAAA,EAAW,IAAA,EAAQC,GAAW,IAAA,CAAM,OAAO,KAC/C,IAAMmB,CAAAA,CAAAA,CAAOnB,EAAUD,CAAAA,EAAW,GAAA,CAElC,OADgB,IAAA,CAAK,MAAMoB,CAAAA,CAAM,EAAE,CAAA,CAAI,EAEzC,EAAG,CAACpB,CAAAA,CAASC,CAAO,CAAC,EAGrB,OACElqB,IAAAA,CAAC,OAAI,SAAA,CAAU,yBAAA,CAOb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CAEb,UAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,SAAAkrB,CAAAA,EAAU,IAAA,CACP,CAAA,EAAGrsB,CAAAA,CAAE,0BAA0B,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,SAAA,CAAUqsB,CAAM,CAAA,CAAI,CAAA,EAAGA,CAAM,CAAA,IAAA,CAAA,CAAM,GAAGA,CAAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,MAAG,CAAA,CAAA,CACtG,IAAA,CACN,CAAA,CAGAprB,IAAAA,CAAC,QAAK,SAAA,CAAU,mEAAA,CACb,UAAAiqB,CAAAA,EAAW,IAAA,EACVjqB,KAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,KAAA,CAAO,sBAAuB,CAAA,CAC1C,QAAA,CAAA,CAAAjB,CAAAA,CAAE,uBAAuB,EAAE,IAAA,CAAG2rB,EAAAA,CAAiBT,CAAO,CAAA,CAAA,CACzD,EAEDA,CAAAA,EAAW,IAAA,EAAQC,GAAW,IAAA,EAC7BhqB,GAAAA,CAAC,QAAK,SAAA,CAAU,cAAA,CAAe,QAAA,CAAA,GAAA,CAAC,CAAA,CAEjCgqB,GAAW,IAAA,EACVlqB,IAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,KAAA,CAAO,sBAAuB,CAAA,CAC1C,QAAA,CAAA,CAAAjB,EAAE,uBAAuB,CAAA,CAAE,KAAG2rB,EAAAA,CAAiBR,CAAO,GACzD,CAAA,CAAA,CAEJ,CAAA,CAGAhqB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,yBAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,KAAA,CAAO4qB,CAAAA,GAAa,OAAA,CAAU,YAAc,aAAA,CAC5C,OAAA,CAAS,IACPC,CAAAA,CAAatW,GAAUA,CAAAA,GAAS,OAAA,CAAU,OAAA,CAAU,OAAQ,EAE9D,SAAA,CAAU,uFAAA,CAET,QAAA,CAAAqW,CAAAA,GAAa,QACZ5qB,GAAAA,CAACorB,kBAAAA,CAAA,CAAmB,SAAA,CAAU,UAAU,CAAA,CAExCprB,GAAAA,CAACqrB,mBAAA,CAAmB,SAAA,CAAU,UAAU,CAAA,CAE5C,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGAvrB,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CACZ,QAAA,CAAA,CAAA8qB,IAAa,OAAA,EACZ5qB,GAAAA,CAAAgS,QAAAA,CAAA,CACG,SAAAgZ,CAAAA,CACChrB,GAAAA,CAACyqB,GAAA,EAAkB,CAAA,CAEnBzqB,IAAC6pB,EAAAA,CAAA,CAAwB,IAAA,CAAM/B,CAAAA,CAAM,KAAMC,CAAAA,CAAM,CAAA,CAErD,CAAA,CAGD6C,CAAAA,GAAa,SACZ5qB,GAAAA,CAAAgS,QAAAA,CAAA,CACG,QAAA,CAAAgZ,EACChrB,GAAAA,CAACyqB,EAAAA,CAAA,EAAkB,CAAA,CAEnBzqB,GAAAA,CAACsrB,GAAA,CACC,IAAA,CAAMxD,CAAAA,CACN,IAAA,CAAMC,EACN,OAAA,CAASgC,CAAAA,EAAW,MAAA,CACpB,OAAA,CAASC,GAAW,MAAA,CACpB,MAAA,CAAQkB,CAAAA,EAAU,MAAA,CACpB,EAEJ,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CAMA,IAAMK,EAAAA,CAAoB,CAAA,CAU1B,SAASD,EAAAA,CAAsB,CAC7B,IAAA,CAAAxD,CAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,OAAAmD,CACF,CAAA,CAA+B,CAC7B,GAAM,CAAE,CAAA,CAAArsB,CAAE,EAAIa,cAAAA,EAAe,CAGvB8rB,EAAatnB,OAAAA,CACjB,IACE,CAAC,GAAG6jB,CAAI,CAAA,CACL,IAAA,CAAK,CAACjpB,CAAAA,CAAGC,IAAMD,CAAAA,CAAE,KAAA,CAAQC,CAAAA,CAAE,KAAK,EAChC,KAAA,CAAM,CAAA,CAAGwsB,EAAiB,CAAA,CAC1B,SAAQ,CACb,CAACxD,CAAI,CACP,EAGM0D,CAAAA,CAAavnB,OAAAA,CACjB,IACE,CAAC,GAAG4jB,CAAI,CAAA,CAAE,IAAA,CAAK,CAAChpB,EAAGC,CAAAA,GAAMA,CAAAA,CAAE,MAAQD,CAAAA,CAAE,KAAK,EAAE,KAAA,CAAM,CAAA,CAAGysB,EAAiB,CAAA,CACxE,CAACzD,CAAI,CACP,CAAA,CAGM4D,CAAAA,CAASxnB,QAAQ,IAAM,CAC3B,IAAMynB,CAAAA,CAAM,CAAC,GAAGH,CAAAA,CAAY,GAAGC,CAAU,EAAE,GAAA,CAAKG,CAAAA,EAAMA,CAAAA,CAAE,QAAQ,EAChE,OAAO,IAAA,CAAK,GAAA,CAAI,GAAGD,EAAK,CAAC,CAC3B,CAAA,CAAG,CAACH,EAAYC,CAAU,CAAC,EAI3B,OAFgBD,CAAAA,CAAW,SAAW,CAAA,EAAKC,CAAAA,CAAW,MAAA,GAAW,CAAA,CAI7DzrB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8DAAA,CACZ,QAAA,CAAAnB,EAAE,yBAAyB,CAAA,CAC9B,CAAA,CAKFiB,IAAAA,CAAC,OAAI,SAAA,CAAU,oEAAA,CAEZ,UAAA0rB,CAAAA,CAAW,GAAA,CAAKpD,GACfpoB,GAAAA,CAAC6rB,EAAAA,CAAA,CAEC,KAAA,CAAOzD,EAAI,KAAA,CACX,QAAA,CAAUA,CAAAA,CAAI,QAAA,CACd,KAAK,KAAA,CACL,MAAA,CAAQsD,CAAAA,CAAAA,CAJH,CAAA,IAAA,EAAOtD,EAAI,KAAK,CAAA,CAKvB,CACD,CAAA,CAGDpoB,GAAAA,CAAC,OAAI,SAAA,CAAU,+FAAA,CACZ,QAAA,CAAAkrB,CAAAA,EAAU,MACTprB,IAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAA,CAAAjB,CAAAA,CAAE,0BAA0B,CAAA,CAAE,GAAA,CAAE,GAAA,CAChC,MAAA,CAAO,UAAUqsB,CAAM,CAAA,CAAI,CAAA,EAAGA,CAAM,OAAM,CAAA,EAAGA,CAAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,CAAA,CAAA,CACjE,CAAA,CAEJ,CAAA,CAGCO,CAAAA,CAAW,IAAKvD,CAAAA,EACfloB,GAAAA,CAAC6rB,EAAAA,CAAA,CAEC,MAAO3D,CAAAA,CAAI,KAAA,CACX,SAAUA,CAAAA,CAAI,QAAA,CACd,KAAK,KAAA,CACL,MAAA,CAAQwD,CAAAA,CAAAA,CAJH,CAAA,IAAA,EAAOxD,EAAI,KAAK,CAAA,CAKvB,CACD,CAAA,CAGDpoB,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mFAAA,CACb,QAAA,CAAA,CAAAE,IAAC,MAAA,CAAA,CAAM,QAAA,CAAAnB,CAAAA,CAAE,yBAAyB,EAAE,CAAA,CACpCmB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAe,QAAA,CAAAnB,CAAAA,CAAE,6BAA6B,CAAA,CAAE,EAChEmB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,YAAA,CAAc,SAAAnB,CAAAA,CAAE,yBAAyB,EAAE,CAAA,CAAA,CAC7D,CAAA,CAAA,CACF,CAEJ,CAaA,SAASgtB,EAAAA,CAAa,CAAE,MAAA3d,CAAAA,CAAO,QAAA,CAAAvG,CAAAA,CAAU,IAAA,CAAAJ,EAAM,MAAA,CAAAmkB,CAAO,CAAA,CAAsB,CAC1E,IAAM5C,CAAAA,CAAQvhB,CAAAA,GAAS,KAAA,CACjBukB,CAAAA,CAAW,KAAK,GAAA,CAAKnkB,CAAAA,CAAW+jB,CAAAA,CAAU,GAAA,CAAK,GAAG,CAAA,CAClDK,CAAAA,CAAUjD,CAAAA,CAAQ,eAAA,CAAkB,gBACpCkD,CAAAA,CAAalD,CAAAA,CAAQ,cAAA,CAAiB,cAAA,CAEtCmD,EAAqB1E,EAAAA,CAAU,IAAA,CAAK,MAAM5f,CAAQ,CAAC,EACnDukB,CAAAA,CAAc,IAAA,CAAK,KAAA,CAAMvkB,CAAAA,CAAWuG,CAAK,CAAA,CACzCie,CAAAA,CAAiB,CAAA,CAAA,EAAI5E,EAAAA,CAAU2E,CAAW,CAAC,CAAA,CAAA,CAEjD,OACEpsB,IAAAA,CAAC,OAAI,SAAA,CAAU,wFAAA,CAEb,UAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,UAAW,CAAA,0BAAA,EAA6B+rB,CAAO,CAAA,gCAAA,CAAA,CAC/C,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGD,CAAQ,CAAA,CAAA,CAAI,EACjC,CAAA,CAEA9rB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAW,iBAAiBgsB,CAAU,CAAA,CAAA,CACzC,SAAAxB,EAAAA,CAAiBtc,CAAK,EACzB,CAAA,CAEAlO,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,4CACb,QAAA,CAAAisB,CAAAA,CACH,CAAA,CAEAjsB,GAAAA,CAAC,QAAK,SAAA,CAAU,0CAAA,CACb,QAAA,CAAAmsB,CAAAA,CACH,GACF,CAEJ,CC/RA,IAAMC,EAAAA,CAAN,cAAiCC,SAG/B,CACA,KAAA,CAAiC,CAAE,MAAO,IAAK,CAAA,CAE/C,OAAO,wBAAA,CAAyB3U,EAAc,CAC5C,OAAO,CAAE,KAAA,CAAAA,CAAM,CACjB,CAEA,iBAAA,CAAkBA,CAAAA,CAAcuR,CAAAA,CAAiB,CAEjD,CAEA,MAAA,EAAS,CACP,OAAI,KAAK,KAAA,CAAM,KAAA,CAEXnpB,IAAAA,CAAC,KAAA,CAAA,CACC,MAAO,CACL,MAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,gBAAkB,GAAA,CACrC,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,SACf,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,QAAA,CAChB,IAAK,CAAA,CACL,KAAA,CAAO,SAAA,CACP,QAAA,CAAU,EACZ,CAAA,CAEA,QAAA,CAAA,CAAAE,IAAC,MAAA,CAAA,CAAK,QAAA,CAAA,mBAAA,CAAiB,EACvBA,GAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,SAAU,EAAA,CAAI,OAAA,CAAS,EAAI,CAAA,CACvC,cAAK,KAAA,CAAM,KAAA,CAAM,OAAA,CACpB,CAAA,CAAA,CACF,EAGG,IAAA,CAAK,KAAA,CAAM,QACpB,CACF,CAAA,CAMMssB,GAAe,CAAA,CAGfC,EAAAA,CAAe,CACnB,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SACF,CAAA,CAMA,SAASjG,EAAAA,CAAgBkG,CAAAA,CAAYC,CAAAA,CAAgC,CACnE,IAAMnS,CAAAA,CAAI,IAAI,KAAKkS,CAAE,CAAA,CACrB,OAAIC,CAAAA,GAAUhqB,UAAAA,CAAW,OAAA,CAEhB6X,CAAAA,CAAE,mBAAmB,OAAA,CAAS,CACnC,IAAA,CAAM,SAAA,CACN,OAAQ,SAAA,CACR,MAAA,CAAQ,KACV,CAAC,EAGIA,CAAAA,CAAE,kBAAA,CAAmB,OAAA,CAAS,CAAE,MAAO,OAAA,CAAS,GAAA,CAAK,SAAU,CAAC,CACzE,CAEA,SAASoS,EAAAA,CAAuBF,CAAAA,CAAYC,EAAgC,CAC1E,IAAMnS,CAAAA,CAAI,IAAI,KAAKkS,CAAE,CAAA,CACrB,OAAIC,CAAAA,GAAUhqB,UAAAA,CAAW,QAChB6X,CAAAA,CAAE,kBAAA,CAAmB,OAAA,CAAS,CACnC,KAAM,SAAA,CACN,MAAA,CAAQ,SAAA,CACR,MAAA,CAAQ,KACV,CAAC,CAAA,CAECmS,CAAAA,GAAUhqB,UAAAA,CAAW,SAChB6X,CAAAA,CAAE,kBAAA,CAAmB,QAAS,CACnC,KAAA,CAAO,QACP,GAAA,CAAK,SAAA,CACL,IAAA,CAAM,SAAA,CACN,OAAQ,SAAA,CACR,MAAA,CAAQ,KACV,CAAC,EAEIA,CAAAA,CAAE,kBAAA,CAAmB,OAAA,CAAS,CAAE,MAAO,OAAA,CAAS,GAAA,CAAK,SAAU,CAAC,CACzE,CAEA,SAASP,EAAAA,CAAcxU,CAAAA,CAAuB,CAC5C,OAAO,CAAA,EAAA,CAAIA,CAAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CACpC,CAMA,IAAMonB,GAA+D,CACnE,CAAE,KAAA,CAAOlqB,UAAAA,CAAW,QAAS,KAAA,CAAO,IAAK,CAAA,CACzC,CAAE,MAAOA,UAAAA,CAAW,QAAA,CAAU,KAAA,CAAO,IAAK,EAC1C,CAAE,KAAA,CAAOA,UAAAA,CAAW,SAAA,CAAW,MAAO,IAAK,CAAA,CAC3C,CAAE,KAAA,CAAOA,UAAAA,CAAW,IAAK,KAAA,CAAO,KAAM,CACxC,CAAA,CAWA,SAASmqB,EAAAA,CAAiB,CAAE,KAAA,CAAArnB,CAAAA,CAAO,SAAAyO,CAAS,CAAA,CAA0B,CACpE,OACEhU,IAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,WAAY,QAAA,CAAU,GAAA,CAAK,CAAE,CAAA,CACzD,SAAA2sB,EAAAA,CAAiB,GAAA,CAAI,CAAC,CAAE,MAAAF,CAAAA,CAAO,KAAA,CAAA9tB,CAAM,CAAA,GAAM,CAC1C,IAAM0W,CAAAA,CAAWoX,IAAUlnB,CAAAA,CAC3B,OACEvF,IAAC,QAAA,CAAA,CAEC,OAAA,CAAS,IAAMgU,CAAAA,CAASyY,CAAK,CAAA,CAC7B,KAAA,CAAO,CACL,OAAA,CAAS,UACT,MAAA,CAAQ,MAAA,CACR,UAAA,CAAY,aAAA,CACZ,MAAOpX,CAAAA,CAAW,SAAA,CAAY,SAAA,CAC9B,UAAA,CAAYA,EAAW,GAAA,CAAM,GAAA,CAC7B,QAAA,CAAU,EAAA,CACV,OAAQ,SAAA,CACR,YAAA,CAAc,CAAA,CACd,aAAA,CAAe,SACf,UAAA,CAAY,aAAA,CACZ,UAAA,CAAY,MACd,EAEC,QAAA,CAAA1W,CAAAA,CAAAA,CAhBI8tB,CAiBP,CAEJ,CAAC,EACH,CAEJ,CAWA,SAASI,EAAAA,EAAmB,CAC1B,IAAMC,CAAAA,CAAazW,MAAAA,CAA8B,IAAI,EAC/C0W,CAAAA,CAAa1W,MAAAA,CAA8B,IAAI,CAAA,CAE/C2W,EAAcptB,WAAAA,CAAa0V,CAAAA,EAAwC,CACvE,IAAM2X,EAAUH,CAAAA,CAAW,OAAA,CACrBI,CAAAA,CAAUH,CAAAA,CAAW,QAC3B,GAAI,CAACE,CAAAA,EAAW,CAACC,EAAS,OAE1B,IAAMC,CAAAA,CAAOF,CAAAA,CAAQ,uBAAsB,CAGrCG,CAAAA,CAAAA,CAAS9X,EAAE,OAAA,CAAU6X,CAAAA,CAAK,MAAQA,CAAAA,CAAK,KAAA,CAAS,GAAA,CAKtDD,CAAAA,CAAQ,MAAM,UAAA,CAAa,CAAA,sCAAA,EAAyCE,CAAI,CAAA,oBAAA,EAAuBA,CAAI,CAAA,EAAA,CAAA,CACnGF,CAAAA,CAAQ,KAAA,CAAM,OAAA,CAAU,IAC1B,CAAA,CAAG,EAAE,CAAA,CAECG,EAAeztB,WAAAA,CAAY,IAAM,CACjCmtB,CAAAA,CAAW,UAASA,CAAAA,CAAW,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAU,KAC7D,CAAA,CAAG,EAAE,CAAA,CAEL,OAAO,CAAE,UAAA,CAAAD,EAAY,UAAA,CAAAC,CAAAA,CAAY,YAAAC,CAAAA,CAAa,YAAA,CAAAK,CAAa,CAC7D,CAuBA,SAASC,EAAAA,CAAc,CACrB,MAAA,CAAAC,EACA,OAAA,CAAAC,CAAAA,CACA,KAAA,CAAA7uB,CAAAA,CACA,SAAA8uB,CAAAA,CACA,SAAA,CAAAC,EACA,KAAA,CAAAjB,CACF,EAAuB,CACrB,GAAI,CAACc,CAAAA,EAAU,CAACG,CAAAA,EAAW,MAAA,CAAQ,OAAO,IAAA,CAE1C,IAAMC,CAAAA,CAAa,IAAI,GAAA,CACvBH,CAAAA,EAAS,QAASpjB,CAAAA,EAAMujB,CAAAA,CAAW,IAAIvjB,CAAAA,CAAE,OAAA,CAASA,CAAC,CAAC,CAAA,CAEpD,IAAMpJ,CAAAA,CAAoC0sB,EAAU,GAAA,CAAKniB,CAAAA,EACtCoiB,CAAAA,CAAW,GAAA,CAAIpiB,EAAE,IAAI,CAAA,EAExB,CACV,OAAA,CAASA,EAAE,IAAA,CACX,KAAA,CAAO,MAAA,CACP,MAAA,CAAQA,EAAE,KAAA,CACV,KAAA,CAAOA,CAAAA,CAAE,KACX,CAEH,CAAA,CAED,OACEzL,IAAAA,CAAC,KAAA,CAAA,CACC,MAAO,CACL,UAAA,CAAY,qBAAA,CACZ,MAAA,CAAQ,kCACR,YAAA,CAAc,CAAA,CACd,QAAS,UAAA,CACT,QAAA,CAAU,IACV,cAAA,CAAgB,WAAA,CAChB,QAAA,CAAU,EACZ,EAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,KAAA,CAAO,SAAA,CAAW,YAAA,CAAc,CAAA,CAAG,WAAY,GAAI,CAAA,CAC9D,QAAA,CAAA,OAAOrB,CAAAA,EAAU,SACd+tB,EAAAA,CAAuB/tB,CAAAA,CAAO8tB,CAAK,CAAA,CACnC9tB,EACN,CAAA,CACCqC,CAAAA,CAAM,GAAA,CAAKoJ,CAAAA,EACVtK,KAAC,KAAA,CAAA,CAEC,KAAA,CAAO,CACL,OAAA,CAAS,OACT,UAAA,CAAY,QAAA,CACZ,IAAK,CAAA,CACL,YAAA,CAAc,CAChB,CAAA,CAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CACC,MAAO,CACL,OAAA,CAAS,cAAA,CACT,KAAA,CAAO,EACP,MAAA,CAAQ,EAAA,CACR,YAAA,CAAc,CAAA,CACd,WAAYoK,CAAAA,CAAE,MAAA,EAAUA,CAAAA,CAAE,KAAA,CAC1B,WAAY,CACd,CAAA,CACF,CAAA,CACApK,GAAAA,CAAC,QACC,KAAA,CAAO,CACL,KAAA,CAAO,SAAA,CACP,KAAM,CAAA,CACN,QAAA,CAAU,QAAA,CACV,YAAA,CAAc,WACd,UAAA,CAAY,QAAA,CACZ,SAAU,GACZ,CAAA,CAEC,SAAAytB,CAAAA,CAAS,GAAA,CAAIrjB,CAAAA,CAAE,OAAO,GAAKA,CAAAA,CAAE,OAAA,CAChC,CAAA,CACApK,GAAAA,CAAC,QACC,KAAA,CAAO,CACL,KAAA,CAAO,SAAA,CACP,WAAY,GAAA,CACZ,kBAAA,CAAoB,cACtB,CAAA,CAEC,QAAA,CAAAoK,EAAE,KAAA,EAAS,IAAA,CAAO2P,EAAAA,CAAc3P,CAAAA,CAAE,KAAK,CAAA,CAAI,IAAA,CAC9C,CAAA,CAAA,CAAA,CAtCKA,CAAAA,CAAE,OAuCT,CACD,CAAA,CAAA,CACH,CAEJ,CAaA,SAASwjB,EAAAA,CAAe,CACtB,QAAAC,CAAAA,CACA,aAAA,CAAAC,EACA,QAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CACF,EAAwB,CACtB,GAAM,CAACte,CAAAA,CAAMue,CAAO,CAAA,CAAI1sB,QAAAA,CAAS,KAAK,CAAA,CAChC2sB,EAAU7X,MAAAA,CAAuB,IAAI,CAAA,CAG3C/M,SAAAA,CAAU,IAAM,CACd,GAAI,CAACoG,CAAAA,CAAM,OACX,SAASye,CAAAA,CAAY7Y,CAAAA,CAAe,CAC9B4Y,EAAQ,OAAA,EAAW,CAACA,CAAAA,CAAQ,OAAA,CAAQ,SAAS5Y,CAAAA,CAAE,MAAc,GAC/D2Y,CAAAA,CAAQ,KAAK,EAEjB,CACA,OAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,CAAaE,CAAW,CAAA,CAC3C,IAAM,QAAA,CAAS,mBAAA,CAAoB,YAAaA,CAAW,CACpE,CAAA,CAAG,CAACze,CAAI,CAAC,CAAA,CAET,IAAM0e,CAAAA,CAAQN,EAAc,MAAA,EAAUxB,EAAAA,CAGhC+B,CAAAA,CACJvuB,IAAAA,CAAC,OACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,WAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,EACN,QAAA,CAAU,CACZ,EAGA,QAAA,CAAA,CAAAE,GAAAA,CAAC,OAAI,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,IAAK,CAAA,CAAG,UAAA,CAAY,CAAE,CAAA,CAClD,SAAA8tB,CAAAA,CAAc,GAAA,CAAKQ,CAAAA,EAClBtuB,GAAAA,CAAC,QAEC,KAAA,CAAO,CACL,KAAA,CAAO,CAAA,CACP,OAAQ,CAAA,CACR,YAAA,CAAc,KAAA,CACd,UAAA,CAAY+tB,EAAS,GAAA,CAAIO,CAAI,CAAA,EAAK,SAAA,CAClC,QAAS,cACX,CAAA,CAAA,CAPKA,CAQP,CACD,EACH,CAAA,CAEAtuB,GAAAA,CAAC,QACC,KAAA,CAAO,CACL,MAAO,SAAA,CACP,QAAA,CAAU,EAAA,CACV,QAAA,CAAU,SACV,YAAA,CAAc,UAAA,CACd,UAAA,CAAY,QACd,EAEC,QAAA,CAAA8tB,CAAAA,CAAc,MAAA,GAAW,CAAA,CAAA,CACrB,IAAM,CACL,IAAMtT,EAAIqT,CAAAA,CAAQ,IAAA,CAAMU,GAAOA,CAAAA,CAAG,IAAA,GAAST,CAAAA,CAAc,CAAC,CAAC,CAAA,CAC3D,OAAOtT,CAAAA,EAAG,QAAA,GAAW,CAAC,CAAA,EAAG,KAAA,EAASA,CAAAA,EAAG,QAAA,EAAY,UACnD,CAAA,GAAG,CACH,GAAGsT,CAAAA,CAAc,MAAM,MAAMD,CAAAA,CAAQ,MAAM,CAAA,QAAA,CAAA,CACjD,CAAA,CAAA,CACF,EAGF,OACE/tB,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKouB,EACL,KAAA,CAAO,CAAE,QAAA,CAAU,UAAA,CAAY,QAAS,cAAA,CAAgB,KAAA,CAAO,GAAI,CAAA,CAGnE,UAAApuB,IAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAMmuB,EAASxiB,CAAAA,EAAM,CAACA,CAAC,CAAA,CAChC,MAAO,CACL,OAAA,CAAS,aAAA,CACT,UAAA,CAAY,SACZ,GAAA,CAAK,CAAA,CACL,QAAS,UAAA,CACT,YAAA,CAAc,EACd,MAAA,CAAQ,kCAAA,CACR,UAAA,CAAY,wBAAA,CACZ,OAAQ,SAAA,CACR,KAAA,CAAO,MAAA,CACP,UAAA,CAAY,MACd,CAAA,CAEC,QAAA,CAAA,CAAA4iB,CAAAA,CAEDruB,GAAAA,CAAC,OACC,KAAA,CAAM,IAAA,CACN,OAAO,IAAA,CACP,OAAA,CAAQ,YACR,IAAA,CAAK,MAAA,CACL,KAAA,CAAO,CACL,WAAY,CAAA,CACZ,SAAA,CAAW0P,CAAAA,CAAO,gBAAA,CAAmB,eACrC,UAAA,CAAY,iBAAA,CACZ,KAAA,CAAO,SACT,EAEA,QAAA,CAAA1P,GAAAA,CAAC,QACC,CAAA,CAAE,cAAA,CACF,OAAO,cAAA,CACP,WAAA,CAAY,KAAA,CACZ,aAAA,CAAc,QACd,cAAA,CAAe,OAAA,CACjB,CAAA,CACF,CAAA,CAAA,CACF,EAGC0P,CAAAA,EACC5P,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,kBAAA,CACL,KAAM,CAAA,CACN,MAAA,CAAQ,EAAA,CACR,UAAA,CAAY,UACZ,MAAA,CAAQ,iCAAA,CACR,YAAA,CAAc,EAAA,CACd,UAAW,4BAAA,CACX,QAAA,CAAU,GAAA,CACV,QAAA,CAAU,IACV,SAAA,CAAW,GAAA,CACX,UAAW,MAAA,CACX,OAAA,CAAS,OACX,CAAA,CAGA,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,MAAO,CACL,OAAA,CAAS,cAAA,CACT,QAAA,CAAU,GACV,KAAA,CAAO,SAAA,CACP,YAAA,CAAc,kCAAA,CACd,aAAc,CAChB,CAAA,CACD,0BACewsB,EAAAA,CAAa,UAAA,CAAA,CAC7B,EAECuB,CAAAA,CAAQ,GAAA,CAAI,CAAC1rB,CAAAA,CAAQzD,IAAQ,CAC5B,IAAM2B,CAAAA,CAAaytB,CAAAA,CAAc,SAAS3rB,CAAAA,CAAO,IAAI,CAAA,CAC/CqsB,CAAAA,CAAa,CAACnuB,CAAAA,EAAc+tB,CAAAA,CAC5BK,EAAYpuB,CAAAA,EAAcytB,CAAAA,CAAc,SAAW,CAAA,CACnDvQ,CAAAA,CAAQwQ,CAAAA,CAAS,GAAA,CAAI5rB,EAAO,IAAI,CAAA,EAAK,SAAA,CACrCusB,CAAAA,CACJvsB,EAAO,QAAA,CAAS,IAAA,CAAM+G,CAAAA,EAAMA,CAAAA,CAAE,MAAM,WAAA,EAAY,GAAM,KAAK,CAAA,EAC3D/G,EAAO,QAAA,CAAS,CAAC,CAAA,CACbgQ,CAAAA,CACJuc,GAAY,KAAA,EAAS,IAAA,CACjB,CAAA,EAAG,IAAA,CAAK,MAAMA,CAAAA,CAAW,KAAA,CAAQ,GAAG,CAAC,IACrC,IAAA,CAEN,OACE5uB,KAAC,QAAA,CAAA,CAEC,OAAA,CAAS,IAAM,CACT2uB,CAAAA,EAAaD,CAAAA,EACjBR,CAAAA,CAAS7rB,EAAO,IAAI,EACtB,CAAA,CACA,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,IAAK,EAAA,CACL,KAAA,CAAO,MAAA,CACP,OAAA,CAAS,WACT,MAAA,CAAQ,MAAA,CACR,UAAA,CAAY9B,CAAAA,CACR,yBACA,aAAA,CACJ,MAAA,CAAQmuB,CAAAA,EAAcC,CAAAA,CAAY,cAAgB,SAAA,CAClD,OAAA,CAASD,CAAAA,CAAa,GAAA,CAAO,EAC7B,SAAA,CAAW,MAAA,CACX,WAAY,iBACd,CAAA,CACA,aAAelZ,CAAAA,EAAM,CACf,CAACkZ,CAAAA,EAAc,CAACC,CAAAA,GACjBnZ,CAAAA,CAAE,aAAA,CAAoC,KAAA,CAAM,WAC3C,wBAAA,EACN,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAM,CAClBA,CAAAA,CAAE,aAAA,CAAoC,KAAA,CAAM,UAAA,CAC3CjV,EAAa,wBAAA,CAA2B,cAC5C,CAAA,CAGA,QAAA,CAAA,CAAAL,IAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,KAAA,CAAO,GACP,MAAA,CAAQ,EAAA,CACR,YAAA,CAAc,CAAA,CACd,OAAQK,CAAAA,CACJ,CAAA,UAAA,EAAakd,CAAK,CAAA,CAAA,CAClB,iCAAA,CACJ,WAAYld,CAAAA,CAAa,CAAA,EAAGkd,CAAK,CAAA,EAAA,CAAA,CAAO,cACxC,UAAA,CAAY,CAAA,CACZ,OAAA,CAAS,MAAA,CACT,WAAY,QAAA,CACZ,cAAA,CAAgB,QAClB,CAAA,CAEC,SAAAld,CAAAA,EACCL,GAAAA,CAAC,OAAI,KAAA,CAAM,GAAA,CAAI,OAAO,GAAA,CAAI,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,OAC/C,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CACC,CAAA,CAAE,mBACF,MAAA,CAAQud,CAAAA,CACR,WAAA,CAAY,KAAA,CACZ,cAAc,OAAA,CACd,cAAA,CAAe,QACjB,CAAA,CACF,CAAA,CAEJ,EAGAvd,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,MAAO,CAAA,CACP,MAAA,CAAQ,CAAA,CACR,YAAA,CAAc,MACd,UAAA,CAAYud,CAAAA,CACZ,UAAA,CAAY,CACd,EACF,CAAA,CAGAvd,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,KAAA,CAAOK,CAAAA,CAAa,SAAA,CAAY,SAAA,CAChC,SAAU,EAAA,CACV,IAAA,CAAM,CAAA,CACN,QAAA,CAAU,SACV,YAAA,CAAc,UAAA,CACd,UAAA,CAAY,QACd,EAEC,QAAA,CAAA8B,CAAAA,CAAO,WAAW,CAAC,CAAA,EAAG,OAASA,CAAAA,CAAO,QAAA,CACzC,CAAA,CAGCgQ,CAAAA,EACCnS,IAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,KAAA,CAAAud,EACA,UAAA,CAAY,GAAA,CACZ,QAAA,CAAU,EAAA,CACV,WAAY,CACd,CAAA,CAEC,SAAApL,CAAAA,CACH,CAAA,CAAA,CAAA,CA/FGhQ,EAAO,EAAA,EAAM,CAAA,EAAGzD,CAAG,CAAA,CAAA,EAAIyD,EAAO,IAAI,CAAA,CAiGzC,CAEJ,CAAC,GACH,CAAA,CAAA,CAEJ,CAEJ,CAaA,SAASwsB,GAAU,CAAE,MAAA,CAAAC,EAAQ,QAAA,CAAAb,CAAAA,CAAU,cAAAc,CAAc,CAAA,CAAmB,CACtE,OACE7uB,IAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,OACT,QAAA,CAAU,MAAA,CACV,GAAA,CAAK,UAAA,CACL,QAAS,OACX,CAAA,CAEC,QAAA,CAAA4uB,CAAAA,CAAO,IAAKrjB,CAAAA,EAAM,CACjB,IAAMgS,CAAAA,CAAQwQ,EAAS,GAAA,CAAIxiB,CAAAA,CAAE,UAAU,CAAA,EAAK,UACtChG,CAAAA,CAAQspB,CAAAA,CAAc,GAAA,CAAItjB,CAAAA,CAAE,UAAU,CAAA,CAC5C,OACEzL,KAAC,KAAA,CAAA,CAEC,KAAA,CAAO,CACL,OAAA,CAAS,aAAA,CACT,UAAA,CAAY,YAAA,CACZ,IAAK,CACP,CAAA,CAGA,QAAA,CAAA,CAAAE,GAAAA,CAAC,QACC,KAAA,CAAO,CACL,KAAA,CAAO,CAAA,CACP,OAAQ,CAAA,CACR,YAAA,CAAc,MACd,UAAA,CAAYud,CAAAA,CACZ,WAAY,CAAA,CACZ,SAAA,CAAW,CACb,CAAA,CACF,EAEAzd,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,QAAS,MAAA,CAAQ,aAAA,CAAe,QAAA,CAAU,GAAA,CAAK,CAAE,CAAA,CAC7D,QAAA,CAAA,CAAAE,IAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,KAAA,CAAO,SAAA,CACP,QAAA,CAAU,EAAA,CACV,WAAY,MAAA,CACZ,UAAA,CAAY,QACd,CAAA,CAEC,SAAAuL,CAAAA,CAAE,KAAA,CACL,CAAA,CACAvL,GAAAA,CAAC,QACC,KAAA,CAAO,CACL,KAAA,CAAO,SAAA,CACP,SAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,UAAA,CAAY,OACZ,kBAAA,CAAoB,cACtB,CAAA,CAEC,QAAA,CAAAuF,GAAS,IAAA,CAAOwU,EAAAA,CAAcxU,CAAK,CAAA,CAAI,KAC1C,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAzCKgG,EAAE,UA0CT,CAEJ,CAAC,CAAA,CACH,CAEJ,CAYA,SAASujB,GAAeC,CAAAA,CAA0B,CAChD,IAAMC,CAAAA,CAAM,KAAK,KAAA,CAAMD,CAAAA,CAAO,MAAA,CAAS,CAAC,EACxC,OAAOA,CAAAA,CAAO,MAAA,CAAS,CAAA,GAAM,EACzBA,CAAAA,CAAOC,CAAG,CAAA,CAAA,CACTD,CAAAA,CAAOC,EAAM,CAAC,CAAA,CAAID,CAAAA,CAAOC,CAAG,GAAK,CACxC,CAQA,SAASC,EAAAA,CACPlX,EACAmX,CAAAA,CAC6B,CAC7B,GAAInX,CAAAA,CAAK,MAAA,EAAUmX,EAAW,OAAOnX,CAAAA,CAErC,IAAM/K,CAAAA,CAAsC,EAAC,CACvCmiB,CAAAA,CAAOpX,CAAAA,CAAK,MAAA,CAASmX,EAE3B,IAAA,IAASruB,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIquB,EAAWruB,CAAAA,EAAAA,CAAK,CAClC,IAAMuuB,CAAAA,CAAQ,KAAK,KAAA,CAAMvuB,CAAAA,CAAIsuB,CAAI,CAAA,CAC3BrpB,EAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAA,CAAOjF,EAAI,CAAA,EAAKsuB,CAAI,CAAA,CAAGpX,CAAAA,CAAK,MAAM,CAAA,CACtDsX,CAAAA,CAAStX,EAAK,KAAA,CAAMqX,CAAAA,CAAOtpB,CAAG,CAAA,CAC9BipB,CAAAA,CAASM,CAAAA,CAAO,GAAA,CAAKjlB,GAAMA,CAAAA,CAAE,KAAK,CAAA,CAAE,IAAA,CAAK,CAACtL,CAAAA,CAAGC,CAAAA,GAAMD,CAAAA,CAAIC,CAAC,EAC9DiO,CAAAA,CAAO,IAAA,CAAK,CACV,SAAA,CAAWqiB,CAAAA,CAAOA,EAAO,MAAA,CAAS,CAAC,CAAA,CAAE,SAAA,CACrC,MAAOP,EAAAA,CAAeC,CAAM,CAC9B,CAAC,EACH,CAEA,OAAO/hB,CACT,CAEA,SAASsiB,EAAAA,CACPV,CAAAA,CACAW,EAAqB,GAAA,CACT,CACZ,GAAIX,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,OAAO,EAAC,CAGjC,IAAMY,CAAAA,CAAgBZ,CAAAA,CAAO,IAAKrjB,CAAAA,GAAO,CACvC,GAAGA,CAAAA,CACH,KAAM0jB,EAAAA,CAAiB1jB,CAAAA,CAAE,IAAA,CAAMgkB,CAAkB,CACnD,CAAA,CAAE,CAAA,CAEIE,CAAAA,CAAgB,IAAI,IAC1BD,CAAAA,CAAc,OAAA,CAASjkB,CAAAA,EACrBA,CAAAA,CAAE,KAAK,OAAA,CAASnB,CAAAA,EAAMqlB,CAAAA,CAAc,GAAA,CAAIrlB,EAAE,SAAS,CAAC,CACtD,CAAA,CAEA,IAAM2kB,EAAS,KAAA,CAAM,IAAA,CAAKU,CAAa,CAAA,CAAE,KAAK,CAAC3wB,CAAAA,CAAGC,CAAAA,GAAMD,CAAAA,CAAIC,CAAC,CAAA,CAGvD2wB,CAAAA,CAAUF,CAAAA,CAAc,GAAA,CAAKjkB,GAAM,CACvC,IAAMiP,EAAI,IAAI,GAAA,CACd,OAAAjP,CAAAA,CAAE,IAAA,CAAK,OAAA,CAASnB,CAAAA,EAAMoQ,EAAE,GAAA,CAAIpQ,CAAAA,CAAE,SAAA,CAAWA,CAAAA,CAAE,KAAK,CAAC,CAAA,CAC1C,CAAE,IAAA,CAAMmB,EAAE,UAAA,CAAY,GAAA,CAAKiP,CAAE,CACtC,CAAC,EAEKmV,CAAAA,CAAa,IAAI,GAAA,CAEvB,OAAOZ,EAAO,GAAA,CAAKa,CAAAA,EAAO,CACxB,IAAMC,EAAgB,CAAE,SAAA,CAAWD,CAAG,CAAA,CACtC,OAAAF,CAAAA,CAAQ,OAAA,CAAQ,CAAC,CAAE,KAAApB,CAAAA,CAAM,GAAA,CAAAwB,CAAI,CAAA,GAAM,CACjC,IAAMvd,CAAAA,CAAMud,CAAAA,CAAI,GAAA,CAAIF,CAAE,CAAA,CACtB,GAAIrd,CAAAA,GAAQ,MAAA,CACVod,EAAW,GAAA,CAAIrB,CAAAA,CAAM/b,CAAG,CAAA,CACxBsd,CAAAA,CAAIvB,CAAI,CAAA,CAAI/b,CAAAA,CAAAA,KACP,CACL,IAAMwd,EAAOJ,CAAAA,CAAW,GAAA,CAAIrB,CAAI,CAAA,CAC5ByB,IAAS,MAAA,GAAWF,CAAAA,CAAIvB,CAAI,CAAA,CAAIyB,GACtC,CACF,CAAC,EACMF,CACT,CAAC,CACH,CAeO,SAASG,EAAAA,CAAgBC,CAAAA,CAA6B,CAC3D,OACEjwB,GAAAA,CAACosB,EAAAA,CAAA,CACC,SAAApsB,GAAAA,CAACkwB,EAAAA,CAAA,CAAsB,GAAGD,EAAO,CAAA,CACnC,CAEJ,CAEA,SAASC,EAAAA,CAAqB,CAC5B,KAAA,CAAAjuB,CAAAA,CACA,SAAA,CAAWkuB,CAAAA,CACX,UAAA1wB,CAAAA,CACA,MAAA,CAAA2wB,CACF,CAAA,CAAyB,CACvB,IAAMC,CAAAA,CAAansB,OAAAA,CAAQ,IAAM,CAC/B,IAAMosB,CAAAA,CAAO,IAAI,GAAA,CACjB,QAAQruB,CAAAA,CAAM,OAAA,EAAW,EAAC,EAAG,OAAQuY,CAAAA,EAC/BA,CAAAA,CAAE,MAAA,GAAW,MAAA,EAAU8V,EAAK,GAAA,CAAI9V,CAAAA,CAAE,IAAI,CAAA,CAAU,OACpD8V,CAAAA,CAAK,GAAA,CAAI9V,EAAE,IAAI,CAAA,CACR,KACR,CACH,CAAA,CAAG,CAACvY,CAAAA,CAAM,OAAO,CAAC,CAAA,CAIZsuB,CAAAA,CAAgBrsB,OAAAA,CACpB,IACE,CAAC,GAAGmsB,CAAU,CAAA,CAAE,KAAK,CAACvxB,CAAAA,CAAGC,CAAAA,GAAM,CAC7B,IAAMyxB,CAAAA,CAAWhW,CAAAA,EAAAA,CAEbA,CAAAA,CAAE,QAAA,CAAS,KAAMtR,EAAAA,EAAMA,EAAAA,CAAE,KAAA,CAAM,WAAA,KAAkB,KAAK,CAAA,EACtDsR,CAAAA,CAAE,QAAA,CAAS,CAAC,CAAA,GACX,KAAA,EAAS,EACd,OAAOgW,CAAAA,CAAQzxB,CAAC,CAAA,CAAIyxB,CAAAA,CAAQ1xB,CAAC,CAC/B,CAAC,CAAA,CACH,CAACuxB,CAAU,CACb,EAGM,CAACvC,CAAAA,CAAe2C,CAAgB,CAAA,CAAIlvB,SAAmB,IAC3DgvB,CAAAA,CAAc,KAAA,CAAM,CAAA,CAAGjE,EAAY,CAAA,CAAE,GAAA,CAAK9R,CAAAA,EAAMA,CAAAA,CAAE,IAAI,CACxD,CAAA,CAGM,CAACkW,CAAAA,CAAYC,CAAa,CAAA,CAC9BpvB,QAAAA,CAAyBmB,EAAmB,CAAA,CAKxCqrB,EAAW7pB,OAAAA,CAAQ,IAAM,CAC7B,IAAM4rB,CAAAA,CAAM,IAAI,GAAA,CAChB,OAAAhC,CAAAA,CAAc,OAAA,CAAQ,CAACQ,CAAAA,CAAM5vB,CAAAA,GAAQ,CACnCoxB,CAAAA,CAAI,IAAIxB,CAAAA,CAAM/B,EAAAA,CAAa7tB,CAAAA,CAAM6tB,EAAAA,CAAa,MAAM,CAAC,EACvD,CAAC,CAAA,CACMuD,CACT,EAAG,CAAChC,CAAa,CAAC,CAAA,CAEZ8C,EAAkB1sB,OAAAA,CACtB,IAAMmsB,CAAAA,CAAW,MAAA,CAAQ7V,GAAMsT,CAAAA,CAAc,QAAA,CAAStT,CAAAA,CAAE,IAAI,CAAC,CAAA,CAC7D,CAAC6V,EAAYvC,CAAa,CAC5B,EAEM,CAAE,MAAA,CAAQ+C,CAAAA,CAAY,SAAA,CAAWC,CAAY,CAAA,CAAIC,gBAAAA,CACrDH,CAAAA,CACAF,CACF,EACMpZ,CAAAA,CAAY6Y,CAAAA,EAAmBW,CAAAA,CAI/BlC,CAAAA,CAAS1qB,QAA+B,IAAM,CAClD,GAAI2sB,CAAAA,CAAW,OAAS,CAAA,EAAKA,CAAAA,CAAW,IAAA,CAAMtlB,CAAAA,EAAMA,EAAE,IAAA,CAAK,MAAA,CAAS,CAAC,CAAA,CACnE,OAAOslB,CAAAA,CAET,IAAMhrB,CAAAA,CAAM,IAAA,CAAK,KAAI,CACfmrB,CAAAA,CAAQ,MACd,OAAOJ,CAAAA,CAAgB,IAAKzuB,CAAAA,EAAW,CAIrC,IAAM+L,EAAAA,CAAAA,CAFJ/L,EAAO,QAAA,EAAU,IAAA,CAAM+G,EAAAA,EAAMA,EAAAA,CAAE,MAAM,WAAA,EAAY,GAAM,KAAK,CAAA,EAC5D/G,EAAO,QAAA,GAAW,CAAC,CAAA,GACK,KAAA,EAAS,GACnC,OAAO,CACL,UAAA,CAAYA,CAAAA,CAAO,KACnB,KAAA,CAAOA,CAAAA,CAAO,QAAA,GAAW,CAAC,GAAG,KAAA,EAASA,CAAAA,CAAO,QAAA,CAC7C,IAAA,CAAM,CACJ,CAAE,SAAA,CAAW0D,EAAM,CAAA,CAAImrB,CAAAA,CAAO,MAAA9iB,EAAM,CAAA,CACpC,CAAE,SAAA,CAAWrI,EAAK,KAAA,CAAAqI,EAAM,CAC1B,CACF,CACF,CAAC,CACH,CAAA,CAAG,CAAC2iB,EAAYD,CAAe,CAAC,CAAA,CAI1BrB,CAAAA,CAAqBrrB,QAAQ,IAC7BwsB,CAAAA,GAAejuB,UAAAA,CAAW,OAAA,CAAgB,GAC1CiuB,CAAAA,GAAejuB,UAAAA,CAAW,QAAA,CAAiB,GAAA,CAC3CiuB,IAAejuB,UAAAA,CAAW,SAAA,CAAkB,GAAA,CACzC,GAAA,CACN,CAACiuB,CAAU,CAAC,EAETO,CAAAA,CAAY/sB,OAAAA,CAChB,IAAMorB,EAAAA,CAAeV,CAAAA,CAAQW,CAAkB,CAAA,CAC/C,CAACX,CAAAA,CAAQW,CAAkB,CAC7B,CAAA,CAGM2B,EAAUhtB,OAAAA,CAAQ,IAAwB,CAC9C,GAAI+sB,EAAU,MAAA,GAAW,CAAA,CAAG,OAAO,CAAC,CAAA,CAAG,CAAC,CAAA,CACxC,IAAIE,CAAAA,CAAM,CAAA,CAAA,CAAA,CACNC,EAAM,EAAA,CAAA,CAAA,CAUV,GATAtD,CAAAA,CAAc,OAAA,CAASQ,GAAS,CAC9B2C,CAAAA,CAAU,OAAA,CAASpB,EAAAA,EAAQ,CACzB,IAAMpkB,EAAAA,CAAIokB,GAAIvB,CAAI,CAAA,CACd7iB,IAAK,IAAA,GACHA,EAAAA,CAAI0lB,CAAAA,GAAKA,CAAAA,CAAM1lB,IACfA,EAAAA,CAAI2lB,CAAAA,GAAKA,CAAAA,CAAM3lB,EAAAA,CAAAA,EAEvB,CAAC,EACH,CAAC,CAAA,CACG,CAAC,SAAS0lB,CAAG,CAAA,CAAG,OAAO,CAAC,EAAG,CAAC,CAAA,CAChC,IAAME,CAAAA,CAAM,KAAK,GAAA,CAAA,CAAKD,CAAAA,CAAMD,CAAAA,EAAO,GAAA,CAAM,GAAI,CAAA,CAC7C,OAAO,CAAC,IAAA,CAAK,IAAI,CAAA,CAAGA,CAAAA,CAAME,CAAG,CAAA,CAAG,IAAA,CAAK,IAAI,CAAA,CAAGD,CAAAA,CAAMC,CAAG,CAAC,CACxD,CAAA,CAAG,CAACJ,CAAAA,CAAWnD,CAAa,CAAC,CAAA,CAGvBwD,CAAAA,CAAgBptB,OAAAA,CAAQ,IAAM,CAClC,IAAM4rB,CAAAA,CAAM,IAAI,GAAA,CAChB,OAAAlB,CAAAA,CAAO,OAAA,CAASrjB,CAAAA,EAAM,CAChBA,EAAE,IAAA,CAAK,MAAA,CAAS,CAAA,EAClBukB,CAAAA,CAAI,IAAIvkB,CAAAA,CAAE,UAAA,CAAYA,CAAAA,CAAE,IAAA,CAAKA,EAAE,IAAA,CAAK,MAAA,CAAS,CAAC,CAAA,CAAE,KAAK,EAEzD,CAAC,CAAA,CACMukB,CACT,CAAA,CAAG,CAAClB,CAAM,CAAC,CAAA,CAGLnB,CAAAA,CAAWvpB,QAAQ,IAAM,CAC7B,IAAM4rB,CAAAA,CAAM,IAAI,GAAA,CAChB,OAAAlB,CAAAA,CAAO,OAAA,CAASrjB,GAAMukB,CAAAA,CAAI,GAAA,CAAIvkB,CAAAA,CAAE,UAAA,CAAYA,EAAE,KAAK,CAAC,CAAA,CAC7CukB,CACT,EAAG,CAAClB,CAAM,CAAC,CAAA,CAGL2C,EAAgBrtB,OAAAA,CACpB,IACE0qB,EAAO,GAAA,CAAKrjB,CAAAA,GAAO,CACjB,IAAA,CAAMA,CAAAA,CAAE,UAAA,CACR,KAAA,CAAOwiB,EAAS,GAAA,CAAIxiB,CAAAA,CAAE,UAAU,CAAA,EAAK,SACvC,CAAA,CAAE,CAAA,CACJ,CAACqjB,CAAAA,CAAQb,CAAQ,CACnB,CAAA,CAGM,CACJ,UAAA,CAAYyD,CAAAA,CACZ,WAAYC,CAAAA,CACZ,WAAA,CAAaC,CAAAA,CACb,YAAA,CAAcC,CAChB,CAAA,CAAI9E,EAAAA,EAAiB,CAGf+E,CAAAA,CAAehyB,YAAa0uB,CAAAA,EAAiB,CACjDmC,CAAAA,CAAkBlc,CAAAA,EACZA,EAAK,QAAA,CAAS+Z,CAAI,EAChB/Z,CAAAA,CAAK,MAAA,EAAU,EAAUA,CAAAA,CACtBA,CAAAA,CAAK,MAAA,CAAQhJ,CAAAA,EAAMA,IAAM+iB,CAAI,CAAA,CAElC/Z,CAAAA,CAAK,MAAA,EAAU+X,GAAqB/X,CAAAA,CACjC,CAAC,GAAGA,CAAAA,CAAM+Z,CAAI,CACtB,EACH,CAAA,CAAG,EAAE,CAAA,CAMC,CAACuD,EAAAA,CAAeC,CAAgB,EAAIvwB,QAAAA,CAGhC,IAAI,CAAA,CACRwwB,CAAAA,CAAmB1b,OAAmC,IAAI,CAAA,CAC1D2b,CAAAA,CAAoB3b,MAAAA,CAAO,EAAE,CAAA,CAC7B4b,EAAAA,CAAW5b,OAAO,CAAC,CAAA,CAEnB6b,GAAY,CAAC5a,CAAAA,EAAa2Z,CAAAA,CAAU,MAAA,CAAS,EAEnD,OACEnxB,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWL,EACX,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,cAAe,QAAA,CAAU,GAAA,CAAK,EAAG,CAAA,CAG3D,QAAA,CAAA,CAAAO,IAAC2uB,EAAAA,CAAA,CACC,MAAA,CAAQC,CAAAA,CACR,SAAUb,CAAAA,CACV,aAAA,CAAe8D,EAAAA,EAAiBP,CAAAA,CAClC,EAGAxxB,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,QAAS,MAAA,CAAQ,aAAA,CAAe,SAAU,GAAA,CAAK,CAAE,EAC7D,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKwxB,EACL,KAAA,CAAO,CACL,MAAA,CAAQ,GAAA,CACR,MAAO,MAAA,CACP,UAAA,CAAY,MAAA,CACZ,QAAA,CAAU,UACZ,CAAA,CACA,WAAA,CACEU,EAAAA,CACK5c,CAAAA,EAAM,CACLoc,CAAAA,CAAuBpc,CAAC,CAAA,CACxB,oBAAA,CAAqB2c,GAAS,OAAO,CAAA,CACrCA,EAAAA,CAAS,OAAA,CAAU,sBAAsB,IAAM,CAC7CH,CAAAA,CAAiBC,CAAAA,CAAiB,OAAO,EAC3C,CAAC,EACH,CAAA,CACA,MAAA,CAEN,aACEG,EAAAA,CACI,IAAM,CACJP,CAAAA,GACA,oBAAA,CAAqBM,EAAAA,CAAS,OAAO,CAAA,CACrCD,EAAkB,OAAA,CAAU,EAAA,CAC5BD,CAAAA,CAAiB,OAAA,CAAU,KAC3BD,CAAAA,CAAiB,IAAI,EACvB,CAAA,CACA,MAAA,CAGL,SAAAxa,CAAAA,CACCtX,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,MAAA,CACT,WAAY,QAAA,CACZ,cAAA,CAAgB,QAClB,CAAA,CAEA,SAAAA,GAAAA,CAAC,KAAA,CAAA,CACC,MAAO,CACL,KAAA,CAAO,GACP,MAAA,CAAQ,EAAA,CACR,YAAA,CAAc,KAAA,CACd,OAAQ,qBAAA,CACR,cAAA,CAAgB,aAAA,CAChB,SAAA,CAAW,2BACb,CAAA,CACF,CAAA,CACF,CAAA,CACEixB,CAAAA,CAAU,SAAW,CAAA,CACvBjxB,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,MAAA,CACT,WAAY,QAAA,CACZ,cAAA,CAAgB,QAAA,CAChB,KAAA,CAAO,UACP,QAAA,CAAU,EACZ,CAAA,CACD,QAAA,CAAA,uBAAA,CAED,EAEAF,IAAAA,CAAAkS,QAAAA,CAAA,CAEE,QAAA,CAAA,CAAAhS,GAAAA,CAAC,OACC,GAAA,CAAKyxB,CAAAA,CACL,KAAA,CAAO,CACL,SAAU,UAAA,CACV,KAAA,CAAO,CAAA,CACP,OAAA,CAAS,EACT,aAAA,CAAe,MAAA,CACf,MAAA,CAAQ,CACV,EACF,CAAA,CACAzxB,GAAAA,CAACmyB,mBAAAA,CAAA,CAAoB,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CACvC,QAAA,CAAAryB,KAACsyB,SAAAA,CAAA,CACC,IAAA,CAAMnB,CAAAA,CACN,OAAQ,CAAE,GAAA,CAAK,CAAA,CAAG,KAAA,CAAO,GAAI,IAAA,CAAM,CAAA,CAAG,OAAQ,CAAE,CAAA,CAGhD,UAAAjxB,GAAAA,CAACqyB,aAAAA,CAAA,CACC,UAAA,CAAU,KACV,QAAA,CAAU,KAAA,CACV,eAAA,CAAgB,KAAA,CAChB,OAAO,SAAA,CACP,OAAA,CAAS,EAAA,CACX,CAAA,CAGAryB,IAACsyB,KAAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,KAAK,QAAA,CACL,KAAA,CAAM,MAAA,CACN,MAAA,CAAQ,CAAC,SAAA,CAAW,SAAS,CAAA,CAC7B,aAAA,CAAgB9F,GACdlG,EAAAA,CAAgBkG,CAAAA,CAAIkE,CAAU,CAAA,CAEhC,SAAU,KAAA,CACV,QAAA,CAAU,MACV,IAAA,CAAM,CAAE,KAAM,SAAA,CAAW,QAAA,CAAU,EAAG,CAAA,CACtC,WAAY,EAAA,CACd,CAAA,CAGA1wB,GAAAA,CAACuyB,KAAAA,CAAA,CACC,MAAA,CAAQrB,CAAAA,CACR,aAAA,CAAgBzlB,CAAAA,EAAc,GAAG,IAAA,CAAK,KAAA,CAAMA,EAAI,GAAG,CAAC,IACpD,QAAA,CAAU,KAAA,CACV,QAAA,CAAU,KAAA,CACV,KAAM,CAAE,IAAA,CAAM,SAAA,CAAW,QAAA,CAAU,EAAG,CAAA,CACtC,KAAA,CAAO,EAAA,CACP,SAAA,CAAW,EACb,CAAA,CAGAzL,GAAAA,CAACwyB,QAAA,CACC,OAAA,CAAUvC,GAAU,CAElB,IAAM7lB,CAAAA,CAAI6lB,CAAAA,CACV,GAAI7lB,CAAAA,CAAE,MAAA,EAAUA,CAAAA,CAAE,OAAA,EAAS,OAAQ,CACjC,IAAMwF,CAAAA,CAAMxF,CAAAA,CAAE,QACX,GAAA,CAEE6N,CAAAA,EAAc,CAAA,EAAGA,CAAAA,CAAK,OAAO,CAAA,CAAA,EAAIA,CAAAA,CAAK,KAAK,CAAA,CAC9C,EACC,IAAA,CAAK,GAAG,CAAA,CACX,GAAIrI,IAAQoiB,CAAAA,CAAkB,OAAA,CAAS,CACrCA,CAAAA,CAAkB,QAAUpiB,CAAAA,CAC5B,IAAMkgB,EAAM,IAAI,GAAA,CAEhB1lB,EAAE,OAAA,CAAQ,OAAA,CAAS6N,EAAAA,EAAc,CAC3BA,GAAK,KAAA,EAAS,IAAA,EAChB6X,CAAAA,CAAI,GAAA,CAAI7X,GAAK,OAAA,CAASA,EAAAA,CAAK,KAAK,EACpC,CAAC,CAAA,CACD8Z,CAAAA,CAAiB,QAAUjC,EAC7B,CACF,CACA,OACE9vB,GAAAA,CAACstB,EAAAA,CAAA,CACE,GAAGljB,CAAAA,CACJ,QAAA,CAAUqjB,CAAAA,CACV,SAAA,CAAW8D,EACX,KAAA,CAAOb,CAAAA,CACT,CAEJ,CAAA,CACA,OAAQ,CACN,MAAA,CAAQ,UACR,WAAA,CAAa,CAAA,CACb,gBAAiB,KACnB,CAAA,CACA,YAAA,CAAc,CAAE,OAAQ,CAAE,CAAA,CAC1B,iBAAA,CAAmB,KAAA,CACrB,EAOC9B,CAAAA,CAAO,GAAA,CAAKrjB,CAAAA,EAAM,CACjB,IAAMgS,CAAAA,CAAQwQ,CAAAA,CAAS,GAAA,CAAIxiB,CAAAA,CAAE,UAAU,CAAA,EAAK,SAAA,CAC5C,OACEvL,GAAAA,CAACyyB,KAAA,CAEC,IAAA,CAAK,QAAA,CACL,OAAA,CAASlnB,EAAE,UAAA,CACX,MAAA,CAAQgS,CAAAA,CACR,WAAA,CAAa,EACb,cAAA,CAAe,OAAA,CACf,cAAc,OAAA,CACd,GAAA,CAAK,MACL,SAAA,CAAW,CACT,CAAA,CAAG,GAAA,CACH,YAAa,CAAA,CACb,MAAA,CAAQ,oBAAA,CACR,IAAA,CAAMA,CACR,CAAA,CACA,YAAA,CAAY,IAAA,CACZ,iBAAA,CAAmB,OAfdhS,CAAAA,CAAE,UAgBT,CAEJ,CAAC,CAAA,CAGAsmB,IAAiB,IAAA,EAChBZ,CAAAA,CAAU,MAAA,CAAS,CAAA,EACnBrC,EAAO,GAAA,CAAKrjB,CAAAA,EAAM,CAChB,IAAMmnB,EAAUzB,CAAAA,CAAUA,CAAAA,CAAU,MAAA,CAAS,CAAC,EACxC0B,CAAAA,CAAOD,CAAAA,CAAQnnB,EAAE,UAAU,CAAA,CACjC,GAAIonB,CAAAA,EAAQ,IAAA,CAAM,OAAO,IAAA,CACzB,IAAMpV,CAAAA,CAAQwQ,CAAAA,CAAS,GAAA,CAAIxiB,CAAAA,CAAE,UAAU,CAAA,EAAK,SAAA,CAC5C,OACEvL,GAAAA,CAAC4yB,aAAA,CAEC,CAAA,CAAGF,CAAAA,CAAQ,SAAA,CACX,EAAGC,CAAAA,CACH,UAAA,CAAW,cAAA,CACX,KAAA,CAAQ1C,IAAwC,CAC9C,GAAM,CAAE,EAAA,CAAI4C,GAAI,EAAA,CAAIC,EAAG,CAAA,CAAI7C,EAAAA,CAC3B,OAAI4C,EAAAA,EAAM,IAAA,EAAQC,IAAM,IAAA,CAAa9yB,GAAAA,CAAC,MAAE,CAAA,CAEtCF,IAAAA,CAAC,GAAA,CAAA,CACC,QAAA,CAAA,CAAAA,KAAC,QAAA,CAAA,CACC,EAAA,CAAI+yB,EAAAA,CACJ,EAAA,CAAIC,GACJ,CAAA,CAAG,CAAA,CACH,IAAA,CAAMvV,CAAAA,CACN,QAAS,EAAA,CAET,QAAA,CAAA,CAAAvd,GAAAA,CAAC,SAAA,CAAA,CACC,cAAc,GAAA,CACd,MAAA,CAAO,OAAA,CACP,GAAA,CAAI,KACJ,WAAA,CAAY,YAAA,CACd,CAAA,CACAA,GAAAA,CAAC,WACC,aAAA,CAAc,SAAA,CACd,MAAA,CAAO,cAAA,CACP,IAAI,IAAA,CACJ,WAAA,CAAY,aACd,CAAA,CAAA,CACF,CAAA,CACAA,IAAC,QAAA,CAAA,CAAO,EAAA,CAAI6yB,EAAAA,CAAI,EAAA,CAAIC,GAAI,CAAA,CAAG,GAAA,CAAK,IAAA,CAAMvV,CAAAA,CAAO,GAC/C,CAEJ,CAAA,CAAA,CAhCK,CAAA,MAAA,EAAShS,CAAAA,CAAE,UAAU,CAAA,CAiC5B,CAEJ,CAAC,CAAA,CAAA,CACL,EACF,CAAA,CAAA,CACF,CAAA,CAEJ,CAAA,CAGAzL,IAAAA,CAAC,OACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,SAAU,MAAA,CACV,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,UACL,SAAA,CAAW,CACb,EAEC,QAAA,CAAA,CAAAswB,CAAAA,EAAU,MAAQA,CAAAA,CAAS,CAAA,EAC1BtwB,IAAAA,CAAC,MAAA,CAAA,CACC,MAAO,CACL,KAAA,CAAO,SAAA,CACP,QAAA,CAAU,EACZ,CAAA,CACD,QAAA,CAAA,CAAA,GAAA,CACG,IAAA,CAAK,KAAA,CAAMswB,CAAM,CAAA,CAAE,cAAA,GAAiB,MAAA,CAAA,CACxC,CAAA,CAEFpwB,IAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,IAAA,CAAM,EAAG,QAAA,CAAU,CAAE,CAAA,CAAG,CAAA,CACtCA,IAAC4sB,EAAAA,CAAA,CAAiB,KAAA,CAAO8D,CAAAA,CAAY,SAAUC,CAAAA,CAAe,CAAA,CAC7DJ,EAAc,MAAA,CAAS,CAAA,EACtBvwB,IAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,KAAA,CAAO,OACP,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QACd,EAEA,QAAA,CAAAA,GAAAA,CAAC4tB,EAAAA,CAAA,CACC,QAAS2C,CAAAA,CACT,aAAA,CAAezC,CAAAA,CACf,QAAA,CAAUC,EACV,QAAA,CAAU6D,CAAAA,CACZ,CAAA,CACF,CAAA,CAAA,CAEJ,GACF,CAAA,CAAA,CACF,CAEJ,CC9uCA,SAAS/X,GAAU1X,CAAAA,CAA+B,CAChD,OAAOA,CAAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,UAAYA,CAAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,OAAS,CACtE,CAEA,SAAS4X,EAAAA,CAAcxU,EAAuB,CAC5C,OAAO,GAAG,UAAA,CAAA,CAAYA,CAAAA,CAAQ,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAC,GAChD,CAEA,SAASwtB,EAAAA,CAAYxtB,CAAAA,CAAuB,CAC1C,IAAMkhB,CAAAA,CAAQlhB,CAAAA,CAAQ,GAAA,CACtB,OAAIkhB,CAAAA,CAAQ,CAAA,EAAKA,EAAQ,CAAA,CAAU,KAAA,CAC5B,WAAWA,CAAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,EAAE,QAAA,EACtC,CAGA,SAASuM,GAAe7wB,CAAAA,CAA+B,CACrD,OAAOA,CAAAA,CAAO,WAAW,CAAC,CAAA,EAAG,KAAA,EAASA,CAAAA,CAAO,QAC/C,CAEA,SAAS8wB,EAAAA,CAAiBlsB,CAAAA,CAAwB,CAChD,OAAQA,CAAAA,EACN,KAAK,aACH,OAAO,YAAA,CACT,KAAK,QAAA,CACH,OAAO,QAAA,CACT,QACE,OAAOA,CACX,CACF,CAEA,SAASmsB,EAAAA,CAAmBC,CAAAA,CAAiC,CAC3D,GAAI,CAACA,CAAAA,CAAK,OAAO,QAAA,CACjB,IAAMxM,CAAAA,CAAO,IAAI,IAAA,CAAKwM,CAAG,EACzB,GAAI,KAAA,CAAMxM,EAAK,OAAA,EAAS,EAAG,OAAO,QAAA,CAClC,IAAMC,CAAAA,CAAQD,EAAK,cAAA,CAAe,SAAA,CAAW,CAAE,KAAA,CAAO,OAAQ,CAAC,CAAA,CACzDE,CAAAA,CAAMF,CAAAA,CAAK,SAAQ,CACnByM,CAAAA,CAAOzM,EAAK,WAAA,EAAY,CACxBG,EAAQH,CAAAA,CAAK,QAAA,EAAS,CAAE,QAAA,GAAW,QAAA,CAAS,CAAA,CAAG,GAAG,CAAA,CAClD0M,EAAU1M,CAAAA,CAAK,UAAA,EAAW,CAAE,QAAA,GAAW,QAAA,CAAS,CAAA,CAAG,GAAG,CAAA,CAC5D,OAAO,CAAA,EAAGC,CAAK,CAAA,CAAA,EAAIC,CAAG,KAAKuM,CAAI,CAAA,CAAA,EAAItM,CAAK,CAAA,CAAA,EAAIuM,CAAO,CAAA,CACrD,CAMA,SAASC,EAAAA,CAAaC,EAA8C,CAClE,GAAM,CAAC1tB,CAAAA,CAAK2tB,CAAM,EAAIjyB,QAAAA,CAAS,CAAC,CAAA,CAShC,GAPA+H,UAAU,IAAM,CACd,GAAI,CAACiqB,EAAW,OAChBC,CAAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CACjB,IAAMpgB,CAAAA,CAAK,WAAA,CAAY,IAAMogB,CAAAA,CAAO,IAAA,CAAK,GAAA,EAAK,EAAG,GAAI,CAAA,CACrD,OAAO,IAAM,cAAcpgB,CAAE,CAC/B,CAAA,CAAG,CAACmgB,CAAS,CAAC,CAAA,CAEV,CAACA,CAAAA,EAAa1tB,CAAAA,GAAQ,EAAG,OAAO,IAAA,CACpC,IAAM4tB,CAAAA,CAAS,IAAI,IAAA,CAAKF,CAAS,CAAA,CAAE,OAAA,GACnC,GAAI,KAAA,CAAME,CAAM,CAAA,CAAG,OAAO,IAAA,CAE1B,IAAMpZ,CAAAA,CAAOoZ,CAAAA,CAAS5tB,EACtB,GAAIwU,CAAAA,EAAQ,CAAA,CAAG,OAAO,KAEtB,IAAMqZ,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMrZ,EAAO,KAAQ,CAAA,CACjCyM,CAAAA,CAAQ,IAAA,CAAK,MAAOzM,CAAAA,CAAO,KAAA,CAAY,IAAO,CAAA,CAC9C0M,CAAAA,CAAO,KAAK,KAAA,CAAO1M,CAAAA,CAAO,IAAA,CAAW,GAAK,EAC1CsZ,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAOtZ,CAAAA,CAAO,IAAS,GAAI,CAAA,CAEvCI,CAAAA,CAAkB,GACxB,OAAIiZ,CAAAA,CAAO,GAAGjZ,CAAAA,CAAM,IAAA,CAAK,GAAGiZ,CAAI,CAAA,CAAA,CAAG,CAAA,CACnCjZ,CAAAA,CAAM,KAAK,CAAA,EAAG,MAAA,CAAOqM,CAAK,CAAA,CAAE,SAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,CAAG,EAC/CrM,CAAAA,CAAM,IAAA,CAAK,GAAG,MAAA,CAAOsM,CAAI,EAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,GAAG,CAAA,CAC9CtM,CAAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAOkZ,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA,CACvClZ,CAAAA,CAAM,KAAK,GAAG,CACvB,CAEA,SAASmZ,GAAoBT,CAAAA,CAAwC,CACnE,GAAI,CAACA,EAAK,OAAO,IAAA,CACjB,IAAM7Y,CAAAA,CAAI,IAAI,IAAA,CAAK6Y,CAAG,EACtB,GAAI,KAAA,CAAM7Y,EAAE,OAAA,EAAS,CAAA,CAAG,OAAO,KAC/B,IAAMwM,CAAAA,CAAQxM,CAAAA,CAAE,QAAA,GAAW,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAA,CAC/CyM,CAAAA,CAAOzM,CAAAA,CAAE,UAAA,GAAa,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAA,CAChDsM,CAAAA,CAAAA,CAAStM,CAAAA,CAAE,QAAA,GAAa,CAAA,EAAG,QAAA,EAAS,CAAE,QAAA,CAAS,EAAG,GAAG,CAAA,CACrDuM,EAAMvM,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAA,CAC5C8Y,CAAAA,CAAO9Y,CAAAA,CAAE,WAAA,GACTuZ,CAAAA,CAAS,CAACvZ,CAAAA,CAAE,iBAAA,GACZwZ,CAAAA,CAAOD,CAAAA,EAAU,CAAA,CAAI,GAAA,CAAM,IAC3BE,CAAAA,CAAU,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAK,KAAA,CAAMF,CAAAA,CAAS,EAAE,CAAC,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,EACzE,OAAO,CAAA,EAAG/M,CAAK,CAAA,CAAA,EAAIC,CAAI,IAAIH,CAAK,CAAA,CAAA,EAAIC,CAAG,CAAA,CAAA,EAAIuM,CAAI,CAAA,EAAA,EAAKU,CAAI,CAAA,EAAGC,CAAO,GACpE,CAoBO,SAASC,EAAAA,CAAc,CAAE,MAAA/xB,CAAAA,CAAO,aAAA,CAAA0oB,CAAc,CAAA,CAAuB,CAC1E,GAAM,CAAE,CAAA,CAAA9rB,CAAE,CAAA,CAAIa,gBAAe,CACvB,CAAE,GAAA,CAAKu0B,CAAAA,CAAa,YAAAC,CAAY,CAAA,CAAIC,iBAAAA,EAAkB,CAEtDtG,EAAU3pB,OAAAA,CAAQ,IAAM,CAC5B,IAAMynB,CAAAA,CAAM,CAAC,GAAI1pB,CAAAA,CAAM,OAAA,EAAW,EAAG,CAAA,CAC/ByN,CAAAA,CAAOic,CAAAA,CACV,MAAA,CAAQnR,GAAMA,CAAAA,CAAE,MAAA,GAAW,MAAM,CAAA,CACjC,KAAK,CAAC1b,CAAAA,CAAGC,CAAAA,GAAM8a,EAAAA,CAAU9a,CAAC,CAAA,CAAI8a,EAAAA,CAAU/a,CAAC,CAAC,EACvCs1B,CAAAA,CAAOzI,CAAAA,CACV,MAAA,CAAQnR,CAAAA,EAAMA,EAAE,MAAA,GAAW,MAAM,CAAA,CACjC,IAAA,CAAK,CAAC1b,CAAAA,CAAGC,CAAAA,GAAM8a,GAAU9a,CAAC,CAAA,CAAI8a,GAAU/a,CAAC,CAAC,CAAA,CAC7C,OAAO,CAAC,GAAG4Q,CAAAA,CAAM,GAAG0kB,CAAI,CAC1B,CAAA,CAAG,CAACnyB,CAAAA,CAAM,OAAO,CAAC,CAAA,CAEZoyB,CAAAA,CAAUpyB,CAAAA,CAAM,MAAA,GAAW,UAAYA,CAAAA,CAAM,MAAA,GAAW,QAAA,CACxDqyB,CAAAA,CAAiBhB,GAAae,CAAAA,CAAU,MAAA,CAAYpyB,CAAAA,CAAM,QAAQ,EAClEsyB,CAAAA,CAAejB,EAAAA,CAAae,CAAAA,CAAU,MAAA,CAAYpyB,EAAM,MAAM,CAAA,CAC9DuyB,EAAqBZ,EAAAA,CAAoB3xB,CAAAA,CAAM,QAAQ,CAAA,CACvDwyB,CAAAA,CAAmBb,EAAAA,CAAoB3xB,CAAAA,CAAM,MAAM,CAAA,CAEzD,OACEnC,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,yCAAA,CAEb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,IAAKm0B,CAAAA,CACL,SAAA,CAAW,CAAA,iFAAA,EACTC,CAAAA,CACI,kEACA,iCACN,CAAA,CAAA,CAEA,QAAA,CAAA,CAAAl0B,GAAAA,CAAC0c,OAAA,CACC,GAAA,CAAKza,CAAAA,CAAM,SAAA,EAAa,OACxB,IAAA,CAAMA,CAAAA,CAAM,KAAA,EAAS,OAAA,CACrB,OAAO,IAAA,CACP,UAAA,CAAY,CAAE,IAAA,CAAM,gBAAiB,EACrC,SAAA,CAAW,CAAA,0CAAA,EACTiyB,CAAAA,CACI,+BAAA,CACA,+BACN,CAAA,CAAA,CACF,CAAA,CACAp0B,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,sCAAA,CACZ,QAAA,CAAA,CAAA,CAACo0B,CAAAA,EACAp0B,IAAAA,CAAC,OAAI,SAAA,CAAU,2BAAA,CACZ,UAAAmC,CAAAA,CAAM,IAAA,EAAM,MAAM,CAAA,CAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC7B,CAAAA,CAAKS,CAAAA,GACjCf,IAAAA,CAACkS,UAAAA,CAAA,CACE,QAAA,CAAA,CAAAnR,CAAAA,CAAI,CAAA,EAAKb,GAAAA,CAAC,QAAK,SAAA,CAAU,yBAAA,CAA0B,gBAAC,CAAA,CACrDA,GAAAA,CAAC,QAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAAI,CAAAA,CAAI,MACP,CAAA,CAAA,CAAA,CAJaA,CAAAA,CAAI,IAKnB,CACD,EACDJ,GAAAA,CAAC4d,EAAAA,CAAA,CAAW,MAAA,CAAQ3b,EAAM,MAAA,CAAQ,CAAA,CAAA,CACpC,CAAA,CAEFjC,GAAAA,CAAC,QACC,SAAA,CAAW,CAAA,mDAAA,EACTk0B,CAAAA,CAAc,sBAAA,CAAyB,oBACzC,CAAA,CAAA,CAEC,QAAA,CAAAjyB,CAAAA,CAAM,KAAA,CACT,GACF,CAAA,CAAA,CACF,CAAA,CAAA,CAGEqyB,CAAAA,EAAkBC,CAAAA,EAAgBF,IAClCr0B,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wDAAA,CACZ,QAAA,CAAAq0B,EACCI,CAAAA,EACEz0B,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eACb,QAAA,CAAAnB,CAAAA,CAAE,uBAAA,CAAyB,CAAE,KAAM41B,CAAiB,CAAC,CAAA,CACxD,CAAA,CAEAH,EACFx0B,IAAAA,CAAAkS,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAhS,GAAAA,CAAC,QAAK,SAAA,CAAU,iBAAA,CACb,QAAA,CAAAnB,CAAAA,CAAE,yBAA0B,CAAE,IAAA,CAAMy1B,CAAe,CAAC,EACvD,CAAA,CACCE,CAAAA,EACC10B,IAAAA,CAAAkS,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAhS,GAAAA,CAAC,QAAK,SAAA,CAAU,iBAAA,CAAkB,gBAAC,CAAA,CACnCA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eAAgB,QAAA,CAAAw0B,CAAAA,CAAmB,CAAA,CAAA,CACrD,CAAA,CAAA,CAEJ,EACED,CAAAA,CACFz0B,IAAAA,CAAAkS,QAAAA,CAAA,CACE,UAAAhS,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CACb,SAAAnB,CAAAA,CAAE,sBAAA,CAAwB,CAAE,IAAA,CAAM01B,CAAa,CAAC,CAAA,CACnD,CAAA,CACCE,CAAAA,EACC30B,KAAAkS,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAhS,GAAAA,CAAC,QAAK,SAAA,CAAU,iBAAA,CAAkB,gBAAC,CAAA,CACnCA,GAAAA,CAAC,QAAK,SAAA,CAAU,cAAA,CAAgB,QAAA,CAAAy0B,CAAAA,CAAiB,GACnD,CAAA,CAAA,CAEJ,CAAA,CACE,IAAA,CACN,CAAA,CAIFz0B,IAACgwB,EAAAA,CAAA,CAAgB,KAAA,CAAO/tB,CAAAA,CAAO,OAAQA,CAAAA,CAAM,MAAA,EAAU,OAAW,CAAA,CAGlEjC,GAAAA,CAAC00B,GAAA,CAAe,OAAA,CAAS7G,CAAAA,CAAS,aAAA,CAAelD,EAAe,CAAA,CAGhE3qB,GAAAA,CAAC20B,EAAAA,CAAA,CAAa,QAAS9G,CAAAA,CAAS,KAAA,CAAO5rB,CAAAA,CAAO,CAAA,CAAA,CAChD,CAEJ,CAMA,IAAM2yB,GAAwB,CAAA,CAW9B,SAASF,GAAe,CACtB,OAAA,CAASxZ,CAAAA,CACT,aAAA,CAAAyP,CACF,CAAA,CAAwB,CACtB,GAAM,CAAE,EAAA9rB,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB,CAAE,QAAA,CAAAgU,CAAS,CAAA,CAAIC,SAAAA,GACf,CAACkhB,CAAAA,CAASC,CAAU,CAAA,CAAIvzB,SAAS,KAAK,CAAA,CACtC,CAACyZ,CAAAA,CAAcC,CAAe,CAAA,CAAI1Z,QAAAA,CAAwB,IAAI,CAAA,CAE9DssB,EAAU3pB,OAAAA,CAAQ,IAAM,CAC5B,IAAMosB,CAAAA,CAAO,IAAI,GAAA,CACjB,OAAOpV,CAAAA,CAAW,MAAA,CAAQV,GACpB8V,CAAAA,CAAK,GAAA,CAAI9V,CAAAA,CAAE,IAAI,EAAU,KAAA,EAC7B8V,CAAAA,CAAK,GAAA,CAAI9V,CAAAA,CAAE,IAAI,CAAA,CACR,IAAA,CACR,CACH,CAAA,CAAG,CAACU,CAAU,CAAC,CAAA,CAET6Z,CAAAA,CAAgBlH,EAAQ,IAAA,CAAMrT,CAAAA,EAAMA,CAAAA,CAAE,MAAA,GAAW,MAAM,CAAA,EAAG,IAAA,CAC1D,CAACwa,CAAAA,CAAWC,CAAY,CAAA,CAAI1zB,QAAAA,CAChCwzB,EAAgB,CAAA,EAAGA,CAAa,OAAS,IAC3C,CAAA,CAEA,GAAIlH,CAAAA,CAAQ,SAAW,CAAA,CAAG,OAAO,IAAA,CAEjC,IAAMlW,EAAUkW,CAAAA,CAAQ,MAAA,CAAS+G,EAAAA,CAC3BM,CAAAA,CAAiBL,EACnBhH,CAAAA,CACAA,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAG+G,EAAqB,CAAA,CAEpCO,CAAAA,CAAgB7G,CAAAA,EAAiB,CACrCrT,EAAiB1G,CAAAA,EAAUA,CAAAA,GAAS+Z,CAAAA,CAAO,IAAA,CAAOA,CAAK,EACzD,CAAA,CAEM8G,CAAAA,CAAoB,CACxBjzB,EACAkF,CAAAA,CACAE,CAAAA,GACG,CACH0tB,CAAAA,CAAa,CAAA,EAAG9yB,EAAO,IAAI,CAAA,CAAA,EAAIkF,CAAO,CAAA,CAAE,EACnCqM,CAAAA,EACHuH,CAAAA,CAAgB9Y,CAAAA,CAAO,IAAI,EAE7BwoB,CAAAA,GAAgBxoB,CAAAA,CAAQkF,CAAAA,CAASE,CAAI,EACvC,CAAA,CAEA,OACEzH,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAEb,QAAA,CAAA,CAAAA,IAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,yBAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,OAAA,CAAA,CACC,QAAA,CAAAF,KAAC,IAAA,CAAA,CACC,QAAA,CAAA,CAAAE,GAAAA,CAAC,IAAA,CAAA,EAAG,EACJA,GAAAA,CAAC,IAAA,CAAA,CAAG,UAAU,2EAAA,CACX,QAAA,CAAAnB,EAAE,6BAA6B,CAAA,CAClC,CAAA,CACAmB,GAAAA,CAAC,OAAG,CAAA,CAAA,CACN,CAAA,CACF,CAAA,CACAA,GAAAA,CAAC,SACE,QAAA,CAAAk1B,CAAAA,CAAe,GAAA,CAAI,CAAC/yB,EAAQzD,CAAAA,GAAQ,CACnC,IAAMwb,CAAAA,CAAWL,GAAU1X,CAAM,CAAA,CAC3BkzB,CAAAA,CACJlzB,CAAAA,CAAO,SAAS,CAAC,CAAA,EAAG,QAAA,EAAYA,CAAAA,CAAO,SAAS,CAAC,CAAA,EAAG,KAAA,CAChDsZ,CAAAA,CAAaT,IAAiB7Y,CAAAA,CAAO,IAAA,CAE3C,OACEnC,GAAAA,CAACs1B,EAAAA,CAAA,CAEC,MAAA,CAAQnzB,CAAAA,CACR,QAAA,CAAU+X,CAAAA,CACV,QAASmb,CAAAA,EAAW,MAAA,CACpB,SAAA,CAAWL,CAAAA,GAAc,GAAG7yB,CAAAA,CAAO,IAAI,CAAA,IAAA,CAAA,CACvC,QAAA,CAAU6yB,IAAc,CAAA,EAAG7yB,CAAAA,CAAO,IAAI,CAAA,GAAA,CAAA,CACtC,UAAA,CAAYsZ,EACZ,cAAA,CAAgB,IAAM0Z,CAAAA,CAAahzB,CAAAA,CAAO,IAAI,CAAA,CAC9C,aAAA,CAAeizB,CAAAA,CAAAA,CARVjzB,CAAAA,CAAO,IAAM,CAAA,EAAGzD,CAAG,CAAA,CAAA,EAAIyD,CAAAA,CAAO,IAAI,CAAA,CASzC,CAEJ,CAAC,CAAA,CACH,CAAA,CAAA,CACF,EAGCwV,CAAAA,EACC7X,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAS,IAAMg1B,CAAAA,CAAYvgB,CAAAA,EAAS,CAACA,CAAI,CAAA,CACzC,SAAA,CAAU,yJAAA,CAEV,UAAAvU,GAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CACGnB,CAAAA,CADHg2B,EACK,8BAAA,CACA,gCAD8B,CAAA,CAEtC,CAAA,CACA70B,IAAC0S,eAAAA,CAAA,CACC,SAAA,CAAW3S,IAAAA,CACT,+BACA80B,CAAAA,EAAW,YACb,CAAA,CACF,CAAA,CAAA,CACF,GAEJ,CAEJ,CAqBA,SAASS,EAAAA,CAAU,CACjB,OAAAnzB,CAAAA,CACA,QAAA,CAAA+X,CAAAA,CACA,OAAA,CAAAmb,EACA,SAAA,CAAAE,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,WAAA/Z,CAAAA,CACA,cAAA,CAAAga,CAAAA,CACA,aAAA,CAAA9K,CACF,CAAA,CAAmB,CACjB,GAAM,CAAE,CAAA,CAAA9rB,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB4P,CAAAA,CAASnN,EAAO,MAAA,GAAW,MAAA,CAC3BuzB,CAAAA,CAAkBvzB,CAAAA,CAAO,OAC3B,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAO,MAAM,CAAA,CAAE,cAAA,CAAe,OAAO,CAAC,CAAA,IAAA,CAAA,CACrD,OAEJ,OACErC,IAAAA,CAAAkS,QAAAA,CAAA,CACE,UAAAlS,IAAAA,CAAC,IAAA,CAAA,CACC,SAAA,CAAU,8EAAA,CACV,QAAS21B,CAAAA,CACT,IAAA,CAAK,QAAA,CACL,QAAA,CAAU,EACV,SAAA,CAAYngB,CAAAA,EAAM,CAAA,CACZA,CAAAA,CAAE,MAAQ,OAAA,EAAWA,CAAAA,CAAE,GAAA,GAAQ,GAAA,IACjCA,EAAE,cAAA,EAAe,CACjBmgB,CAAAA,EAAe,EAEnB,EAGA,QAAA,CAAA,CAAAz1B,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,oBACZ,QAAA,CAAAF,IAAAA,CAAC,OAAI,SAAA,CAAU,sCAAA,CACZ,UAAAqC,CAAAA,CAAO,SAAA,EACNnC,GAAAA,CAAC0c,MAAAA,CAAA,CACC,GAAA,CAAKva,CAAAA,CAAO,SAAA,CACZ,IAAA,CAAM6wB,GAAe7wB,CAAM,CAAA,GAAI,CAAC,CAAA,EAAK,IACrC,MAAA,CAAO,IAAA,CACP,SAAA,CAAU,2BAAA,CACV,SAAU,CAAE,SAAA,CAAW,cAAe,CAAA,CACxC,EAEFrC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CACb,UAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,yDAAA,CACb,SAAAgzB,EAAAA,CAAe7wB,CAAM,EACxB,CAAA,CACCuzB,CAAAA,EACC11B,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qCAAA,CACb,QAAA,CAAA01B,EACH,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAGA11B,IAAC,IAAA,CAAA,CAAG,SAAA,CAAU,+CAAA,CACX,QAAA,CAAA+Z,GAAcG,CAAQ,CAAA,CACzB,CAAA,CAGAla,GAAAA,CAAC,MAAG,SAAA,CAAU,mBAAA,CACX,QAAA,CAAAsP,CAAAA,CACCxP,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uCAAA,CACb,QAAA,CAAA,CAAAE,IAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAWD,KACT,uIAAA,CACAw1B,CAAAA,CACI,qCACA,4BACN,CAAA,CACA,QAAUjgB,CAAAA,EAAM,CACdA,CAAAA,CAAE,eAAA,GACFqV,CAAAA,GAAgBxoB,CAAAA,CAAQ,KAAA,CAAO,KAAK,EACtC,CAAA,CAEC,QAAA,CAAAtD,CAAAA,CAAE,2BAAA,CAA6B,CAC9B,KAAA,CAAOk0B,EAAAA,CAAY7Y,CAAQ,CAC7B,CAAC,EACH,CAAA,CACAla,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,SAAA,CAAWD,IAAAA,CACT,uIAAA,CACAy1B,CAAAA,CACI,yCACA,gCACN,CAAA,CACA,OAAA,CAAUlgB,CAAAA,EAAM,CACdA,CAAAA,CAAE,eAAA,GACFqV,CAAAA,GAAgBxoB,CAAAA,CAAQ,KAAM,KAAK,EACrC,CAAA,CAEC,QAAA,CAAAkzB,GAAW,IAAA,CACRx2B,CAAAA,CAAE,0BAAA,CAA4B,CAC5B,MAAOk0B,EAAAA,CAAYsC,CAAO,CAC5B,CAAC,EACDx2B,CAAAA,CAAE,mBAAmB,CAAA,CAC3B,CAAA,CAAA,CACF,EAEAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+BAAA,CACb,SAAAA,GAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAWD,IAAAA,CACT,0EACAoC,CAAAA,CAAO,MAAA,GAAW,QAAA,CACd,4BAAA,CACAA,EAAO,MAAA,GAAW,QAAA,CAChB,6BACA,4BACR,CAAA,CAEC,SAAAA,CAAAA,CAAO,MAAA,GAAW,QAAA,CACftD,CAAAA,CAAE,6BAA6B,CAAA,CAC/BsD,CAAAA,CAAO,MAAA,GAAW,QAAA,CAChBtD,EAAE,6BAA6B,CAAA,CAC/BA,CAAAA,CAAE,8BAA8B,EACxC,CAAA,CACF,CAAA,CAEJ,GACF,CAAA,CAGC4c,CAAAA,EACCzb,IAAC,IAAA,CAAA,CACC,QAAA,CAAAA,GAAAA,CAAC,IAAA,CAAA,CAAG,QAAS,CAAA,CAAG,SAAA,CAAU,MAAA,CACxB,QAAA,CAAAA,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAAA,IAAC0qB,EAAAA,CAAA,CACC,OAAQvoB,CAAAA,CACR,OAAA,CAASqzB,EAAW,IAAA,CAAO,KAAA,CAC3B,aAAA,CAAe7K,CAAAA,CACjB,EACF,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CAWA,SAASgK,EAAAA,CAAa,CAAE,OAAA,CAAA9G,EAAS,KAAA,CAAA5rB,CAAM,CAAA,CAAsB,CAC3D,GAAM,CAAE,CAAA,CAAApD,CAAE,CAAA,CAAIa,gBAAe,CACvB,CAACi2B,CAAAA,CAAeC,CAAgB,EAAIr0B,QAAAA,CAAS,KAAK,CAAA,CAClD,CAACs0B,EAAcC,CAAe,CAAA,CAAIv0B,SAAS,KAAK,CAAA,CAChD,CAACw0B,CAAAA,CAAaC,CAAc,CAAA,CAAIz0B,QAAAA,CAAS,CAAC,CAAA,CAE1C00B,CAAAA,CAAqBpI,CAAAA,CAAQ,MAAA,CAChCrT,GAAOA,CAAAA,CAAE,KAAA,EAASA,CAAAA,CAAE,KAAA,CAAM,OAAS,CAAA,EAAMA,CAAAA,CAAE,WAC9C,CAAA,CACA,GAAIyb,EAAmB,MAAA,GAAW,CAAA,CAAG,OAAO,IAAA,CAE5C,IAAMC,CAAAA,CACJD,CAAAA,CAAmBF,CAAW,CAAA,EAAKE,EAAmB,CAAC,CAAA,CACnDE,CAAAA,CACJD,CAAAA,CAAe,OAASA,CAAAA,CAAe,KAAA,CAAM,OAAS,CAAA,CAClDA,CAAAA,CAAe,MAAM,IAAA,CAAK;;AAAA,CAAM,CAAA,CAC/BA,CAAAA,CAAe,WAAA,EAAe,EAAA,CACrC,GAAI,CAACC,CAAAA,CAAW,OAAO,IAAA,CACvB,IAAMC,CAAAA,CACJD,CAAAA,CAAU,OAAS,GAAA,EAAO,CAACR,CAAAA,CACvBQ,CAAAA,CAAU,KAAA,CAAM,CAAA,CAAG,GAAG,CAAA,CAAI,KAAA,CAC1BA,CAAAA,CAEN,OACEr2B,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,uBAAA,CAEb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,UAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oDAAA,CACb,QAAA,CAAAnB,CAAAA,CAAE,qBAAqB,CAAA,CAC1B,CAAA,CAECo3B,CAAAA,CAAmB,MAAA,CAAS,CAAA,EAC3Bn2B,IAAAA,CAACu2B,QAAAA,CAAA,CACC,SAAA,CAAU,YAAA,CACV,UAAA,CAAY,CACV,OAAA,CAAS,2CACX,EAEA,QAAA,CAAA,CAAAr2B,GAAAA,CAACs2B,eAAAA,CAAA,CACC,QAAA,CAAAt2B,GAAAA,CAAC2S,OAAA,CACC,IAAA,CAAK,IAAA,CACL,OAAA,CAAQ,UAAA,CACR,MAAA,CAAO,KACP,UAAA,CAAY3S,GAAAA,CAAC0S,eAAAA,CAAA,CAAgB,SAAA,CAAU,aAAA,CAAc,CAAA,CACrD,SAAA,CAAU,yBAAA,CAET,QAAA,CAAAsgB,EAAAA,CAAekD,CAAc,CAAA,CAChC,CAAA,CACF,EACAl2B,GAAAA,CAACu2B,YAAAA,CAAA,CACC,YAAA,CAAW,qBAAA,CACX,aAAA,CAAc,SACd,YAAA,CAAc,CAAC,MAAA,CAAOR,CAAW,CAAC,CAAA,CAClC,SAAWnmB,CAAAA,EAAa,CACtBomB,CAAAA,CAAe,MAAA,CAAOpmB,CAAG,CAAC,CAAA,CAC1BgmB,CAAAA,CAAiB,KAAK,EACxB,CAAA,CACA,UAAA,CAAY,CAAE,IAAA,CAAM,OAAQ,CAAA,CAC5B,WAAA,CAAa,CAAE,IAAA,CAAM,qBAAsB,CAAA,CAE1C,SAAAK,CAAAA,CAAmB,GAAA,CAAI,CAACzb,CAAAA,CAAG9b,CAAAA,GAC1BsB,GAAAA,CAACw2B,aAAA,CAEC,SAAA,CAAWz2B,IAAAA,CACTrB,CAAAA,GAAQq3B,CAAAA,CACJ,6BAAA,CACA,cAAA,CACJ,iEACF,CAAA,CAEC,QAAA,CAAA/C,EAAAA,CAAexY,CAAC,CAAA,CAAA,CARZ,MAAA,CAAO9b,CAAG,CASjB,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAGAsB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CACZ,QAAA,CAAAo2B,CAAAA,CACH,CAAA,CAECD,EAAU,MAAA,CAAS,GAAA,EAClBn2B,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAM41B,CAAAA,CAAkBnqB,CAAAA,EAAM,CAACA,CAAC,CAAA,CACzC,SAAA,CAAU,yFAET,QAAA,CACG5M,CAAAA,CADH82B,CAAAA,CACK,8BAAA,CACA,wBAD8B,CAAA,CAEtC,EAIF71B,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMg2B,EAAiBrqB,CAAAA,EAAM,CAACA,CAAC,CAAA,CACxC,SAAA,CAAU,kJAAA,CAEV,QAAA,CAAA,CAAAzL,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAnB,CAAAA,CAAE,iCAAiC,CAAA,CAAE,CAAA,CAC5CmB,IAAC0S,eAAAA,CAAA,CACC,SAAA,CAAW3S,IAAAA,CACT,8BAAA,CACA81B,CAAAA,EAAgB,YAClB,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAECA,CAAAA,EACC/1B,IAAAA,CAAAkS,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAhS,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CACX,QAAA,CAAA,CAAA,IAAM,CACN,IAAM0M,CAAAA,CAASwpB,CAAAA,CAAe,MAAA,CACxBl1B,CAAAA,CAIA,EAAC,CAEP,OAAIk1B,CAAAA,CAAe,UAAA,EACjBl1B,CAAAA,CAAM,IAAA,CAAK,CACT,KAAA,CAAOnC,EAAE,gCAAgC,CAAA,CACzC,KAAA,CAAOq0B,EAAAA,CAAmBgD,CAAAA,CAAe,UAAU,EACnD,QAAA,CAAU,IACZ,CAAC,CAAA,CAGHl1B,CAAAA,CAAM,IAAA,CAAK,CACT,KAAA,CAAOnC,CAAAA,CAAE,6BAA6B,CAAA,CACtC,KAAA,CAAOq0B,EAAAA,CAAmBgD,CAAAA,CAAe,QAAQ,CAAA,CACjD,QAAA,CAAUxpB,CAAAA,GAAW,SACvB,CAAC,CAAA,CAEGA,IAAW,QAAA,CACb1L,CAAAA,CAAM,IAAA,CAAK,CACT,KAAA,CAAOnC,CAAAA,CAAE,+BAA+B,CAAA,CACxC,KAAA,CAAOq0B,EAAAA,CACLgD,CAAAA,CAAe,SAAA,EAAaA,CAAAA,CAAe,MAC7C,CAAA,CACA,QAAA,CAAU,IACZ,CAAC,CAAA,CACQxpB,CAAAA,GAAW,QAAA,CACpB1L,EAAM,IAAA,CAAK,CACT,KAAA,CAAOnC,CAAAA,CAAE,+BAA+B,CAAA,CACxC,MAAOq0B,EAAAA,CACLgD,CAAAA,CAAe,SAAA,EAAaA,CAAAA,CAAe,MAC7C,CAAA,CACA,SAAU,IACZ,CAAC,CAAA,CAEDl1B,CAAAA,CAAM,IAAA,CAAK,CACT,KAAA,CAAOnC,CAAAA,CAAE,8BAA8B,CAAA,CACvC,KAAA,CAAOq0B,EAAAA,CAAmBgD,CAAAA,CAAe,MAAM,EAC/C,QAAA,CAAU,KACZ,CAAC,CAAA,CAGIl1B,CACT,CAAA,IAAK,GAAA,CAAI,CAACiX,CAAAA,CAAMM,CAAAA,CAAOke,CAAAA,GACrB32B,IAAAA,CAAC,OAAqB,SAAA,CAAU,4BAAA,CAC9B,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,8CAAA,EACTiY,CAAAA,CAAK,QAAA,CACD,4BACA,8BACN,CAAA,CAAA,CACF,CAAA,CACCM,CAAAA,CAAQke,CAAAA,CAAI,MAAA,CAAS,GACpBz2B,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CAAwB,CAAA,CAAA,CAE3C,CAAA,CACAF,KAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,cAAA,EAAiByY,CAAAA,CAAQke,CAAAA,CAAI,MAAA,CAAS,CAAA,CAAI,MAAA,CAAS,EAAE,CAAA,CAAA,CAEhE,QAAA,CAAA,CAAAz2B,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iDACb,QAAA,CAAAiY,CAAAA,CAAK,KAAA,CACR,CAAA,CACAjY,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,iCAAA,CACb,QAAA,CAAAiY,CAAAA,CAAK,KAAA,CACR,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAtBQA,EAAK,KAuBf,CACD,CAAA,CACH,CAAA,CAGAnY,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2EAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,MAAA,CAAA,CACC,QAAA,CAAA,CAAAA,IAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,cAAA,CACb,QAAA,CAAA,CAAAjB,CAAAA,CAAE,wBAAwB,CAAA,CAAE,GAAA,CAAA,CAC/B,EAAQ,GAAA,CACRmB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CAAmB,QAAA,CAAAiC,EAAM,IAAA,CAAK,CAAA,CAAA,CAChD,CAAA,CACAnC,IAAAA,CAAC,MAAA,CAAA,CACC,QAAA,CAAA,CAAAA,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAA,CACb,QAAA,CAAA,CAAAjB,CAAAA,CAAE,yBAAyB,CAAA,CAAE,KAChC,CAAA,CAAQ,GAAA,CACRmB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CAAmB,SAAAk2B,CAAAA,CAAe,IAAA,CAAK,CAAA,CAAA,CACzD,CAAA,CACAp2B,IAAAA,CAAC,MAAA,CAAA,CACC,UAAAA,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAA,CACb,QAAA,CAAA,CAAAjB,CAAAA,CAAE,yBAAyB,CAAA,CAAE,GAAA,CAAA,CAChC,CAAA,CAAQ,GAAA,CACRmB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBACb,QAAA,CAAAizB,EAAAA,CAAiBiD,CAAAA,CAAe,MAAM,CAAA,CACzC,CAAA,CAAA,CACF,GACF,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CAMA,SAAStY,EAAAA,CAAW,CAAE,MAAA,CAAA7W,CAAO,CAAA,CAAuB,CAElD,OACEjH,IAAAA,CAAC,QACC,SAAA,CAAU,mDAAA,CACV,KAAA,CAJUiH,CAAAA,GAAW,YAAA,CAAe,YAAA,CAAe,SAMnD,QAAA,CAAA,CAAA/G,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,QAAA,CAAA,MAAA,CAAC,EACnC+G,CAAAA,GAAW,YAAA,CACV/G,GAAAA,CAAC4e,cAAAA,CAAA,CAAe,SAAA,CAAU,sBAAsB,CAAA,CAEhD5e,GAAAA,CAAC6e,UAAAA,CAAA,CAAW,SAAA,CAAU,qBAAA,CAAsB,CAAA,CAAA,CAEhD,CAEJ,CChvBO,SAAS6X,EAAAA,CAAkB,CAChC,SAAA,CAAAC,CAAAA,CACA,MAAA,CAAA5vB,CAAAA,CACA,aAAA,CAAA4jB,CACF,EAA2B,CACzB,GAAM,CACJ,IAAA,CAAM1oB,CAAAA,CACN,SAAA,CAAW20B,EACX,KAAA,CAAOC,CACT,CAAA,CAAIC,QAAAA,CAAS,CAAE,IAAA,CAAMH,CAAAA,CAAW,MAAA,CAAA5vB,CAAO,CAAC,CAAA,CAExC,OAAI6vB,CAAAA,CACK52B,GAAAA,CAACinB,GAAA,EAAoB,CAAA,CAG1B4P,CAAAA,EAAc,CAAC50B,CAAAA,CAEfjC,GAAAA,CAAC,OAAI,SAAA,CAAU,2DAAA,CACZ,QAAA,CAAA62B,CAAAA,EAAY,OAAA,EAAW,iBAAA,CAC1B,EAIG72B,GAAAA,CAACg0B,EAAAA,CAAA,CAAc,KAAA,CAAO/xB,CAAAA,CAAO,aAAA,CAAe0oB,CAAAA,CAAe,CACpE,CCzBO,SAASoM,EAAAA,CAAqB,CACnC,SAAA,CAAAJ,CAAAA,CACA,MAAA,CAAA5vB,CAAAA,CACA,KAAA,CAAAua,CAAAA,CAAQ,CAAA,CACR,YAAA,CAAA0V,CACF,CAAA,CAA8B,CAC5B,GAAM,CAAE,CAAA,CAAAn4B,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB,CAAE,IAAA,CAAMu3B,CAAAA,CAAe,SAAA,CAAA3f,CAAU,CAAA,CAAI4f,gBAAAA,CAAiB,CAC1D,IAAA,CAAMP,CAAAA,CACN,MAAA,CAAA5vB,CAAAA,CACA,KAAA,CAAAua,CACF,CAAC,CAAA,CAED,OAAIhK,CAAAA,EAAa,CAAC2f,CAAAA,EAAiBA,CAAAA,CAAc,MAAA,GAAW,EAAU,IAAA,CAGpEn3B,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yCAAA,CACb,QAAA,CAAA,CAAAE,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oDAAA,CACb,QAAA,CAAAnB,CAAAA,CAAE,uBAAuB,EAC5B,CAAA,CACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CACZ,QAAA,CAAAi3B,CAAAA,CAAc,GAAA,CAAKE,CAAAA,EAClBn3B,GAAAA,CAACo3B,EAAAA,CAAA,CAEC,KAAA,CAAOD,CAAAA,CACP,QAASH,CAAAA,CAAAA,CAFJ,CAAA,EAAGG,CAAAA,CAAG,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAG,IAAI,CAAA,CAG9B,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAEJ,CAMO,SAASC,EAAAA,CAAiB,CAAE,KAAA,CAAAn1B,CAAAA,CAAO,OAAA,CAAA+S,CAAQ,CAAA,CAA0B,CAC1E,IAAMob,CAAAA,CAASnuB,CAAAA,CAAM,MAAA,CACrB,OACEnC,IAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMkV,CAAAA,GAAU/S,CAAK,EAC9B,SAAA,CAAU,mIAAA,CAEV,QAAA,CAAA,CAAAjC,GAAAA,CAAC0c,MAAAA,CAAA,CACC,IAAKza,CAAAA,CAAM,SAAA,EAAa,MAAA,CACxB,IAAA,CAAMA,CAAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,EAAK,GAAA,CAC1B,MAAA,CAAO,IAAA,CACP,SAAA,CAAU,gCAAA,CACV,QAAA,CAAU,CAAE,SAAA,CAAW,cAAe,CAAA,CACxC,CAAA,CACAnC,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,8BAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,8CAAA,CACb,SAAAiC,CAAAA,CAAM,KAAA,CACT,CAAA,CACCmuB,CAAAA,EAAU,IAAA,EAAQA,CAAAA,CAAS,CAAA,EAC1BtwB,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sBAAA,CAAuB,QAAA,CAAA,CAAA,GAAA,CACnC,IAAA,CAAK,KAAA,CAAMswB,CAAM,CAAA,CAAE,cAAA,EAAe,CAAE,MAAA,CAAA,CACxC,CAAA,CAAA,CAEJ,CAAA,CACApwB,IAAC2d,gBAAAA,CAAA,CAAiB,SAAA,CAAU,+BAAA,CAAgC,CAAA,CAAA,CAC9D,CAEJ,CC9DA,SAAS9D,EAAAA,CAAUW,CAAAA,CAA0B,CAC3C,OAAOA,CAAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,UAAYA,CAAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,KAAA,EAAS,CAC5D,CAyBO,SAAS6c,EAAAA,CAAgB,CAC9B,SAAA,CAAAV,CAAAA,CACA,MAAA,CAAA5vB,EACA,KAAA,CAAA8L,CAAAA,CACA,aAAA,CAAAsQ,CAAAA,CACA,mBAAA,CAAAmU,CAAAA,CACA,MAAA,CAAAC,CACF,CAAA,CAAyB,CACvB,GAAM,CAAE,CAAA,CAAA14B,CAAE,EAAIa,cAAAA,EAAe,CACvB,CAAE,QAAA,CAAAgU,CAAS,CAAA,CAAIC,WAAU,CAEzB,CAAE,MAAA,CAAQyO,CAAe,CAAA,CAAIC,aAAAA,CACjCnP,EACF,CAAA,CAEM,CAAE,IAAA,CAAMjR,CAAAA,CAAO,SAAA,CAAW20B,CAAe,CAAA,CAAIE,QAAAA,CAAS,CAC1D,IAAA,CAAMH,CAAAA,CACN,MAAA,CAAA5vB,CACF,CAAC,EAEK8mB,CAAAA,CAAU3pB,OAAAA,CACd,IACE,CAAC,GAAIjC,CAAAA,EAAO,SAAW,EAAG,CAAA,CAAE,IAAA,CAAK,CAACnD,CAAAA,CAAGC,IAAM8a,EAAAA,CAAU9a,CAAC,CAAA,CAAI8a,EAAAA,CAAU/a,CAAC,CAAC,CAAA,CACxE,CAACmD,CAAAA,EAAO,OAAO,CACjB,CAAA,CAEM,CAACu1B,CAAAA,CAAgBC,CAAiB,CAAA,CAAIl2B,QAAAA,CAKlC,IAAI,CAAA,CAER6zB,CAAAA,CAAoBx1B,WAAAA,CACxB,CAACuC,CAAAA,CAAuBkF,CAAAA,CAAuBE,CAAAA,GAAoB,CACjEkwB,CAAAA,CAAmBljB,CAAAA,GAAU,CAC3B,MAAA,CAAApS,CAAAA,CACA,OAAA,CAAAkF,CAAAA,CACA,IAAA,CAAAE,CAAAA,CACA,OAAA,CAAA,CAAUgN,CAAAA,EAAM,OAAA,EAAW,CAAA,EAAK,CAClC,CAAA,CAAE,CAAA,CACEb,CAAAA,EAAYzR,GACdmgB,CAAAA,CAAe,CACb,MAAA,CAAQ,CAAE,KAAA,CAAAngB,CAAAA,CAAO,OAAAE,CAAAA,CAAQ,cAAA,CAAgBkF,CAAAA,CAAS,KAAA,CAAAwL,CAAM,CAC1D,CAAC,EAEL,CAAA,CACA,CAACa,CAAAA,CAAUzR,CAAAA,CAAO4Q,CAAAA,CAAOuP,CAAc,CACzC,CAAA,CAEM8T,CAAAA,CAAiBsB,CAAAA,EAAgB,MAAA,EAAU3J,CAAAA,CAAQ,CAAC,EAK1D,GAAI+I,CAAAA,CAAgB,CAClB,IAAMc,CAAAA,CAAU,CAAC,CAACH,CAAAA,CAClB,OAAI7jB,CAAAA,CACK1T,GAAAA,CAACinB,EAAAA,CAAA,CAAoB,SAAUyQ,CAAAA,CAAS,CAAA,CAG/C53B,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,UAAAE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CACb,QAAA,CAAAA,GAAAA,CAACinB,GAAA,CAAoB,QAAA,CAAUyQ,CAAAA,CAAS,CAAA,CAC1C,CAAA,CACA13B,GAAAA,CAAC,SAAM,SAAA,CAAU,iDAAA,CACf,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wEACb,QAAA,CAAAA,GAAAA,CAAConB,EAAAA,CAAA,EAAkB,CAAA,CACrB,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAEA,IAAMuQ,CAAAA,CAAeH,CAAAA,CACjB,CAAA,EAAGA,CAAAA,CAAe,OAAO,IAAI,CAAA,CAAA,EAAIA,CAAAA,CAAe,OAAO,CAAA,CAAA,CACtDtB,CAAAA,EAAgB,MAAQ,SAAA,CAE7B,OACEp2B,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6EAAA,CACb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iEAAA,CAEZ,QAAA,CAAA,CAAAy3B,CAAAA,EACCv3B,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oCACb,QAAA,CAAAA,GAAAA,CAAC2S,MAAAA,CAAA,CACC,EAAA,CAAG,GAAA,CACH,QAAS4kB,CAAAA,CACT,YAAA,CAAcv3B,GAAAA,CAAC2e,eAAAA,CAAA,CAAgB,SAAA,CAAU,UAAU,CAAA,CACnD,SAAA,CAAU,iFAAA,CAET,QAAA,CAAA9f,CAAAA,CAAE,aAAa,CAAA,CAClB,CAAA,CACF,CAAA,CAEFmB,GAAAA,CAAC02B,EAAAA,CAAA,CACC,SAAA,CAAWC,CAAAA,CACX,OAAQ5vB,CAAAA,CACR,aAAA,CAAequB,CAAAA,CACjB,CAAA,CAAA,CACF,CAAA,CACAt1B,IAAAA,CAAC,OAAI,SAAA,CAAU,iFAAA,CACZ,QAAA,CAAA,CAAAo2B,CAAAA,EACCl2B,GAAAA,CAAC4S,EAAAA,CAAA,CAEC,KAAA,CAAO3Q,CAAAA,CACP,MAAA,CAAQi0B,CAAAA,CACR,WAAA,CAAasB,CAAAA,EAAgB,IAAA,CAC7B,cAAA,CAAgBA,CAAAA,EAAgB,OAAA,CAChC,KAAA,CAAO3kB,CAAAA,CAAAA,CALF8kB,CAMP,CAAA,CAGD11B,GACCjC,GAAAA,CAAC+2B,EAAAA,CAAA,CACC,SAAA,CAAWJ,CAAAA,CACX,MAAA,CAAQ10B,EAAM,MAAA,CACd,YAAA,CAAcq1B,CAAAA,CAChB,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CACCr1B,GACCjC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CACb,QAAA,CAAAA,GAAAA,CAACkjB,EAAAA,CAAA,CAAoB,KAAA,CAAOjhB,CAAAA,CAAO,aAAA,CAAekhB,CAAAA,CAAe,CAAA,CACnE,CAAA,CAGFnjB,IAACmT,EAAAA,CAAA,EAAkB,CAAA,CAAA,CACrB,CAEJ,CCvKA,SAAS0G,EAAAA,CAAUW,CAAAA,CAA0B,CAC3C,OAAOA,EAAE,QAAA,CAAS,CAAC,CAAA,EAAG,QAAA,EAAYA,CAAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,KAAA,EAAS,CAC5D,CAEA,SAASod,EAAAA,CACPlH,EACwB,CACxB,OAAQA,CAAAA,EACN,KAAKjuB,UAAAA,CAAW,OAAA,CACd,OAAO,CAAE,QAAA,CAAU,KAAA,CAAO,KAAA,CAAO,EAAG,CAAA,CACtC,KAAKA,UAAAA,CAAW,QAAA,CACd,OAAO,CAAE,QAAA,CAAU,IAAA,CAAM,MAAO,GAAI,CAAA,CACtC,KAAKA,UAAAA,CAAW,SAAA,CACd,OAAO,CAAE,QAAA,CAAU,IAAA,CAAM,KAAA,CAAO,GAAI,CAAA,CACtC,KAAKA,UAAAA,CAAW,GAAA,CACd,OAAO,CAAE,QAAA,CAAU,IAAA,CAAM,KAAA,CAAO,GAAI,EACtC,QACE,OAAO,CAAE,QAAA,CAAU,IAAA,CAAM,KAAA,CAAO,GAAI,CACxC,CACF,CAiBO,IAAMo1B,EAAAA,CAAkBrkB,CAAAA,EAAiC,CAC9D,GAAM,CACJ,sBAAA,CAAAskB,CAAAA,CACA,UAAA,CAAApH,CAAAA,CAAahuB,EAAAA,CACb,MAAA,CAAAqE,CACF,CAAA,CAAIyM,CAAAA,CAEEukB,CAAAA,CAASrxB,gBAAAA,EAAiB,CAC1BsxB,EAAoB9zB,OAAAA,CACxB,IAAM0zB,EAAAA,CAA+BlH,CAAU,CAAA,CAC/C,CAACA,CAAU,CACb,CAAA,CAEM,CACJ,IAAA,CAAMzuB,CAAAA,CACN,SAAA,CAAW20B,EACX,KAAA,CAAOC,CACT,CAAA,CAAIC,QAAAA,CAAS,CAAE,IAAA,CAAMtjB,CAAAA,CAAO,SAAA,CAAW,MAAA,CAAAzM,CAAO,CAAC,CAAA,CAEzCkxB,CAAAA,CAAiB/zB,OAAAA,CAAQ,IAAM,CACnC,GAAI,CAACjC,CAAAA,EAAO,OAAA,CAAS,OAAO,EAAC,CAG7B,IAAMquB,CAAAA,CAAO,IAAI,GAAA,CACX4H,CAAAA,CAAiBj2B,EAAM,OAAA,CAAQ,MAAA,CAAQuY,CAAAA,EACvC8V,CAAAA,CAAK,GAAA,CAAI9V,CAAAA,CAAE,IAAI,CAAA,CAAU,KAAA,EAC7B8V,CAAAA,CAAK,GAAA,CAAI9V,CAAAA,CAAE,IAAI,CAAA,CACR,KACR,CAAA,CAcD,OAAA,CAXEsd,CAAAA,EAA0BA,CAAAA,CAAuB,MAAA,CAAS,CAAA,CACtDA,EACG,KAAA,CAAM,CAAA,CAAG,CAAyB,CAAA,CAClC,GAAA,CAAKxJ,CAAAA,EACJ4J,EAAe,IAAA,CAAM1d,CAAAA,EAAqBA,CAAAA,CAAE,IAAA,GAAS8T,CAAI,CAC3D,CAAA,CACC,MAAA,CAAQ9T,CAAAA,EAA0BA,CAAAA,GAAM,MAAS,CAAA,CACpD,CAAC,GAAG0d,CAAc,CAAA,CACf,IAAA,CAAK,CAACp5B,CAAAA,CAAGC,CAAAA,GAAM8a,EAAAA,CAAU9a,CAAC,CAAA,CAAI8a,EAAAA,CAAU/a,CAAC,CAAC,CAAA,CAC1C,KAAA,CAAM,EAAG,CAAyB,CAAA,EAE5B,GAAA,CAAK0b,CAAAA,EAAMA,CAAAA,CAAE,IAAI,CAClC,CAAA,CAAG,CAACsd,CAAAA,CAAwB71B,CAAAA,EAAO,OAAO,CAAC,CAAA,CAErCk2B,EAAqBC,UAAAA,CAAW,CACpC,OAAA,CAASH,CAAAA,CAAe,GAAA,CAAK3J,CAAAA,GAAU,CACrC,QAAA,CAAU+J,oBAAAA,CAAqB/J,CAAAA,CAAM0J,CAAiB,CAAA,CACtD,OAAA,CAAS,IAAMD,CAAAA,CAAO,gBAAA,CAAiBzJ,CAAAA,CAAM0J,CAAiB,CAAA,CAC9D,OAAA,CAASC,CAAAA,CAAe,MAAA,CAAS,CACnC,CAAA,CAAE,CACJ,CAAC,CAAA,CAEKK,CAAAA,CAAwBH,EAAmB,IAAA,CAAMI,CAAAA,EAAMA,CAAAA,CAAE,SAAS,CAAA,CAElEC,CAAAA,CAAoBt0B,QAAQ,IAAM,CACtC,IAAM4H,CAAAA,CAAS,IAAI,GAAA,CACnB,OAAAmsB,CAAAA,CAAe,OAAA,CAAQ,CAAC3J,CAAAA,CAAM/V,CAAAA,GAAU,CACtC,IAAMb,CAAAA,CAAQygB,CAAAA,CAAmB5f,CAAK,CAAA,EAAG,KAAA,CACrCb,CAAAA,EAAO5L,CAAAA,CAAO,IAAIwiB,CAAAA,CAAM5W,CAAK,EACnC,CAAC,CAAA,CACM5L,CACT,EAAG,CAACmsB,CAAAA,CAAgBE,CAAkB,CAAC,CAAA,CAEjCM,CAAAA,CAAev0B,QAAQ,IAAM,CACjC,IAAM4rB,CAAAA,CAAM,IAAI,GAAA,CAChB,OAAAmI,CAAAA,CAAe,OAAA,CAAQ,CAAC3J,CAAAA,CAAM/V,CAAAA,GAAU,CACtC,IAAMR,EAAOogB,CAAAA,CAAmB5f,CAAK,CAAA,EAAG,IAAA,CACpCR,CAAAA,EAAM+X,CAAAA,CAAI,IAAIxB,CAAAA,CAAMvW,CAAI,EAC9B,CAAC,CAAA,CACM+X,CACT,EAAG,CAACmI,CAAAA,CAAgBE,CAAkB,CAAC,CAAA,CAEvC,OAAO,CACL,KAAA,CAAAl2B,CAAAA,CACA,cAAA,CAAA20B,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,iBAAA,CAAAmB,EACA,YAAA,CAAAS,CAAAA,CACA,qBAAA,CAAAH,CAAAA,CACA,iBAAA,CAAAE,CACF,CACF,ECpIA,IAAME,EAAAA,CAAmB,EAAA,CAEnBC,EAAAA,CAAsBC,eAAAA,CAC1B,kCAAA,CACA,EAAC,CACD,MAAA,CACA,CAAE,SAAA,CAAW,IAAK,CACpB,EAEO,SAASC,EAAAA,EAA0B,CACxC,GAAM,CAACC,CAAAA,CAAWC,CAAY,CAAA,CAAIC,OAAAA,CAAQL,EAAmB,CAAA,CAEvDM,CAAAA,CAAar5B,WAAAA,CAChBs5B,CAAAA,EAAoB,CACnB,IAAMC,CAAAA,CAAUD,CAAAA,CAAQ,IAAA,EAAK,CACxBC,CAAAA,EAELJ,EAAcxkB,CAAAA,EAAS,CACrB,IAAM+Q,CAAAA,CAAW/Q,CAAAA,CAAK,MAAA,CAAQgG,GAAMA,CAAAA,GAAM4e,CAAO,CAAA,CACjD,OAAO,CAACA,CAAAA,CAAS,GAAG7T,CAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,CAAGoT,EAAgB,CACzD,CAAC,EACH,CAAA,CACA,CAACK,CAAY,CACf,CAAA,CAEMK,CAAAA,CAAiBx5B,YAAY,IAAM,CACvCm5B,CAAAA,CAAa,EAAE,EACjB,EAAG,CAACA,CAAY,CAAC,CAAA,CAEjB,OAAO,CAAE,UAAAD,CAAAA,CAAW,UAAA,CAAAG,CAAAA,CAAY,cAAA,CAAAG,CAAe,CACjD,CCxBO,SAASC,GAAgB,CAC9B,SAAA,CAAAP,CAAAA,CACA,QAAA,CAAA13B,CAAAA,CACA,OAAA,CAAAk4B,CAAAA,CACA,SAAA,CAAA75B,CACF,CAAA,CAAyB,CACvB,GAAM,CAAE,CAAA,CAAAZ,CAAE,CAAA,CAAIa,cAAAA,EAAe,CAE7B,OAAIo5B,CAAAA,CAAU,MAAA,GAAW,EAAU,IAAA,CAGjCh5B,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,IAAAA,CAAG,WAAA,CAAaN,CAAS,CAAA,CACvC,QAAA,CAAA,CAAAK,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CACb,QAAA,CAAAnB,CAAAA,CAAE,wBAAwB,EAC7B,CAAA,CACAmB,GAAAA,CAAC2S,MAAAA,CAAA,CACC,UAAA,CAAU,IAAA,CACV,KAAK,IAAA,CACL,SAAA,CAAU,6CAAA,CACV,OAAA,CAAS2mB,CAAAA,CAET,QAAA,CAAAt5B,IAACu5B,SAAAA,CAAA,CAAU,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CACpC,CAAA,CAAA,CACF,CAAA,CACAv5B,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACZ,QAAA,CAAA84B,EAAU,GAAA,CAAKI,CAAAA,EACdl5B,GAAAA,CAACG,IAAAA,CAAA,CAEC,IAAA,CAAK,KACL,OAAA,CAAQ,UAAA,CACR,SAAA,CAAWJ,IAAAA,CACT,cAAA,CACA,wBAAA,CACA,iBACA,qBACF,CAAA,CACA,OAAA,CAAS,IAAMqB,CAAAA,GAAW83B,CAAO,CAAA,CAEhC,QAAA,CAAAA,CAAAA,CAAAA,CAXIA,CAYP,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAEJ,CC7CO,SAASM,EAAAA,CAAoB,CAClC,SAAAp4B,CAAAA,CACA,SAAA,CAAA3B,CACF,CAAA,CAA6B,CAC3B,GAAM,CAAE,SAAA,CAAAq5B,CAAAA,CAAW,cAAA,CAAAM,CAAe,CAAA,CAAIP,EAAAA,EAAwB,CAE9D,OACE74B,GAAAA,CAACq5B,EAAAA,CAAA,CACC,SAAA,CAAWt5B,IAAAA,CAAGN,CAAS,EACvB,SAAA,CAAWq5B,CAAAA,CACX,QAAA,CAAU13B,CAAAA,CACV,OAAA,CAASg4B,CAAAA,CACX,CAEJ,CCHO,SAASK,GAAc,CAC5B,KAAA,CAAAl0B,CAAAA,CACA,aAAA,CAAAm0B,CAAAA,CACA,OAAA,CAAAJ,EACA,QAAA,CAAA/iB,CAAAA,CACA,SAAA,CAAA9W,CACF,CAAA,CAAuB,CACrB,GAAM,CAAE,CAAA,CAAAZ,CAAE,CAAA,CAAIa,cAAAA,EAAe,CAE7B,OACEM,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWP,CAAAA,CACd,QAAA,CAAAO,GAAAA,CAAC25B,WAAAA,CAAA,CACC,SAAA,CAAS,IAAA,CACT,OAAA,CAAQ,UAAA,CACR,MAAA,CAAO,IAAA,CACP,MAAOp0B,CAAAA,CACP,aAAA,CAAem0B,CAAAA,CACf,WAAA,CAAa76B,CAAAA,CAAE,4BAA4B,EAC3C,UAAA,CAAY,CACV,YAAA,CAAc,CACZ,0BAAA,CACA,8BAAA,CACA,0CAAA,CACA,gDAAA,CACA,sDACF,CAAA,CAAE,IAAA,CAAK,GAAG,CACZ,CAAA,CACA,aACEmB,GAAAA,CAAC45B,UAAAA,CAAA,CAAW,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,GAAI,SAAA,CAAU,cAAA,CAAe,CAAA,CAE9D,UAAA,CACEr0B,CAAAA,CACEvF,GAAAA,CAAC2S,OAAA,CACC,UAAA,CAAU,IAAA,CACV,SAAA,CAAU,6CAAA,CACV,OAAA,CAAS2mB,EAET,QAAA,CAAAt5B,GAAAA,CAAC65B,UAAAA,CAAA,CAAW,KAAA,CAAO,EAAA,CAAI,OAAQ,EAAA,CAAI,CAAA,CACrC,CAAA,CAEA75B,GAAAA,CAAC85B,GAAAA,CAAA,CACC,UAAU,qIAAA,CACV,WAAA,CAAcxkB,CAAAA,EAAwB,CACpCA,CAAAA,CAAE,cAAA,GACFiB,CAAAA,KACF,CAAA,CACD,QAAA,CAAA,KAAA,CAED,CAAA,CAGN,CAAA,CACF,CAEJ,CClEA,IAAMwjB,GAA0C,CAC9C,MAAA,CAAQ,CACN,KAAA,CAAO,QAAA,CACP,KAAA,CAAO,UACP,OAAA,CAAS,yBAAA,CACT,IAAA,CAAM/5B,GAAAA,CAAC6e,UAAAA,CAAA,CAAW,UAAU,sBAAA,CAAuB,CACrD,CAAA,CACA,UAAA,CAAY,CACV,KAAA,CAAO,YAAA,CACP,KAAA,CAAO,SAAA,CACP,OAAA,CAAS,0BAAA,CACT,IAAA,CAAM7e,GAAAA,CAAC4e,cAAAA,CAAA,CAAe,SAAA,CAAU,sBAAA,CAAuB,CACzD,CAAA,CACA,KAAA,CAAO,CACL,MAAO,OAAA,CACP,KAAA,CAAO,mBAAA,CACP,OAAA,CAAS,0BAAA,CACT,IAAA,CAAM,IACR,CACF,CAAA,CAEMob,EAAAA,CAA2B,CAC/B,KAAA,CAAO,SAAA,CACP,KAAA,CAAO,oBAAA,CACP,OAAA,CAAS,2BAAA,CACT,IAAA,CAAM,IACR,CAAA,CAEO,SAASC,GAAclzB,CAAAA,CAA6C,CACzE,OAAOgzB,EAAAA,CAAYhzB,CAAM,CAAA,EAAKizB,EAChC,CAOO,SAASE,EAAAA,CAAY,CAAE,MAAA,CAAAnzB,CAAAA,CAAQ,UAAAtH,CAAU,CAAA,CAAqB,CACnE,IAAM06B,CAAAA,CAAOF,EAAAA,CAAclzB,CAAM,CAAA,CACjC,OACEjH,IAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAWC,IAAAA,CACT,+EAAA,CACAN,CACF,CAAA,CACA,KAAA,CAAO,CAAE,eAAA,CAAiB06B,CAAAA,CAAK,OAAA,CAAS,MAAOA,CAAAA,CAAK,KAAM,CAAA,CAEzD,QAAA,CAAA,CAAAA,CAAAA,CAAK,IAAA,CACLA,EAAK,KAAA,CAAA,CACR,CAEJ,CCjCA,SAASC,EAAAA,CAAaC,CAAAA,CAAwC,CAC5D,OAAIA,CAAAA,EAAO,IAAA,CAAa,GAAA,CACpBA,CAAAA,EAAO,GAAA,CAAkB,KAAKA,CAAAA,CAAM,GAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CACzDA,GAAO,GAAA,CAAc,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAM,GAAK,CAAC,CAAA,CAAA,CAAA,CAC7C,CAAA,CAAA,EAAIA,CAAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAC3B,CAMO,SAASC,EAAAA,CAAmB,CACjC,KAAA,CAAAr4B,CAAAA,CACA,IAAA,CAAA2Y,EACA,aAAA,CAAAC,CAAAA,CACA,QAAA,CAAAzZ,CAAAA,CACA,OAAA,CAAA2Z,CAAAA,CACA,UAAAtb,CACF,CAAA,CAA4B,CAC1B,GAAM,CAAE,CAAA,CAAAZ,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB66B,CAAAA,CAAWt4B,CAAAA,CAAM,IAAA,GAAO,CAAC,EACzBu4B,CAAAA,CAAaP,EAAAA,CAAch4B,CAAAA,CAAM,MAAM,CAAA,CAEvCsZ,CAAAA,CAAkBrX,QACtB,IAAMk2B,EAAAA,CAAan4B,CAAAA,CAAM,MAAM,CAAA,CAC/B,CAACA,EAAM,MAAM,CACf,CAAA,CAEA,OACEnC,IAAAA,CAAC2c,QAAAA,CAAA,CACC,IAAA,CAAM7B,CAAAA,CACN,aAAA,CAAeC,CAAAA,CACf,SAAA,CAAW9a,IAAAA,CACT,kDAAA,CACA,oDACA,gCAAA,CACAN,CACF,CAAA,CACA,OAAA,CAAU6V,CAAAA,EAAM,CACVsF,GAAQxZ,CAAAA,EAAUkU,CAAAA,CAAE,cAAA,EAAe,CACvClU,CAAAA,GAAWa,CAAK,EAClB,CAAA,CACA,YAAA,CAAc,IAAM8Y,CAAAA,GAAU9Y,CAAK,CAAA,CAGnC,QAAA,CAAA,CAAAjC,GAAAA,CAAC0c,MAAAA,CAAA,CACC,GAAA,CAAKza,CAAAA,CAAM,SAAA,EAAa,MAAA,CACxB,KAAMA,CAAAA,CAAM,KAAA,EAAS,OAAA,CACrB,MAAA,CAAO,MAAA,CACP,SAAA,CAAU,0BACZ,CAAA,CAGAnC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uDAAA,CACb,QAAA,CAAA,CAAAE,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qFAAA,CACb,QAAA,CAAAiC,CAAAA,CAAM,KAAA,CACT,CAAA,CAEAnC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+EAAA,CAEb,QAAA,CAAA,CAAAA,IAAAA,CAAC,MAAA,CAAA,CACC,UAAU,2CAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAO06B,CAAAA,CAAW,KAAM,EAEhC,QAAA,CAAA,CAAAA,CAAAA,CAAW,IAAA,CACZx6B,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,aAAA,CAAe,QAAA,CACf,aAAA,CAAe,WACjB,CAAA,CAEC,QAAA,CAAAw6B,CAAAA,CAAW,KAAA,CACd,CAAA,CAAA,CACF,CAAA,CAEAx6B,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,QAAA,CAAA,MAAA,CAAQ,CAAA,CAG3CF,IAAAA,CAAC,QAAK,SAAA,CAAU,kBAAA,CACb,QAAA,CAAA,CAAAyb,CAAAA,CAAgB,GAAA,CAAE1c,CAAAA,CAAE,sBAAsB,CAAA,CAAA,CAC7C,CAAA,CAGC07B,CAAAA,EACCz6B,IAAAA,CAAAkS,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAhS,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,QAAA,CAAA,MAAA,CAAQ,CAAA,CAC3CA,GAAAA,CAAC,QAAK,SAAA,CAAU,kBAAA,CAAoB,QAAA,CAAAu6B,CAAAA,CAAS,KAAA,CAAM,CAAA,CAAA,CACrD,GAEJ,CAAA,CAAA,CACF,CAAA,CAGAv6B,GAAAA,CAAC2d,gBAAAA,CAAA,CACC,KAAA,CAAO,GACP,MAAA,CAAQ,EAAA,CACR,SAAA,CAAU,gFAAA,CACZ,CAAA,CAAA,CACF,CAEJ,CClHO,SAAS8c,EAAAA,CAA0B,CACxC,OAAA,CAAAvB,CAAAA,CAAU,EAAA,CACV,MAAA5X,CAAAA,CACA,MAAA,CAAAva,CACF,CAAA,CAAoC,CAClC,GAAM,CAAE,IAAA,CAAAgR,CAAAA,CAAM,SAAA,CAAAT,CAAAA,CAAW,kBAAA,CAAAojB,CAAAA,CAAoB,YAAA3V,CAAAA,CAAa,aAAA,CAAAnN,CAAc,CAAA,CACtE+iB,eAAAA,CACE,CACE,QAAAzB,CAAAA,CACA,KAAA,CAAA5X,CAAAA,CACA,MAAA,CAAAva,CAAAA,CACA,OAAA,CAASmyB,EAAU,MAAA,CAAY,QAAA,CAC/B,QAAA,CAAUA,CAAAA,CAAU,MAAA,CAAY,KAClC,EACA,CAAE,OAAA,CAAS,IAAK,CAClB,CAAA,CAUF,OAAO,CACL,MAAA,CATah1B,OAAAA,CACb,IACE6T,CAAAA,EAAM,KAAA,CACH,OAAA,CAAS3N,CAAAA,EAAiCA,EAAE,KAAK,CAAA,CACjD,MAAA,CAAQ6N,CAAAA,EAA+BA,CAAAA,EAAQ,IAAI,GAAK,EAAC,CAC9D,CAACF,CAAI,CACP,CAAA,CAIE,UAAAT,CAAAA,CACA,kBAAA,CAAAojB,CAAAA,CACA,WAAA,CAAa3V,CAAAA,EAAe,KAAA,CAC5B,aAAA,CAAAnN,CACF,CACF,CCjCA,IAAMkL,EAAAA,CAAa,EAAA,CAaZ,SAAS8X,EAAAA,CAAuB,CACrC,SAAAx5B,CAAAA,CACA,YAAA,CAAAue,CAAAA,CACA,aAAA,CAAA9E,CAAAA,CACA,OAAA,CAAAE,EACA,SAAA,CAAAtb,CAAAA,CACA,GAAGo7B,CACL,CAAA,CAAgC,CAC9B,GAAM,CAAE,MAAA,CAAApb,CAAAA,CAAQ,SAAA,CAAAnI,CAAAA,CAAW,kBAAA,CAAAojB,CAAAA,CAAoB,YAAA3V,CAAAA,CAAa,aAAA,CAAAnN,CAAc,CAAA,CACxE6iB,EAAAA,CAA0BI,CAAY,EAElCC,CAAAA,CAAMzkB,MAAAA,CAAuB,IAAI,CAAA,CACjC,CAAE,MAAA,CAAA0kB,CAAO,CAAA,CAAI/a,iBAAAA,CAAkC,CAAE,GAAA,CAAA8a,CAAI,CAAC,CAAA,CAEtDE,CAAAA,CAAep7B,WAAAA,CAClB2Y,CAAAA,EAAkBA,CAAAA,CAAQkH,CAAAA,CAAO,MAAA,CAClC,CAACA,CAAM,CACT,CAAA,CAEMwb,CAAAA,CAAgBr7B,WAAAA,CAAY,SAAY,CACxCmlB,GAAe,CAAC2V,CAAAA,EAClB,MAAM9iB,CAAAA,GAEV,CAAA,CAAG,CAACmN,CAAAA,CAAa2V,CAAAA,CAAoB9iB,CAAa,CAAC,CAAA,CAE7C6N,CAAAA,CAAYvhB,OAAAA,CAChB,IAAO6gB,CAAAA,CAActF,CAAAA,CAAO,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAO,MAAA,CAChD,CAACA,CAAAA,CAAQsF,CAAW,CACtB,CAAA,CAEMmW,CAAAA,CAAeza,iBAAAA,CAAkB,CACrC,WAAA,CAAaua,CAAAA,CACb,YAAA,CAAcC,CAAAA,CACd,QAAA,CAAUxV,CAAAA,CACV,UAAW,CACb,CAAC,CAAA,CAED,OAAInO,CAAAA,CACKtX,GAAAA,CAACm7B,EAAAA,CAAA,CAAa,SAAA,CAAW17B,CAAAA,CAAW,CAAA,CAGzCggB,CAAAA,CAAO,MAAA,GAAW,CAAA,CACbzf,IAACgkB,EAAAA,CAAA,CAAW,SAAA,CAAWvkB,CAAAA,CAAW,CAAA,CAIzCO,GAAAA,CAAC,OAAI,SAAA,CAAWD,IAAAA,CAAG,6BAAA,CAA+BN,CAAS,CAAA,CACzD,QAAA,CAAAO,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mBAAA,CAAoB,GAAA,CAAK86B,CAAAA,CACtC,QAAA,CAAA96B,GAAAA,CAAC2gB,IAAAA,CAAA,CACC,SAAA,CAAU,cAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAAoa,CAAO,CAAA,CAChB,cAAA,CAAgBG,CAAAA,CAChB,YAAA,CAAcE,EAAAA,CACd,QAAA,CAAU3V,EACV,SAAA,CAAW3C,EAAAA,CACX,QAAA,CAAU,CAAE,MAAA,CAAArD,CAAAA,CAAQ,SAAAre,CAAAA,CAAU,YAAA,CAAAue,CAAAA,CAAc,aAAA,CAAA9E,CAAAA,CAAe,OAAA,CAAAE,CAAQ,CAAA,CACnE,aAAA,CAAe,CAAA,CACjB,CAAA,CACF,CAAA,CACF,CAEJ,CAcA,SAASqgB,EAAAA,CAAgB,CACvB,KAAA,CAAA7iB,CAAAA,CACA,KAAA,CAAAsI,CAAAA,CACA,OAAApB,CAAAA,CACA,QAAA,CAAAre,CAAAA,CACA,YAAA,CAAAue,CAAAA,CACA,aAAA,CAAA9E,EACA,OAAA,CAAAE,CACF,CAAA,CAAyD,CACvD,IAAM9Y,CAAAA,CAAQwd,CAAAA,CAAOlH,CAAK,CAAA,CAE1B,OAAKtW,CAAAA,CASHjC,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO6gB,EACV,QAAA,CAAA7gB,GAAAA,CAACs6B,EAAAA,CAAA,CACC,KAAA,CAAOr4B,CAAAA,CACP,KAAM0d,CAAAA,GAAe1d,CAAK,CAAA,CAC1B,aAAA,CAAe4Y,CAAAA,CACf,QAAA,CAAUzZ,EACV,OAAA,CAAS2Z,CAAAA,CACX,CAAA,CACF,CAAA,CAfE/a,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO6gB,CAAAA,CAAO,SAAA,CAAU,kCAAA,CAC3B,QAAA,CAAA7gB,GAAAA,CAACghB,OAAAA,CAAA,CAAQ,KAAK,IAAA,CAAK,CAAA,CACrB,CAeN,CAMA,SAASma,EAAAA,CAAa,CAAE,SAAA,CAAA17B,CAAU,CAAA,CAA2B,CAC3D,GAAM,CAAE,CAAE,CAAA,CAAIC,cAAAA,EAAe,CAE7B,OACEI,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWC,IAAAA,CAAG,8CAAA,CAAgDN,CAAS,CAAA,CAEvE,QAAA,CAAA,CAAAO,GAAAA,CAACghB,OAAAA,CAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAA,CACnBhhB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uBACb,QAAA,CAAA,CAAA,CAAE,wBAAwB,CAAA,CAC7B,CAAA,CAAA,CACF,CAEJ,CAEA,SAASgkB,EAAAA,CAAW,CAAE,SAAA,CAAAvkB,CAAU,CAAA,CAA2B,CACzD,GAAM,CAAE,CAAE,CAAA,CAAIC,cAAAA,EAAe,CAE7B,OACEI,IAAAA,CAAC,OACC,SAAA,CAAWC,IAAAA,CACT,iDAAA,CACAN,CACF,CAAA,CAEA,QAAA,CAAA,CAAAO,IAACq7B,SAAAA,CAAA,CAAU,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,UAAU,cAAA,CAAe,CAAA,CAC3Dr7B,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,2BAAA,CACV,QAAA,CAAA,CAAA,CAAE,0BAA0B,CAAA,CAC/B,CAAA,CAAA,CACF,CAEJ,CC/JO,SAASs7B,EAAAA,CAAgB,CAAE,eAAA,CAAAC,CAAgB,CAAA,CAA0B,CAC1E,GAAM,CAACC,CAAAA,CAAMC,CAAO,CAAA,CAAIl6B,QAAAA,CAAS,EAAE,CAAA,CAC7B,CAAC23B,CAAAA,CAASwC,CAAU,CAAA,CAAIn6B,QAAAA,CAAS,EAAE,CAAA,CACnC,CAAE,UAAA,CAAA03B,CAAW,CAAA,CAAIJ,EAAAA,EAAwB,CAEzC8C,CAAAA,CAAwBC,eAAeL,CAAe,CAAA,CACtDM,CAAAA,CAAmBD,cAAAA,CAAe3C,CAAU,CAAA,CAE5C6C,CAAAA,CAAkB53B,OAAAA,CACtB,IACE63B,QAAAA,CAAUtwB,CAAAA,EAAc,CACtBiwB,CAAAA,CAAWjwB,CAAC,EACZkwB,CAAAA,CAAsBlwB,CAAC,CAAA,CACnBA,CAAAA,EAAGowB,CAAAA,CAAiBpwB,CAAC,EAC3B,CAAA,CAAG,GAAG,CAAA,CACR,CAACkwB,CAAAA,CAAuBE,CAAgB,CAC1C,CAAA,CAEMG,CAAAA,CAAWp8B,WAAAA,CACd6L,CAAAA,EAAc,CACbgwB,CAAAA,CAAQhwB,CAAC,CAAA,CACTqwB,CAAAA,CAAgBrwB,CAAC,EACnB,CAAA,CACA,CAACqwB,CAAe,CAClB,CAAA,CAEMG,CAAAA,CAAcr8B,WAAAA,CACjB2F,CAAAA,EAAkB,CACjBu2B,EAAgB,MAAA,EAAO,CACvBL,CAAAA,CAAQl2B,CAAK,CAAA,CACbm2B,CAAAA,CAAWn2B,CAAK,CAAA,CAChBo2B,CAAAA,CAAsBp2B,CAAK,CAAA,CACvBA,CAAAA,EAAOs2B,CAAAA,CAAiBt2B,CAAK,EACnC,CAAA,CACA,CAACu2B,CAAAA,CAAiBH,CAAAA,CAAuBE,CAAgB,CAC3D,EAEMK,CAAAA,CAAet8B,WAAAA,CAAY,IAAMq8B,CAAAA,CAAY,EAAE,CAAA,CAAG,CAACA,CAAW,CAAC,CAAA,CAErE,OAAO,CACL,IAAA,CAAAT,EACA,OAAA,CAAAtC,CAAAA,CACA,OAAA,CAAS8C,CAAAA,CACT,UAAA,CAAYC,CAAAA,CACZ,YAAA,CAAAC,CACF,CACF,CChCO,SAASC,EAAAA,CAAa,CAC3B,eAAA,CAAAZ,CAAAA,CACA,cAAAa,CAAAA,CACA,YAAA,CAAAzc,CAAAA,CACA,aAAA,CAAA9E,CAAAA,CACA,OAAA,CAAAE,EACA,QAAA,CAAAxE,CAAAA,CACA,MAAA,CAAAxP,CACF,CAAA,CAAsB,CACpB,GAAM,CAAE,IAAA,CAAAy0B,CAAAA,CAAM,OAAA,CAAAtC,CAAAA,CAAS,OAAA,CAAAuC,CAAAA,CAAS,WAAAC,CAAAA,CAAY,YAAA,CAAAQ,CAAa,CAAA,CAAIZ,EAAAA,CAAgB,CAC3E,gBAAAC,CACF,CAAC,CAAA,CAED,OACEz7B,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,mCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAACy5B,EAAAA,CAAA,CACC,KAAA,CAAO+B,CAAAA,CACP,aAAA,CAAeC,CAAAA,CACf,OAAA,CAASS,CAAAA,CACT,QAAA,CAAU3lB,CAAAA,CACZ,CAAA,CACC,CAAC2iB,CAAAA,EAAWl5B,GAAAA,CAACw5B,EAAAA,CAAA,CAAoB,QAAA,CAAUkC,CAAAA,CAAY,EACxD17B,GAAAA,CAAC46B,EAAAA,CAAA,CACC,SAAA,CAAU,mBAAA,CACV,OAAA,CAAS1B,EACT,QAAA,CAAUkD,CAAAA,CACV,YAAA,CAAczc,CAAAA,CACd,aAAA,CAAe9E,CAAAA,CACf,OAAA,CAASE,CAAAA,CACT,MAAA,CAAQhU,CAAAA,CACV,CAAA,CAAA,CACF,CAEJ,CCzBO,IAAMs1B,EAAAA,CAA0B,iBAEhC,SAASC,EAAAA,CAAmB,CACjC,EAAA,CAAAlpB,CAAAA,CAAKipB,EACP,CAAA,CAEG,CACD,OACEr8B,GAAAA,CAACqT,UAAAA,CAAA,CAA+D,EAAA,CAAID,CAAAA,CACjE,QAAA,CAACE,CAAAA,EAAetT,GAAAA,CAACu8B,EAAAA,CAAA,CAA2B,GAAGjpB,CAAAA,CAAY,CAAA,CAC9D,CAEJ,CAEA,SAASipB,EAAAA,CAA0B,CACjC,MAAA,CAAA/oB,CAAAA,CACA,OAAAlE,CAAAA,CACA,YAAA,CAAAmE,CAAAA,CACA,QAAA,CAAA+oB,CACF,CAAA,CAA8E,CAC5E,GAAM,CAAE,CAAA,CAAA39B,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB,CAAE,QAAA,CAAAgU,CAAS,CAAA,CAAIC,SAAAA,EAAU,CAEzB8oB,CAAAA,CAAoB78B,YACvBqC,CAAAA,EAAwB,CACvBu6B,CAAAA,CAASv6B,CAAK,EAChB,CAAA,CACA,CAACu6B,CAAQ,CACX,CAAA,CAEME,CAAAA,CAAe98B,WAAAA,CAAY,IAAM,CACrC6T,CAAAA,CAAa,KAAK,EACpB,CAAA,CAAG,CAACA,CAAY,CAAC,CAAA,CAEjB,OACEzT,GAAAA,CAACyP,WAAAA,CAAA,CACC,MAAA,CAAQH,CAAAA,CACR,aAAcmE,CAAAA,CACd,IAAA,CAAMC,CAAAA,CAAW,MAAA,CAAS,IAAA,CAC1B,eAAA,CAAe,KACf,QAAA,CAAS,MAAA,CACT,MAAA,CAAO,IAAA,CAEP,QAAA,CAAA5T,IAAAA,CAAC6P,aAAA,CACC,SAAA,CAAU,eAAA,CACV,KAAA,CAAO,CACL,YAAA,CAAc+D,CAAAA,CAAW,MAAA,CAAY,EAAA,CACrC,MAAA,CAAQA,CAAAA,CAAW,MAAA,CAAY,4BAAA,CAC/B,UAAA,CAAY,mBACZ,SAAA,CAAWA,CAAAA,CAAW,MAAA,CAAY,mCAAA,CAClC,QAAA,CAAU,QACZ,EAEA,QAAA,CAAA,CAAA5T,IAAAA,CAAC68B,WAAAA,CAAA,CAAY,SAAA,CAAU,uDAAA,CACrB,UAAA38B,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,yBAAA,CACb,QAAA,CAAAnB,CAAAA,CAAE,sBAAsB,CAAA,CAC3B,CAAA,CACAmB,GAAAA,CAAC2S,MAAAA,CAAA,CACC,UAAA,CAAU,IAAA,CACV,QAAS,IAAMc,CAAAA,CAAa,KAAK,CAAA,CACjC,IAAA,CAAK,IAAA,CACL,UAAU,gCAAA,CAEV,QAAA,CAAAzT,GAAAA,CAAC65B,UAAAA,CAAA,CAAW,KAAA,CAAO,GAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CACrC,CAAA,CAAA,CACF,CAAA,CACA75B,GAAAA,CAAC48B,SAAAA,CAAA,CAAU,SAAA,CAAU,KAAA,CACnB,QAAA,CAAA58B,GAAAA,CAACm8B,EAAAA,CAAA,CACC,aAAc3oB,CAAAA,EAAQ,YAAA,CACtB,aAAA,CAAeA,CAAAA,EAAQ,aAAA,CACvB,OAAA,CAASA,GAAQ,OAAA,CACjB,MAAA,CAAQA,CAAAA,EAAQ,MAAA,CAChB,aAAA,CAAeipB,CAAAA,CACf,SAAUC,CAAAA,CACZ,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CC3FO,SAASG,EAAAA,CAAmB,CACjC,aAAA,CAAAT,CAAAA,CACA,YAAAU,CAAAA,CACA,SAAA,CAAAr9B,CACF,CAAA,CAA4B,CAC1B,GAAM,CAAE,CAAA,CAAAZ,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB,CAAE,UAAAq9B,CAAAA,CAAW,QAAA,CAAArpB,CAAS,CAAA,CAAIC,SAAAA,EAAU,CAEpC,CAAE,MAAA,CAAAqpB,CAAAA,CAAQ,OAAA,CAAAztB,CAAQ,CAAA,CAAI8S,aAAAA,CAG1Bga,EAAuB,EAEnBY,CAAAA,CAAsBrB,cAAAA,CAAeQ,CAAa,CAAA,CAElDc,CAAAA,CAAatB,cAAAA,CAAe,SAAY,CAC5C,IAAM5uB,CAAAA,CAAS,MAAMgwB,CAAAA,CAAO,CAAE,OAAQF,CAAY,CAAC,CAAA,CAC/C9vB,CAAAA,EACFiwB,CAAAA,CAAoBjwB,CAAM,EAE9B,CAAC,CAAA,CAEKmwB,CAAAA,CAAcvB,cAAAA,CAAe,IAAM,CACvCrsB,CAAAA,GACF,CAAC,CAAA,CAED,OAAAjG,SAAAA,CAAU,IAAM,CACd,IAAM8zB,CAAAA,CAAiBn7B,CAAAA,EAAyB,CAC9C,IAAMo7B,CAAAA,CAAgB,QAAA,CAAS,cAEzBC,CAAAA,CACJ,CAAC,CAACD,CAAAA,GACDA,CAAAA,CAAc,OAAA,GAAY,OAAA,EACzBA,CAAAA,CAAc,OAAA,GAAY,UAAA,EAC1BA,CAAAA,CAAc,YAAA,CAAa,iBAAiB,CAAA,GAAM,QAElDp7B,CAAAA,CAAM,GAAA,GAAQ,GAAA,EAAO,CAACq7B,CAAAA,GACxBr7B,CAAAA,CAAM,gBAAe,CACrBi7B,CAAAA,EAAW,CAAA,CAGTj7B,CAAAA,CAAM,GAAA,GAAQ,QAAA,GAChBA,EAAM,cAAA,EAAe,CACrBk7B,CAAAA,EAAY,EAEhB,CAAA,CAEA,OAAA,MAAA,CAAO,gBAAA,CAAiB,SAAA,CAAWC,CAAa,CAAA,CACzC,IAAM,CACX,MAAA,CAAO,mBAAA,CAAoB,UAAWA,CAAa,EACrD,CACF,CAAA,CAAG,CAACF,CAAAA,CAAYC,CAAW,CAAC,CAAA,CAG1Bn9B,GAAAA,CAAC2S,MAAAA,CAAA,CACC,IAAA,CAAK,KACL,MAAA,CAAO,MAAA,CACP,UAAA,CAAY,CAACoqB,CAAAA,CACb,OAAA,CAASG,CAAAA,CACT,OAAA,CAASxpB,CAAAA,CAAW,MAAA,CAAS,UAAA,CAC7B,YAAA,CACEqpB,CAAAA,CAAY/8B,GAAAA,CAAC45B,WAAA,CAAW,SAAA,CAAU,cAAA,CAAe,CAAA,CAAK,MAAA,CAExD,UAAA,CACEmD,EACE/8B,GAAAA,CAAC85B,GAAAA,CAAA,CAAI,SAAA,CAAU,yFAAA,CAA0F,QAAA,CAAA,GAAA,CAEzG,EACE,MAAA,CAEN,SAAA,CAAW/5B,IAAAA,CACTg9B,CAAAA,EAAa,iDAAA,CACbt9B,CACF,CAAA,CAEC,QAAA,CAAAs9B,CAAAA,CACCl+B,CAAAA,CAAE,4BAA4B,CAAA,CAE9BmB,GAAAA,CAAC45B,UAAAA,CAAA,CAAW,SAAA,CAAU,cAAA,CAAe,CAAA,CAEzC,CAEJ,CC1FA,IAAM2D,EAAAA,CAKA,CACJ,CACE,KAAA,CAAO,QAAA,CACP,QAAA,CAAU,6BAAA,CACV,OAAA,CAAS,iCAAA,CACT,IAAA,CAAM,aACR,CAAA,CACA,CACE,KAAA,CAAO,SACP,QAAA,CAAU,6BAAA,CACV,OAAA,CAAS,iCAAA,CACT,IAAA,CAAM,cACR,EACA,CACE,KAAA,CAAO,YAAA,CACP,QAAA,CAAU,iCAAA,CACV,OAAA,CAAS,sCACT,IAAA,CAAM,OACR,CACF,CAAA,CAEMC,EAAAA,CAAiB,CACrB,CAAE,QAAA,CAAU,kCAAA,CAAoC,KAAA,CAAO,IAAA,CAAM,KAAA,CAAO,CAAE,CAAA,CACtE,CAAE,QAAA,CAAU,IAAA,CAAM,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,GAAI,EAC7C,CAAE,QAAA,CAAU,IAAA,CAAM,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,GAAI,CAAA,CAC7C,CAAE,QAAA,CAAU,IAAA,CAAM,KAAA,CAAO,MAAA,CAAQ,KAAA,CAAO,GAAM,CAAA,CAC9C,CAAE,QAAA,CAAU,IAAA,CAAM,KAAA,CAAO,MAAA,CAAQ,MAAO,GAAM,CAAA,CAC9C,CAAE,QAAA,CAAU,IAAA,CAAM,KAAA,CAAO,QAAS,KAAA,CAAO,GAAO,CAAA,CAChD,CAAE,QAAA,CAAU,IAAA,CAAM,MAAO,OAAA,CAAS,KAAA,CAAO,GAAO,CAAA,CAChD,CAAE,QAAA,CAAU,IAAA,CAAM,KAAA,CAAO,QAAA,CAAU,KAAA,CAAO,GAAQ,CACpD,CAAA,CAEM9nB,EAAAA,CAA+B,CACnC,OAAA,CAAS,aAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,aAAc,EAAA,CACd,MAAA,CAAQ,8BAAA,CACR,UAAA,CAAY,oBAAA,CACZ,OAAA,CAAS,WACT,QAAA,CAAU,EAAA,CACV,KAAA,CAAO,SAAA,CACP,MAAA,CAAQ,SAAA,CACR,UAAA,CAAY,WACd,CAAA,CAEMC,EAAAA,CAAoC,CACxC,QAAA,CAAU,UAAA,CACV,KAAA,CAAO,EACP,GAAA,CAAK,MAAA,CACL,MAAA,CAAQ,EAAA,CACR,SAAA,CAAW,CAAA,CACX,aAAc,EAAA,CACd,MAAA,CAAQ,4BAAA,CACR,UAAA,CAAY,kBAAA,CACZ,SAAA,CAAW,oCACX,QAAA,CAAU,QACZ,CAAA,CAEA,SAAS8nB,EAAAA,CACPpD,CAAAA,CACA,CAAA,CACQ,CACR,GAAI,CAACA,CAAAA,CAAK,OAAO,MAAA,CACjB,IAAM30B,EAAS83B,EAAAA,CAAe,IAAA,CAAMpzB,CAAAA,EAAMA,CAAAA,CAAE,KAAA,GAAUiwB,CAAG,EACzD,OAAK30B,CAAAA,CACEA,CAAAA,CAAO,QAAA,CAAW,CAAA,CAAEA,CAAAA,CAAO,QAAQ,CAAA,CAAIA,CAAAA,CAAO,KAAA,CADjC,CAAA,CAAA,EAAI20B,CAAG,CAAA,CAE7B,CAEO,SAASqD,EAAAA,CAAiB,CAC/B,MAAA,CAAA9a,CAAAA,CACA,YAAA,CAAA9M,CAAAA,CACA,QAAAC,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,SAAA,CAAA2L,CAAAA,CACA,iBAAA,CAAAgc,EACA,SAAA,CAAAC,CACF,CAAA,CAA0B,CACxB,GAAM,CAAE,EAAA/+B,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB,CAACm+B,CAAAA,CAAUC,CAAW,CAAA,CAAIv8B,QAAAA,CAAS,KAAK,CAAA,CACxC,CAACw8B,CAAAA,CAAYC,CAAa,EAAIz8B,QAAAA,CAAS,KAAK,CAAA,CAC5C,CAAC08B,CAAAA,CAAgBC,CAAiB,EAAI38B,QAAAA,CAAS,KAAK,CAAA,CACpD,CAAC48B,CAAAA,CAAUC,CAAW,EAAI78B,QAAAA,CAAS,KAAK,CAAA,CACxC88B,CAAAA,CAAUhoB,MAAAA,CAAuB,IAAI,CAAA,CACrCioB,CAAAA,CAAYjoB,MAAAA,CAAuB,IAAI,CAAA,CAEvCkoB,CAAAA,CACJhB,EAAAA,CAAa,IAAA,CAAMr0B,GAAMA,CAAAA,CAAE,KAAA,GAAU0Z,CAAM,CAAA,EAAK2a,EAAAA,CAAa,CAAC,EAE1DjnB,CAAAA,CAAqB1W,WAAAA,CAAa0V,CAAAA,EAAkB,CACpD+oB,CAAAA,CAAQ,OAAA,EAAW,CAACA,CAAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS/oB,CAAAA,CAAE,MAAc,CAAA,EAC/DwoB,CAAAA,CAAY,KAAK,CAAA,CAEfQ,CAAAA,CAAU,OAAA,EAAW,CAACA,CAAAA,CAAU,OAAA,CAAQ,SAAShpB,CAAAA,CAAE,MAAc,CAAA,EACnE0oB,CAAAA,CAAc,KAAK,EAEvB,EAAG,EAAE,CAAA,CAEL10B,SAAAA,CAAU,KACR,QAAA,CAAS,iBAAiB,WAAA,CAAagN,CAAkB,CAAA,CAClD,IAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,CAAaA,CAAkB,CAAA,CAAA,CACxE,CAACA,CAAkB,CAAC,CAAA,CAEvB,IAAMkoB,EAAgB5+B,WAAAA,CAAY,IAAM,CACtCg+B,CAAAA,IAAY,CACZQ,CAAAA,CAAY,IAAI,CAAA,CAChB,UAAA,CAAW,IAAMA,CAAAA,CAAY,KAAK,CAAA,CAAG,GAAG,EAC1C,CAAA,CAAG,CAACR,CAAS,CAAC,CAAA,CAEd,OACE99B,IAAAA,CAAAkS,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAhS,GAAAA,CAAC,OAAA,CAAA,CAAO,QAAA,CAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,CAIN,EACFF,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,QAAS,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,GAAA,CAAK,CAAE,CAAA,CAE1D,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,IAAKu+B,CAAAA,CAAS,KAAA,CAAO,CAAE,QAAA,CAAU,UAAW,CAAA,CAC/C,QAAA,CAAA,CAAAv+B,IAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,SAAA,CAAU,WAAA,CACV,KAAA,CAAO4V,GACP,YAAA,CAAeJ,CAAAA,EAAM,CACnBA,CAAAA,CAAE,cAAc,KAAA,CAAM,UAAA,CAAa,mBACrC,CAAA,CACA,aAAeA,CAAAA,EAAM,CACnBA,CAAAA,CAAE,aAAA,CAAc,MAAM,UAAA,CAAa,qBACrC,CAAA,CACA,OAAA,CAAS,IAAM,CACbwoB,CAAAA,CAAa,CAAA,EAAM,CAAC,CAAC,CAAA,CACrBE,CAAAA,CAAc,KAAK,EACrB,EAEA,QAAA,CAAA,CAAAh+B,GAAAA,CAAC0W,EAAAA,CAAA,EAAS,EACV1W,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CAAkB,MAAO,CAAE,KAAA,CAAO,SAAU,CAAA,CACzD,QAAA,CAAAnB,EAAE0/B,CAAAA,CAAY,QAAiB,CAAA,CAClC,CAAA,CACAv+B,IAAC2W,EAAAA,CAAA,CAAY,IAAA,CAAMknB,CAAAA,CAAU,GAC/B,CAAA,CAECA,CAAAA,EACC79B,GAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,GAAG2V,EAAAA,CAAc,KAAA,CAAO,IAAK,OAAA,CAAS,CAAE,CAAA,CACnD,QAAA,CAAA4nB,GAAa,GAAA,CAAKnoB,CAAAA,EAAQ,CACzB,IAAMC,EAAWuN,CAAAA,GAAWxN,CAAAA,CAAI,KAAA,CAChC,OACEtV,KAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,KAAA,CAAO,MAAA,CACP,WAAY,QAAA,CACZ,GAAA,CAAK,EAAA,CACL,OAAA,CAAS,YACT,SAAA,CAAW,MAAA,CACX,QAAA,CAAU,EAAA,CACV,OAAQ,MAAA,CACR,MAAA,CAAQ,SAAA,CACR,UAAA,CAAY,YACZ,UAAA,CAAYuV,CAAAA,CACR,uBAAA,CACA,aAAA,CACJ,MAAOA,CAAAA,CAAW,SAAA,CAAY,SAAA,CAC9B,YAAA,CAAc,EAChB,CAAA,CACA,YAAA,CAAeC,CAAAA,EAAM,CACdD,IACHC,CAAAA,CAAE,aAAA,CAAc,MAAM,UAAA,CAAa,oBAAA,CACnCA,EAAE,aAAA,CAAc,KAAA,CAAM,KAAA,CAAQ,MAAA,EAElC,EACA,YAAA,CAAeA,CAAAA,EAAM,CACdD,CAAAA,GACHC,EAAE,aAAA,CAAc,KAAA,CAAM,UAAA,CAAa,aAAA,CACnCA,EAAE,aAAA,CAAc,KAAA,CAAM,KAAA,CAAQ,SAAA,EAElC,EACA,OAAA,CAAS,IAAM,CACTsN,CAAAA,GAAWxN,EAAI,KAAA,CACjBY,CAAAA,CAAgB,CAACD,CAAO,EAExBD,CAAAA,CAAaV,CAAAA,CAAI,KAAK,CAAA,CAExB0oB,EAAY,KAAK,EACnB,CAAA,CAEA,QAAA,CAAA,CAAA99B,IAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,KAAA,CAAOqV,EAAW,SAAA,CAAY,SAChC,CAAA,CAEA,QAAA,CAAArV,IAACy+B,EAAAA,CAAA,CAAe,IAAA,CAAMrpB,CAAAA,CAAI,KAAM,CAAA,CAClC,CAAA,CACAtV,IAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,IAAA,CAAM,CAAA,CAAG,SAAA,CAAW,MAAgB,CAAA,CAChD,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,UAAA,CAAY,GAAI,CAAA,CAC3B,SAAAnB,CAAAA,CAAEuW,CAAAA,CAAI,QAAiB,CAAA,CAC1B,CAAA,CACApV,IAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,GACV,KAAA,CAAO,SAAA,CACP,SAAA,CAAW,CACb,EAEC,QAAA,CAAAnB,CAAAA,CAAEuW,CAAAA,CAAI,OAAgB,EACzB,CAAA,CAAA,CACF,CAAA,CACCC,CAAAA,EACCrV,GAAAA,CAAC,OACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CACL,MAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,KAAA,CAAO,UACP,UAAA,CAAY,CACd,CAAA,CACA,IAAA,CAAK,OACL,MAAA,CAAO,cAAA,CACP,YAAY,GAAA,CACZ,aAAA,CAAc,QACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAAA,GAAAA,CAAC,QAAK,CAAA,CAAE,iBAAA,CAAkB,CAAA,CAC5B,CAAA,CAAA,CAAA,CA7EGoV,EAAI,KA+EX,CAEJ,CAAC,CAAA,CACH,GAEJ,CAAA,CAGCuoB,CAAAA,EACC79B,IAAAA,CAAC,KAAA,CAAA,CAAI,IAAKw+B,CAAAA,CAAW,KAAA,CAAO,CAAE,QAAA,CAAU,UAAW,CAAA,CACjD,QAAA,CAAA,CAAAx+B,IAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,QAAA,CAAU,UAAA,CAAY,OAAA,CAAS,aAAc,CAAA,CACzD,QAAA,CAAA,CAAAA,KAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,SAAA,CAAU,WAAA,CACV,KAAA,CAAO4V,EAAAA,CACP,aAAeJ,CAAAA,EAAM,CACnBA,CAAAA,CAAE,aAAA,CAAc,MAAM,UAAA,CAAa,mBACrC,CAAA,CACA,YAAA,CAAeA,GAAM,CACnBA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,WAAa,qBACrC,CAAA,CACA,OAAA,CAAS,IAAM,CACb0oB,CAAAA,CAAe,CAAA,EAAM,CAAC,CAAC,EACvBF,CAAAA,CAAY,KAAK,EACnB,CAAA,CAEA,UAAA99B,GAAAA,CAAC0+B,EAAAA,CAAA,EAAW,CAAA,CACZ1+B,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CAAkB,KAAA,CAAO,CAAE,KAAA,CAAO,SAAU,CAAA,CACzD,QAAA,CAAAy9B,GAAe9b,CAAAA,CAAW9iB,CAA4B,CAAA,CACzD,CAAA,CACAmB,IAAC2+B,EAAAA,CAAA,CACC,YAAA,CAAc,IAAMT,EAAkB,IAAI,CAAA,CAC1C,YAAA,CAAc,IAAMA,EAAkB,KAAK,CAAA,CAC7C,CAAA,CACAl+B,GAAAA,CAAC2W,GAAA,CAAY,IAAA,CAAMonB,CAAAA,CAAY,CAAA,CAAA,CACjC,EAGCE,CAAAA,EACCn+B,IAAAA,CAAC,OACC,KAAA,CAAO,CACL,SAAU,UAAA,CACV,MAAA,CAAQ,GAAA,CACR,GAAA,CAAK,OACL,SAAA,CAAW,CAAA,CACX,IAAA,CAAM,KAAA,CACN,UAAW,kBAAA,CACX,KAAA,CAAO,GAAA,CACP,OAAA,CAAS,GACT,YAAA,CAAc,EAAA,CACd,UAAA,CAAY,kBAAA,CACZ,OAAQ,8BAAA,CACR,SAAA,CAAW,mCAAA,CACX,aAAA,CAAe,MACjB,CAAA,CAGA,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,MAAO,CACL,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,GACL,IAAA,CAAM,KAAA,CACN,UAAW,gCAAA,CACX,KAAA,CAAO,GACP,MAAA,CAAQ,EAAA,CACR,UAAA,CAAY,kBAAA,CACZ,WAAY,8BAAA,CACZ,SAAA,CAAW,8BACb,CAAA,CACF,EACAF,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,SAAU,UAAA,CACV,QAAA,CAAU,EAAA,CACV,KAAA,CAAO,UACP,UAAA,CAAY,KACd,CAAA,CAEA,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,UAAA,CAAY,IACZ,KAAA,CAAO,MAAA,CACP,OAAA,CAAS,MAAA,CACT,WAAY,QAAA,CACZ,GAAA,CAAK,EACL,YAAA,CAAc,CAChB,EAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,YACR,KAAA,CAAO,CACL,KAAA,CAAO,EAAA,CACP,OAAQ,EAAA,CACR,KAAA,CAAO,SAAA,CACP,UAAA,CAAY,CACd,CAAA,CACA,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,eACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,eAAe,OAAA,CAEf,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,oJAAA,CAAqJ,CAAA,CAC/J,CAAA,CACCnB,CAAAA,CAAE,wCAAiD,CAAA,CAAA,CACtD,CAAA,CACAmB,GAAAA,CAAC,GAAA,CAAA,CAAE,MAAO,CAAE,KAAA,CAAO,SAAA,CAAW,MAAA,CAAQ,SAAU,CAAA,CAC7C,QAAA,CAAAnB,CAAAA,CAAE,oCAA6C,EAClD,CAAA,CACAmB,GAAAA,CAAC,GAAA,CAAA,CAAE,KAAA,CAAO,CAAE,KAAA,CAAO,SAAA,CAAW,QAAA,CAAU,EAAA,CAAI,OAAQ,CAAE,CAAA,CACnD,QAAA,CAAAnB,CAAAA,CAAE,oCAA6C,CAAA,CAClD,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,EAGCk/B,CAAAA,EACCj+B,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,GAAG6V,EAAAA,CAAc,MAAO,CAAA,CAAG,KAAA,CAAO,GAAI,CAAA,CAClD,QAAA,CAAA,CAAA3V,GAAAA,CAAC,KAAA,CAAA,CACC,MAAO,CACL,OAAA,CAAS,UAAA,CACT,YAAA,CAAc,4BAChB,CAAA,CAEA,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CACC,MAAO,CACL,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,IACZ,KAAA,CAAO,SAAA,CACP,aAAA,CAAe,WAAA,CACf,cAAe,QACjB,CAAA,CAEC,QAAA,CAAAnB,CAAAA,CAAE,sCAA+C,CAAA,CACpD,CAAA,CACF,CAAA,CACAmB,GAAAA,CAAC,OAAI,KAAA,CAAO,CAAE,QAAS,CAAE,CAAA,CACtB,SAAAw9B,EAAAA,CAAe,GAAA,CAAKpzB,CAAAA,EAAM,CACzB,IAAMiL,CAAAA,CACJjL,CAAAA,CAAE,KAAA,GAAU,CAAA,CAAI,CAACuX,CAAAA,CAAYA,CAAAA,GAAcvX,CAAAA,CAAE,KAAA,CAC/C,OACEtK,IAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,MAAO,CACL,OAAA,CAAS,MAAA,CACT,KAAA,CAAO,OACP,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,eAAA,CAChB,QAAS,UAAA,CACT,SAAA,CAAW,MAAA,CACX,QAAA,CAAU,GACV,MAAA,CAAQ,MAAA,CACR,OAAQ,SAAA,CACR,UAAA,CAAYuV,EACR,uBAAA,CACA,aAAA,CACJ,KAAA,CAAOA,CAAAA,CAAW,UAAY,SAAA,CAC9B,YAAA,CAAc,EAAA,CACd,UAAA,CAAY,WACd,CAAA,CACA,YAAA,CAAeC,CAAAA,EAAM,CACdD,IACHC,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,UAAA,CACpB,qBACFA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,KAAA,CAAQ,QAElC,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAM,CACdD,IACHC,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,UAAA,CAAa,cACnCA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,KAAA,CAAQ,WAElC,CAAA,CACA,OAAA,CAAS,IAAM,CACbqoB,IACEvzB,CAAAA,CAAE,KAAA,GAAU,CAAA,CAAI,MAAA,CAAYA,EAAE,KAChC,CAAA,CACA4zB,CAAAA,CAAc,KAAK,EACrB,CAAA,CAEA,QAAA,CAAA,CAAAh+B,GAAAA,CAAC,MAAA,CAAA,CACE,SAAAoK,CAAAA,CAAE,QAAA,CAAWvL,CAAAA,CAAEuL,CAAAA,CAAE,QAAiB,CAAA,CAAIA,CAAAA,CAAE,KAAA,CAC3C,CAAA,CACCiL,GACCrV,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,MAAO,CACL,KAAA,CAAO,GACP,MAAA,CAAQ,EAAA,CACR,MAAO,SACT,CAAA,CACA,IAAA,CAAK,MAAA,CACL,OAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,QACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAAA,GAAAA,CAAC,QAAK,CAAA,CAAE,iBAAA,CAAkB,CAAA,CAC5B,CAAA,CAAA,CAAA,CAzDGoK,EAAE,KA2DT,CAEJ,CAAC,CAAA,CACH,GACF,CAAA,CAAA,CAEJ,CAAA,CAIDwzB,CAAAA,EACC59B,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,WAAA,CACV,MAAO,CACL,YAAA,CAAc,EAAA,CACd,MAAA,CAAQ,+BACR,UAAA,CAAY,oBAAA,CACZ,KAAA,CAAO,EAAA,CACP,OAAQ,EAAA,CACR,KAAA,CAAO,SAAA,CACP,MAAA,CAAQ,UACR,UAAA,CAAY,WAAA,CACZ,OAAA,CAAS,aAAA,CACT,WAAY,QAAA,CACZ,cAAA,CAAgB,QAClB,CAAA,CACA,aAAesV,CAAAA,EAAM,CACnBA,CAAAA,CAAE,aAAA,CAAc,MAAM,UAAA,CAAa,kBAAA,CACnCA,CAAAA,CAAE,aAAA,CAAc,MAAM,KAAA,CAAQ,OAChC,CAAA,CACA,YAAA,CAAeA,GAAM,CACnBA,CAAAA,CAAE,cAAc,KAAA,CAAM,UAAA,CAAa,qBACnCA,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAM,KAAA,CAAQ,UAChC,CAAA,CACA,OAAA,CAASkpB,CAAAA,CAET,QAAA,CAAA1+B,KAAC,KAAA,CAAA,CACC,SAAA,CAAWq+B,CAAAA,CAAW,oBAAA,CAAuB,OAC7C,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CAAE,MAAO,EAAA,CAAI,MAAA,CAAQ,EAAG,CAAA,CAC/B,KAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,IACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,UAAAn+B,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,oDAAA,CAAqD,EAC7DA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,YAAA,CAAa,EACrBA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,qDAAA,CAAsD,EAC9DA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,WAAA,CAAY,GACtB,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CAEA,SAAS0W,EAAAA,EAAW,CAClB,OACE5W,KAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CAAE,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,MAAO,SAAU,CAAA,CACjD,KAAK,MAAA,CACL,MAAA,CAAO,eACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,eAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,gBAAA,CAAiB,CAAA,CACzBA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,UAAA,CAAW,CAAA,CACnBA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,cAAA,CAAe,CAAA,CACvBA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,SAAA,CAAU,CAAA,CAAA,CACpB,CAEJ,CAEA,SAASy+B,EAAAA,CAAe,CACtB,IAAA,CAAAr1B,CACF,EAEG,CACD,IAAMyX,EAA6B,CAAE,KAAA,CAAO,GAAI,MAAA,CAAQ,EAAG,CAAA,CACrD+d,CAAAA,CAAS,CACb,OAAA,CAAS,WAAA,CACT,IAAA,CAAM,MAAA,CACN,OAAQ,cAAA,CACR,WAAA,CAAa,CAAA,CACb,aAAA,CAAe,QACf,cAAA,CAAgB,OAClB,CAAA,CAEA,OAAIx1B,IAAS,aAAA,CAETtJ,IAAAA,CAAC,KAAA,CAAA,CAAK,GAAG8+B,EAAQ,KAAA,CAAO/d,CAAAA,CACtB,QAAA,CAAA,CAAA7gB,GAAAA,CAAC,QAAK,CAAA,CAAE,WAAA,CAAY,CAAA,CACpBA,GAAAA,CAAC,QAAK,CAAA,CAAE,wBAAA,CAAyB,GACnC,CAAA,CAGAoJ,CAAAA,GAAS,eAETtJ,IAAAA,CAAC,KAAA,CAAA,CAAK,GAAG8+B,CAAAA,CAAQ,MAAO/d,CAAAA,CACtB,QAAA,CAAA,CAAA7gB,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,0BAAA,CAA2B,CAAA,CACnCA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,UAAA,CAAW,CAAA,CACnBA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,UAAA,CAAW,CAAA,CACnBA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,UAAA,CAAW,CAAA,CAAA,CACrB,CAAA,CAIFA,GAAAA,CAAC,OAAK,GAAG4+B,CAAAA,CAAQ,KAAA,CAAO/d,CAAAA,CACtB,SAAA7gB,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,2KAAA,CAA4K,EACtL,CAEJ,CAEA,SAAS0+B,EAAAA,EAAa,CACpB,OACE1+B,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,YACR,KAAA,CAAO,CAAE,KAAA,CAAO,EAAA,CAAI,OAAQ,EAAA,CAAI,KAAA,CAAO,SAAU,CAAA,CACjD,KAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,IACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,SAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,oJAAA,CAAqJ,EAC/J,CAEJ,CAEA,SAAS2+B,EAAAA,CAAS,CAChB,aAAAE,CAAAA,CACA,YAAA,CAAAxR,CACF,CAAA,CAGG,CACD,OACEvtB,IAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,YACR,SAAA,CAAU,iBAAA,CACV,KAAA,CAAO,CAAE,MAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAO,UAAW,UAAA,CAAY,CAAE,CAAA,CAChE,IAAA,CAAK,OACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,cAAc,OAAA,CACd,cAAA,CAAe,OAAA,CACf,YAAA,CAAc++B,EACd,YAAA,CAAcxR,CAAAA,CAEd,UAAArtB,GAAAA,CAAC,QAAA,CAAA,CAAO,GAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,CAC/BA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,YAAY,CAAA,CACpBA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,YAAY,CAAA,CAAA,CACtB,CAEJ,CAEA,SAAS2W,GAAY,CAAE,IAAA,CAAAjH,CAAK,CAAA,CAAsB,CAChD,OACE1P,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,YACR,KAAA,CAAO,CACL,KAAA,CAAO,EAAA,CACP,OAAQ,EAAA,CACR,KAAA,CAAO,UACP,UAAA,CAAY,iBAAA,CACZ,UAAW0P,CAAAA,CAAO,gBAAA,CAAmB,MACvC,CAAA,CACA,KAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,IACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,SAAA1P,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,cAAA,CAAe,EACzB,CAEJ,CCxmBA,SAASo6B,GAAaC,CAAAA,CAAqB,CACzC,OAAIA,CAAAA,EAAO,IAAkB,CAAA,CAAA,EAAA,CAAKA,CAAAA,CAAM,GAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CACzDA,CAAAA,EAAO,GAAA,CAAc,KAAKA,CAAAA,CAAM,GAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CAC9C,CAAA,CAAA,EAAIA,CAAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAC3B,CAEA,IAAMyE,GAQA,CACJ,CACE,GAAA,CAAK,aAAA,CACL,SAAU,mCAAA,CACV,MAAA,CAASrzB,CAAAA,EAAMA,CAAAA,CAAE,gBAAe,CAChC,UAAA,CAAY,UACZ,YAAA,CAAc,uBAAA,CACd,WAAY,uBAAA,CACZ,WAAA,CAAa,uBACf,CAAA,CACA,CACE,GAAA,CAAK,WAAA,CACL,QAAA,CAAU,iCAAA,CACV,OAASA,CAAAA,EAAM,CAAA,EAAA,CAAIA,CAAAA,CAAI,GAAA,EAAK,QAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CACtC,UAAA,CAAY,UACZ,YAAA,CAAc,uBAAA,CACd,UAAA,CAAY,uBAAA,CACZ,YAAa,uBACf,CAAA,CACA,CACE,GAAA,CAAK,kBACL,QAAA,CAAU,uCAAA,CACV,MAAA,CAASA,CAAAA,EAAMA,EAAE,cAAA,EAAe,CAChC,WAAY,SAAA,CACZ,YAAA,CAAc,wBACd,UAAA,CAAY,uBAAA,CACZ,WAAA,CAAa,uBACf,EACA,CACE,GAAA,CAAK,aAAA,CACL,QAAA,CAAU,oCACV,MAAA,CAAQ2uB,EAAAA,CACR,UAAA,CAAY,SAAA,CACZ,aAAc,uBAAA,CACd,UAAA,CAAY,uBAAA,CACZ,WAAA,CAAa,uBACf,CACF,CAAA,CAEO,SAAS2E,EAAAA,CAAY,CAAE,KAAA,CAAAC,CAAM,CAAA,CAAqB,CACvD,GAAM,CAAE,CAAE,CAAA,CAAIt/B,cAAAA,GAEd,OACEI,IAAAA,CAAAkS,SAAA,CACE,QAAA,CAAA,CAAAhS,IAAC,OAAA,CAAA,CAAO,QAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,MAAA,CAAA,CAqCN,CAAA,CAEFF,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,oBAAA,CACV,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,YAAA,CAAc,CAChB,CAAA,CAGA,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CACC,SAAA,CAAU,mBAAA,CACV,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,QAAA,CACf,QAAA,CAAU,CAAA,CACV,IAAA,CAAM,CAAA,CACN,SAAA,CACE,8DACJ,CAAA,CAGA,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,mBAAA,CACV,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,YAAA,CAAc,EAAG,CAAA,CAE3C,QAAA,CAAAF,KAAC,KAAA,CAAA,CACC,SAAA,CAAU,0BAAA,CACV,KAAA,CAAO,CACL,GAAA,CAAK,CAAA,CACL,YAAA,CAAc,IAAA,CACd,MAAA,CAAQ,8BAAA,CACR,UAAA,CAAY,oBAAA,CACZ,OAAA,CAAS,WACT,cAAA,CAAgB,WAAA,CAChB,oBAAA,CAAsB,WACxB,CAAA,CAEA,QAAA,CAAA,CAAAA,IAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,OAAA,CAAS,MAAA,CACT,MAAO,CAAA,CACP,MAAA,CAAQ,CACV,CAAA,CAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,OAAA,CAAS,aAAA,CACT,KAAA,CAAO,OACP,MAAA,CAAQ,MAAA,CACR,YAAA,CAAc,IAAA,CACd,UAAA,CAAY,SAAA,CACZ,OAAA,CAAS,GAAA,CACT,SAAA,CACE,uDACJ,CAAA,CACF,CAAA,CACAA,GAAAA,CAAC,MAAA,CAAA,CACC,MAAO,CACL,QAAA,CAAU,UAAA,CACV,OAAA,CAAS,aAAA,CACT,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAAA,CACR,YAAA,CAAc,IAAA,CACd,UAAA,CAAY,SAAA,CACZ,SAAA,CAAW,8CACb,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACAA,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,KAAA,CAAO,SAAA,CACP,aAAA,CAAe,SACjB,CAAA,CAEC,QAAA,CAAA,CAAA,CAAE,2BAAoC,CAAA,CACzC,CAAA,CACAA,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,YAAA,CAAc,CAAA,CACd,UAAA,CAAY,uBAAA,CACZ,OAAA,CAAS,UACT,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,KAAA,CAAO,SAAA,CACP,aAAA,CAAe,WAAA,CACf,MAAA,CAAQ,iCACV,CAAA,CAEC,QAAA,CAAA,CAAA,CAAE,yBAAkC,CAAA,CACvC,GACF,CAAA,CACF,CAAA,CAGAF,IAAAA,CAAC,IAAA,CAAA,CACC,SAAA,CAAU,oBAAA,CACV,KAAA,CAAO,CACL,UAAA,CAAY,4CAAA,CACZ,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,cAAe,QAAA,CACf,UAAA,CAAY,GAAA,CACZ,KAAA,CAAO,MAAA,CACP,MAAA,CAAQ,UACV,CAAA,CAEA,QAAA,CAAA,CAAAA,IAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,KAAA,CAAO,MAAO,CAAA,CAC1B,QAAA,CAAA,CAAA,CAAA,CAAE,6BAAsC,CAAA,CAAG,GAAA,CAAA,CAC9C,CAAA,CACAE,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,eAAA,CACE,sDAAA,CACF,oBAAA,CAAsB,MAAA,CACtB,oBAAqB,aAAA,CACrB,cAAA,CAAgB,MAClB,CAAA,CAEC,QAAA,CAAA,CAAA,CAAE,gCAAyC,CAAA,CAC9C,CAAA,CAAA,CACF,CAAA,CAGAA,GAAAA,CAAC,GAAA,CAAA,CACC,SAAA,CAAU,kDAAA,CACV,KAAA,CAAO,CACL,UAAA,CAAY,GAAA,CACZ,KAAA,CAAO,SAAA,CACP,QAAA,CAAU,GACZ,CAAA,CAEC,QAAA,CAAA,MAAA,CAAO,CAAA,CAAE,8BAAuC,CAAC,CAAA,CAC/C,KAAA,CAAM;AAAA,CAAI,CAAA,CACV,GAAA,CAAI,CAACi/B,CAAAA,CAAcp+B,CAAAA,GAClBf,IAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAA,CAAAe,CAAAA,CAAI,CAAA,EAAKb,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,kBAAkB,CAAA,CACzCi/B,CAAAA,CACAp+B,CAAAA,GAAM,CAAA,CAAI,GAAA,CAAM,EAAA,CAAA,CAAA,CAHRA,CAIX,CACD,CAAA,CACL,CAAA,CAAA,CACF,CAAA,CAGAb,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,oBACV,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,YAAA,CAAc,EAAA,CACd,MAAA,CAAQ,8BAAA,CACR,QAAA,CAAU,QAAA,CACV,UAAA,CAAY,CAAA,CACZ,cAAA,CAAgB,WAAA,CAChB,oBAAA,CAAsB,WAAA,CACtB,GAAIg/B,CAAAA,CACA,CACE,SAAA,CACE,0DAAA,CACF,cAAA,CAAgB,MAClB,CAAA,CACA,EACN,CAAA,CAEC,QAAA,CAAAF,EAAAA,CAAW,GAAA,CAAI,CAACI,CAAAA,CAAMxgC,CAAAA,GACrBoB,IAAAA,CAAC,KAAA,CAAA,CAEC,KAAA,CAAO,CACL,OAAA,CAAS,WAAA,CACT,UAAA,CAAYk/B,CAAAA,CACR,CAAA,2BAAA,EAA8BE,CAAAA,CAAK,YAAY,CAAA,EAAA,EAAKA,EAAK,UAAU,CAAA,CAAA,CAAA,CACnE,wBAAA,CACJ,WAAA,CACExgC,CAAAA,CAAM,CAAA,GAAM,CAAA,CAAI,8BAAA,CAAiC,MAAA,CACnD,YAAA,CAAcA,CAAAA,CAAM,CAAA,CAAI,8BAAA,CAAiC,MAAA,CACzD,GAAIsgC,CAAAA,CACA,CACE,SAAA,CACE,8DAAA,CACF,cAAA,CAAgB,CAAA,EAAG,GAAA,CAAMtgC,CAAAA,CAAM,EAAE,CAAA,EAAA,CACnC,CAAA,CACA,EACN,CAAA,CAEA,QAAA,CAAA,CAAAsB,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,kBAAA,CACV,KAAA,CAAO,CACL,UAAA,CAAY,GAAA,CACZ,kBAAA,CAAoB,cAAA,CACpB,KAAA,CAAOg/B,CAAAA,CAAQE,CAAAA,CAAK,UAAA,CAAa,aAAA,CACjC,QAAS,MAAA,CACT,UAAA,CAAY,QACd,CAAA,CAEC,QAAA,CAAAF,CAAAA,CACCE,CAAAA,CAAK,MAAA,CAAOF,CAAAA,CAAME,CAAAA,CAAK,GAAG,CAAC,CAAA,CAE3Bl/B,GAAAA,CAAC,OACC,KAAA,CAAO,CACL,MAAA,CAAQ,EAAA,CACR,KAAA,CAAO,EAAA,CACP,YAAA,CAAc,CAAA,CACd,UAAA,CAAY,wBAAA,CACZ,SAAA,CAAW,uCAAA,CACX,cAAA,CAAgB,CAAA,EAAGtB,EAAM,EAAE,CAAA,EAAA,CAC7B,CAAA,CACF,CAAA,CAEJ,CAAA,CACAsB,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,oBAAA,CACV,KAAA,CAAO,CACL,UAAA,CAAY,GAAA,CACZ,KAAA,CAAOg/B,CAAAA,CAAQ,SAAA,CAAY,aAAA,CAC3B,SAAA,CAAW,CAAA,CACX,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QACd,CAAA,CAEC,QAAA,CAAAA,CAAAA,CACC,CAAA,CAAEE,CAAAA,CAAK,QAAiB,CAAA,CAExBl/B,IAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,MAAA,CAAQ,EAAA,CACR,KAAA,CAAO,EAAA,CACP,YAAA,CAAc,CAAA,CACd,UAAA,CAAY,wBAAA,CACZ,SAAA,CAAW,uCAAA,CACX,cAAA,CAAgB,CAAA,EAAG,EAAA,CAAKtB,CAAAA,CAAM,EAAE,CAAA,EAAA,CAClC,CAAA,CACF,CAAA,CAEJ,CAAA,CAAA,CAAA,CAnEKwgC,CAAAA,CAAK,GAoEZ,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CC3UA,SAAS9E,EAAAA,CAAaC,CAAAA,CAAwC,CAC5D,OAAIA,CAAAA,EAAO,IAAA,CAAa,GAAA,CACpBA,CAAAA,EAAO,GAAA,CAAkB,CAAA,CAAA,EAAA,CAAKA,EAAM,GAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CACzDA,CAAAA,EAAO,GAAA,CAAc,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAM,GAAK,CAAC,CAAA,CAAA,CAAA,CAC7C,IAAIA,CAAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAC3B,CAEA,SAAS8E,EAAAA,CAAYh9B,CAAAA,CAAsC,CACzD,IAAMC,CAAAA,CAAMD,CAAAA,CAAO,QAAA,GAAW,CAAC,CAAA,CAC/B,OAAOC,CAAAA,EAAK,QAAA,EAAYA,CAAAA,EAAK,KAAA,EAAS,IACxC,CAEA,SAASg9B,EAAAA,CAAej9B,CAAAA,CAAsC,CAC5D,OAAOA,CAAAA,CAAO,QAAA,GAAW,CAAC,CAAA,EAAG,KAAA,EAAS,IACxC,CAIA,SAASk9B,EAAAA,CAAcC,CAAAA,CAA0C,CAC/D,OAAIA,CAAAA,EAAiB,IAAA,CAAa,KAAA,CAC9BA,CAAAA,EAAiB,CAAA,CAAU,MAAA,CAC3BA,CAAAA,EAAiB,CAAA,CAAU,QAAA,CACxB,KACT,CAEA,IAAMC,EAAAA,CASF,CACF,IAAA,CAAM,CACJ,KAAA,CAAO,SAAA,CACP,QAAA,CAAU,uBAAA,CACV,MAAA,CAAQ,wBACR,WAAA,CAAa,SAAA,CACb,aAAA,CAAe,uBACjB,CAAA,CACA,MAAA,CAAQ,CACN,KAAA,CAAO,SAAA,CACP,QAAA,CAAU,uBAAA,CACV,MAAA,CAAQ,uBAAA,CACR,WAAA,CAAa,SAAA,CACb,aAAA,CAAe,uBACjB,CAAA,CACA,GAAA,CAAK,CACH,KAAA,CAAO,SAAA,CACP,QAAA,CAAU,wBAAA,CACV,MAAA,CAAQ,aAAA,CACR,WAAA,CAAa,SAAA,CACb,aAAA,CAAe,wBACjB,CACF,CAAA,CAEMC,EAAAA,CAAsE,CAC1E,IAAA,CAAM,CACJ,MAAA,CAAQ,sBAAA,CACR,MAAA,CAAQ,kCACV,CAAA,CACA,MAAA,CAAQ,CACN,MAAA,CAAQ,sBAAA,CACR,OAAQ,kCACV,CAAA,CACA,GAAA,CAAK,CACH,MAAA,CAAQ,uBAAA,CACR,MAAA,CAAQ,mCACV,CACF,CAAA,CAEMC,EAAAA,CAAmE,CACvE,IAAA,CAAM,CAAE,IAAK,SAAA,CAAW,KAAA,CAAO,gCAAiC,CAAA,CAChE,MAAA,CAAQ,CAAE,GAAA,CAAK,SAAA,CAAW,KAAA,CAAO,+BAAgC,CAAA,CACjE,GAAA,CAAK,CAAE,GAAA,CAAK,SAAA,CAAW,KAAA,CAAO,+BAAgC,CAChE,CAAA,CAEA,SAASC,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CACQ,CACR,OAAID,CAAAA,GACAC,CAAAA,EAAS,IAAA,CAAa,KAAA,CACtBA,CAAAA,EAAS,GAAY,MAAA,CACrBA,CAAAA,EAAS,EAAA,CAAY,QAAA,CAClB,KAAA,CACT,CAEA,SAASC,EAAAA,CAAY,CAAE,IAAA,CAAAF,CAAK,CAAA,CAAyB,CACnD,IAAMG,CAAAA,CAAQP,EAAAA,CAAaI,CAAI,CAAA,CACzBI,CAAAA,CAASJ,CAAAA,GAAS,MAAA,CAAS,CAAA,CAAIA,CAAAA,GAAS,QAAA,CAAW,CAAA,CAAI,CAAA,CAC7D,OACE3/B,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,GAAA,CAAK,CAAA,CAAG,UAAA,CAAY,QAAS,CAAA,CACzD,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAA,CAAG,CAACY,CAAAA,CAAGC,CAAAA,GAC7Bb,GAAAA,CAAC,KAAA,CAAA,CAEC,KAAA,CAAO,CACL,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,EAAA,CACR,YAAA,CAAc,GAAA,CACd,UAAA,CAAYa,CAAAA,CAAIk/B,CAAAA,CAASD,CAAAA,CAAM,YAAcA,CAAAA,CAAM,aAAA,CACnD,UAAA,CAAY,iBACd,CAAA,CAAA,CAPKj/B,CAQP,CACD,CAAA,CACH,CAEJ,CAEA,IAAMm/B,EAAAA,CAAkE,CACtE,UAAA,CAAY,CAAE,IAAA,CAAM,SAAA,CAAW,IAAA,CAAM,SAAU,CAAA,CAC/C,MAAA,CAAQ,CAAE,IAAA,CAAM,SAAA,CAAW,IAAA,CAAM,SAAU,CAC7C,CAAA,CAEMC,EAAAA,CAAmB,CAAE,IAAA,CAAM,SAAA,CAAW,IAAA,CAAM,SAAU,CAAA,CAE5D,SAASC,EAAAA,CAAiBn5B,CAAAA,CAAgB,CACxC,OAAOi5B,EAAAA,CAAgBj5B,CAAM,CAAA,EAAKk5B,EACpC,CAEO,SAASE,EAAAA,CAAgB,CAC9B,KAAA,CAAAC,CAAAA,CACA,QAAA,CAAAh/B,CAAAA,CACA,OAAA,CAAA2Z,CAAAA,CACA,aAAA,CAAAslB,CAAAA,CACA,aAAA,CAAAxlB,CACF,CAAA,CAAyB,CACvB,GAAM,CAAE,CAAA,CAAAhc,CAAE,CAAA,CAAIa,cAAAA,EAAe,CAEvB4gC,CAAAA,CAASnB,EAAAA,CAAYiB,CAAAA,CAAM,QAAQ,CAAA,CACnCG,CAAAA,CAASpB,EAAAA,CAAYiB,CAAAA,CAAM,QAAQ,CAAA,CACnCd,CAAAA,CACJc,CAAAA,CAAM,cAAA,EAAkB,IAAA,CACpBA,CAAAA,CAAM,cAAA,CACNA,CAAAA,CAAM,MAAA,EAAU,IAAA,CACdA,CAAAA,CAAM,MAAA,CAAS,GAAA,CACf,IAAA,CAEFT,EAAON,EAAAA,CAAcC,CAAa,CAAA,CAClCQ,CAAAA,CAAQP,EAAAA,CAAaI,CAAI,CAAA,CAEzBa,CAAAA,CACJF,CAAAA,EAAU,IAAA,EAAQC,CAAAA,EAAU,IAAA,CACxBD,CAAAA,EAAUC,CAAAA,CACRH,CAAAA,CAAM,QAAA,CACNA,CAAAA,CAAM,QAAA,CACR,IAAA,CAEAK,CAAAA,CAAQL,CAAAA,CAAM,aAAA,EAAiBA,CAAAA,CAAM,aAAA,CAErCM,CAAAA,CAAUhB,EAAAA,CACdU,CAAAA,CAAM,eAAA,CACNA,CAAAA,CAAM,gBACR,EACMO,CAAAA,CAAYlB,EAAAA,CAAiBiB,CAAO,CAAA,EAAKjB,EAAAA,CAAiB,GAAA,CAE1DmB,CAAAA,CAAYjB,CAAAA,GAAS,MAAA,CAAS,QAAA,CAAW,MAAA,CAE/C,OACE7/B,IAAAA,CAAC,KAAA,CAAA,CACC,UAAU,OAAA,CACV,KAAA,CAAO,CACL,YAAA,CAAc,EAAA,CACd,MAAA,CAAQ,8BAAA,CACR,UAAA,CAAY,oBAAA,CACZ,QAAA,CAAU,QAAA,CACV,UAAA,CAAY,UACd,CAAA,CACA,aAAewV,CAAAA,EAAM,CACnB,IAAM2G,CAAAA,CAAK3G,CAAAA,CAAE,aAAA,CACPurB,CAAAA,CAAOrB,EAAAA,CAAYG,CAAI,CAAA,CAC7B1jB,CAAAA,CAAG,KAAA,CAAM,WAAA,CAAc4kB,CAAAA,CAAK,MAAA,CAC5B5kB,CAAAA,CAAG,KAAA,CAAM,SAAA,CAAY4kB,CAAAA,CAAK,MAAA,CAC1B9lB,CAAAA,GAAUqlB,CAAK,EACjB,CAAA,CACA,YAAA,CAAe9qB,CAAAA,EAAM,CACnB,IAAM2G,CAAAA,CAAK3G,CAAAA,CAAE,cACb2G,CAAAA,CAAG,KAAA,CAAM,WAAA,CAAc,oBAAA,CACvBA,CAAAA,CAAG,KAAA,CAAM,SAAA,CAAY,OACvB,CAAA,CAGC,QAAA,CAAA,CAAAqjB,CAAAA,EAAiB,IAAA,EAChBx/B,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,eAAA,CAChB,OAAA,CAAS,UAAA,CACT,UAAA,CAAY,CAAA,uBAAA,EAA0BggC,CAAAA,CAAM,QAAQ,CAAA,EAAA,EAAKA,CAAAA,CAAM,MAAM,CAAA,CAAA,CAAA,CACrE,YAAA,CAAc,8BAChB,CAAA,CAEA,QAAA,CAAA,CAAAhgC,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,CACP,CAAA,CAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CACL,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,UAAA,CAAY,CAAA,CACZ,KAAA,CAAO8/B,EAAM,KACf,CAAA,CACA,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,KAAA,CACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA9/B,GAAAA,CAAC,QAAK,CAAA,CAAE,6JAAA,CAA8J,CAAA,CACxK,CAAA,CACAF,IAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,kBAAA,CAAoB,cAAA,CACpB,MAAOggC,CAAAA,CAAM,KACf,CAAA,CAEC,QAAA,CAAA,CAAAR,CAAAA,CAAc,OAAA,CAAQ,CAAC,CAAA,CAAE,GAAA,CAAA,CAC5B,CAAA,CACAt/B,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,KAAA,CAAO,uBAAA,CACP,aAAA,CAAe,WAAA,CACf,aAAA,CAAe,QACjB,CAAA,CACD,QAAA,CAAA,QAAA,CAED,CAAA,CAAA,CACF,CAAA,CACAA,GAAAA,CAAC6/B,EAAAA,CAAA,CAAY,IAAA,CAAMF,CAAAA,CAAM,CAAA,CAAA,CAC3B,CAAA,CAGF7/B,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,OAAA,CAAS,gBAAiB,CAAA,CAEtC,QAAA,CAAA,CAAAE,GAAAA,CAAC,IAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,UAAA,CAAY,GAAA,CACZ,aAAA,CAAe,QAAA,CACf,KAAA,CAAO,SAAA,CACP,QAAA,CAAU,QAAA,CACV,YAAA,CAAc,UAAA,CACd,QAAS,aAAA,CACT,eAAA,CAAiB,CAAA,CACjB,eAAA,CAAiB,UAAA,CACjB,MAAA,CAAQ,UACV,CAAA,CAEC,QAAA,CAAAygC,CAAAA,CACH,CAAA,CAGA3gC,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,YAAA,CAAc,EAAA,CACd,MAAA,CAAQ,8BAAA,CACR,QAAA,CAAU,QACZ,CAAA,CAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC8gC,EAAAA,CAAA,CACC,MAAA,CAAQV,CAAAA,CAAM,QAAA,CACd,MAAA,CAAQA,EAAM,QAAA,CACd,SAAA,CAAWI,CAAAA,GAAkBJ,CAAAA,CAAM,QAAA,CACnC,OAAA,CAAS,IAAMh/B,CAAAA,GAAWg/B,CAAAA,CAAOA,CAAAA,CAAM,QAAQ,CAAA,CAC/C,IAAA,CAAMC,CAAAA,GAAgBD,EAAOA,CAAAA,CAAM,QAAQ,CAAA,CAC3C,aAAA,CAAevlB,CAAAA,CACjB,CAAA,CACA7a,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,MAAA,CAAQ,CAAA,CAAG,UAAA,CAAY,oBAAqB,EAAG,CAAA,CAC7DA,GAAAA,CAAC8gC,EAAAA,CAAA,CACC,MAAA,CAAQV,CAAAA,CAAM,QAAA,CACd,MAAA,CAAQA,CAAAA,CAAM,QAAA,CACd,SAAA,CAAWI,CAAAA,GAAkBJ,CAAAA,CAAM,QAAA,CACnC,OAAA,CAAS,IAAMh/B,CAAAA,GAAWg/B,CAAAA,CAAOA,CAAAA,CAAM,QAAQ,CAAA,CAC/C,IAAA,CAAMC,CAAAA,GAAgBD,CAAAA,CAAOA,CAAAA,CAAM,QAAQ,CAAA,CAC3C,aAAA,CAAevlB,CAAAA,CACjB,CAAA,CAAA,CACF,EAGC2lB,CAAAA,EAAiBlB,CAAAA,EAAiB,IAAA,EACjCt/B,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,cAAA,CAAgB,UAAA,CAChB,SAAA,CAAW,EACb,CAAA,CAEA,QAAA,CAAAF,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,KAAA,CAAO,CACL,OAAA,CAAS,aAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,OAAA,CAAS,UAAA,CACT,YAAA,CAAc,EACd,MAAA,CAAQ,CAAA,UAAA,EAAa8gC,CAAAA,GAAc,QAAA,CAAW,sBAAA,CAAyB,uBAAuB,CAAA,CAAA,CAC9F,UAAA,CACEA,CAAAA,GAAc,QAAA,CACV,uBAAA,CACA,uBAAA,CACN,MAAA,CAAQ,SAAA,CACR,UAAA,CAAY,WAAA,CACZ,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,KAAA,CACEA,CAAAA,GAAc,QAAA,CACV,sBAAA,CACA,uBACR,CAAA,CACA,YAAA,CAAetrB,CAAAA,EAAM,CACnB,IAAM2G,EAAK3G,CAAAA,CAAE,aAAA,CACb2G,CAAAA,CAAG,KAAA,CAAM,UAAA,CACP2kB,CAAAA,GAAc,QAAA,CACV,uBAAA,CACA,wBACR,CAAA,CACA,YAAA,CAAetrB,CAAAA,EAAM,CACnB,IAAM2G,EAAK3G,CAAAA,CAAE,aAAA,CACb2G,CAAAA,CAAG,KAAA,CAAM,UAAA,CACP2kB,CAAAA,GAAc,QAAA,CACV,uBAAA,CACA,wBACR,CAAA,CACA,OAAA,CAAS,IAAMx/B,CAAAA,GAAWg/B,CAAAA,CAAOI,CAAa,CAAA,CAE9C,QAAA,CAAA,CAAAxgC,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CACL,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,UAAA,CAAY,CAAA,CACZ,KAAA,CAAO4gC,CAAAA,GAAc,QAAA,CAAW,SAAA,CAAY,SAC9C,CAAA,CACA,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,SAAA5gC,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,6JAAA,CAA8J,CAAA,CACxK,CAAA,CACCnB,CAAAA,CAAE,yBAAA,CAAoC,CACrC,QAAA,CACE2hC,CAAAA,CAAc,MAAA,CAAO,CAAC,CAAA,CAAE,aAAY,CACpCA,CAAAA,CAAc,KAAA,CAAM,CAAC,CAAA,CACvB,MAAA,CAAQlB,CAAAA,CAAc,OAAA,CAAQ,CAAC,CACjC,CAAC,CAAA,CACDx/B,IAAAA,CAAC,KAAA,CAAA,CACC,QAAQ,WAAA,CACR,KAAA,CAAO,CACL,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,KAAA,CACE8gC,CAAAA,GAAc,QAAA,CACV,sBAAA,CACA,sBACR,CAAA,CACA,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAA5gC,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,UAAA,CAAW,CAAA,CACnBA,GAAAA,CAAC,QAAK,CAAA,CAAE,eAAA,CAAgB,CAAA,CAAA,CAC1B,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAGAF,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,SACZ,cAAA,CAAgB,eAAA,CAChB,SAAA,CAAW,8BAAA,CACX,UAAA,CAAY,qBAAA,CACZ,OAAA,CAAS,UACX,CAAA,CAEA,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,EAAA,CACL,QAAA,CAAU,EAAA,CACV,KAAA,CAAO,SACT,CAAA,CAEA,QAAA,CAAA,CAAAA,IAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,GAAA,CAAK,CAAE,CAAA,CAC3D,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CAAE,KAAA,CAAO,GAAI,MAAA,CAAQ,EAAG,CAAA,CAC/B,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,0BAAA,CAA2B,CAAA,CACnCA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,UAAA,CAAW,CAAA,CACnBA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,UAAA,CAAW,CAAA,CACnBA,GAAAA,CAAC,QAAK,CAAA,CAAE,UAAA,CAAW,CAAA,CAAA,CACrB,CAAA,CACCo6B,EAAAA,CAAagG,CAAAA,CAAM,eAAe,CAAA,CAAA,CACrC,CAAA,CACCA,CAAAA,CAAM,mBAAA,EAAuB,IAAA,EAC5BA,CAAAA,CAAM,mBAAA,CAAsB,CAAA,EAC1BtgC,IAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,GAAA,CAAK,CAAE,CAAA,CAC3D,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,YACR,KAAA,CAAO,CAAE,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAG,CAAA,CAC/B,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,QACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,2KAAA,CAA4K,CAAA,CACtL,CAAA,CACCo6B,EAAAA,CAAagG,CAAAA,CAAM,mBAAmB,CAAA,CAAG,GAAA,CACzCvhC,EAAE,wBAAiC,CAAA,CAAA,CACtC,CAAA,CAAA,CAEN,CAAA,CAEAiB,IAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,aAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,QAAA,CAAU,EAAA,CACV,KAAA,CAAO,SACT,CAAA,CAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAAA,CACR,YAAA,CAAc,KAAA,CACd,WAAY2gC,CAAAA,CAAU,GAAA,CACtB,UAAA,CAAY,CACd,CAAA,CACF,CAAA,CACC9hC,CAAAA,CAAE8hC,CAAAA,CAAU,KAAc,CAAA,CAAA,CAC7B,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAEA,SAASG,EAAAA,CAAY,CACnB,MAAA,CAAA/5B,CAAAA,CACA,MAAA,CAAA5E,CAAAA,CACA,SAAA,CAAA4+B,CAAAA,CACA,OAAA,CAAA/rB,CAAAA,CACA,IAAA,CAAA4F,CAAAA,CACA,aAAA,CAAAC,CACF,CAAA,CAOG,CACD,GAAM,CAAE,CAAA,CAAAhc,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvBy6B,CAAAA,CAAOF,EAAAA,CAAclzB,CAAM,CAAA,CAC3Bi6B,CAAAA,CAAYd,EAAAA,CAAiBn5B,CAAM,CAAA,CACnCmT,CAAAA,CAAWilB,EAAAA,CAAYh9B,CAAM,CAAA,CAC7B8+B,CAAAA,CAAc7B,EAAAA,CAAej9B,CAAM,CAAA,CACnCiuB,CAAAA,CAASjuB,CAAAA,CAAO,MAAA,CAEhB++B,CAAAA,CACJphC,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,OAAA,CAAS,WAAA,CACT,MAAA,CAAQ8a,CAAAA,EAAQ5F,CAAAA,CAAU,SAAA,CAAY,MAAA,CACtC,UAAA,CAAY,mBACZ,UAAA,CAAY+rB,CAAAA,CAAY,uBAAA,CAA0B,aACpD,CAAA,CACA,YAAA,CAAezrB,CAAAA,EAAM,CAClBA,CAAAA,CAAE,aAAA,CAAiC,KAAA,CAAM,UAAA,CAAayrB,CAAAA,CACnD,uBAAA,CACA,yBACN,CAAA,CACA,YAAA,CAAezrB,CAAAA,EAAM,CAClBA,CAAAA,CAAE,aAAA,CAAiC,KAAA,CAAM,UAAA,CAAayrB,CAAAA,CACnD,uBAAA,CACA,cACN,CAAA,CACA,OAAA,CAAS/rB,CAAAA,CAGR,QAAA,CAAA,CAAA+rB,CAAAA,CACC/gC,GAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,QAAA,CAAU,EAAA,CAAI,KAAA,CAAO,SAAA,CAAW,UAAA,CAAY,CAAE,CAAA,CAAG,QAAA,CAAA,QAAA,CAAC,CAAA,CAEjEA,GAAAA,CAAC,QAAK,KAAA,CAAO,CAAE,KAAA,CAAO,EAAA,CAAI,UAAA,CAAY,CAAE,CAAA,CAAG,CAAA,CAI7CF,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,KAAA,CAAO,EAAA,CACP,UAAA,CAAY,CACd,CAAA,CAEC,QAAA,CAAA,CAAAq6B,CAAAA,CAAK,IAAA,CACNn6B,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,SAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,aAAA,CAAe,QAAA,CACf,KAAA,CAAOghC,CAAAA,CAAU,IAAA,CACjB,aAAA,CAAe,WACjB,CAAA,CAEC,QAAA,CAAA7G,CAAAA,CAAK,KAAA,CACR,CAAA,CAAA,CACF,CAAA,CAGAr6B,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,IAAA,CAAM,CAAA,CACN,QAAA,CAAU,CAAA,CACV,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,QAAA,CACf,GAAA,CAAK,CACP,EAEC,QAAA,CAAA,CAAAmhC,CAAAA,EACCjhC,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,EAAA,CACV,KAAA,CAAO,SAAA,CACP,QAAA,CAAU,QAAA,CACV,YAAA,CAAc,UAAA,CACd,WAAY,QACd,CAAA,CAEC,QAAA,CAAAihC,CAAAA,CACH,CAAA,CAEFnhC,IAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,QAAA,CAAU,CAAA,CAAG,KAAA,CAAO,SAAU,CAAA,CAC1C,UAAAs6B,EAAAA,CAAahK,CAAM,CAAA,CAAE,GAAA,CAAEvxB,CAAAA,CAAE,wBAAiC,CAAA,CAAA,CAC7D,CAAA,CAAA,CACF,CAAA,CAGAiB,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,UAAA,CACZ,GAAA,CAAK,CAAA,CACL,UAAA,CAAY,CACd,CAAA,CAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,IACZ,kBAAA,CAAoB,cAAA,CACpB,KAAA,CAAO+gC,CAAAA,CAAY,SAAA,CAAY,SACjC,CAAA,CAEC,QAAA,CAAA7mB,CAAAA,EAAY,IAAA,CAAA,CAAQA,CAAAA,CAAW,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAAI,GAAA,CACpD,CAAA,CACAla,GAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,QAAA,CAAU,CAAA,CAAG,KAAA,CAAO,SAAU,CAAA,CAC1C,QAAA,CAAAnB,CAAAA,CAAE,0BAAmC,CAAA,CACxC,GACF,CAAA,CAGAiB,IAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,SAAA,CAAU,sDAAA,CACV,KAAA,CAAO,CACL,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,KAAA,CAAO,SAAA,CACP,UAAA,CAAY,CACd,CAAA,CACA,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,QAAK,CAAA,CAAE,YAAA,CAAa,CAAA,CACrBA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,YAAA,CAAa,CAAA,CAAA,CACvB,CAAA,CAAA,CACF,CAAA,CAGF,OAAI4a,CAAAA,EAAQC,CAAAA,CAER7a,GAAAA,CAAC6a,EAAA,CAAc,IAAA,CAAMD,CAAAA,CAAM,SAAA,CAAU,OAAA,CAClC,QAAA,CAAAsmB,CAAAA,CACH,CAAA,CAIGA,CACT,CC3lBO,IAAMC,EAAAA,CAAgBC,UAAAA,CAC3B,SACE,CACE,MAAA,CAAAxe,CAAAA,CACA,OAAA,CAAA7M,CAAAA,CACA,SAAA,CAAA4L,CAAAA,CACA,QAAA,CAAAvgB,CAAAA,CACA,OAAA,CAAA2Z,CAAAA,CACA,aAAA,CAAAslB,CAAAA,CACA,aAAA,CAAAxlB,CAAAA,CACA,aAAA,CAAAwmB,CACF,CAAA,CACAvG,CAAAA,CACA,CACA,GAAM,CAAE,CAAA,CAAAj8B,CAAE,CAAA,CAAIa,cAAAA,EAAe,CAEvB,CACJ,IAAA,CAAAqY,CAAAA,CACA,WAAA,CAAAgN,CAAAA,CACA,aAAA,CAAAnN,CAAAA,CACA,kBAAA,CAAA8iB,CAAAA,CACA,SAAA,CAAApjB,CAAAA,CACA,iBAAA,CAAAgqB,CAAAA,CACA,OAAA,CAAAzpB,CACF,CAAA,CAAI0pB,uBAAAA,CACF,CACE,OAAA,CAAS3e,CAAAA,CACT,QAAA,CAAU7M,CAAAA,CACV,UAAA,CAAY4L,CAAAA,CACZ,MAAA,CAAQ,QAAA,CACR,KAAA,CAAO,EACT,CAAA,CACA,CAAE,eAAA,CAAiB6f,gBAAiB,CACtC,CAAA,CAEM,CAACC,CAAAA,CAASC,CAAU,CAAA,CAAIngC,QAAAA,CAAS,CAAC,CAAA,CAClC,CAACogC,CAAAA,CAAmBC,CAAoB,CAAA,CAAIrgC,QAAAA,CAAS,KAAK,CAAA,CAE5DogC,CAAAA,EAAqB,CAACL,CAAAA,EACxBM,CAAAA,CAAqB,KAAK,CAAA,CAC1BF,CAAAA,CAAYG,CAAAA,EAAMA,CAAAA,CAAI,CAAC,GACdP,CAAAA,EAAqB,CAACK,CAAAA,EAC/BC,CAAAA,CAAqB,IAAI,CAAA,CAM3BE,mBAAAA,CACEhH,CAAAA,CACA,KAAO,CACL,OAAA,CAAS,IAAM,CACbjjB,CAAAA,GACF,CACF,CAAA,CAAA,CACA,CAACA,CAAO,CACV,CAAA,CAEA,IAAMkqB,CAAAA,CAAa79B,OAAAA,CACjB,IAAM6T,CAAAA,EAAM,KAAA,CAAM,OAAA,CAAS3N,CAAAA,EAAMA,EAAE,KAAA,EAAS,EAAE,CAAA,EAAK,EAAC,CACpD,CAAC2N,CAAI,CACP,CAAA,CAEMiqB,CAAAA,CAAQjqB,CAAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAExBinB,CAAAA,CAAQ96B,OAAAA,CAA0B,IAAM,CAC5C,IAAI+9B,CAAAA,CAAY,CAAA,CACZC,EAAAA,CAAc,CAAA,CACdC,CAAAA,CAAkB,CAAA,CAEtB,IAAA,IAAW3nB,CAAAA,IAAKunB,CAAAA,CAAY,CAC1B,IAAM7W,CAAAA,CAAS1Q,CAAAA,CAAE,MAAA,EAAU,CAAA,CACvB0Q,CAAAA,CAAS+W,CAAAA,GAAWA,CAAAA,CAAY/W,CAAAA,CAAAA,CAChCA,CAAAA,EAAU,GAAA,EAAMiX,CAAAA,EAAAA,CAChB3nB,CAAAA,CAAE,eAAA,EAAmB,IAAA,GACvB0nB,EAAAA,EAAe1nB,CAAAA,CAAE,eAAA,EAErB,CAEA,OAAO,CACL,WAAA,CAAawnB,CAAAA,EAASD,CAAAA,CAAW,MAAA,CACjC,SAAA,CAAAE,CAAAA,CACA,eAAA,CAAAE,CAAAA,CACA,WAAA,CAAAD,EACF,CACF,CAAA,CAAG,CAACH,CAAAA,CAAYC,CAAK,CAAC,CAAA,CAEtB14B,SAAAA,CAAU,IAAM,CACV01B,CAAAA,CAAM,WAAA,CAAc,CAAA,EACtBqC,CAAAA,GAAgBrC,CAAK,EAEzB,CAAA,CAAG,CAACA,CAAAA,CAAOqC,CAAa,CAAC,CAAA,CAEzB,IAAMe,CAAAA,CAAc/rB,MAAAA,CAAuB,IAAI,CAAA,CA+B/C,OA7BA/M,SAAAA,CAAU,IAAM,CACd,IAAM2S,CAAAA,CAAKmmB,CAAAA,CAAY,OAAA,CACvB,GAAI,CAACnmB,CAAAA,CAAI,OACT,IAAMomB,EAAAA,CAAW,IAAI,oBAAA,CAClBC,CAAAA,EAAY,CAETA,EAAQ,CAAC,CAAA,EAAG,cAAA,EACZvd,CAAAA,EACA,CAAC2V,CAAAA,EAED9iB,CAAAA,GAEJ,CAAA,CACA,CAAE,UAAA,CAAY,OAAQ,CACxB,CAAA,CACA,OAAAyqB,EAAAA,CAAS,OAAA,CAAQpmB,CAAE,CAAA,CACZ,IAAMomB,EAAAA,CAAS,UAAA,EACxB,CAAA,CAAG,CAACtd,CAAAA,CAAa2V,CAAAA,CAAoB9iB,CAAa,CAAC,CAAA,CAInDtO,SAAAA,CAAU,IAAM,CACd,GAAKyb,CAAAA,CACL,OAAA,QAAA,CAAS,eAAA,CAAgB,KAAA,CAAM,mBAAA,CAAsB,MAAA,CAC9C,IAAM,CACX,QAAA,CAAS,eAAA,CAAgB,KAAA,CAAM,oBAAsB,GACvD,CACF,CAAA,CAAG,CAACA,CAAW,CAAC,CAAA,CAEZzN,CAAAA,CACKtX,GAAAA,CAACuiC,EAAAA,CAAA,EAAoB,CAAA,CAG1BR,CAAAA,CAAW,MAAA,GAAW,CAAA,CAEtB/hC,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,QAAA,CACf,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,QAAA,CAChB,OAAA,CAAS,QAAA,CACT,KAAA,CAAO,wBACT,CAAA,CAEA,QAAA,CAAAA,GAAAA,CAAC,GAAA,CAAA,CAAE,KAAA,CAAO,CAAE,QAAA,CAAU,EAAG,CAAA,CAAI,QAAA,CAAAnB,CAAAA,CAAE,uBAAuB,CAAA,CAAE,CAAA,CAC1D,CAAA,CAKFiB,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,aAAA,CAAe,QAAA,CAAU,GAAA,CAAK,EAAG,CAAA,CAC9D,QAAA,CAAA,CAAAE,GAAAA,CAAC,OAAA,CAAA,CAAO,QAAA,CAAA;AAAA;AAAA;AAAA,CAAA,CAGd,CAAA,CACMA,IAAC,KAAA,CAAA,CACC,SAAA,CAAU,oBACV,KAAA,CAAO,CACL,QAAS,MAAA,CACT,mBAAA,CAAqB,iBACrB,GAAA,CAAK,EACP,EAEC,QAAA,CAAA+X,CAAAA,EAAM,MAAM,GAAA,CAAKC,CAAAA,EAChBA,CAAAA,CAAK,KAAA,EAAO,GAAA,CAAI,CAACooB,GAAOoC,CAAAA,GACtBxiC,GAAAA,CAAC,OAEC,KAAA,CAAO,CACL,UAAW,CAAA,oDAAA,EAAuDwiC,CAAAA,CAAY,EAAE,CAAA,OAAA,CAClF,CAAA,CAEA,SAAAxiC,GAAAA,CAACmgC,EAAAA,CAAA,CACC,KAAA,CAAOC,EAAAA,CACP,SAAUh/B,CAAAA,CACV,OAAA,CAAS2Z,CAAAA,CACT,aAAA,CAAeslB,CAAAA,CACf,aAAA,CAAexlB,EACjB,CAAA,CAAA,CAXK,CAAA,EAAG4mB,CAAO,CAAA,CAAA,EAAIrB,EAAAA,CAAM,QAAQ,CAAA,CAAA,EAAIA,EAAAA,CAAM,QAAQ,CAAA,CAAA,EAAIA,EAAAA,CAAM,UAAU,IAAA,EAAQoC,CAAS,EAY1F,CACD,CACH,EACF,CAAA,CAGA1iC,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKsiC,CAAAA,CACL,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,cAAe,QAAA,CACf,UAAA,CAAY,SACZ,GAAA,CAAK,CAAA,CACL,OAAA,CAAS,QAAA,CACT,SAAA,CAAW,CACb,EAEA,QAAA,CAAA,CAAApiC,GAAAA,CAAC,SAAO,QAAA,CAAA,0DAAA,CAA2D,CAAA,CAClE06B,GACC56B,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,WAAY,QAAA,CACZ,GAAA,CAAK,EACL,KAAA,CAAO,SAAA,CACP,SAAU,EACZ,CAAA,CAEA,UAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,MAAM,IAAA,CACN,MAAA,CAAO,KACP,OAAA,CAAQ,WAAA,CACR,KAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,QACd,cAAA,CAAe,OAAA,CACf,MAAO,CAAE,SAAA,CAAW,oCAAqC,CAAA,CAEzD,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,6BAAA,CAA8B,EACxC,CAAA,CACCnB,CAAAA,CAAE,0BAA0B,CAAA,CAAA,CAC/B,CAAA,CAAA,CAEJ,GACF,CAEJ,CACF,EAEA,SAAS0jC,EAAAA,EAAsB,CAC7B,OACEziC,IAAAA,CAAAkS,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAhS,GAAAA,CAAC,SAAO,QAAA,CAAA,0KAAA,CAA2K,CAAA,CACnLA,IAAC,KAAA,CAAA,CACC,SAAA,CAAU,wBACV,KAAA,CAAO,CACL,QAAS,MAAA,CACT,mBAAA,CAAqB,iBACrB,GAAA,CAAK,EACP,CAAA,CAEC,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,OAAQ,CAAE,CAAC,EAAE,GAAA,CAAI,CAACY,EAAGC,CAAAA,GACjCb,GAAAA,CAACsY,EAAAA,CAAA,CAAqB,KAAA,CAAOzX,CAAAA,CAAAA,CAAVA,CAAa,CACjC,CAAA,CACH,GACF,CAEJ,CAEA,SAASyX,EAAAA,CAAa,CAAE,KAAA,CAAAC,CAAM,CAAA,CAAsB,CAElD,IAAMC,CAAAA,CAA+B,CACnC,WACE,4GAAA,CACF,cAAA,CAAgB,YAChB,SAAA,CAAW,CAAA,kCAAA,EALCD,EAAQ,GAKiC,CAAA,EAAA,CAAA,CACrD,aAAc,CAChB,CAAA,CAEA,OACEzY,IAAAA,CAAC,KAAA,CAAA,CACC,MAAO,CACL,YAAA,CAAc,EAAA,CACd,MAAA,CAAQ,8BAAA,CACR,UAAA,CAAY,qBACZ,QAAA,CAAU,QACZ,EAEA,QAAA,CAAA,CAAAA,IAAAA,CAAC,OACC,KAAA,CAAO,CACL,QAAS,MAAA,CACT,UAAA,CAAY,aACZ,cAAA,CAAgB,eAAA,CAChB,QAAS,gBACX,CAAA,CAEA,UAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,GAAGwY,CAAAA,CACH,OAAQ,EAAA,CACR,KAAA,CAAOD,EAAQ,CAAA,GAAM,CAAA,CAAI,MAAQ,KACnC,CAAA,CACF,EACAvY,GAAAA,CAAC,KAAA,CAAA,CACC,MAAO,CACL,GAAGwY,EACH,MAAA,CAAQ,EAAA,CACR,MAAO,EAAA,CACP,YAAA,CAAc,EAAA,CACd,UAAA,CAAY,CAAA,CACZ,UAAA,CAAY,EACd,CAAA,CACF,CAAA,CAAA,CACF,EAEAxY,GAAAA,CAAC,KAAA,CAAA,CACC,MAAO,CACL,OAAA,CAAS,MAAA,CACT,mBAAA,CAAqB,SAAA,CACrB,GAAA,CAAK,GACL,OAAA,CAAS,QACX,EAEC,QAAA,CAAA,CAAC,CAAA,CAAG,CAAC,CAAA,CAAE,GAAA,CAAK0Y,CAAAA,EACX5Y,IAAAA,CAAC,KAAA,CAAA,CAEC,KAAA,CAAO,CACL,YAAA,CAAc,EAAA,CACd,OAAQ,kCAAA,CACR,UAAA,CAAY,yBACZ,OAAA,CAAS,EAAA,CACT,QAAS,MAAA,CACT,aAAA,CAAe,SACf,GAAA,CAAK,CACP,EAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,OAAI,KAAA,CAAO,CAAE,GAAGwY,CAAAA,CAAS,MAAA,CAAQ,EAAA,CAAI,MAAO,EAAG,CAAA,CAAG,EACnDxY,GAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,GAAGwY,CAAAA,CAAS,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAO,EAAG,CAAA,CAAG,CAAA,CACnDxY,IAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,GAAGwY,CAAAA,CAAS,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAO,EAAG,EAAG,CAAA,CACnDxY,GAAAA,CAAC,OAAI,KAAA,CAAO,CAAE,GAAGwY,CAAAA,CAAS,MAAA,CAAQ,GAAI,KAAA,CAAO,EAAA,CAAI,UAAW,CAAE,CAAA,CAAG,IAd5DE,CAeP,CACD,EACH,CAAA,CAEA1Y,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,OAAA,CAAS,WAAY,CAAA,CACjC,QAAA,CAAAA,IAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,GAAGwY,CAAAA,CACH,MAAA,CAAQ,EAAA,CACR,YAAA,CAAc,EAAA,CACd,MAAO,MACT,CAAA,CACF,EACF,CAAA,CAEA1Y,IAAAA,CAAC,OACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,eAAgB,eAAA,CAChB,SAAA,CAAW,+BACX,OAAA,CAAS,WACX,EAEA,QAAA,CAAA,CAAAA,IAAAA,CAAC,OAAI,KAAA,CAAO,CAAE,QAAS,MAAA,CAAQ,GAAA,CAAK,EAAG,CAAA,CACrC,QAAA,CAAA,CAAAE,IAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,GAAGwY,CAAAA,CAAS,MAAA,CAAQ,GAAI,KAAA,CAAO,EAAG,EAAG,CAAA,CACnDxY,GAAAA,CAAC,OAAI,KAAA,CAAO,CAAE,GAAGwY,CAAAA,CAAS,MAAA,CAAQ,GAAI,KAAA,CAAO,EAAG,EAAG,CAAA,CAAA,CACrD,CAAA,CACAxY,IAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,GAAGwY,CAAAA,CAAS,MAAA,CAAQ,GAAI,KAAA,CAAO,EAAG,EAAG,CAAA,CAAA,CACrD,CAAA,CAAA,CACF,CAEJ,CCpXA,IAAMiqB,EAAAA,CAAiD,CACrD,MAAA,CAAQ,kCAAA,CACR,MAAA,CAAQ,+BAAA,CACR,UAAA,CAAY,+BACd,EAkBA,SAASC,EAAAA,EAAc,CACrB,GAAM,CAACC,EAAMC,CAAO,CAAA,CAAIrhC,QAAAA,CAAS,EAAE,CAAA,CAEnC,OAAA+H,UAAU,IAAM,CACd,IAAMu5B,CAAAA,CAAM,IAAM,CAChB,IAAMvoB,CAAAA,CAAI,IAAI,IAAA,CACd,OAAO,CAAA,EAAG,OAAOA,CAAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,EAAG,GAAG,CAAC,IAAI,MAAA,CAAOA,CAAAA,CAAE,YAAY,CAAA,CAAE,SAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAC5F,CAAA,CACAsoB,CAAAA,CAAQC,CAAAA,EAAK,CAAA,CACb,IAAMzvB,CAAAA,CAAK,WAAA,CAAY,IAAMwvB,CAAAA,CAAQC,CAAAA,EAAK,CAAA,CAAG,GAAM,CAAA,CACnD,OAAO,IAAM,aAAA,CAAczvB,CAAE,CAC/B,CAAA,CAAG,EAAE,CAAA,CAEEpT,IAAC,MAAA,CAAA,CAAM,QAAA,CAAA2iC,CAAAA,CAAK,CACrB,CAEA,SAASG,GAAiB,CAAE,KAAA,CAAA9D,CAAM,CAAA,CAAiC,CACjE,GAAM,CAAE,CAAE,EAAIt/B,cAAAA,EAAe,CAC7B,OACEI,IAAAA,CAAAkS,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAhS,GAAAA,CAAC,SAAO,QAAA,CAAA,sEAAA,CAAuE,CAAA,CAC/EF,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,oBAAA,CACV,MAAO,CACL,QAAA,CAAU,QACV,MAAA,CAAQ,CAAA,CACR,KAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,EAAA,CACR,OAAA,CAAS,OACT,UAAA,CAAY,QAAA,CACZ,eAAgB,eAAA,CAChB,OAAA,CAAS,SACT,UAAA,CAAY,oBAAA,CACZ,SAAA,CAAW,8BAAA,CACX,QAAA,CAAU,EAAA,CACV,MAAO,uBAAA,CACP,MAAA,CAAQ,GACR,cAAA,CAAgB,YAAA,CAChB,qBAAsB,YAAA,CACtB,UAAA,CAAY,CACd,CAAA,CAEA,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,WAAY,QAAA,CAAU,GAAA,CAAK,EAAG,CAAA,CAC3D,QAAA,CAAA,CAAAA,IAAAA,CAAC,OAAI,KAAA,CAAO,CAAE,QAAS,MAAA,CAAQ,UAAA,CAAY,SAAU,GAAA,CAAK,CAAE,CAAA,CAC1D,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,QAAQ,WAAA,CACR,KAAA,CAAO,CAAE,KAAA,CAAO,EAAA,CAAI,OAAQ,EAAA,CAAI,KAAA,CAAO,SAAU,CAAA,CACjD,IAAA,CAAK,MAAA,CACL,OAAO,cAAA,CACP,WAAA,CAAY,IACZ,aAAA,CAAc,OAAA,CACd,eAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,IAAC,MAAA,CAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CACrBA,GAAAA,CAAC,QAAK,CAAA,CAAE,0BAAA,CAA2B,EACnCA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,4BAAA,CAA6B,CAAA,CACrCA,GAAAA,CAAC,QAAK,CAAA,CAAE,2BAAA,CAA4B,GACtC,CAAA,CACAA,GAAAA,CAAC,QAAK,KAAA,CAAO,CAAE,KAAA,CAAO,SAAA,CAAW,UAAA,CAAY,GAAI,EAC9C,QAAA,CAAA,CAAA,CAAE,6BAAsC,EAC3C,CAAA,CAAA,CACF,CAAA,CAEAA,IAAC,KAAA,CAAA,CACC,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,CAAG,MAAA,CAAQ,GAAI,UAAA,CAAY,oBAAqB,EAClE,CAAA,CACCg/B,CAAAA,EACCl/B,KAAC,KAAA,CAAA,CACC,SAAA,CAAU,iBACV,KAAA,CAAO,CAAE,WAAY,QAAA,CAAU,GAAA,CAAK,EAAG,CAAA,CAEvC,QAAA,CAAA,CAAAA,KAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,SACZ,GAAA,CAAK,CAAA,CACL,MAAO,SACT,CAAA,CAGA,UAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CAAE,MAAO,EAAA,CAAI,MAAA,CAAQ,EAAG,CAAA,CAC/B,IAAA,CAAK,OACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,eAAe,OAAA,CAEf,QAAA,CAAAA,IAAC,MAAA,CAAA,CAAK,CAAA,CAAE,6HAA6H,CAAA,CACvI,CAAA,CACAA,IAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,KAAA,CAAO,SAAU,EAC7B,QAAA,CAAA,CAAA,CAAE,gCAAyC,EAC9C,CAAA,CACAA,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,KAAA,CAAO,UACP,UAAA,CAAY,GAAA,CACZ,mBAAoB,cACtB,CAAA,CAEC,SAAAg/B,CAAAA,CAAM,WAAA,CAAY,cAAA,EAAe,CACpC,CAAA,CAAA,CACF,CAAA,CACAl/B,KAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,WAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,KAAA,CAAO,SACT,CAAA,CAGA,UAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,QAAQ,WAAA,CACR,KAAA,CAAO,CAAE,KAAA,CAAO,EAAA,CAAI,OAAQ,EAAG,CAAA,CAC/B,KAAK,MAAA,CACL,MAAA,CAAO,eACP,WAAA,CAAY,GAAA,CACZ,cAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,0BAAA,CAA2B,CAAA,CACnCA,IAAC,MAAA,CAAA,CAAK,CAAA,CAAE,WAAW,CAAA,CACnBA,GAAAA,CAAC,QAAK,CAAA,CAAE,UAAA,CAAW,EACnBA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,UAAA,CAAW,CAAA,CAAA,CACrB,EACAA,GAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,KAAA,CAAO,SAAU,EAC7B,QAAA,CAAA,CAAA,CAAE,+BAAwC,EAC7C,CAAA,CACAA,GAAAA,CAAC,QACC,KAAA,CAAO,CACL,MAAO,SAAA,CACP,UAAA,CAAY,IACZ,kBAAA,CAAoB,cACtB,EAEC,QAAA,CAAAg/B,CAAAA,CAAM,aAAe,GAAA,CAClB,CAAA,CAAA,EAAA,CAAKA,CAAAA,CAAM,WAAA,CAAc,GAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CAC9CA,EAAM,WAAA,EAAe,GAAA,CACnB,IAAI,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAM,WAAA,CAAc,GAAK,CAAC,IACzC,CAAA,CAAA,EAAIA,CAAAA,CAAM,WAAW,CAAA,CAAA,CAC7B,CAAA,CAAA,CACF,GACF,CAAA,CAAA,CAEJ,CAAA,CACAl/B,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,QAAS,MAAA,CAAQ,UAAA,CAAY,SAAU,GAAA,CAAK,CAAE,EAE1D,QAAA,CAAA,CAAAA,IAAAA,CAAC,KACC,IAAA,CAAK,GAAA,CACL,OAAO,QAAA,CACP,GAAA,CAAI,sBACJ,KAAA,CAAO,CACL,QAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,OAAA,CAAS,UACT,YAAA,CAAc,CAAA,CACd,MAAO,SAAA,CACP,cAAA,CAAgB,OAChB,UAAA,CAAY,+BACd,CAAA,CACA,YAAA,CAAewV,CAAAA,EAAM,CAClBA,EAAE,aAAA,CAAoC,KAAA,CAAM,MAAQ,SAAA,CACpDA,CAAAA,CAAE,cAAoC,KAAA,CAAM,UAAA,CAC3C,qBACJ,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAM,CAClBA,CAAAA,CAAE,aAAA,CAAoC,MAAM,KAAA,CAAQ,SAAA,CACpDA,EAAE,aAAA,CAAoC,KAAA,CAAM,WAC3C,cACJ,CAAA,CAEA,UAAAxV,IAAAA,CAAC,KAAA,CAAA,CACC,QAAQ,WAAA,CACR,KAAA,CAAO,CAAE,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAG,CAAA,CAC/B,IAAA,CAAK,OACL,MAAA,CAAO,cAAA,CACP,YAAY,GAAA,CACZ,aAAA,CAAc,QACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,6DAA6D,CAAA,CACrEA,GAAAA,CAAC,QAAK,CAAA,CAAE,yBAAA,CAA0B,EAClCA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,SAAA,CAAU,CAAA,CAClBA,GAAAA,CAAC,QAAK,CAAA,CAAE,UAAA,CAAW,EACnBA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,UAAA,CAAW,CAAA,CAAA,CACrB,EACAA,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,kBAAA,CACb,QAAA,CAAA,CAAA,CAAE,6BAAsC,CAAA,CAC3C,CAAA,CAAA,CACF,EAEAF,IAAAA,CAAC,GAAA,CAAA,CACC,IAAA,CAAK,GAAA,CACL,MAAA,CAAO,QAAA,CACP,IAAI,qBAAA,CACJ,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,WAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,OAAA,CAAS,SAAA,CACT,YAAA,CAAc,EACd,KAAA,CAAO,SAAA,CACP,eAAgB,MAAA,CAChB,UAAA,CAAY,+BACd,CAAA,CACA,YAAA,CAAewV,CAAAA,EAAM,CAClBA,CAAAA,CAAE,aAAA,CAAoC,MAAM,KAAA,CAAQ,SAAA,CACpDA,EAAE,aAAA,CAAoC,KAAA,CAAM,WAC3C,qBACJ,CAAA,CACA,aAAeA,CAAAA,EAAM,CAClBA,EAAE,aAAA,CAAoC,KAAA,CAAM,MAAQ,SAAA,CACpDA,CAAAA,CAAE,cAAoC,KAAA,CAAM,UAAA,CAC3C,cACJ,CAAA,CAEA,QAAA,CAAA,CAAAtV,GAAAA,CAAC,OACC,OAAA,CAAQ,WAAA,CACR,MAAO,CAAE,KAAA,CAAO,GAAI,MAAA,CAAQ,EAAG,CAAA,CAC/B,IAAA,CAAK,cAAA,CAEL,QAAA,CAAAA,IAAC,MAAA,CAAA,CAAK,CAAA,CAAE,8JAA8J,CAAA,CACxK,CAAA,CACAA,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,QAAA,CAAA,GAAA,CAAC,CAAA,CAAA,CACtC,CAAA,CAEAA,IAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,KAAA,CAAO,CAAA,CACP,OAAQ,EAAA,CACR,UAAA,CAAY,qBACZ,MAAA,CAAQ,OACV,EACF,CAAA,CAEAF,IAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,MAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,EACL,OAAA,CAAS,SAAA,CACT,aAAc,CAAA,CACd,KAAA,CAAO,UACP,UAAA,CAAY,aAAA,CACZ,MAAA,CAAQ,MAAA,CACR,MAAA,CAAQ,SAAA,CACR,SAAU,EAAA,CACV,UAAA,CAAY,+BACd,CAAA,CACA,YAAA,CAAewV,GAAM,CAClBA,CAAAA,CAAE,aAAA,CAAoC,KAAA,CAAM,KAAA,CAAQ,SAAA,CACpDA,EAAE,aAAA,CAAoC,KAAA,CAAM,WAC3C,qBACJ,CAAA,CACA,aAAeA,CAAAA,EAAM,CAClBA,EAAE,aAAA,CAAoC,KAAA,CAAM,MAAQ,SAAA,CACpDA,CAAAA,CAAE,cAAoC,KAAA,CAAM,UAAA,CAC3C,cACJ,CAAA,CAEA,QAAA,CAAA,CAAAtV,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,MAAO,CAAE,KAAA,CAAO,GAAI,MAAA,CAAQ,EAAG,EAC/B,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,cAAc,OAAA,CACd,cAAA,CAAe,QAEf,QAAA,CAAAA,GAAAA,CAAC,WAAQ,MAAA,CAAO,gGAAA,CAAiG,CAAA,CACnH,CAAA,CACAA,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,kBAAA,CACb,QAAA,CAAA,CAAA,CAAE,kCAA2C,CAAA,CAChD,CAAA,CAAA,CACF,EACAF,IAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,WAAY,QAAA,CACZ,GAAA,CAAK,EACL,OAAA,CAAS,SAAA,CACT,YAAA,CAAc,CAAA,CACd,KAAA,CAAO,SAAA,CACP,WAAY,aAAA,CACZ,MAAA,CAAQ,OACR,MAAA,CAAQ,SAAA,CACR,SAAU,EAAA,CACV,UAAA,CAAY,+BACd,CAAA,CACA,YAAA,CAAewV,GAAM,CAClBA,CAAAA,CAAE,cAAoC,KAAA,CAAM,KAAA,CAAQ,UACpDA,CAAAA,CAAE,aAAA,CAAoC,KAAA,CAAM,UAAA,CAC3C,qBACJ,CAAA,CACA,aAAeA,CAAAA,EAAM,CAClBA,EAAE,aAAA,CAAoC,KAAA,CAAM,MAAQ,SAAA,CACpDA,CAAAA,CAAE,cAAoC,KAAA,CAAM,UAAA,CAC3C,cACJ,CAAA,CAEA,QAAA,CAAA,CAAAxV,KAAC,KAAA,CAAA,CACC,OAAA,CAAQ,YACR,KAAA,CAAO,CAAE,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAG,EAC/B,IAAA,CAAK,MAAA,CACL,OAAO,cAAA,CACP,WAAA,CAAY,IACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,QAAK,CAAA,CAAE,gGAAA,CAAiG,EACzGA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,2CAAA,CAA4C,CAAA,CAAA,CACtD,CAAA,CACAA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mBACb,QAAA,CAAA,CAAA,CAAE,kCAA2C,EAChD,CAAA,CAAA,CACF,CAAA,CACAF,KAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,KAAA,CAAO,CACL,QAAS,MAAA,CACT,UAAA,CAAY,SACZ,GAAA,CAAK,CAAA,CACL,QAAS,SAAA,CACT,YAAA,CAAc,CAAA,CACd,KAAA,CAAO,SAAA,CACP,UAAA,CAAY,cACZ,MAAA,CAAQ,MAAA,CACR,OAAQ,SAAA,CACR,QAAA,CAAU,GACV,UAAA,CAAY,+BACd,CAAA,CACA,YAAA,CAAewV,CAAAA,EAAM,CAClBA,EAAE,aAAA,CAAoC,KAAA,CAAM,MAAQ,SAAA,CACpDA,CAAAA,CAAE,cAAoC,KAAA,CAAM,UAAA,CAC3C,qBACJ,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAM,CAClBA,CAAAA,CAAE,aAAA,CAAoC,MAAM,KAAA,CAAQ,SAAA,CACpDA,EAAE,aAAA,CAAoC,KAAA,CAAM,WAC3C,cACJ,CAAA,CAEA,UAAAxV,IAAAA,CAAC,KAAA,CAAA,CACC,QAAQ,WAAA,CACR,KAAA,CAAO,CAAE,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAG,CAAA,CAC/B,IAAA,CAAK,OACL,MAAA,CAAO,cAAA,CACP,YAAY,GAAA,CACZ,aAAA,CAAc,QACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,QAAA,CAAA,CAAO,EAAA,CAAG,KAAK,EAAA,CAAG,IAAA,CAAK,EAAE,IAAA,CAAK,CAAA,CAC/BA,IAAC,MAAA,CAAA,CAAK,CAAA,CAAE,sCAAA,CAAuC,CAAA,CAC/CA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,YAAA,CAAa,CAAA,CAAA,CACvB,EACAA,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,kBAAA,CACb,QAAA,CAAA,CAAA,CAAE,6BAAsC,CAAA,CAC3C,CAAA,CAAA,CACF,EAEAA,GAAAA,CAAC,KAAA,CAAA,CACC,MAAO,CACL,KAAA,CAAO,EACP,MAAA,CAAQ,EAAA,CACR,UAAA,CAAY,oBAAA,CACZ,MAAA,CAAQ,OACV,EACF,CAAA,CAEAF,IAAAA,CAAC,OACC,KAAA,CAAO,CACL,QAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,KAAA,CAAO,SACT,CAAA,CAEA,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CACC,OAAA,CAAQ,YACR,KAAA,CAAO,CAAE,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAG,EAC/B,IAAA,CAAK,MAAA,CACL,OAAO,cAAA,CACP,WAAA,CAAY,IACZ,aAAA,CAAc,OAAA,CACd,eAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,IAAC,QAAA,CAAA,CAAO,EAAA,CAAG,KAAK,EAAA,CAAG,IAAA,CAAK,EAAE,IAAA,CAAK,CAAA,CAC/BA,GAAAA,CAAC,UAAA,CAAA,CAAS,MAAA,CAAO,kBAAA,CAAmB,GACtC,CAAA,CACAA,GAAAA,CAAC0iC,GAAA,EAAY,CAAA,CAAA,CACf,GACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAEO,SAASK,EAAAA,CAAY,CAC1B,QAAA,CAAA3hC,CAAAA,CACA,QAAA2Z,CAAAA,CACA,aAAA,CAAAslB,EACA,aAAA,CAAAxlB,CAAAA,CACA,UAAA,CAAAmoB,CACF,CAAA,CAAqB,CACnB,GAAM,CAAE,CAAA,CAAAnkC,CAAE,CAAA,CAAIa,cAAAA,GAER,CAACkjB,CAAAA,CAAQqgB,CAAS,CAAA,CAAI1hC,QAAAA,CAAyB,QAAQ,CAAA,CACvD,CAACwU,EAASmtB,CAAU,CAAA,CAAI3hC,SAAS,KAAK,CAAA,CACtC,CAACogB,CAAAA,CAAWwhB,CAAY,CAAA,CAAI5hC,SAA6B,GAAK,CAAA,CAC9D,CAAC6hC,CAAAA,CAAWC,CAAY,EAAI9hC,QAAAA,EAAuC,CACnE+hC,CAAAA,CAAYjtB,MAAAA,CAAyB,IAAI,CAAA,CAEzCmM,EAAmB5iB,WAAAA,CAAa2jC,CAAAA,EAAyB,CAC7DN,CAAAA,CAAUM,CAAI,EAChB,CAAA,CAAG,EAAE,CAAA,CAEC9gB,CAAAA,CAAsB7iB,WAAAA,CAAa8iB,GAAiB,CACxDwgB,CAAAA,CAAWxgB,CAAG,EAChB,CAAA,CAAG,EAAE,CAAA,CAEC8gB,EAAoB5jC,WAAAA,CAAao/B,CAAAA,EAA4B,CACjEyE,eAAAA,CAAgB,IAAM,CACpBJ,CAAAA,CAAarE,CAAK,EACpB,CAAC,EACH,CAAA,CAAG,EAAE,CAAA,CAECR,EAAgB5+B,WAAAA,CAAY,IAAM,CACtC0jC,CAAAA,CAAU,OAAA,EAAS,UACrB,CAAA,CAAG,EAAE,CAAA,CAEL,OACExjC,KAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,SAAA,CAAW,OAAA,CACX,SAAU,UACZ,CAAA,CAGA,QAAA,CAAA,CAAAE,GAAAA,CAAC,OAAA,CAAA,CAAO,QAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,CAKN,CAAA,CAEFF,KAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,QAAA,CACV,YAAA,CAAc,8BAChB,EAGA,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,WACV,KAAA,CAAO,CAAA,CACP,aAAA,CAAe,MAAA,CACf,MAAA,CAAQ,CAAA,CACR,SAAU,QACZ,CAAA,CAEC,QAAA,CAAA,CAAAkjC,CAAAA,EACChjC,GAAAA,CAAC,KAAA,CAAA,CACC,IAAKgjC,CAAAA,CACL,GAAA,CAAI,EAAA,CACJ,aAAA,CAAY,MAAA,CACZ,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,KAAA,CAAO,CAAA,CACP,KAAA,CAAO,MAAA,CACP,OAAQ,MAAA,CACR,SAAA,CAAW,OAAA,CACX,cAAA,CAAgB,eAAA,CAChB,OAAA,CAAS,GACT,YAAA,CAAc,SAAA,CACd,SAAA,CACE,yDAAA,CACF,eAAA,CACE,yDACJ,EACF,CAAA,CAGFhjC,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,WACV,KAAA,CAAO,CAAA,CACP,OAAA,CAAS,IAAA,CACT,eAAA,CACE,yEAAA,CACF,eAAgB,WAClB,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACAA,GAAAA,CAAC,OAAA,CAAA,CAAO,6LAAoL,CAAA,CAC5LA,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,iCAAA,CACV,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,CAAA,CACR,QAAA,CAAU,IAAA,CACV,OAAQ,QACV,CAAA,CAEA,QAAA,CAAAA,GAAAA,CAAC++B,EAAAA,CAAA,CAAY,MAAOqE,CAAAA,CAAW,CAAA,CACjC,CAAA,CAAA,CACF,CAAA,CAGAtjC,IAAAA,CAAC,KAAA,CAAA,CACC,MAAO,CACL,QAAA,CAAU,QAAA,CACV,GAAA,CAAK,CAAA,CACL,MAAA,CAAQ,GACR,UAAA,CAAY,oBAAA,CACZ,cAAA,CAAgB,YAAA,CAChB,oBAAA,CAAsB,YAAA,CACtB,aAAc,8BAChB,CAAA,CAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,OAAA,CAAA,CAAO,QAAA,CAAA,gLAAA,CAAiL,EACzLF,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,uBAAA,CACV,KAAA,CAAO,CACL,SAAU,IAAA,CACV,MAAA,CAAQ,QAAA,CACR,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,SACZ,cAAA,CAAgB,eAAA,CAChB,GAAA,CAAK,EACP,CAAA,CAEA,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,SACZ,GAAA,CAAK,EAAA,CACL,QAAA,CAAU,CACZ,CAAA,CAEA,QAAA,CAAA,CAAAE,IAAC,KAAA,CAAA,CACC,SAAA,CAAU,gBAAA,CACV,KAAA,CAAO,CACL,UAAA,CAAY,SACZ,cAAA,CAAgB,QAAA,CAChB,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,aAAc,EAAA,CACd,UAAA,CACE,gFAAA,CACF,MAAA,CAAQ,iCAAA,CACR,UAAA,CAAY,CACd,CAAA,CAEA,QAAA,CAAAF,IAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,MAAO,CAAE,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,KAAA,CAAO,SAAU,CAAA,CACjD,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,IACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,QAAK,CAAA,CAAE,8GAAA,CAA+G,CAAA,CACvHA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,4EAA4E,CAAA,CACpFA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,2EAAA,CAA4E,CAAA,CAAA,CACtF,EACF,CAAA,CACAF,IAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,QAAA,CAAU,CAAE,CAAA,CACxB,QAAA,CAAA,CAAAE,GAAAA,CAAC,IAAA,CAAA,CACC,KAAA,CAAO,CACL,SAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,KAAA,CAAO,MAAA,CACP,MAAA,CAAQ,EACR,aAAA,CAAe,SAAA,CACf,QAAA,CAAU,QAAA,CACV,YAAA,CAAc,UAAA,CACd,WAAY,QACd,CAAA,CAEC,QAAA,CAAAnB,CAAAA,CAAE4jC,EAAAA,CAAe7f,CAAM,CAAU,CAAA,CACpC,CAAA,CACCwgB,CAAAA,EAAaA,CAAAA,CAAU,WAAA,CAAc,CAAA,EACpCpjC,IAAC,GAAA,CAAA,CACC,SAAA,CAAU,iBAAA,CACV,KAAA,CAAO,CAAE,QAAA,CAAU,GAAI,KAAA,CAAO,SAAA,CAAW,MAAA,CAAQ,CAAE,CAAA,CAElD,QAAA,CAAAnB,EAAE,4BAAA,CAAuC,CACxC,KAAA,CAAOukC,CAAAA,CAAU,WACnB,CAAC,EACH,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CACApjC,GAAAA,CAAC09B,EAAAA,CAAA,CACC,OAAQ9a,CAAAA,CACR,YAAA,CAAcJ,CAAAA,CACd,OAAA,CAASzM,CAAAA,CACT,eAAA,CAAiB0M,EACjB,SAAA,CAAWd,CAAAA,CACX,iBAAA,CAAmBwhB,CAAAA,CACnB,SAAA,CAAW3E,CAAAA,CACb,GACF,CAAA,CAAA,CACF,CAAA,CAGAx+B,GAAAA,CAAC,OAAA,CAAA,CAAO,QAAA,CAAA,4LAAA,CAA6L,CAAA,CACrMF,KAAC,KAAA,CAAA,CACC,SAAA,CAAU,uCAAA,CACV,KAAA,CAAO,CACL,QAAA,CAAU,WACV,QAAA,CAAU,IAAA,CACV,MAAA,CAAQ,QACV,CAAA,CAGA,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,SACZ,GAAA,CAAK,CAAA,CACL,YAAA,CAAc,EAAA,CACd,OAAA,CAAS,UAAA,CACT,aAAc,CAAA,CACd,MAAA,CAAQ,8BAAA,CACR,UAAA,CAAY,qBACd,CAAA,CAEA,UAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CACL,MAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,KAAA,CAAO,SAAA,CACP,UAAA,CAAY,CACd,CAAA,CACA,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,IACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAAA,GAAAA,CAAC,QAAK,CAAA,CAAE,oKAAA,CAAqK,CAAA,CAC/K,CAAA,CACAF,IAAAA,CAAC,GAAA,CAAA,CACC,MAAO,CACL,QAAA,CAAU,EAAA,CACV,KAAA,CAAO,SAAA,CACP,UAAA,CAAY,IACZ,MAAA,CAAQ,CACV,CAAA,CAEA,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,MAAO,CAAE,KAAA,CAAO,SAAA,CAAW,UAAA,CAAY,GAAI,CAAA,CAC9C,SAAAnB,CAAAA,CAAE,qCAA8C,CAAA,CACnD,CAAA,CACC,UAAA,CACAA,CAAAA,CAAE,4BAAqC,CAAA,CAAA,CAC1C,CAAA,CAAA,CACF,CAAA,CAEAmB,GAAAA,CAACmhC,EAAAA,CAAA,CACC,IAAKmC,CAAAA,CACL,MAAA,CAAQ1gB,CAAAA,CACR,OAAA,CAAS7M,CAAAA,CACT,SAAA,CAAW4L,EACX,QAAA,CAAUvgB,CAAAA,CACV,OAAA,CAAS2Z,CAAAA,CACT,aAAA,CAAeslB,CAAAA,CACf,cAAexlB,CAAAA,CACf,aAAA,CAAe2oB,CAAAA,CACjB,CAAA,CAAA,CACF,CAAA,CACAxjC,GAAAA,CAAC8iC,GAAA,CAAiB,KAAA,CAAOM,EAAW,CAAA,CAAA,CACtC,CAEJ,CCnsBA,SAAShJ,EAAAA,CAAaC,CAAAA,CAAwC,CAC5D,OAAIA,CAAAA,EAAO,KAAa,GAAA,CACpBA,CAAAA,EAAO,GAAA,CAAkB,CAAA,CAAA,EAAA,CAAKA,CAAAA,CAAM,GAAA,EAAW,QAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CACzDA,CAAAA,EAAO,GAAA,CAAc,CAAA,CAAA,EAAI,KAAK,KAAA,CAAMA,CAAAA,CAAM,GAAK,CAAC,CAAA,CAAA,CAAA,CAC7C,CAAA,CAAA,EAAIA,EAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAC3B,CAUA,IAAM2F,GAUF,CACF,UAAA,CAAY,CACV,IAAA,CAAM,SAAA,CACN,MAAA,CAAQ,wBACR,WAAA,CAAa,sBAAA,CACb,EAAA,CAAI,uBAAA,CACJ,UAAA,CAAY,qBAAA,CACZ,iBAAkB,qBACpB,CAAA,CACA,MAAA,CAAQ,CACN,IAAA,CAAM,SAAA,CACN,OAAQ,sBAAA,CACR,WAAA,CAAa,qBAAA,CACb,EAAA,CAAI,sBAAA,CACJ,UAAA,CAAY,UACZ,gBAAA,CAAkB,SACpB,CACF,CAAA,CAEM0D,EAAAA,CAA0B,CAC9B,KAAM,SAAA,CACN,MAAA,CAAQ,wBAAA,CACR,WAAA,CAAa,uBAAA,CACb,EAAA,CAAI,yBACJ,UAAA,CAAY,qBAAA,CACZ,gBAAA,CAAkB,qBACpB,CAAA,CAEA,SAASC,GAAkB58B,CAAAA,CAAgB,CACzC,OAAOi5B,EAAAA,CAAgBj5B,CAAM,CAAA,EAAK28B,EACpC,CAEA,SAASE,EAAAA,CAAkBC,CAAAA,CAA4C,CACrE,GAAI,CAACA,CAAAA,CAAM,eAAA,EAAiB,MAAA,CAAQ,OAAO,IAAA,CAC3C,IAAIC,EAAgC,IAAA,CAChCC,CAAAA,CAAa,EAAA,CACjB,IAAA,IAAWvpB,CAAAA,IAAKqpB,CAAAA,CAAM,gBAAiB,CACrC,IAAM3Y,CAAAA,CAAS1Q,CAAAA,CAAE,MAAA,EAAU,CAAA,CACvB0Q,EAAS6Y,CAAAA,GACXA,CAAAA,CAAa7Y,CAAAA,CACb4Y,CAAAA,CAAOtpB,CAAAA,EAEX,CACA,OAAOspB,CACT,CAEA,SAASE,EAAAA,CACPH,CAAAA,CACAI,CAAAA,CAC8B,CAC9B,IAAMC,CAAAA,CAASL,CAAAA,CAAM,OAAA,CAAQ,IAAA,CAC1BvuB,CAAAA,EAAMA,EAAE,MAAA,IAAY2uB,CAAAA,EAAM,QAAA,EAAYJ,CAAAA,CAAM,OAAA,CAAQ,CAAC,GAAG,MAAA,CAC3D,CAAA,CACMM,CAAAA,CAASN,CAAAA,CAAM,OAAA,CAAQ,IAAA,CAC1BvuB,GAAMA,CAAAA,CAAE,MAAA,IAAY2uB,CAAAA,EAAM,QAAA,EAAYJ,CAAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,MAAA,CAC3D,CAAA,CAEMO,CAAAA,CAAcjiC,CAAAA,EAAqD,CACvE,GAAI,CAACA,CAAAA,EAAQ,QAAA,GAAW,CAAC,CAAA,CAAG,OAAO,CAAE,IAAA,CAAM,IAAA,CAAM,KAAA,CAAO,IAAK,CAAA,CAC7D,IAAM+G,EAAI/G,CAAAA,CAAO,QAAA,CAAS,CAAC,CAAA,CAC3B,OAAO,CACL,KAAM+G,CAAAA,CAAE,KAAA,EAAS,IAAA,CACjB,KAAA,CAAOA,CAAAA,CAAE,QAAA,EAAYA,EAAE,KAAA,EAAS,IAClC,CACF,CAAA,CAEMm7B,CAAAA,CAAKD,CAAAA,CAAWH,GAAM,QAAQ,CAAA,CAC9BK,CAAAA,CAAKF,CAAAA,CAAWH,CAAAA,EAAM,QAAQ,EAEpC,OAAO,CACL,CACE,MAAA,CAAQA,CAAAA,EAAM,QAAA,EAAYC,GAAQ,MAAA,EAAU,SAAA,CAC5C,WAAA,CAAaG,CAAAA,CAAG,IAAA,CAChB,QAAA,CAAUA,EAAG,KAAA,CACb,MAAA,CAAQH,CAAAA,EAAQ,KAAA,EAAO,MAAA,EAAU,IAAA,CACjC,MAAOA,CAAAA,EAAQ,KACjB,CAAA,CACA,CACE,MAAA,CAAQD,CAAAA,EAAM,UAAYE,CAAAA,EAAQ,MAAA,EAAU,SAAA,CAC5C,WAAA,CAAaG,CAAAA,CAAG,IAAA,CAChB,SAAUA,CAAAA,CAAG,KAAA,CACb,MAAA,CAAQH,CAAAA,EAAQ,KAAA,EAAO,MAAA,EAAU,KACjC,KAAA,CAAOA,CAAAA,EAAQ,KACjB,CACF,CACF,CAEO,SAASI,EAAAA,CAAe,CAC7B,KAAA,CAAAV,CAAAA,CACA,aAAA,CAAAW,CAAAA,CACA,aAAA7kB,CAAAA,CACA,aAAA,CAAA9E,CACF,CAAA,CAAwB,CACtB,IAAM,CAAE,CAAA,CAAAhc,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB+kC,CAAAA,CAAWvgC,QAAQ,IAAM0/B,EAAAA,CAAkBC,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAC1DvE,CAAAA,CACJuE,CAAAA,CAAM,UAAA,EAAc,IAAA,CAAOA,CAAAA,CAAM,WAAa,GAAA,CAAM,IAAA,CAEhD,CAACa,CAAAA,CAAOC,CAAK,CAAA,CAAIzgC,QACrB,IAAM8/B,EAAAA,CAAoBH,CAAAA,CAAOY,CAAQ,CAAA,CACzC,CAACZ,EAAOY,CAAQ,CAClB,CAAA,CAEMG,CAAAA,CAAetF,CAAAA,EAAiB,IAAA,EAAQA,GAAiB,CAAA,CAE7DoF,CAAAA,CAAM,QAAA,EAAY,IAAA,EAAQC,CAAAA,CAAM,UAAY,IAAA,CACxCD,CAAAA,CAAM,MAAA,GAAW,QAAA,CACfA,CAAAA,CAAM,QAAA,CAAWC,EAAM,QAAA,CACvBA,CAAAA,CAAM,QAAA,CAAWD,CAAAA,CAAM,QAAA,CACzB,KAAA,KAEAG,EACJH,CAAAA,CAAM,QAAA,EAAY,IAAA,EAAQC,CAAAA,CAAM,QAAA,EAAY,IAAA,CACxCD,EAAM,QAAA,EAAYC,CAAAA,CAAM,QAAA,CACtBD,CAAAA,CACAC,CAAAA,CACF,IAAA,CACAG,EAAeD,CAAAA,CAAW5K,EAAAA,CAAc4K,CAAAA,CAAS,MAAM,CAAA,CAAI,IAAA,CAE3DjE,EAAYgE,CAAAA,CAAe,OAAA,CAAU,SAE3C,OACE9kC,IAAAA,CAAC,KAAA,CAAA,CACC,UAAU,OAAA,CACV,KAAA,CAAO,CACL,YAAA,CAAc,EAAA,CACd,MAAA,CAAQ,+BACR,UAAA,CAAY,oBAAA,CACZ,QAAA,CAAU,QAAA,CACV,UAAA,CAAY,UAAA,CACZ,SAAU,UACZ,CAAA,CACA,YAAA,CAAewV,CAAAA,EAAM,CACnB,IAAM2G,EAAK3G,CAAAA,CAAE,aAAA,CACb2G,CAAAA,CAAG,KAAA,CAAM,WAAA,CAAc,oBAAA,CACvBA,EAAG,KAAA,CAAM,SAAA,CAAY,mCACvB,CAAA,CACA,YAAA,CAAe3G,CAAAA,EAAM,CACnB,IAAM2G,CAAAA,CAAK3G,CAAAA,CAAE,aAAA,CACb2G,CAAAA,CAAG,KAAA,CAAM,YAAc,oBAAA,CACvBA,CAAAA,CAAG,KAAA,CAAM,SAAA,CAAY,OACvB,CAAA,CAGC,UAAAqjB,CAAAA,EAAiB,IAAA,EAChBx/B,IAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,SAAU,UAAA,CACV,GAAA,CAAK,EAAA,CACL,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,GACR,OAAA,CAAS,aAAA,CACT,WAAY,QAAA,CACZ,GAAA,CAAK,EACL,YAAA,CAAc,EAAA,CACd,OAAA,CAAS,UAAA,CACT,QAAA,CAAU,EAAA,CACV,WAAY,GAAA,CACZ,MAAA,CAAQ,CAAA,UAAA,EACN8kC,CAAAA,CACI,qBAAA,CACAtF,CAAAA,EAAiB,EACf,uBAAA,CACA,uBACR,CAAA,CAAA,CACA,UAAA,CAAYsF,CAAAA,CACR,sBAAA,CACAtF,GAAiB,CAAA,CACf,wBAAA,CACA,wBAAA,CACN,KAAA,CAAOsF,CAAAA,CACH,SAAA,CACAtF,GAAiB,CAAA,CACf,SAAA,CACA,SACR,CAAA,CAGA,QAAA,CAAA,CAAAt/B,GAAAA,CAAC,OACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CAAE,KAAA,CAAO,EAAA,CAAI,OAAQ,EAAG,CAAA,CAC/B,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,YAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAAA,IAAC,MAAA,CAAA,CAAK,CAAA,CAAE,6JAAA,CAA8J,CAAA,CACxK,CAAA,CACCs/B,CAAAA,CAAc,QAAQ,CAAC,CAAA,CAAE,GAAA,CAAA,CAC5B,CAAA,CAIFx/B,IAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,OAAA,CAAS,EAAG,CAAA,CAExB,QAAA,CAAA,CAAAE,GAAAA,CAAC,MACC,KAAA,CAAO,CACL,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,WAAY,KAAA,CACZ,aAAA,CAAe,SAAA,CACf,KAAA,CAAO,SAAA,CACP,QAAA,CAAU,SACV,YAAA,CAAc,UAAA,CACd,OAAA,CAAS,aAAA,CACT,eAAA,CAAiB,CAAA,CACjB,gBAAiB,UAAA,CACjB,YAAA,CAAc,EAAA,CACd,MAAA,CAAQ,UACV,CAAA,CAEC,SAAA6jC,CAAAA,CAAM,KAAA,CACT,CAAA,CAGA/jC,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,mBAAA,CAAqB,SAAA,CAAW,GAAA,CAAK,EAAG,EAElE,QAAA,CAAA,CAAAE,GAAAA,CAAC+kC,EAAAA,CAAA,CACC,IAAA,CAAML,CAAAA,CACN,UAAWG,CAAAA,GAAaH,CAAAA,CACxB,QAAA,CAAUF,CAAAA,CACV,YAAA,CAAc7kB,CAAAA,CACd,cAAe9E,CAAAA,CACjB,CAAA,CACA7a,GAAAA,CAAC+kC,EAAAA,CAAA,CACC,IAAA,CAAMJ,EACN,SAAA,CAAWE,CAAAA,GAAaF,CAAAA,CACxB,QAAA,CAAUH,CAAAA,CACV,YAAA,CAAc7kB,EACd,aAAA,CAAe9E,CAAAA,CACjB,CAAA,CAAA,CACF,CAAA,CAGCgqB,CAAAA,EAAYC,CAAAA,EAAgBxF,GAAiB,IAAA,EAC5Cx/B,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,SAAA,CAAW,GACX,OAAA,CAAS,UAAA,CACT,YAAA,CAAc,EAAA,CACd,OAAA,CAAS,MAAA,CACT,WAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,MAAA,CAAQ,SAAA,CACR,UAAA,CAAY,YACZ,MAAA,CAAQ,CAAA,UAAA,EAAa8gC,CAAAA,GAAc,OAAA,CAAU,sBAAA,CAAyB,wBAAwB,GAC9F,UAAA,CACEA,CAAAA,GAAc,OAAA,CACV,sBAAA,CACA,wBACR,CAAA,CACA,QAAS,IAAMiE,CAAAA,CAAS,KAAA,EAASL,CAAAA,GAAgBK,CAAAA,CAAS,KAAK,EAG/D,QAAA,CAAA,CAAA7kC,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CACL,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,UAAA,CAAY,CAAA,CACZ,MAAO4gC,CAAAA,GAAc,OAAA,CAAU,SAAA,CAAY,SAC7C,CAAA,CACA,IAAA,CAAK,OACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,eAAe,OAAA,CAEf,QAAA,CAAA5gC,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,6JAAA,CAA8J,EACxK,CAAA,CACAA,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,GACV,UAAA,CAAY,GAAA,CACZ,KAAA,CACE4gC,CAAAA,GAAc,OAAA,CACV,qBAAA,CACA,uBACR,CAAA,CAEC,QAAA,CAAA/hC,CAAAA,CAAE,yBAAA,CAAoC,CACrC,QAAA,CACEgmC,EAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,CACtCA,EAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,CACzB,MAAA,CAAQvF,CAAAA,CAAc,QAAQ,CAAC,CACjC,CAAC,CAAA,CACH,CAAA,CAEAx/B,IAAAA,CAAC,OACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CACL,KAAA,CAAO,EAAA,CACP,OAAQ,EAAA,CACR,UAAA,CAAY,MAAA,CACZ,KAAA,CACE8gC,CAAAA,GAAc,OAAA,CACV,sBACA,uBACR,CAAA,CACA,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,YAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAA5gC,IAAC,MAAA,CAAA,CAAK,CAAA,CAAE,UAAA,CAAW,CAAA,CACnBA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,eAAA,CAAgB,CAAA,CAAA,CAC1B,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAGAF,IAAAA,CAAC,OACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,eAAgB,eAAA,CAChB,SAAA,CAAW,8BAAA,CACX,UAAA,CAAY,oBAAA,CACZ,OAAA,CAAS,WACX,CAAA,CAEA,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,EAAA,CACL,QAAA,CAAU,GACV,KAAA,CAAO,SACT,CAAA,CAEA,QAAA,CAAA,CAAAA,IAAAA,CAAC,MAAA,CAAA,CAAK,MAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,GAAA,CAAK,CAAE,CAAA,CAE3D,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,MAAO,CAAE,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAG,CAAA,CAC/B,KAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,QACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,2BAA2B,CAAA,CACnCA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,UAAA,CAAW,CAAA,CACnBA,IAAC,MAAA,CAAA,CAAK,CAAA,CAAE,UAAA,CAAW,CAAA,CACnBA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,UAAA,CAAW,CAAA,CAAA,CACrB,CAAA,CACCo6B,EAAAA,CAAayJ,CAAAA,CAAM,eAAe,GACrC,CAAA,CACCA,CAAAA,CAAM,mBAAA,EAAuB,IAAA,EAC5BA,CAAAA,CAAM,mBAAA,CAAsB,GAC1B/jC,IAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,WAAY,QAAA,CAAU,GAAA,CAAK,CAAE,CAAA,CAE3D,QAAA,CAAA,CAAAE,GAAAA,CAAC,OACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CAAE,KAAA,CAAO,EAAA,CAAI,OAAQ,EAAG,CAAA,CAC/B,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,YAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAAA,IAAC,MAAA,CAAA,CAAK,CAAA,CAAE,2KAAA,CAA4K,CAAA,CACtL,CAAA,CACCo6B,EAAAA,CAAayJ,EAAM,mBAAmB,CAAA,CAAG,GAAA,CACzChlC,CAAAA,CAAE,wBAAiC,CAAA,CAAA,CACtC,GAEN,CAAA,CACCglC,CAAAA,CAAM,UAAA,EAAc,IAAA,EACnB/jC,IAAAA,CAAC,MAAA,CAAA,CACC,MAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,EACL,QAAA,CAAU,EAAA,CACV,KAAA,CAAO,SACT,CAAA,CAGA,QAAA,CAAA,CAAAE,IAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,KAAA,CAAO,CAAE,KAAA,CAAO,GAAI,MAAA,CAAQ,EAAG,CAAA,CAC/B,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,eACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,SAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,4HAAA,CAA6H,CAAA,CACvI,CAAA,CACC,KAAK,KAAA,CAAM6jC,CAAAA,CAAM,UAAA,CAAa,GAAG,CAAA,CAAE,GAAA,CAAE,IACrChlC,CAAAA,CAAE,uBAAgC,CAAA,CAAA,CACrC,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CAEA,SAASkmC,EAAAA,CAAc,CACrB,IAAA,CAAAhtB,CAAAA,CACA,SAAA,CAAAgpB,EACA,QAAA,CAAA3/B,CAAAA,CACA,YAAA,CAAAue,CAAAA,CACA,aAAA,CAAA9E,CACF,EAMG,CACD,GAAM,CAAE,CAAA,CAAAhc,CAAE,CAAA,CAAIa,gBAAe,CACvBy6B,CAAAA,CAAOF,EAAAA,CAAcliB,CAAAA,CAAK,MAAM,CAAA,CAChCitB,EAASrB,EAAAA,CAAkB5rB,CAAAA,CAAK,MAAM,CAAA,CACtC6C,CAAAA,CAAO7C,CAAAA,CAAK,MAAQ4H,CAAAA,GAAe5H,CAAAA,CAAK,KAAK,CAAA,CAAI,MAAA,CAEjDmpB,CAAAA,CACJphC,KAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,YAAA,CAAc,EAAA,CACd,MAAA,CAAQ,aAAaklC,CAAAA,CAAO,MAAM,CAAA,CAAA,CAClC,UAAA,CAAYA,CAAAA,CAAO,EAAA,CACnB,QAAS,EAAA,CACT,MAAA,CAAQpqB,CAAAA,EAAQxZ,CAAAA,CAAW,SAAA,CAAY,MAAA,CACvC,WAAY,oBACd,CAAA,CACA,YAAA,CAAekU,CAAAA,EAAM,CAClBA,CAAAA,CAAE,cAAiC,KAAA,CAAM,WAAA,CACxC0vB,CAAAA,CAAO,YACX,CAAA,CACA,YAAA,CAAe1vB,GAAM,CAClBA,CAAAA,CAAE,aAAA,CAAiC,KAAA,CAAM,WAAA,CAAc0vB,CAAAA,CAAO,OACjE,CAAA,CACA,OAAA,CAAS,IAAMjtB,CAAAA,CAAK,KAAA,EAAS3W,CAAAA,GAAW2W,EAAK,KAAK,CAAA,CAGlD,QAAA,CAAA,CAAAjY,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,GAAA,CAAK,CAAA,CACL,aAAc,CAChB,CAAA,CAEC,QAAA,CAAA,CAAAq6B,CAAAA,CAAK,IAAA,CACNn6B,GAAAA,CAAC,QACC,KAAA,CAAO,CACL,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,cAAe,QAAA,CACf,KAAA,CAAOglC,CAAAA,CAAO,IAAA,CACd,aAAA,CAAe,WACjB,EAEC,QAAA,CAAA7K,CAAAA,CAAK,KAAA,CACR,CAAA,CAEAr6B,IAAAA,CAAC,KAAA,CAAA,CACC,QAAQ,WAAA,CACR,SAAA,CAAU,sDAAA,CACV,KAAA,CAAO,CACL,KAAA,CAAO,GACP,MAAA,CAAQ,EAAA,CACR,KAAA,CAAO,SAAA,CACP,UAAA,CAAY,MACd,EACA,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,cAAc,OAAA,CACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,YAAA,CAAa,CAAA,CACrBA,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,YAAA,CAAa,GACvB,CAAA,CAAA,CACF,CAAA,CAGC+X,CAAAA,CAAK,WAAA,EACJ/X,GAAAA,CAAC,KAAA,CAAA,CACC,MAAO,CACL,QAAA,CAAU,EAAA,CACV,KAAA,CAAO,SAAA,CACP,QAAA,CAAU,SACV,YAAA,CAAc,UAAA,CACd,UAAA,CAAY,QAAA,CACZ,YAAA,CAAc,CAChB,EAEC,QAAA,CAAA+X,CAAAA,CAAK,WAAA,CACR,CAAA,CAIFjY,IAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,OAAA,CAAS,MAAA,CAAQ,UAAA,CAAY,UAAA,CAAY,GAAA,CAAK,CAAE,CAAA,CAC5D,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,SAAU,EAAA,CACV,UAAA,CAAY,GAAA,CACZ,kBAAA,CAAoB,cAAA,CACpB,KAAA,CAAO+gC,EAAYiE,CAAAA,CAAO,gBAAA,CAAmBA,CAAAA,CAAO,UACtD,CAAA,CAEC,QAAA,CAAAjtB,EAAK,QAAA,EAAY,IAAA,CAAA,CAAQA,CAAAA,CAAK,QAAA,CAAW,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAAI,GAAA,CAC9D,CAAA,CACA/X,GAAAA,CAAC,MAAA,CAAA,CAAK,KAAA,CAAO,CAAE,QAAA,CAAU,EAAA,CAAI,KAAA,CAAO,SAAU,CAAA,CAC3C,QAAA,CAAAnB,EAAE,0BAAmC,CAAA,CACxC,CAAA,CAAA,CACF,CAAA,CAGAiB,IAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,QAAA,CAAU,EAAA,CAAI,KAAA,CAAO,SAAA,CAAW,SAAA,CAAW,CAAE,CAAA,CACxD,QAAA,CAAA,CAAAs6B,EAAAA,CAAariB,CAAAA,CAAK,MAAM,CAAA,CAAE,IAAElZ,CAAAA,CAAE,wBAAiC,CAAA,CAAA,CAClE,CAAA,CAAA,CACF,CAAA,CAGF,OAAI+b,GAAQC,CAAAA,CAER7a,GAAAA,CAAC6a,CAAAA,CAAA,CAAc,IAAA,CAAMD,CAAAA,CAAM,UAAU,OAAA,CAClC,QAAA,CAAAsmB,CAAAA,CACH,CAAA,CAIGA,CACT,CCpjBA,SAAS9G,EAAAA,CAAaC,CAAAA,CAAqB,CACzC,OAAIA,CAAAA,EAAO,GAAA,CAAkB,KAAKA,CAAAA,CAAM,GAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CACzDA,GAAO,GAAA,CAAc,CAAA,CAAA,EAAA,CAAKA,CAAAA,CAAM,GAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CAC9C,CAAA,CAAA,EAAIA,CAAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,EAC3B,CAEO,SAAS4K,EAAAA,CAAgB,CAAE,OAAA,CAAAC,CAAAA,CAAS,MAAAlD,CAAM,CAAA,CAAyB,CACxE,GAAM,CAAE,CAAA,CAAAnjC,CAAE,CAAA,CAAIa,cAAAA,EAAe,CAEvBs/B,CAAAA,CAAQ96B,OAAAA,CAAQ,IAAM,CAC1B,IAAI+9B,CAAAA,CAAY,CAAA,CACZC,CAAAA,CAAc,CAAA,CACZiD,CAAAA,CAAU,IAAI,GAAA,CAEpB,IAAA,IAAWtB,CAAAA,IAASqB,CAAAA,CAAS,CACvBrB,CAAAA,CAAM,YAAc,IAAA,EAAQA,CAAAA,CAAM,WAAa5B,CAAAA,GACjDA,CAAAA,CAAY4B,EAAM,UAAA,CAAA,CAEhBA,CAAAA,CAAM,eAAA,EAAmB,IAAA,GAC3B3B,CAAAA,EAAe2B,CAAAA,CAAM,iBAEvB,IAAA,IAAWuB,CAAAA,IAASvB,CAAAA,CAAM,OAAA,CACxBsB,CAAAA,CAAQ,GAAA,CAAI,OAAOC,CAAAA,CAAM,MAAA,EAAW,QAAA,CAAWA,CAAAA,CAAM,MAAA,CAAS,EAAE,EAEpE,CAEA,OAAO,CACL,KAAA,CAAOpD,CAAAA,EAASkD,CAAAA,CAAQ,OACxB,SAAA,CAAAjD,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,aAAA,CAAeiD,CAAAA,CAAQ,IACzB,CACF,CAAA,CAAG,CAACD,CAAAA,CAASlD,CAAK,CAAC,EAEnB,OACEliC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mHAAA,CACb,QAAA,CAAA,CAAAE,IAACqlC,EAAAA,CAAA,CACC,KAAA,CAAOxmC,CAAAA,CAAE,sCAAsC,CAAA,CAC/C,MAAOmgC,CAAAA,CAAM,KAAA,CAAM,cAAA,EAAe,CACpC,CAAA,CACAh/B,GAAAA,CAACslC,GAAA,EAAU,CAAA,CACXtlC,GAAAA,CAACqlC,EAAAA,CAAA,CACC,KAAA,CAAOxmC,EAAE,mCAAmC,CAAA,CAC5C,KAAA,CAAOu7B,EAAAA,CAAa4E,CAAAA,CAAM,WAAW,EACvC,CAAA,CACAh/B,GAAAA,CAACslC,EAAAA,CAAA,EAAU,CAAA,CACXtlC,GAAAA,CAACqlC,GAAA,CACC,KAAA,CAAOxmC,CAAAA,CAAE,qCAAqC,CAAA,CAC9C,KAAA,CAAO,IAAImgC,CAAAA,CAAM,SAAA,CAAY,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,OAC5C,cAAA,CAAe,gBAAA,CACjB,CAAA,CACAh/B,GAAAA,CAACslC,EAAAA,CAAA,EAAU,EACXtlC,GAAAA,CAACqlC,EAAAA,CAAA,CACC,KAAA,CAAOxmC,CAAAA,CAAE,iCAAiC,EAC1C,KAAA,CAAO,MAAA,CAAOmgC,CAAAA,CAAM,aAAa,CAAA,CACnC,CAAA,CAAA,CACF,CAEJ,CAEA,SAASqG,EAAAA,CAAS,CAChB,KAAA,CAAA1mC,CAAAA,CACA,MAAA4G,CAAAA,CACA,cAAA,CAAAggC,CAAAA,CAAiB,gBACnB,CAAA,CAIG,CACD,OACEzlC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,QAAK,SAAA,CAAU,kBAAA,CAAoB,QAAA,CAAA,CAAAnB,CAAAA,CAAM,GAAA,CAAA,CAAC,CAAA,CAC3CqB,IAAC,MAAA,CAAA,CAAK,SAAA,CAAW,CAAA,cAAA,EAAiBulC,CAAc,CAAA,CAAA,CAAK,QAAA,CAAAhgC,EAAM,CAAA,CAAA,CAC7D,CAEJ,CAEA,SAAS+/B,EAAAA,EAAY,CACnB,OAAOtlC,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mCAAA,CAAoC,QAAA,CAAA,GAAA,CAAC,CAC9D,CC/EA,SAAS+yB,EAAAA,CAAYxtB,CAAAA,CAAuB,CAC1C,OAAO,CAAA,EAAA,CAAIA,CAAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,MACpC,CAEA,SAASigC,EAAAA,CAAeta,CAAAA,CAAwB,CAC9C,OAAIA,GAAU,GAAA,CAAa,gBAAA,CACvBA,CAAAA,EAAU,GAAA,CAAa,iBAAA,CACpB,kBACT,CAEO,SAASua,EAAAA,CAAgB,CAC9B,MAAA,CAAAva,CAAAA,CACA,SAAA,CAAAwa,EACA,SAAA,CAAAjmC,CACF,CAAA,CAAyB,CACvB,GAAIyrB,CAAAA,EAAU,KAAM,OAAO,IAAA,CAE3B,IAAMya,CAAAA,CAASD,CAAAA,EAAa,IAAA,EAAQA,EAAY,CAAA,CAEhD,OACE5lC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,IAAAA,CAAG,4BAA6BN,CAAS,CAAA,CACvD,QAAA,CAAA,CAAAO,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAWD,KAAG,uBAAA,CAAyBylC,EAAAA,CAAeta,CAAM,CAAC,CAAA,CAChE,QAAA,CAAA6H,GAAY7H,CAAM,CAAA,CACrB,CAAA,CACCya,CAAAA,EACC7lC,IAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,2BAAA,CAA4B,QAAA,CAAA,CAAA,GAAA,CACxCizB,EAAAA,CAAY2S,CAAU,CAAA,CAAA,CAC1B,CAAA,CAAA,CAEJ,CAEJ,CC/BA,IAAME,EAAAA,CAAY,GACZ9iB,EAAAA,CAAa,EAAA,CACbC,EAAAA,CAAgB,EAAA,CAChB8iB,EAAAA,CAAoB,EAAA,CAQnB,SAASC,EAAAA,CAAe,CAC7B,aAAA,CAAA7hC,CAAAA,CACA,UAAA,CAAAI,CAAAA,CACA,WAAA0hC,CACF,CAAA,CAAwB,CACtB,GAAM,CAAE,CAAA,CAAAlnC,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB,CAACsmC,CAAAA,CAAaC,CAAc,EAAI1kC,QAAAA,CAAS,CAAC,CAAA,CAE1C,CACJ,IAAA,CAAM2kC,CAAAA,CACN,UAAWC,CAAAA,CACX,aAAA,CAAeC,CAAAA,CACf,WAAA,CAAaC,CAAAA,CACb,kBAAA,CAAoBC,CACtB,CAAA,CAAIrgB,iBAAAA,CAAkB,CACpB,MAAA,CAAQ,QAAA,CACR,MAAA,CAAQhiB,GAAiB,EAAA,CACzB,KAAA,CAAO,EACT,CAAC,CAAA,CAEK,CACJ,KAAMsiC,CAAAA,CACN,SAAA,CAAWC,CAAAA,CACX,aAAA,CAAeC,CAAAA,CACf,WAAA,CAAaC,EACb,kBAAA,CAAoBC,CACtB,CAAA,CAAI1gB,iBAAAA,CAAkB,CACpB,MAAA,CAAQ,aACR,MAAA,CAAQ5hB,CAAAA,EAAc,EAAA,CACtB,KAAA,CAAO,EACT,CAAC,EAEKiT,CAAAA,CAAY6uB,CAAAA,EAAiBK,CAAAA,CAC7BhvB,CAAAA,CAAiB8uB,CAAAA,EAAoBK,CAAAA,CACrC5hB,EAAcshB,CAAAA,EAAiBK,CAAAA,CAE/BE,CAAAA,CAAY1iC,OAAAA,CAAQ,IAAM,CAC9B,IAAMynB,CAAAA,CAAsB,EAAC,CAC7B,OAAIua,CAAAA,EAAY,KAAA,EACdva,EAAI,IAAA,CAAK,GAAGua,CAAAA,CAAW,KAAA,CAAM,OAAA,CAAS97B,CAAAA,EAAMA,EAAE,KAAK,CAAC,CAAA,CAClDm8B,CAAAA,EAAU,KAAA,EAAO5a,CAAAA,CAAI,KAAK,GAAG4a,CAAAA,CAAS,KAAA,CAAM,OAAA,CAASn8B,CAAAA,EAAMA,CAAAA,CAAE,KAAK,CAAC,CAAA,CACvEuhB,CAAAA,CAAI,IAAA,CAAK,CAAC7sB,CAAAA,CAAGC,KAAOA,CAAAA,CAAE,SAAA,EAAa,CAAA,GAAMD,CAAAA,CAAE,SAAA,EAAa,CAAA,CAAE,EACnD6sB,CACT,CAAA,CAAG,CAACua,CAAAA,CAAYK,CAAQ,CAAC,EAEnBM,CAAAA,CAAa,IAAA,CAAK,GAAA,CACtB,CAAA,CACA,IAAA,CAAK,IAAA,CAAKD,EAAU,MAAA,CAAShB,EAAS,CAAA,EAAK7gB,CAAAA,CAAc,CAAA,CAAI,CAAA,CAC/D,EACM+hB,CAAAA,CAAAA,CAAad,CAAAA,CAAc,CAAA,EAAKJ,EAAAA,CAChCmB,CAAAA,CAAaH,CAAAA,CAAU,MAAME,CAAAA,CAAWA,CAAAA,CAAYlB,EAAS,CAAA,CAE7DoB,CAAAA,CAAapnC,WAAAA,CAAY,IAAM,CACnCqmC,CAAAA,CAAgB77B,CAAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGA,EAAI,CAAC,CAAC,EAC1C,CAAA,CAAG,EAAE,EAEC68B,CAAAA,CAAarnC,WAAAA,CAAY,SAAY,CACnBomC,CAAAA,CAAcJ,EAAAA,EACfgB,EAAU,MAAA,EAAU7hB,CAAAA,GACnCshB,CAAAA,EAAe,MAAMD,CAAAA,EAAgB,CACrCM,GAAa,MAAMD,CAAAA,EAAc,CAAA,CAEvCR,CAAAA,CAAgB77B,CAAAA,EAAMA,CAAAA,CAAI,CAAC,EAC7B,CAAA,CAAG,CACD47B,CAAAA,CACAY,CAAAA,CAAU,MAAA,CACV7hB,EACAshB,CAAAA,CACAK,CAAAA,CACAN,CAAAA,CACAK,CACF,CAAC,CAAA,CAEKS,EAAYlB,CAAAA,CAAc,CAAA,CAC1BmB,CAAAA,CAAYnB,CAAAA,CAAcJ,EAAAA,CAAYgB,CAAAA,CAAU,QAAU7hB,CAAAA,CAEhE,GAAIzN,CAAAA,CAAW,OAAOtX,GAAAA,CAAC+jB,EAAAA,CAAA,CAAY,MAAA,CAAQgiB,CAAAA,CAAY,CAAA,CAEvD,GAAIa,CAAAA,CAAU,MAAA,GAAW,GAAK,CAAC7hB,CAAAA,CAC7B,OACE/kB,GAAAA,CAACgkB,EAAAA,CAAA,CACC,QAASnlB,CAAAA,CAAE,2BAA2B,CAAA,CACtC,MAAA,CAAQknC,CAAAA,CACV,CAAA,CAIJ,IAAMqB,EAAAA,CAAgBrB,CAAAA,CAAahjB,EAAAA,CAAgB8iB,EAAAA,CAEnD,OACE/lC,IAAAA,CAAC,OAAI,SAAA,CAAU,eAAA,CAAgB,KAAA,CAAO,CAAE,MAAA,CAAQimC,CAAW,EAEzD,QAAA,CAAA,CAAAjmC,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,iGAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAQijB,EAAc,CAAA,CAE/B,QAAA,CAAA,CAAA/iB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,uBAAA,CACZ,QAAA,CAAAnB,CAAAA,CAAE,uBAAuB,CAAA,CAC5B,CAAA,CACAmB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,aAAA,CAAe,QAAA,CAAAnB,CAAAA,CAAE,wBAAwB,EAAE,CAAA,CAC1DmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,aAAA,CAAe,QAAA,CAAAnB,EAAE,wBAAwB,CAAA,CAAE,CAAA,CAC1DmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBACZ,QAAA,CAAAnB,CAAAA,CAAE,uBAAuB,CAAA,CAC5B,CAAA,CACAmB,GAAAA,CAAC,OAAI,SAAA,CAAU,4BAAA,CACZ,QAAA,CAAAnB,CAAAA,CAAE,iCAAiC,CAAA,CACtC,EACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CAA0B,QAAA,CAAAnB,CAAAA,CAAE,qBAAqB,CAAA,CAAE,CAAA,CAClEmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CAA0B,SAAAnB,CAAAA,CAAE,qBAAqB,CAAA,CAAE,CAAA,CAClEmB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,eAAA,CAAgB,CAAA,CAAA,CACjC,CAAA,CAGAF,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,kCACV,KAAA,CAAO,CAAE,MAAA,CAAQsnC,EAAc,CAAA,CAE9B,QAAA,CAAA,CAAAL,EAAW,GAAA,CAAI,CAAC3gB,CAAAA,CAAOvlB,CAAAA,GACtBb,GAAAA,CAACqnC,EAAAA,CAAA,CAEC,KAAA,CAAOjhB,CAAAA,CAAAA,CADFA,CAAAA,CAAM,EAAA,EAAM,CAAA,EAAG0gB,CAAAA,CAAYjmC,CAAC,CAAA,CAEnC,CACD,CAAA,CACA2W,CAAAA,EACCxX,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,uCAAA,CACb,QAAA,CAAAA,GAAAA,CAACghB,OAAAA,CAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,CACrB,CAAA,CAAA,CAEJ,CAAA,CAGAlhB,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,4DACV,KAAA,CAAO,CAAE,MAAA,CAAQ+lC,EAAkB,CAAA,CAEnC,QAAA,CAAA,CAAA/lC,KAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAA,CAAU,CAAConC,CAAAA,CACX,QAASF,CAAAA,CACT,SAAA,CAAWjnC,IAAAA,CACT,kEAAA,CACAmnC,CAAAA,CACI,oCAAA,CACA,oCACN,CAAA,CACD,QAAA,CAAA,CAAA,SAAA,CACIroC,CAAAA,CAAE,0BAA0B,CAAA,CAAA,CACjC,CAAA,CAEC,MAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,IAAA,CAAK,GAAA,CAAIgoC,CAAAA,CAAY,CAAC,CAAE,CAAA,CAAG,CAACjmC,CAAAA,CAAGC,CAAAA,GAAM,CACzD,IAAMmX,CAAAA,CAAOnX,CAAAA,CAAI,CAAA,CACjB,OACEb,GAAAA,CAAC,QAAA,CAAA,CAEC,KAAK,QAAA,CACL,OAAA,CAAS,IAAMimC,CAAAA,CAAejuB,CAAI,CAAA,CAClC,UAAWjY,IAAAA,CACT,0DAAA,CACAiY,CAAAA,GAASguB,CAAAA,CACL,8CAAA,CACA,oCACN,EAEC,QAAA,CAAAhuB,CAAAA,CAAAA,CAVIA,CAWP,CAEJ,CAAC,CAAA,CAEDlY,KAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAA,CAAU,CAACqnC,CAAAA,CACX,QAASF,CAAAA,CACT,SAAA,CAAWlnC,IAAAA,CACT,kEAAA,CACAonC,CAAAA,CACI,oCAAA,CACA,oCACN,CAAA,CAEC,QAAA,CAAA,CAAAtoC,CAAAA,CAAE,sBAAsB,CAAA,CAAE,SAAA,CAAA,CAC7B,GACF,CAAA,CAGAmB,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,oDAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAQ+lC,CAAAA,CAAaF,EAAkB,CAAA,CAE/C,QAAA,CAAAkB,CAAAA,CAAW,IAAI,CAAC3gB,CAAAA,CAAOvlB,CAAAA,GACtBb,GAAAA,CAACsnC,EAAAA,CAAA,CAAmD,MAAOlhB,CAAAA,CAAAA,CAAzCA,CAAAA,CAAM,EAAA,EAAM,CAAA,EAAA,EAAK0gB,CAAAA,CAAYjmC,CAAC,EAAkB,CACnE,CAAA,CACH,CAAA,CAGAf,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,4DACV,KAAA,CAAO,CAAE,MAAA,CAAQ+lC,EAAkB,CAAA,CAEnC,QAAA,CAAA,CAAA7lC,IAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAA,CAAU,CAACknC,CAAAA,CACX,QAASF,CAAAA,CACT,SAAA,CAAWjnC,IAAAA,CACT,wBAAA,CACAmnC,CAAAA,CACI,oCAAA,CACA,oCACN,CAAA,CACD,QAAA,CAAA,QAAA,CAED,CAAA,CACAlnC,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uCACb,QAAA,CAAAgmC,CAAAA,CACH,CAAA,CACAhmC,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,QAAA,CAAU,CAACmnC,CAAAA,CACX,OAAA,CAASF,CAAAA,CACT,SAAA,CAAWlnC,KACT,wBAAA,CACAonC,CAAAA,CACI,oCAAA,CACA,oCACN,CAAA,CACD,QAAA,CAAA,QAAA,CAED,GACF,CAAA,CAAA,CACF,CAEJ,CAMA,SAASE,EAAAA,CAAiB,CAAE,MAAAjhB,CAAM,CAAA,CAA4B,CAC5D,GAAM,CAAE,CAAE,CAAA,CAAI1mB,cAAAA,EAAe,CACvBqmB,CAAAA,CAAQK,CAAAA,CAAM,IAAA,EAAM,aAAY,GAAM,KAAA,CACtClY,CAAAA,CAAQkY,CAAAA,CAAM,KAAA,EAAS,CAAA,CACvBG,EAAUH,CAAAA,CAAM,QAAA,EAAY,CAAA,CAC5BmhB,CAAAA,CAAcC,EAAAA,CAAephB,CAAAA,CAAM,KAAM,CAAC,CAAA,CAE1CqhB,CAAAA,CAAY1hB,CAAAA,CACZ2hB,CAAAA,CAAcD,CAAAA,CAAY,IAAM,GAAA,CAChCE,CAAAA,CAAeF,CAAAA,CAAY,cAAA,CAAiB,iBAAA,CAE5CG,CAAAA,CAAaxhB,EAAM,KAAA,EAAO,KAAA,EAASA,CAAAA,CAAM,MAAA,EAAQ,QAAA,EAAY,QAAA,CAC7DyhB,EAAazhB,CAAAA,CAAM,KAAA,EAAO,SAAA,CAC1B5U,CAAAA,CAAe4U,CAAAA,CAAM,OAAA,EAAW,GAChCC,CAAAA,CAAUC,EAAAA,CAAgBF,CAAAA,CAAM,SAAS,CAAA,CAEzC0hB,CAAAA,CAAQC,GAAS3hB,CAAK,CAAA,CAEtB4hB,CAAAA,CAAWC,EAAAA,CAAW7hB,CAAK,CAAA,CAC3B8hB,EAAWC,EAAAA,CAAW/hB,CAAK,CAAA,CAEjC,OACEtmB,IAAAA,CAAC,KAAA,CAAA,CACC,UAAU,4FAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAQgjB,EAAW,CAAA,CAG5B,UAAA9iB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAAF,IAAAA,CAAC,OAAI,SAAA,CAAU,mCAAA,CACZ,QAAA,CAAA,CAAA+nC,CAAAA,EACC7nC,GAAAA,CAAC,KAAA,CAAA,CACC,IAAK6nC,CAAAA,CACL,GAAA,CAAI,EAAA,CACJ,SAAA,CAAU,4CAAA,CACZ,CAAA,CAEF/nC,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,8CAAA,CACb,QAAA,CAAA4nC,CAAAA,CACH,CAAA,CACA9nC,IAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,0BAAA,CACb,QAAA,CAAA,CAAA0R,CAAAA,EAAgBxR,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,OAAQ,QAAA,CAAAwR,CAAAA,CAAa,CAAA,CACtDxR,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAqmB,EAAQ,CAAA,CAAA,CACjB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAGArmB,GAAAA,CAAC,OAAI,SAAA,CAAU,aAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAWD,KACT,qBAAA,CACAgmB,CAAAA,CAAQ,cAAA,CAAiB,aAC3B,CAAA,CAEC,QAAA,CAAQ,EAARA,CAAAA,CAAU,qBAAA,CAA2B,sBAAN,CAAA,CAClC,CAAA,CACF,CAAA,CAGA/lB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qCAAA,CAAuC,QAAA,CAAAunC,CAAAA,CAAY,CAAA,CAGlEvnC,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACZ,QAAA,CAAA+yB,EAAAA,CAAY7kB,CAAK,EACpB,CAAA,CAGAlO,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWD,IAAAA,CAAG,sCAAA,CAAwC4nC,CAAY,CAAA,CACpE,QAAA,CAAAphB,CAAAA,CAAU,CAAA,CACTzmB,IAAAA,CAAAkS,QAAAA,CAAA,CACG,QAAA,CAAA,CAAA01B,CAAAA,CAAY,GAAA,CAAEnhB,CAAAA,CAAQ,OAAA,CAAQ,CAAC,GAClC,CAAA,CAEA,QAAA,CAEJ,CAAA,CAGAvmB,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWD,KACT,kCAAA,CACAioC,CAAAA,GAAa,IAAA,CACTA,CAAAA,EAAY,CAAA,CACV,cAAA,CACA,cACF,cACN,CAAA,CAEC,QAAA,CAAAA,CAAAA,GAAa,IAAA,CACV,CAAA,EAAGA,GAAY,CAAA,CAAI,GAAA,CAAM,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAIA,CAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAC7D,QAAA,CACN,EAGAhoC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+CAAA,CACZ,QAAA,CAAAkoC,CAAAA,GAAa,KAAO,CAAA,CAAA,EAAIA,CAAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAK,SACnD,CAAA,CAGAloC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CACZ,QAAA,CAAA8nC,GACC9nC,GAAAA,CAAC,GAAA,CAAA,CACC,IAAA,CAAM8nC,CAAAA,CACN,MAAA,CAAO,QAAA,CACP,IAAI,qBAAA,CACJ,SAAA,CAAU,sDAAA,CACV,YAAA,CAAW,kBAAA,CAEX,QAAA,CAAA9nC,IAACooC,EAAAA,CAAA,EAAiB,CAAA,CACpB,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CAMA,SAASd,EAAAA,CAAY,CAAE,KAAA,CAAAlhB,CAAM,CAAA,CAA4B,CACvD,GAAM,CAAE,CAAE,CAAA,CAAI1mB,cAAAA,EAAe,CACvBqmB,EAAQK,CAAAA,CAAM,IAAA,EAAM,WAAA,EAAY,GAAM,KAAA,CACtClY,CAAAA,CAAQkY,EAAM,KAAA,EAAS,CAAA,CACvBG,CAAAA,CAAUH,CAAAA,CAAM,QAAA,EAAY,CAAA,CAC5BmhB,EAAcC,EAAAA,CAAephB,CAAAA,CAAM,IAAA,CAAM,CAAC,CAAA,CAC1CwhB,CAAAA,CAAaxhB,EAAM,KAAA,EAAO,KAAA,EAASA,CAAAA,CAAM,MAAA,EAAQ,QAAA,EAAY,QAAA,CAC7DC,EAAUC,EAAAA,CAAgBF,CAAAA,CAAM,SAAS,CAAA,CACzC0hB,CAAAA,CAAQC,EAAAA,CAAS3hB,CAAK,CAAA,CAE5B,OACEtmB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qEAAA,CACb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wCAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,OAAI,SAAA,CAAU,iCAAA,CACZ,QAAA,CAAA,CAAAsmB,CAAAA,CAAM,KAAA,EAAO,SAAA,EACZpmB,IAAC,KAAA,CAAA,CACC,GAAA,CAAKomB,CAAAA,CAAM,KAAA,CAAM,SAAA,CACjB,GAAA,CAAI,GACJ,SAAA,CAAU,4CAAA,CACZ,CAAA,CAEFpmB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mDACb,QAAA,CAAA4nC,CAAAA,CACH,CAAA,CAAA,CACF,CAAA,CACA5nC,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,4CAAA,CACb,QAAA,CAAAqmB,CAAAA,CACH,CAAA,CAAA,CACF,CAAA,CACAvmB,IAAAA,CAAC,OAAI,SAAA,CAAU,2CAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAA,CAAgB,QAAA,CAAA,CAAA,CAAE,wBAAwB,CAAA,CAAE,CAAA,CAC5DA,GAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAWD,IAAAA,CACT,cACAgmB,CAAAA,CAAQ,cAAA,CAAiB,aAC3B,CAAA,CAEC,QAAA,CAAQ,CAAA,CAARA,EAAU,qBAAA,CAA2B,sBAAN,CAAA,CAClC,CAAA,CAAA,CACF,CAAA,CACAjmB,IAAAA,CAAC,OAAI,SAAA,CAAU,eAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eAAgB,QAAA,CAAA,CAAA,CAAE,wBAAwB,CAAA,CAAE,CAAA,CAC5DA,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,iBAAA,CAAmB,QAAA,CAAAunC,CAAAA,CAAY,CAAA,CAAA,CACjD,CAAA,CACAznC,IAAAA,CAAC,OAAI,SAAA,CAAU,eAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eAAgB,QAAA,CAAA,CAAA,CAAE,uBAAuB,CAAA,CAAE,CAAA,CAC3DA,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,2BAAA,CACb,QAAA,CAAA+yB,EAAAA,CAAY7kB,CAAK,CAAA,CACpB,CAAA,CAAA,CACF,EACApO,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,QAAK,SAAA,CAAU,cAAA,CACb,QAAA,CAAA,CAAA,CAAE,iCAAiC,CAAA,CACtC,CAAA,CACAA,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,2BAAA,CACb,QAAA,CAAAumB,CAAAA,CAAU,CAAA,CAAI,IAAIA,CAAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAK,QAAA,CAC5C,GACF,CAAA,CACCuhB,CAAAA,EACC9nC,GAAAA,CAAC,GAAA,CAAA,CACC,IAAA,CAAM8nC,CAAAA,CACN,OAAO,QAAA,CACP,GAAA,CAAI,qBAAA,CACJ,SAAA,CAAU,8DAAA,CAEV,QAAA,CAAA9nC,IAACooC,EAAAA,CAAA,EAAiB,CAAA,CACpB,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CAMA,SAASZ,EAAAA,CAAep+B,CAAAA,CAAiB,CAAA,CAAoC,CAC3E,OAAQA,GACN,KAAK,OAAA,CACH,OAAO,CAAA,CAAE,wBAAwB,EACnC,KAAK,QAAA,CACH,OAAO,CAAA,CAAE,yBAAyB,CAAA,CACpC,KAAK,OAAA,CACL,KAAK,OAAA,CACL,KAAK,YAAA,CACH,OAAO,EAAE,yBAAyB,CAAA,CACpC,QACE,OAAOA,CACX,CACF,CAEA,SAAS2+B,EAAAA,CAAS3hB,CAAAA,CAAyC,CACzD,GAAKA,CAAAA,CAAM,QACX,OAAIA,CAAAA,CAAM,MAAA,GAAW,YAAA,CACZ,CAAA,2BAAA,EAA8BA,CAAAA,CAAM,OAAO,CAAA,CAAA,CAE7C,CAAA,sBAAA,EAAyBA,CAAAA,CAAM,OAAO,CAAA,CAC/C,CAEA,SAAS6hB,EAAAA,CAAW7hB,CAAAA,CAAoC,CACtD,IAAM+T,CAAAA,CAAO/T,CAAAA,CAAM,cACnB,GAAI+T,CAAAA,CAAM,CACR,IAAM/V,CAAAA,CACJ+V,CAAAA,CAAK,KACLA,CAAAA,CAAK,MAAA,EACLA,CAAAA,CAAK,YAAA,EACLA,CAAAA,CAAK,WAAW,EAClB,GAAI,OAAO/V,CAAAA,EAAQ,QAAA,CAAU,OAAOA,CAAAA,CACpC,GAAI,OAAOA,CAAAA,EAAQ,QAAA,EAAYA,CAAAA,GAAQ,EAAA,CAAI,CACzC,IAAMikB,CAAAA,CAAS,UAAA,CAAWjkB,CAAG,CAAA,CAC7B,GAAI,CAAC,OAAO,KAAA,CAAMikB,CAAM,CAAA,CAAG,OAAOA,CACpC,CACF,CACA,OAAIjiB,CAAAA,CAAM,IAAA,GAAS,QAAA,EAAYA,CAAAA,CAAM,QAAA,EAAY,KACxCA,CAAAA,CAAM,QAAA,CAER,IACT,CAEA,SAAS+hB,EAAAA,CAAW/hB,EAAoC,CACtD,IAAM+T,CAAAA,CAAO/T,CAAAA,CAAM,aAAA,CACnB,GAAI+T,EAAM,CACR,IAAMmO,CAAAA,CACJnO,CAAAA,CAAK,GAAA,EAAUA,CAAAA,CAAK,MAAWA,CAAAA,CAAK,WAAA,EAAkBA,CAAAA,CAAK,WAAW,CAAA,CACxE,GAAI,OAAOmO,CAAAA,EAAQ,QAAA,CAAU,OAAOA,CAAAA,CACpC,GAAI,OAAOA,GAAQ,QAAA,EAAYA,CAAAA,GAAQ,EAAA,CAAI,CACzC,IAAMD,CAAAA,CAAS,WAAWC,CAAG,CAAA,CAC7B,GAAI,CAAC,MAAA,CAAO,KAAA,CAAMD,CAAM,CAAA,CAAG,OAAOA,CACpC,CACF,CACA,OAAO,IACT,CAEA,SAASD,EAAAA,EAAmB,CAC1B,OACEtoC,IAAAA,CAAC,OACC,KAAA,CAAM,IAAA,CACN,MAAA,CAAO,IAAA,CACP,OAAA,CAAQ,WAAA,CACR,KAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,QACd,cAAA,CAAe,OAAA,CAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,2DAA2D,CAAA,CACnEA,GAAAA,CAAC,UAAA,CAAA,CAAS,MAAA,CAAO,gBAAA,CAAiB,CAAA,CAClCA,IAAC,MAAA,CAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,KAAK,EAAA,CAAG,GAAA,CAAI,CAAA,CAAA,CACvC,CAEJ,CAEA,SAASgkB,GAAW,CAAE,OAAA,CAAAwC,CAAAA,CAAS,MAAA,CAAAuU,CAAO,CAAA,CAAwC,CAC5E,OACE/6B,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,uDAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAA+6B,CAAO,CAAA,CAEf,QAAA,CAAAvU,CAAAA,CACH,CAEJ,CAEA,SAASzC,EAAAA,CAAY,CAAE,MAAA,CAAAgX,CAAO,CAAA,CAAuB,CACnD,OACE/6B,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,0CAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAA+6B,CAAO,CAAA,CAEf,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,OAAQ,CAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAACn6B,CAAAA,CAAGC,IACjCb,GAAAA,CAACc,QAAAA,CAAA,CAAiB,SAAA,CAAU,wBAAA,CAAA,CAAbD,CAAsC,CACtD,CAAA,CACH,CAEJ,CAEA,SAASkyB,EAAAA,CAAY7kB,CAAAA,CAAuB,CAC1C,IAAMuY,CAAAA,CAAQvY,CAAAA,CAAQ,GAAA,CACtB,OAAIuY,CAAAA,CAAQ,GAAKA,CAAAA,CAAQ,CAAA,CAAU,SAAA,CAC5B,CAAA,EAAGA,CAAAA,CAAM,OAAA,CAAQA,EAAQ,CAAA,GAAM,CAAA,CAAI,CAAA,CAAI,CAAC,CAAC,CAAA,IAAA,CAClD,CAEA,SAASH,EAAAA,CAAgBI,CAAAA,CAA6B,CACpD,IAAMC,CAAAA,CAAO,IAAI,IAAA,CAAKD,CAAAA,CAAc,GAAI,CAAA,CAClCI,CAAAA,CAAQH,CAAAA,CAAK,UAAS,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,EAClDI,CAAAA,CAAOJ,CAAAA,CAAK,UAAA,EAAW,CAAE,QAAA,EAAS,CAAE,SAAS,CAAA,CAAG,GAAG,CAAA,CACnDE,CAAAA,CAAMF,CAAAA,CAAK,OAAA,GAAU,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAA,CAC/CC,GAASD,CAAAA,CAAK,QAAA,EAAS,CAAI,CAAA,EAAG,QAAA,EAAS,CAAE,SAAS,CAAA,CAAG,GAAG,CAAA,CACxDyM,CAAAA,CAAOzM,CAAAA,CAAK,WAAA,GACZ4hB,CAAAA,CAAK5hB,CAAAA,CAAK,iBAAA,EAAkB,CAC5B6hB,CAAAA,CAASD,CAAAA,EAAM,EAAI,GAAA,CAAM,GAAA,CACzBxU,CAAAA,CAAU,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAK,KAAA,CAAMwU,CAAAA,CAAK,EAAE,CAAC,CAAC,CAAA,CAAE,SAAS,CAAA,CAAG,GAAG,CAAA,CACrE,OAAO,CAAA,EAAGzhB,CAAK,IAAIC,CAAI,CAAA,CAAA,EAAIF,CAAG,CAAA,CAAA,EAAID,CAAK,CAAA,CAAA,EAAIwM,CAAI,CAAA,EAAA,EAAKoV,CAAM,CAAA,EAAGzU,CAAO,CAAA,CAAA,CACtE,CCpjBA,IAAM6R,EAAAA,CAAY,EAAA,CACZ9iB,GAAa,EAAA,CACbC,EAAAA,CAAgB,EAAA,CAChB8iB,EAAAA,CAAoB,EAAA,CAQnB,SAAS4C,GAAc,CAC5B,aAAA,CAAAxkC,CAAAA,CACA,UAAA,CAAAI,CAAAA,CACA,UAAA,CAAA0hC,CACF,CAAA,CAAuB,CACrB,GAAM,CAAE,CAAA,CAAAlnC,CAAE,EAAIa,cAAAA,EAAe,CACvBulB,CAAAA,CAAiBC,cAAAA,EAAe,CAChC,CAAC8gB,EAAaC,CAAc,CAAA,CAAI1kC,QAAAA,CAAS,CAAC,CAAA,CAE1C,CACJ,KAAM2kC,CAAAA,CACN,SAAA,CAAWC,CAAAA,CACX,aAAA,CAAeC,CAAAA,CACf,WAAA,CAAaC,EACb,kBAAA,CAAoBC,CACtB,CAAA,CAAIthB,iBAAAA,CAAkB,CACpB,MAAA,CAAQ,SACR,cAAA,CAAgB/gB,CAAAA,EAAiB,EACnC,CAAC,CAAA,CAEK,CACJ,KAAMsiC,CAAAA,CACN,SAAA,CAAWC,CAAAA,CACX,aAAA,CAAeC,CAAAA,CACf,WAAA,CAAaC,EACb,kBAAA,CAAoBC,CACtB,CAAA,CAAI3hB,iBAAAA,CAAkB,CACpB,MAAA,CAAQ,aACR,cAAA,CAAgB3gB,CAAAA,EAAc,EAChC,CAAC,CAAA,CAEKiT,CAAAA,CAAY6uB,GAAiBK,CAAAA,CAC7BhvB,CAAAA,CAAiB8uB,CAAAA,EAAoBK,CAAAA,CACrC5hB,CAAAA,CAAcshB,CAAAA,EAAiBK,EAE/BvhB,CAAAA,CAASjhB,OAAAA,CAAQ,IAAM,CAC3B,IAAMynB,CAAAA,CAAsB,EAAC,CACvBtG,EAAAA,CAAe,IAAI,GAAA,CAAI,CAAC,MAAA,CAAQ,OAAQ,WAAA,CAAa,SAAS,CAAC,CAAA,CACrE,OAAI6gB,CAAAA,EAAY,OACdva,CAAAA,CAAI,IAAA,CACF,GAAGua,CAAAA,CAAW,KAAA,CACX,OAAA,CAAS97B,IAAMA,EAAAA,CAAE,KAAK,CAAA,CACtB,MAAA,CAAQlB,EAAAA,EAAMmc,EAAAA,CAAa,IAAInc,EAAAA,CAAE,MAAM,CAAC,CAC7C,CAAA,CAEEq9B,CAAAA,EAAU,OACZ5a,CAAAA,CAAI,IAAA,CACF,GAAG4a,CAAAA,CAAS,KAAA,CACT,OAAA,CAASn8B,IAAMA,EAAAA,CAAE,KAAK,CAAA,CACtB,MAAA,CAAQlB,EAAAA,EAAMmc,EAAAA,CAAa,IAAInc,EAAAA,CAAE,MAAM,CAAC,CAC7C,CAAA,CAEKyiB,CACT,EAAG,CAACua,CAAAA,CAAYK,CAAQ,CAAC,CAAA,CAEnBhhB,CAAAA,CAAe3lB,YAClB4lB,CAAAA,EAAwB,CACvBP,CAAAA,CAAe,MAAA,CAAO,CAAE,MAAA,CAAQO,EAAM,MAAA,CAAQ,EAAA,CAAIA,CAAAA,CAAM,EAAG,CAAC,EAC9D,EACA,CAACP,CAAc,CACjB,CAAA,CAEM4hB,CAAAA,CAAa,IAAA,CAAK,IACtB,CAAA,CACA,IAAA,CAAK,IAAA,CAAK1hB,CAAAA,CAAO,MAAA,CAASygB,EAAS,GAAK7gB,CAAAA,CAAc,CAAA,CAAI,CAAA,CAC5D,CAAA,CACM+hB,CAAAA,CAAAA,CAAad,CAAAA,CAAc,GAAKJ,EAAAA,CAChC8C,CAAAA,CAAavjB,CAAAA,CAAO,KAAA,CAAM2hB,CAAAA,CAAWA,CAAAA,CAAYlB,EAAS,CAAA,CAE1DoB,CAAAA,CAAapnC,WAAAA,CAAY,IAAM,CACnCqmC,CAAAA,CAAgB77B,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,CAAC,CAAC,EAC1C,CAAA,CAAG,EAAE,CAAA,CAEC68B,CAAAA,CAAarnC,WAAAA,CAAY,SAAY,CACnBomC,CAAAA,CAAcJ,EAAAA,EACfzgB,CAAAA,CAAO,MAAA,EAAUJ,CAAAA,GAChCshB,GAAe,MAAMD,CAAAA,EAAgB,CACrCM,CAAAA,EAAa,MAAMD,CAAAA,IAEzBR,CAAAA,CAAgB77B,EAAAA,EAAMA,EAAAA,CAAI,CAAC,EAC7B,CAAA,CAAG,CACD47B,CAAAA,CACA7gB,CAAAA,CAAO,MAAA,CACPJ,CAAAA,CACAshB,CAAAA,CACAK,CAAAA,CACAN,EACAK,CACF,CAAC,CAAA,CAEKS,EAAAA,CAAYlB,CAAAA,CAAc,CAAA,CAC1BmB,EAAYnB,CAAAA,CAAcJ,EAAAA,CAAYzgB,CAAAA,CAAO,MAAA,EAAUJ,CAAAA,CAE7D,GAAIzN,EAAW,OAAOtX,GAAAA,CAAC+jB,EAAAA,CAAA,CAAY,MAAA,CAAQgiB,CAAAA,CAAY,EAEvD,GAAI5gB,CAAAA,CAAO,MAAA,GAAW,CAAA,EAAK,CAACJ,CAAAA,CAC1B,OACE/kB,GAAAA,CAACgkB,EAAAA,CAAA,CAAW,OAAA,CAASnlB,CAAAA,CAAE,0BAA0B,EAAG,MAAA,CAAQknC,CAAAA,CAAY,CAAA,CAI5E,IAAMqB,CAAAA,CAAgBrB,CAAAA,CAAahjB,GAAgB8iB,EAAAA,CAEnD,OACE/lC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CAAgB,MAAO,CAAE,MAAA,CAAQimC,CAAW,CAAA,CAEzD,QAAA,CAAA,CAAAjmC,IAAAA,CAAC,OACC,SAAA,CAAU,iGAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAQijB,EAAc,EAE/B,QAAA,CAAA,CAAA/iB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACZ,QAAA,CAAAnB,EAAE,uBAAuB,CAAA,CAC5B,CAAA,CACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAe,QAAA,CAAAnB,CAAAA,CAAE,wBAAwB,CAAA,CAAE,CAAA,CAC1DmB,GAAAA,CAAC,OAAI,SAAA,CAAU,aAAA,CAAe,QAAA,CAAAnB,CAAAA,CAAE,sBAAsB,CAAA,CAAE,EACxDmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CACZ,QAAA,CAAAnB,CAAAA,CAAE,2BAA2B,CAAA,CAChC,CAAA,CACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CACZ,SAAAnB,CAAAA,CAAE,sBAAsB,CAAA,CAC3B,CAAA,CAAA,CACF,CAAA,CAGAiB,IAAAA,CAAC,OACC,SAAA,CAAU,iCAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAQsnC,CAAc,EAE9B,QAAA,CAAA,CAAAsB,CAAAA,CAAW,GAAA,CAAKljB,CAAAA,EACfxlB,GAAAA,CAAC2oC,EAAAA,CAAA,CAEC,KAAA,CAAOnjB,CAAAA,CACP,QAAA,CAAUD,CAAAA,CAAAA,CAFLC,CAAAA,CAAM,EAGb,CACD,CAAA,CACAhO,CAAAA,EACCxX,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uCAAA,CACb,SAAAA,GAAAA,CAACghB,OAAAA,CAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAA,CACrB,GAEJ,CAAA,CAGAhhB,GAAAA,CAAC4oC,EAAAA,CAAA,CACC,SAAA,CAAU,gBAAA,CACV,YAAa5C,CAAAA,CACb,UAAA,CAAYa,CAAAA,CACZ,SAAA,CAAWK,EAAAA,CACX,SAAA,CAAWC,EACX,MAAA,CAAQH,CAAAA,CACR,MAAA,CAAQC,CAAAA,CACR,MAAA,CAAQhB,CAAAA,CACR,EAAGpnC,CAAAA,CACL,CAAA,CAGAmB,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,oDAAA,CACV,MAAO,CAAE,MAAA,CAAQ+lC,CAAAA,CAAaF,EAAkB,CAAA,CAE/C,QAAA,CAAA6C,EAAW,GAAA,CAAKljB,CAAAA,EACfxlB,GAAAA,CAAC6oC,EAAAA,CAAA,CAAyB,KAAA,CAAOrjB,EAAO,QAAA,CAAUD,CAAAA,CAAAA,CAAlCC,CAAAA,CAAM,EAA0C,CACjE,CAAA,CACH,EAGAxlB,GAAAA,CAAC4oC,EAAAA,CAAA,CACC,SAAA,CAAU,WAAA,CACV,WAAA,CAAa5C,EACb,UAAA,CAAYa,CAAAA,CACZ,SAAA,CAAWK,EAAAA,CACX,SAAA,CAAWC,CAAAA,CACX,OAAQH,CAAAA,CACR,MAAA,CAAQC,CAAAA,CACR,MAAA,CAAQhB,CAAAA,CACR,CAAA,CAAGpnC,EACH,OAAA,CAAO,IAAA,CACT,CAAA,CAAA,CACF,CAEJ,CAMA,SAAS8pC,GAAe,CACtB,KAAA,CAAAnjB,CAAAA,CACA,QAAA,CAAAI,CACF,CAAA,CAGG,CACD,GAAM,CAAE,CAAA,CAAA/mB,CAAE,CAAA,CAAIa,cAAAA,GACRqmB,CAAAA,CAAQP,CAAAA,CAAM,IAAA,GAAS,KAAA,CACvBtX,CAAAA,CAAQsX,CAAAA,CAAM,MAAQ,UAAA,CAAWA,CAAAA,CAAM,KAAK,CAAA,CAAI,CAAA,CAChDsjB,CAAAA,CAAOtjB,EAAM,SAAA,CACf,UAAA,CAAWA,CAAAA,CAAM,SAAS,CAAA,CAC1BtX,CAAAA,CAAQ,WAAWsX,CAAAA,CAAM,aAAA,EAAiB,GAAG,CAAA,CAEjD,OACE1lB,IAAAA,CAAC,OACC,SAAA,CAAU,4FAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAQgjB,EAAW,EAG5B,QAAA,CAAA,CAAA9iB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAAA,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,sCAAA,CACb,QAAA,CAAAwlB,CAAAA,CAAM,OAAA,EAAWA,CAAAA,CAAM,SAAA,EAAa,SACvC,CAAA,CACF,CAAA,CACF,CAAA,CAGAxlB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cACb,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAWD,IAAAA,CACT,qBAAA,CACAgmB,EAAQ,cAAA,CAAiB,aAC3B,CAAA,CAEC,QAAA,CAAQlnB,CAAAA,CAARknB,CAAAA,CAAU,sBAA2B,sBAAN,CAAA,CAClC,CAAA,CACF,CAAA,CAGA/lB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,6CAAA,CACZ,QAAA,CAAAwlB,CAAAA,CAAM,UAAA,EAAc,OAAA,CACvB,CAAA,CAGAxlB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACZ,QAAA,CAAAkO,CAAAA,CAAQ,CAAA,CAAI6kB,GAAY7kB,CAAK,CAAA,CAAI,QAAA,CACpC,CAAA,CAGAlO,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,kDAAA,CACZ,QAAA,CAAA8oC,CAAAA,CAAO,CAAA,CAAI,CAAA,CAAA,EAAIA,CAAAA,CAAK,QAAQ,CAAC,CAAC,CAAA,CAAA,CAAK,QAAA,CACtC,CAAA,CAAA,CACF,CAEJ,CAMA,SAASD,EAAAA,CAAU,CACjB,KAAA,CAAArjB,CAAAA,CACA,QAAA,CAAAI,CACF,CAAA,CAGG,CACD,GAAM,CAAE,CAAA,CAAA/mB,CAAE,EAAIa,cAAAA,EAAe,CACvBqmB,CAAAA,CAAQP,CAAAA,CAAM,IAAA,GAAS,KAAA,CACvBtX,EAAQsX,CAAAA,CAAM,KAAA,CAAQ,UAAA,CAAWA,CAAAA,CAAM,KAAK,CAAA,CAAI,EAEtD,OACE1lB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qEAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,yBAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAWD,IAAAA,CACT,4CACAgmB,CAAAA,CAAQ,4BAAA,CAA+B,0BACzC,CAAA,CAEC,QAAA,CAAAP,CAAAA,CAAM,KACT,CAAA,CACAxlB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oCAAA,CACb,QAAA,CAAAwlB,EAAM,OAAA,EAAW,QAAA,CACpB,CAAA,CAAA,CACF,CAAA,CACAxlB,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,iCAAA,CACb,QAAA,CAAAwlB,CAAAA,CAAM,UAAA,EAAc,OAAA,CACvB,CAAA,CAAA,CACF,EACA1lB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,OAAI,SAAA,CAAU,eAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eAAgB,QAAA,CAAAnB,CAAAA,CAAE,2BAA2B,CAAA,CAAE,CAAA,CAC/DmB,GAAAA,CAAC,QAAK,SAAA,CAAU,2BAAA,CACb,QAAA,CAAAkO,CAAAA,CAAQ,CAAA,CAAI6kB,EAAAA,CAAY7kB,CAAK,CAAA,CAAI,QAAA,CACpC,CAAA,CAAA,CACF,CAAA,CACAlO,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,QAAA,CAAS,CAAA,CACxBA,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAM4lB,CAAAA,CAASJ,CAAK,CAAA,CAC7B,SAAA,CAAU,gGAAA,CAET,SAAA3mB,CAAAA,CAAE,uBAAuB,CAAA,CAC5B,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAMA,SAAS+pC,EAAAA,CAAW,CAClB,SAAA,CAAAnpC,CAAAA,CACA,WAAA,CAAAumC,EACA,UAAA,CAAAa,CAAAA,CACA,SAAA,CAAAK,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,OAAA4B,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,CAAA,CAAApqC,EACA,OAAA,CAAAqqC,CACF,CAAA,CAWG,CACD,OAAIA,CAAAA,CAEAppC,KAAC,KAAA,CAAA,CACC,SAAA,CAAWC,IAAAA,CACT,iDAAA,CACAN,CACF,CAAA,CACA,MAAO,CAAE,MAAA,CAAQomC,EAAkB,CAAA,CAEnC,QAAA,CAAA,CAAA7lC,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,QAAA,CAAU,CAACknC,CAAAA,CACX,OAAA,CAAS6B,EACT,SAAA,CAAWhpC,IAAAA,CACT,wBAAA,CACAmnC,CAAAA,CACI,oCAAA,CACA,oCACN,EACD,QAAA,CAAA,QAAA,CAED,CAAA,CACAlnC,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sCAAA,CACb,SAAAgmC,CAAAA,CACH,CAAA,CACAhmC,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAU,CAACmnC,CAAAA,CACX,OAAA,CAAS6B,CAAAA,CACT,SAAA,CAAWjpC,IAAAA,CACT,yBACAonC,CAAAA,CACI,oCAAA,CACA,oCACN,CAAA,CACD,QAAA,CAAA,QAAA,CAED,CAAA,CAAA,CACF,EAKFrnC,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWC,IAAAA,CACT,iDAAA,CACAN,CACF,EACA,KAAA,CAAO,CAAE,MAAA,CAAQomC,EAAkB,CAAA,CAEnC,QAAA,CAAA,CAAA/lC,KAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAA,CAAU,CAAConC,CAAAA,CACX,QAAS6B,CAAAA,CACT,SAAA,CAAWhpC,IAAAA,CACT,kEAAA,CACAmnC,CAAAA,CACI,oCAAA,CACA,oCACN,CAAA,CACD,QAAA,CAAA,CAAA,SAAA,CACIroC,CAAAA,CAAE,0BAA0B,CAAA,CAAA,CACjC,CAAA,CACC,MAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,IAAA,CAAK,GAAA,CAAIgoC,CAAAA,CAAY,CAAC,CAAE,CAAA,CAAG,CAACjmC,CAAAA,CAAGC,CAAAA,GAAM,CACzD,IAAMmX,CAAAA,CAAOnX,CAAAA,CAAI,CAAA,CACjB,OACEb,GAAAA,CAAC,UAEC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMipC,CAAAA,CAAOjxB,CAAI,EAC1B,SAAA,CAAWjY,IAAAA,CACT,0DAAA,CACAiY,CAAAA,GAASguB,CAAAA,CACL,8CAAA,CACA,oCACN,CAAA,CAEC,QAAA,CAAAhuB,CAAAA,CAAAA,CAVIA,CAWP,CAEJ,CAAC,EACDlY,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAA,CAAU,CAACqnC,EACX,OAAA,CAAS6B,CAAAA,CACT,SAAA,CAAWjpC,IAAAA,CACT,kEAAA,CACAonC,CAAAA,CACI,qCACA,oCACN,CAAA,CAEC,QAAA,CAAA,CAAAtoC,CAAAA,CAAE,sBAAsB,CAAA,CAAE,WAC7B,CAAA,CAAA,CACF,CAEJ,CAEA,SAASmlB,EAAAA,CAAW,CAAE,QAAAwC,CAAAA,CAAS,MAAA,CAAAuU,CAAO,CAAA,CAAwC,CAC5E,OACE/6B,IAAC,KAAA,CAAA,CACC,SAAA,CAAU,uDAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAA+6B,CAAO,CAAA,CAEf,QAAA,CAAAvU,CAAAA,CACH,CAEJ,CAEA,SAASzC,GAAY,CAAE,MAAA,CAAAgX,CAAO,CAAA,CAAuB,CACnD,OACE/6B,IAAC,KAAA,CAAA,CACC,SAAA,CAAU,0CAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAA+6B,CAAO,CAAA,CAEf,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAACn6B,CAAAA,CAAGC,CAAAA,GACjCb,GAAAA,CAACc,SAAA,CAAiB,SAAA,CAAU,wBAAA,CAAA,CAAbD,CAAsC,CACtD,CAAA,CACH,CAEJ,CAEA,SAASkyB,EAAAA,CAAY7kB,CAAAA,CAAuB,CAC1C,IAAMuY,EAAQvY,CAAAA,CAAQ,GAAA,CACtB,OAAIuY,CAAAA,CAAQ,CAAA,EAAKA,CAAAA,CAAQ,EAAU,SAAA,CAC5B,CAAA,EAAGA,CAAAA,CAAM,OAAA,CAAQA,CAAAA,CAAQ,CAAA,GAAM,EAAI,CAAA,CAAI,CAAC,CAAC,CAAA,IAAA,CAClD,CCndA,IAAMmf,EAAAA,CAAY,EAAA,CACZ9iB,EAAAA,CAAa,EAAA,CACbC,GAAgB,EAAA,CAChB8iB,EAAAA,CAAoB,EAAA,CAUnB,SAASsD,EAAAA,CAAiB,CAC/B,UAAArlB,CAAAA,CACA,SAAA,CAAAxM,CAAAA,CACA,UAAA,CAAAyuB,CAAAA,CACA,eAAA,CAAAqD,EACA,YAAA,CAAApS,CACF,CAAA,CAA0B,CACxB,GAAM,CAAE,EAAAn4B,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB,CAACsmC,CAAAA,CAAaC,CAAc,CAAA,CAAI1kC,QAAAA,CAAS,CAAC,CAAA,CAE1C8nC,CAAAA,CAAiBzpC,WAAAA,CAAY,IAAM,CACvC,IAAA,IAAW0pC,CAAAA,IAAOxlB,CAAAA,CAChBslB,CAAAA,GAAkBE,CAAG,EAEzB,CAAA,CAAG,CAACxlB,CAAAA,CAAWslB,CAAe,CAAC,CAAA,CAE/B,GAAI9xB,CAAAA,CAAW,OAAOtX,GAAAA,CAAC+jB,EAAAA,CAAA,CAAY,MAAA,CAAQgiB,EAAY,CAAA,CAEvD,GAAIjiB,CAAAA,CAAU,MAAA,GAAW,CAAA,CACvB,OACE9jB,IAACgkB,EAAAA,CAAA,CACC,OAAA,CAASnlB,CAAAA,CAAE,6BAA6B,CAAA,CACxC,OAAQknC,CAAAA,CACV,CAAA,CAIJ,IAAMc,CAAAA,CAAa,IAAA,CAAK,GAAA,CAAI,EAAG,IAAA,CAAK,IAAA,CAAK/iB,CAAAA,CAAU,MAAA,CAAS8hB,EAAS,CAAC,EAChEkB,CAAAA,CAAAA,CAAad,CAAAA,CAAc,CAAA,EAAKJ,EAAAA,CAChC2D,CAAAA,CAAgBzlB,CAAAA,CAAU,MAAMgjB,CAAAA,CAAWA,CAAAA,CAAYlB,EAAS,CAAA,CAChEsB,CAAAA,CAAYlB,CAAAA,CAAc,EAC1BmB,CAAAA,CAAYnB,CAAAA,CAAca,CAAAA,CAC1BO,CAAAA,CAAgBrB,CAAAA,CAAahjB,EAAAA,CAAgB8iB,GAEnD,OACE/lC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CAAgB,KAAA,CAAO,CAAE,MAAA,CAAQimC,CAAW,CAAA,CAEzD,QAAA,CAAA,CAAAjmC,IAAAA,CAAC,KAAA,CAAA,CACC,UAAU,iGAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAQijB,EAAc,CAAA,CAE/B,UAAA/iB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACZ,QAAA,CAAAnB,CAAAA,CAAE,uBAAuB,CAAA,CAC5B,CAAA,CACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CACZ,SAAAnB,CAAAA,CAAE,2BAA2B,CAAA,CAChC,CAAA,CACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wBAAA,CACZ,QAAA,CAAAnB,CAAAA,CAAE,uBAAuB,CAAA,CAC5B,CAAA,CACAmB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CACZ,QAAA,CAAAnB,CAAAA,CAAE,0BAA0B,EAC/B,CAAA,CACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CACZ,QAAA,CAAAnB,EAAE,2BAA2B,CAAA,CAChC,CAAA,CACAiB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAnB,CAAAA,CAAE,qBAAqB,EAAE,CAAA,CAChCiB,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,6BAAA,CAA8B,QAAA,CAAA,CAAA,GAAA,CAC1CjB,EAAE,gCAAgC,CAAA,CAAE,GAAA,CAAA,CACxC,CAAA,CAAA,CACF,CAAA,CACAmB,GAAAA,CAAC,OAAI,SAAA,CAAU,wBAAA,CACZ,QAAA,CAAAnB,CAAAA,CAAE,+BAA+B,CAAA,CACpC,EACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAAA,CACZ,QAAA,CAAAnB,CAAAA,CAAE,+BAA+B,CAAA,CACpC,CAAA,CACAmB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CACZ,SAAAopC,CAAAA,EAAmBtlB,CAAAA,CAAU,MAAA,CAAS,CAAA,EACrC9jB,GAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,OAAA,CAASqpC,CAAAA,CACT,SAAA,CAAU,6EAAA,CAET,QAAA,CAAAxqC,EAAE,0BAA0B,CAAA,CAC/B,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAGAmB,GAAAA,CAAC,OACC,SAAA,CAAU,iCAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAQonC,CAAc,EAE9B,QAAA,CAAAmC,CAAAA,CAAc,GAAA,CAAI,CAACD,CAAAA,CAAKzoC,CAAAA,GACvBb,IAACwpC,EAAAA,CAAA,CAEC,QAAA,CAAUF,CAAAA,CACV,eAAA,CAAiBF,CAAAA,CACjB,aAAcpS,CAAAA,CAAAA,CAHT,CAAA,EAAGsS,CAAAA,CAAI,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAI,QAAQ,IAAA,EAAQxC,CAAAA,CAAYjmC,CAAC,CAAA,CAIzD,CACD,CAAA,CACH,EAGAf,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,2DAAA,CACV,KAAA,CAAO,CAAE,OAAQ+lC,EAAkB,CAAA,CAEnC,QAAA,CAAA,CAAA/lC,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,QAAA,CAAU,CAAConC,CAAAA,CACX,OAAA,CAAS,IAAMjB,CAAAA,CAAgB77B,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,CAAC,CAAC,EACvD,SAAA,CAAWrK,IAAAA,CACT,kEAAA,CACAmnC,CAAAA,CACI,oCAAA,CACA,oCACN,EACD,QAAA,CAAA,CAAA,SAAA,CACIroC,CAAAA,CAAE,0BAA0B,CAAA,CAAA,CACjC,CAAA,CACC,KAAA,CAAM,KAAK,CAAE,MAAA,CAAQ,IAAA,CAAK,GAAA,CAAIgoC,CAAAA,CAAY,CAAC,CAAE,CAAA,CAAG,CAACjmC,CAAAA,CAAGC,CAAAA,GAAM,CACzD,IAAMmX,EAAOnX,CAAAA,CAAI,CAAA,CACjB,OACEb,GAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,SACL,OAAA,CAAS,IAAMimC,CAAAA,CAAejuB,CAAI,CAAA,CAClC,SAAA,CAAWjY,KACT,0DAAA,CACAiY,CAAAA,GAASguB,CAAAA,CACL,8CAAA,CACA,oCACN,CAAA,CAEC,SAAAhuB,CAAAA,CAAAA,CAVIA,CAWP,CAEJ,CAAC,CAAA,CACDlY,IAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,QAAA,CAAU,CAACqnC,CAAAA,CACX,OAAA,CAAS,IAAMlB,CAAAA,CAAgB77B,CAAAA,EAAMA,CAAAA,CAAI,CAAC,CAAA,CAC1C,SAAA,CAAWrK,KACT,kEAAA,CACAonC,CAAAA,CACI,oCAAA,CACA,oCACN,CAAA,CAEC,QAAA,CAAA,CAAAtoC,EAAE,sBAAsB,CAAA,CAAE,SAAA,CAAA,CAC7B,CAAA,CAAA,CACF,CAAA,CAGAmB,GAAAA,CAAC,OACC,SAAA,CAAU,oDAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAQ+lC,CAAAA,CAAaF,EAAkB,CAAA,CAE/C,QAAA,CAAA0D,CAAAA,CAAc,GAAA,CAAI,CAACD,CAAAA,CAAKzoC,IACvBb,GAAAA,CAACypC,EAAAA,CAAA,CAEC,QAAA,CAAUH,CAAAA,CACV,OAAA,CAASF,EACT,YAAA,CAAcpS,CAAAA,CAAAA,CAHT,CAAA,EAAGsS,CAAAA,CAAI,MAAM,CAAA,CAAA,EAAIA,EAAI,MAAA,EAAQ,IAAA,EAAQ,CAAA,EAAA,EAAKxC,CAAAA,CAAYjmC,CAAC,CAAA,CAAE,EAIhE,CACD,CAAA,CACH,CAAA,CAGAf,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,4DACV,KAAA,CAAO,CAAE,MAAA,CAAQ+lC,EAAkB,CAAA,CAEnC,QAAA,CAAA,CAAA7lC,IAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAA,CAAU,CAACknC,CAAAA,CACX,QAAS,IAAMjB,CAAAA,CAAgB77B,CAAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGA,EAAI,CAAC,CAAC,CAAA,CACvD,SAAA,CAAWrK,IAAAA,CACT,wBAAA,CACAmnC,EACI,oCAAA,CACA,oCACN,CAAA,CACD,QAAA,CAAA,QAAA,CAED,CAAA,CACAlnC,GAAAA,CAAC,QAAK,SAAA,CAAU,sCAAA,CACb,QAAA,CAAAgmC,CAAAA,CACH,CAAA,CACAhmC,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,QAAA,CAAU,CAACmnC,CAAAA,CACX,OAAA,CAAS,IAAMlB,CAAAA,CAAgB77B,CAAAA,EAAMA,CAAAA,CAAI,CAAC,CAAA,CAC1C,SAAA,CAAWrK,KACT,wBAAA,CACAonC,CAAAA,CACI,oCAAA,CACA,oCACN,CAAA,CACD,QAAA,CAAA,QAAA,CAED,GACF,CAAA,CAAA,CACF,CAEJ,CAMA,SAASqC,EAAAA,CAAkB,CACzB,SAAUF,CAAAA,CACV,eAAA,CAAAF,CAAAA,CACA,YAAA,CAAApS,CACF,CAAA,CAIG,CACD,GAAM,CAAE,CAAA,CAAAn4B,CAAE,CAAA,CAAIa,cAAAA,GAER0kB,CAAAA,CAAMklB,CAAAA,CAAI,GAAA,EAAO,CAAA,CACjBjlB,CAAAA,CAAailB,CAAAA,CAAI,aAAe,CAAA,CAChChlB,CAAAA,CAAWglB,CAAAA,CAAI,SAAA,EAAa,CAAA,CAC5B/kB,CAAAA,CAAe+kB,EAAI,aAAA,EAAiB,CAAA,CACpC/jC,CAAAA,CAAQ+jC,CAAAA,CAAI,aAAA,EAAiBA,CAAAA,CAAI,KAAO/kB,CAAAA,CACxCI,CAAAA,CAAgB2kB,CAAAA,CAAI,IAAA,CAEpB9kB,CAAAA,CACJJ,CAAAA,CAAM,EAAI,cAAA,CAAiBA,CAAAA,CAAM,CAAA,CAAI,aAAA,CAAgB,iBAAA,CACjDK,CAAAA,CAAUL,EAAM,CAAA,CAAI,GAAA,CAAM,EAAA,CAE1BwjB,CAAAA,CAAa0B,CAAAA,CAAI,KAAA,EAAO,OAASA,CAAAA,CAAI,MAAA,EAAQ,QAAA,EAAY,QAAA,CACzDzB,CAAAA,CAAayB,CAAAA,CAAI,OAAO,SAAA,CACxBI,CAAAA,CAAcJ,CAAAA,CAAI,IAAA,CAClB93B,CAAAA,CAAe83B,CAAAA,CAAI,QAAQ,QAAA,GAAW,CAAC,CAAA,EAAG,KAAA,EAAS,EAAA,CAEnD1kB,CAAAA,CAAgB0kB,EAAI,MAAA,EAAQ,MAAA,CAC9BzkB,EAAAA,CAAqBykB,CAAAA,CAAI,MAAA,CAAO,MAAM,EACtC,QAAA,CAEJ,OACExpC,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,4FAAA,CACV,MAAO,CAAE,MAAA,CAAQgjB,EAAW,CAAA,CAG5B,QAAA,CAAA,CAAA9iB,GAAAA,CAAC,OAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAAF,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,SAAA,CAAU,4DAAA,CACV,OAAA,CAAS,IAAMwpC,CAAAA,CAAI,KAAA,EAAStS,IAAesS,CAAAA,CAAI,KAAK,CAAA,CAEnD,QAAA,CAAA,CAAAzB,CAAAA,EACC7nC,GAAAA,CAAC,OACC,GAAA,CAAK6nC,CAAAA,CACL,GAAA,CAAI,EAAA,CACJ,SAAA,CAAU,4CAAA,CACZ,EAEF/nC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,QAAK,SAAA,CAAU,8CAAA,CACb,QAAA,CAAA4nC,CAAAA,CACH,CAAA,CACA9nC,IAAAA,CAAC,QAAK,SAAA,CAAU,0BAAA,CACd,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAWD,KACT,aAAA,CACA2pC,CAAAA,CAAY,WAAA,EAAY,GAAM,KAAA,CAC1B,cAAA,CACA,aACN,CAAA,CAEC,QAAA,CAAAA,CAAAA,CACH,CAAA,CACCl4B,CAAAA,EACC1R,IAAAA,CAAAkS,SAAA,CACE,QAAA,CAAA,CAAAhS,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,MAAA,CAAO,gBAAC,CAAA,CACxBA,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAwR,CAAAA,CAAa,CAAA,CAAA,CACtB,GAEJ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAGAxR,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wBAAA,CACb,QAAA,CAAAF,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,UAAAA,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,2BAAA,CAA4B,QAAA,CAAA,CAAA,GAAA,CAAEyF,CAAAA,CAAM,QAAQ,CAAC,CAAA,CAAA,CAAE,CAAA,CAC/DvF,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,2BACb,QAAA,CAAAnB,CAAAA,CAAE,2BAAA,CAA6B,CAAE,KAAA,CAAOyqC,CAAAA,CAAI,IAAK,CAAC,CAAA,CACrD,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAGAxpC,IAAAA,CAAC,OAAI,SAAA,CAAU,kDAAA,CAAmD,QAAA,CAAA,CAAA,GAAA,CAAA,CAC7DwpC,CAAAA,CAAI,IAAA,CAAOhlB,CAAAA,EAAU,QAAQ,CAAC,CAAA,CAAA,CACnC,EAGAtkB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,kDAAA,CACZ,QAAA,CAAA+yB,EAAAA,CAAYzO,CAAQ,CAAA,CACvB,CAAA,CAGAtkB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACZ,QAAA,CAAA+yB,EAAAA,CAAYxO,CAAY,EAC3B,CAAA,CAGAzkB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,IAAAA,CAAG,sCAAA,CAAwCykB,CAAQ,CAAA,CACjE,QAAA,CAAA,CAAA1kB,IAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAA,CAAA2kB,CAAAA,CAAQ,IAAE,IAAA,CAAK,GAAA,CAAIL,CAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,GACpC,CAAA,CACAtkB,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CAAgC,QAAA,CAAA,CAAA,GAAA,CAC5C2kB,EACDJ,CAAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA,CAAA,CACzB,CAAA,CAAA,CACF,EAGAvkB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CAAmD,QAAA,CAAA,CAAA,GAAA,CAC9D6kB,CAAAA,CAAc,QAAQ,CAAC,CAAA,CAAA,CAC3B,CAAA,CAGA3kB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oEACZ,QAAA,CAAA4kB,CAAAA,CACH,CAAA,CAGA5kB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BACZ,QAAA,CAAAopC,CAAAA,EACCtpC,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAMspC,CAAAA,CAAgBE,CAAG,CAAA,CAClC,SAAA,CAAU,4GAAA,CAEV,UAAAtpC,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAc,QAAA,CAAA,QAAA,CAAC,CAAA,CAC9BnB,EAAE,uBAAuB,CAAA,CAAA,CAC5B,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CAMA,SAAS4qC,EAAAA,CAAa,CACpB,QAAA,CAAUH,CAAAA,CACV,OAAA,CAAA/5B,CAAAA,CACA,aAAAynB,CACF,CAAA,CAIG,CACD,GAAM,CAAE,CAAA,CAAAn4B,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB0kB,CAAAA,CAAMklB,CAAAA,CAAI,GAAA,EAAO,EACjBjlB,CAAAA,CAAailB,CAAAA,CAAI,WAAA,EAAe,CAAA,CAChC/kB,CAAAA,CAAe+kB,CAAAA,CAAI,eAAiB,CAAA,CACpC9kB,CAAAA,CACJJ,CAAAA,CAAM,CAAA,CAAI,cAAA,CAAiBA,CAAAA,CAAM,EAAI,aAAA,CAAgB,iBAAA,CACjDK,CAAAA,CAAUL,CAAAA,CAAM,CAAA,CAAI,GAAA,CAAM,GAC1BwjB,CAAAA,CAAa0B,CAAAA,CAAI,KAAA,EAAO,KAAA,EAASA,CAAAA,CAAI,MAAA,EAAQ,UAAY,QAAA,CAE/D,OACExpC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qEAAA,CACb,UAAAA,IAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,iEAAA,CACV,QAAS,IAAMwpC,CAAAA,CAAI,KAAA,EAAStS,CAAAA,GAAesS,CAAAA,CAAI,KAAK,EAEpD,QAAA,CAAA,CAAAxpC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACZ,QAAA,CAAA,CAAAwpC,EAAI,KAAA,EAAO,SAAA,EACVtpC,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKspC,CAAAA,CAAI,MAAM,SAAA,CACf,GAAA,CAAI,EAAA,CACJ,SAAA,CAAU,4CAAA,CACZ,CAAA,CAEFtpC,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA4nC,CAAAA,CACH,CAAA,CAAA,CACF,EACA5nC,GAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAWD,IAAAA,CACT,oDAAA,CACAupC,CAAAA,CAAI,KAAK,WAAA,EAAY,GAAM,KAAA,CACvB,4BAAA,CACA,0BACN,CAAA,CAEC,SAAAA,CAAAA,CAAI,IAAA,CACP,CAAA,CAAA,CACF,CAAA,CACAxpC,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,2CAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC2pC,EAAAA,CAAA,CACC,KAAA,CAAO9qC,EAAE,2BAA2B,CAAA,CACpC,KAAA,CAAO,CAAA,EAAGyqC,CAAAA,CAAI,IAAI,GACpB,CAAA,CACAtpC,GAAAA,CAAC2pC,EAAAA,CAAA,CACC,KAAA,CAAO9qC,CAAAA,CAAE,2BAA2B,CAAA,CACpC,KAAA,CAAOk0B,EAAAA,CAAYxO,CAAY,CAAA,CACjC,CAAA,CACAvkB,IAAC2pC,EAAAA,CAAA,CACC,KAAA,CAAO9qC,CAAAA,CAAE,qBAAqB,CAAA,CAC9B,MAAO,CAAA,EAAG4lB,CAAO,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAIL,CAAG,EAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAAKK,CAAO,CAAA,EAAGJ,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA,CACjF,SAAA,CAAWG,CAAAA,CACb,EACAxkB,GAAAA,CAAC2pC,EAAAA,CAAA,CACC,KAAA,CAAO9qC,CAAAA,CAAE,+BAA+B,EACxC,KAAA,CAAO,CAAA,CAAA,EAAIyqC,CAAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAChC,CAAA,CAAA,CACF,CAAA,CACC/5B,CAAAA,EACCvP,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,kBAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAMuP,CAAAA,CAAQ+5B,CAAG,CAAA,CAC1B,SAAA,CAAU,kHAAA,CAET,SAAAzqC,CAAAA,CAAE,uBAAuB,CAAA,CAC5B,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CAMA,SAAS8qC,EAAAA,CAAW,CAClB,KAAA,CAAAhrC,CAAAA,CACA,KAAA,CAAA4G,EACA,SAAA,CAAA9F,CACF,CAAA,CAIG,CACD,OACEK,IAAAA,CAAC,OAAI,SAAA,CAAU,eAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eAAgB,QAAA,CAAArB,CAAAA,CAAM,CAAA,CACtCqB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAWD,KAAG,2BAAA,CAA6BN,CAAS,CAAA,CACvD,QAAA,CAAA8F,CAAAA,CACH,CAAA,CAAA,CACF,CAEJ,CAEA,SAASye,EAAAA,CAAW,CAAE,OAAA,CAAAwC,CAAAA,CAAS,OAAAuU,CAAO,CAAA,CAAwC,CAC5E,OACE/6B,GAAAA,CAAC,KAAA,CAAA,CACC,UAAU,uDAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAA+6B,CAAO,CAAA,CAEf,SAAAvU,CAAAA,CACH,CAEJ,CAEA,SAASzC,EAAAA,CAAY,CAAE,OAAAgX,CAAO,CAAA,CAAuB,CACnD,OACE/6B,GAAAA,CAAC,KAAA,CAAA,CACC,UAAU,0CAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAA+6B,CAAO,CAAA,CAEf,eAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAC,CAAA,CAAE,IAAI,CAACn6B,CAAAA,CAAGC,CAAAA,GACjCb,GAAAA,CAACc,QAAAA,CAAA,CAAiB,UAAU,wBAAA,CAAA,CAAbD,CAAsC,CACtD,CAAA,CACH,CAEJ,CAEA,SAASkyB,EAAAA,CAAY7kB,CAAAA,CAAuB,CAC1C,IAAMuY,CAAAA,CAAQvY,CAAAA,CAAQ,IACtB,OAAIuY,CAAAA,CAAQ,CAAA,EAAKA,CAAAA,CAAQ,CAAA,CAAU,SAAA,CAC5B,GAAGA,CAAAA,CAAM,OAAA,CAAQA,CAAAA,CAAQ,CAAA,GAAM,CAAA,CAAI,CAAA,CAAI,CAAC,CAAC,CAAA,IAAA,CAClD,CAEA,SAAS5B,EAAAA,CAAqBmC,CAAAA,CAA2B,CACvD,GAAI,CACF,IAAML,CAAAA,CAAO,IAAI,IAAA,CAAKK,CAAS,CAAA,CACzBF,CAAAA,CAAQH,CAAAA,CAAK,QAAA,EAAS,CAAE,QAAA,GAAW,QAAA,CAAS,CAAA,CAAG,GAAG,CAAA,CAClDI,CAAAA,CAAOJ,CAAAA,CAAK,YAAW,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,EACnDE,CAAAA,CAAMF,CAAAA,CAAK,OAAA,EAAQ,CAAE,QAAA,EAAS,CAAE,SAAS,CAAA,CAAG,GAAG,CAAA,CAC/CC,CAAAA,CAAAA,CAASD,CAAAA,CAAK,QAAA,GAAa,CAAA,EAAG,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,EACxDyM,CAAAA,CAAOzM,CAAAA,CAAK,WAAA,EAAY,CACxB4hB,CAAAA,CAAK5hB,CAAAA,CAAK,mBAAkB,CAC5B6hB,CAAAA,CAASD,CAAAA,EAAM,CAAA,CAAI,GAAA,CAAM,GAAA,CACzBxU,EAAU,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAMwU,CAAAA,CAAK,EAAE,CAAC,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,EACrE,OAAO,CAAA,EAAGzhB,CAAK,CAAA,CAAA,EAAIC,CAAI,CAAA,CAAA,EAAIF,CAAG,CAAA,CAAA,EAAID,CAAK,CAAA,CAAA,EAAIwM,CAAI,CAAA,EAAA,EAAKoV,CAAM,GAAGzU,CAAO,CAAA,CAAA,CACtE,CAAA,KAAQ,CACN,OAAO,QACT,CACF,CCzfO,SAAS6V,EAAAA,CAAa,CAC3B,SAAA,CAAA9lB,CAAAA,CACA,MAAA,CAAAoC,CAAAA,CACA,UAAA5O,CACF,CAAA,CAAsB,CACpB,GAAM,CAAE,CAAA,CAAAzY,CAAE,CAAA,CAAIa,cAAAA,EAAe,CAEvBs/B,CAAAA,CAAQ96B,OAAAA,CAAQ,IAAM,CAC1B,IAAI2lC,CAAAA,CAAc,CAAA,CACdC,CAAAA,CAAiB,CAAA,CACrB,IAAA,IAAW1/B,KAAK0Z,CAAAA,CACd+lB,CAAAA,EAAez/B,CAAAA,CAAE,YAAA,EAAgB,CAAA,CACjC0/B,CAAAA,EAAkB1/B,EAAE,aAAA,EAAiBA,CAAAA,CAAE,IAAA,EAAQA,CAAAA,CAAE,aAAA,EAAiB,CAAA,CAAA,CAGpE,IAAIgmB,CAAAA,CAAS,CAAA,CACT2Z,CAAAA,CAAO,CAAA,CACPC,CAAAA,CAAU,CAAA,CACd,QAAWC,CAAAA,IAAM/jB,CAAAA,CACfkK,CAAAA,EAAU6Z,CAAAA,CAAG,QAAA,EAAY,CAAA,CACrBA,EAAG,IAAA,GAAS,QAAA,GACdD,CAAAA,EAAAA,CAAAA,CACKC,CAAAA,CAAG,QAAA,EAAY,CAAA,EAAK,GAAGF,CAAAA,EAAAA,CAAAA,CAIhC,IAAMG,CAAAA,CAAaF,CAAAA,CAAU,CAAA,CAAI,CAAA,EAAGD,CAAI,CAAA,GAAA,EAAMC,CAAO,CAAA,CAAA,CAAK,OAAA,CAE1D,OAAO,CAAE,YAAAH,CAAAA,CAAa,cAAA,CAAAC,CAAAA,CAAgB,MAAA,CAAA1Z,CAAAA,CAAQ,UAAA,CAAA8Z,CAAW,CAC3D,CAAA,CAAG,CAACpmB,CAAAA,CAAWoC,CAAM,CAAC,EAEhB1B,CAAAA,CACJwa,CAAAA,CAAM,WAAA,CAAc,CAAA,CAChB,cAAA,CACAA,CAAAA,CAAM,YAAc,CAAA,CAClB,aAAA,CACA,iBAAA,CACFva,CAAAA,CAAUua,CAAAA,CAAM,WAAA,CAAc,EAAI,GAAA,CAAM,EAAA,CAE9C,OACEl/B,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0EACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACb,QAAA,CAAA,CAAAE,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sBAAA,CACb,QAAA,CAAAnB,CAAAA,CAAE,6BAA6B,EAClC,CAAA,CACCyY,CAAAA,CACCtX,GAAAA,CAACc,QAAAA,CAAA,CAAS,SAAA,CAAU,uBAAuB,CAAA,CAE3ChB,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAWC,IAAAA,CAAG,iCAAA,CAAmCykB,CAAQ,CAAA,CAC5D,QAAA,CAAA,CAAAC,CAAAA,CAAQ,GAAA,CAAE,IAAA,CAAK,GAAA,CAAIua,EAAM,WAAW,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAClD,CAAA,CAAA,CAEJ,EAEAl/B,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAACmqC,GAAA,CACC,KAAA,CAAOtrC,CAAAA,CAAE,yBAAyB,CAAA,CAClC,KAAA,CAAOmgC,EAAM,UAAA,CACb,SAAA,CAAW1nB,CAAAA,CACb,CAAA,CACAtX,GAAAA,CAACmqC,EAAAA,CAAA,CACC,KAAA,CAAOtrC,CAAAA,CAAE,2BAA2B,CAAA,CACpC,KAAA,CAAO,CAAA,CAAA,EAAImgC,EAAM,cAAA,CAAe,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAC1C,SAAA,CAAW1nB,EACb,CAAA,CACAtX,GAAAA,CAACmqC,EAAAA,CAAA,CACC,KAAA,CAAOtrC,CAAAA,CAAE,wBAAwB,CAAA,CACjC,KAAA,CAAO,CAAA,CAAA,EAAImgC,CAAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAClC,SAAA,CAAW1nB,CAAAA,CACb,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAEA,SAAS6yB,EAAAA,CAAS,CAChB,KAAA,CAAAxrC,CAAAA,CACA,MAAA4G,CAAAA,CACA,SAAA,CAAA+R,CACF,CAAA,CAIG,CACD,OACExX,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,wCAAA,CAA0C,QAAA,CAAArB,CAAAA,CAAM,CAAA,CAC/D2Y,CAAAA,CACCtX,GAAAA,CAACc,SAAA,CAAS,SAAA,CAAU,qBAAA,CAAsB,CAAA,CAE1Cd,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,sDAAA,CACb,QAAA,CAAAuF,CAAAA,CACH,CAAA,CAAA,CAEJ,CAEJ,CC3FA,IAAM0d,EAAAA,CAAc,IAab,SAASmnB,EAAAA,CAAY,CAC1B,aAAA,CAAAnmC,CAAAA,CACA,UAAA,CAAAI,EACA,eAAA,CAAA+kC,CAAAA,CACA,YAAA,CAAApS,CACF,CAAA,CAAqB,CACnB,GAAM,CAAE,CAAA,CAAAn4B,CAAE,CAAA,CAAIa,cAAAA,EAAe,CACvB,CAAC2jB,CAAAA,CAAWC,CAAY,CAAA,CAAI/hB,QAAAA,CAAqB,WAAW,CAAA,CAE5D8oC,EAAY,CAAA,EAAQpmC,CAAAA,EAAiBI,CAAAA,CAAAA,CAGrC,CAAE,IAAA,CAAMimC,CAAAA,CAAiB,UAAWC,CAAiB,CAAA,CAAIrgC,YAAAA,CAAa,CAC1E,MAAA,CAAQ,QAAA,CACR,KAAMjG,CAAAA,EAAiB,EACzB,CAAC,CAAA,CACK,CAAE,IAAA,CAAMumC,EAAe,SAAA,CAAWC,CAAe,CAAA,CAAIvgC,YAAAA,CAAa,CACtE,MAAA,CAAQ,aACR,IAAA,CAAM7F,CAAAA,EAAc,EACtB,CAAC,CAAA,CAEKqmC,CAAAA,CAAexmC,QAAQ,IAAM,CACjC,IAAMynB,CAAAA,CAAyB,EAAC,CAChC,OAAI2e,CAAAA,EAAiB,SAAA,EAAW3e,EAAI,IAAA,CAAK,GAAG2e,EAAgB,SAAS,CAAA,CACjEE,CAAAA,EAAe,SAAA,EAAW7e,CAAAA,CAAI,IAAA,CAAK,GAAG6e,CAAAA,CAAc,SAAS,CAAA,CAC1D7e,CACT,CAAA,CAAG,CAAC2e,EAAiBE,CAAa,CAAC,CAAA,CAE7BvgC,CAAAA,CAAmBsgC,CAAAA,EAAoBE,CAAAA,CAGvC,CAAE,IAAA,CAAME,CAAAA,CAAc,SAAA,CAAWC,CAAoB,CAAA,CACzD3kB,iBAAAA,CAAkB,CAChB,MAAA,CAAQ,QAAA,CACR,MAAA,CAAQhiB,CAAAA,EAAiB,EAAA,CACzB,KAAA,CAAO,GACT,CAAC,CAAA,CACG,CAAE,IAAA,CAAM4mC,CAAAA,CAAY,SAAA,CAAWC,CAAkB,CAAA,CAAI7kB,iBAAAA,CAAkB,CAC3E,MAAA,CAAQ,YAAA,CACR,MAAA,CAAQ5hB,GAAc,EAAA,CACtB,KAAA,CAAO,GACT,CAAC,CAAA,CAEKuiC,CAAAA,CAAY1iC,QAAQ,IACZ,CACV,GAAIymC,CAAAA,EAAc,KAAA,EAAO,OAAA,CAASvgC,GAAMA,CAAAA,CAAE,KAAK,CAAA,EAAK,EAAC,CACrD,GAAIygC,GAAY,KAAA,EAAO,OAAA,CAASzgC,CAAAA,EAAMA,CAAAA,CAAE,KAAK,CAAA,EAAK,EACpD,CAAA,CAEC,CAACugC,CAAAA,CAAcE,CAAU,CAAC,EAEvBE,CAAAA,CACJ9gC,CAAAA,EAAoB2gC,CAAAA,EAAuBE,CAAAA,CAEvCtnB,CAAAA,CAAiBknB,CAAAA,CAAa,OAM9BjnB,CAAAA,CAA6C,CACjD,CAAE,GAAA,CAAK,WAAA,CAAa,KAAA,CALpBD,EAAiB,CAAA,CACb,CAAA,EAAG3kB,CAAAA,CAAE,8BAA8B,CAAC,CAAA,EAAA,EAAK2kB,CAAc,CAAA,CAAA,CAAA,CACvD3kB,CAAAA,CAAE,8BAA8B,CAGS,CAAA,CAC7C,CAAE,IAAK,QAAA,CAAU,KAAA,CAAOA,CAAAA,CAAE,+BAA+B,CAAE,CAAA,CAC3D,CAAE,GAAA,CAAK,SAAA,CAAW,KAAA,CAAOA,CAAAA,CAAE,4BAA4B,CAAE,CAC3D,CAAA,CAEA,OAAKwrC,CAAAA,CASHvqC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+DAEb,QAAA,CAAA,CAAAE,GAAAA,CAAC4pC,EAAAA,CAAA,CACC,SAAA,CAAWc,CAAAA,CACX,OAAQ9D,CAAAA,CACR,SAAA,CAAWmE,CAAAA,CACb,CAAA,CAGA/qC,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gDAAA,CACZ,QAAA,CAAAyjB,CAAAA,CAAK,GAAA,CAAKC,CAAAA,EACT1jB,GAAAA,CAAC,UAEC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMsjB,CAAAA,CAAaI,CAAAA,CAAI,GAAG,CAAA,CACnC,SAAA,CAAW3jB,IAAAA,CACT,oFAAA,CACAsjB,CAAAA,GAAcK,CAAAA,CAAI,IACd,8CAAA,CACA,oCACN,CAAA,CAEC,QAAA,CAAAA,CAAAA,CAAI,KAAA,CAAA,CAVAA,EAAI,GAWX,CACD,CAAA,CACH,CAAA,CAGA5jB,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,MAAA,CACZ,QAAA,CAAA,CAAAujB,CAAAA,GAAc,WAAA,EACbrjB,GAAAA,CAACmpC,EAAAA,CAAA,CACC,SAAA,CAAWuB,CAAAA,CACX,SAAA,CAAWzgC,CAAAA,CACX,UAAA,CAAYgZ,EAAAA,CACZ,gBAAiBmmB,CAAAA,CACjB,YAAA,CAAcpS,CAAAA,CAChB,CAAA,CAED3T,CAAAA,GAAc,QAAA,EACbrjB,IAACyoC,EAAAA,CAAA,CACC,aAAA,CAAexkC,CAAAA,CACf,UAAA,CAAYI,CAAAA,CACZ,WAAY4e,EAAAA,CACd,CAAA,CAEDI,CAAAA,GAAc,SAAA,EACbrjB,GAAAA,CAAC8lC,EAAAA,CAAA,CACC,aAAA,CAAe7hC,CAAAA,CACf,UAAA,CAAYI,CAAAA,CACZ,UAAA,CAAY4e,EAAAA,CACd,GAEJ,CAAA,CAAA,CACF,CAAA,CA5DEjjB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kEAAA,CACZ,SAAAnB,CAAAA,CAAE,+BAA+B,CAAA,CACpC,CA4DN,CChJO,SAASmsC,GAAW,CACzB,MAAA,CAAA17B,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,YAAA,CAAA07B,EACA,aAAA,CAAAC,CAAAA,CACA,kBAAA,CAAAC,CACF,CAAA,CAAoB,CAClB,GAAM,CAAE,CAAA,CAAAtsC,CAAE,CAAA,CAAIa,cAAAA,EAAe,CAEvB,CAAC0rC,CAAAA,CAAcC,CAAe,CAAA,CAAI9pC,QAAAA,CAAS,KAAK,CAAA,CAChD,CAAC+pC,CAAAA,CAAYC,CAAa,CAAA,CAAIhqC,QAAAA,CAAwB,IAAI,CAAA,CAC1D,CAACiqC,CAAAA,CAAgBC,CAAiB,CAAA,CAAIlqC,QAAAA,CAAS,KAAK,CAAA,CAEpDmqC,EAAwBT,CAAAA,EAAgBO,CAAAA,CACxCG,CAAAA,CAAyBT,CAAAA,EAAiBM,CAAAA,CAE1CI,CAAAA,CAA0BF,EAC5B,MAAA,CACAN,CAAAA,CACE,SAAA,CACA,SAAA,CACAS,CAAAA,CAA0BF,CAAAA,CAC5B,OACAD,CAAAA,EAAyBN,CAAAA,CACvB,SAAA,CACA,SAAA,CAEAU,CAAAA,CAAUJ,CAAAA,EAAyBC,EAEnCI,CAAAA,CAAcnsC,WAAAA,CAAY,SAAY,CAC1C2rC,CAAAA,CAAc,IAAI,EAClBE,CAAAA,CAAkB,KAAK,CAAA,CACvBJ,CAAAA,CAAgB,IAAI,CAAA,CACpB,GAAI,CACF,MAAMF,CAAAA,EAAmB,CACzBM,CAAAA,CAAkB,CAAA,CAAI,EACxB,CAAA,MAASt8B,CAAAA,CAAK,CACZo8B,CAAAA,CAAcp8B,CAAAA,YAAe,KAAA,CAAQA,EAAI,OAAA,CAAU,MAAA,CAAOA,CAAG,CAAC,EAChE,CAAA,OAAE,CACAk8B,CAAAA,CAAgB,KAAK,EACvB,CACF,CAAA,CAAG,CAACF,CAAkB,CAAC,CAAA,CAEjBa,CAAAA,CAKA,CACJ,CACE,GAAA,CAAK,QACL,KAAA,CAAOntC,CAAAA,CAAE,qBAAqB,CAAA,CAC9B,IAAA,CAAMA,CAAAA,CAAE,yBAAkC,CAAA,CAC1C,MAAA,CAAQ+sC,CACV,CAAA,CACA,CACE,GAAA,CAAK,QACL,KAAA,CAAO/sC,CAAAA,CAAE,qBAAqB,CAAA,CAC9B,IAAA,CAAMA,CAAAA,CAAE,yBAAkC,CAAA,CAC1C,MAAA,CAAQgtC,CACV,CACF,CAAA,CAEMI,CAAAA,CAAe,IAAM,CACrBH,CAAAA,CACFv8B,CAAAA,EAAQ,CAERw8B,CAAAA,GAEJ,EAEMG,CAAAA,CACFrtC,CAAAA,CADgBitC,CAAAA,CACd,oBAAA,CACA,2BADoB,CAAA,CAG1B,OACE9rC,GAAAA,CAACyP,WAAAA,CAAA,CACC,MAAA,CAAQH,CAAAA,CACR,YAAA,CAAeI,GAAS,CACjBA,CAAAA,EAAMH,CAAAA,GACb,CAAA,CACA,IAAA,CAAK,KACL,UAAA,CAAY,CACV,IAAA,CAAM,8GAAA,CACN,IAAA,CAAM,MACR,EAEA,QAAA,CAAAvP,GAAAA,CAAC2P,YAAAA,CAAA,CACC,QAAA,CAAA7P,IAAAA,CAAC,OAEC,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAE,IAAC,IAAA,CAAA,CAAG,SAAA,CAAU,oCAAA,CACX,QAAA,CAAAnB,CAAAA,CAAE,0BAA0B,EAC/B,CAAA,CACAmB,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASuP,EACT,SAAA,CAAU,wNAAA,CAEV,QAAA,CAAAzP,IAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,GACP,MAAA,CAAQ,EAAA,CACR,OAAA,CAAQ,WAAA,CACR,IAAA,CAAK,MAAA,CACL,OAAO,cAAA,CACP,WAAA,CAAa,CAAA,CACb,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,QAEf,QAAA,CAAA,CAAAE,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,IAAI,EAAA,CAAG,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,CAAA,CACpCA,GAAAA,CAAC,QAAK,EAAA,CAAG,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,GAAG,IAAA,CAAK,CAAA,CAAA,CACtC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGAF,IAAAA,CAAC,OAAI,SAAA,CAAU,qBAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,sCACV,QAAA,CAAAnB,CAAAA,CAAE,gCAAgC,CAAA,CACrC,CAAA,CAGAmB,GAAAA,CAAC,OAAI,SAAA,CAAU,aAAA,CACZ,QAAA,CAAAgsC,CAAAA,CAAM,GAAA,CAAI,CAAC7c,EAAMzwB,CAAAA,GAChBoB,IAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAU,8EAAA,CAEV,QAAA,CAAA,CAAAE,IAACmsC,EAAAA,CAAA,CAAc,KAAA,CAAOztC,CAAAA,CAAM,CAAA,CAAG,MAAA,CAAQywB,EAAK,MAAA,CAAQ,CAAA,CACpDrvB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAE,SAAA,CAAU,mCAAA,CACV,QAAA,CAAAmvB,CAAAA,CAAK,KAAA,CACR,CAAA,CACAnvB,IAAC,MAAA,CAAA,CACC,SAAA,CAAW,CAAA,yBAAA,EACTmvB,CAAAA,CAAK,MAAA,GAAW,MAAA,CACZ,iBACAA,CAAAA,CAAK,MAAA,GAAW,SAAA,CACd,mBAAA,CACA,eACR,CAAA,CAAA,CAEC,SAAAA,CAAAA,CAAK,MAAA,GAAW,MAAA,CACbtwB,CAAAA,CAAE,4BAA4B,CAAA,CAC9BswB,EAAK,MAAA,GAAW,SAAA,CACdtwB,CAAAA,CAAE,2BAA2B,CAAA,CAC7BA,CAAAA,CAAE,2BAA2B,CAAA,CACrC,CAAA,CAAA,CACF,CAAA,CACAmB,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,6BAA8B,QAAA,CAAAmvB,CAAAA,CAAK,IAAA,CAAK,CAAA,CAAA,CACvD,CAAA,CAAA,CAAA,CA1BKA,CAAAA,CAAK,GA2BZ,CACD,CAAA,CACH,CAAA,CAECmc,CAAAA,EACCtrC,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,iEAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,sBAAA,CAAwB,SAAAsrC,CAAAA,CAAW,CAAA,CAClD,CAAA,CAIFtrC,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAASisC,CAAAA,CACT,QAAA,CAAUb,CAAAA,CACV,SAAA,CACEU,CAAAA,CACI,2OACA,0RAAA,CAGL,QAAA,CAAAV,CAAAA,CACCtrC,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iCACd,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,sBAAA,CACV,OAAA,CAAQ,YACR,IAAA,CAAK,MAAA,CAEL,QAAA,CAAA,CAAAE,GAAAA,CAAC,QAAA,CAAA,CACC,EAAA,CAAG,KACH,EAAA,CAAG,IAAA,CACH,CAAA,CAAE,IAAA,CACF,MAAA,CAAO,cAAA,CACP,YAAY,GAAA,CACZ,SAAA,CAAU,YAAA,CACZ,CAAA,CACAA,GAAAA,CAAC,MAAA,CAAA,CACC,EAAE,mBAAA,CACF,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,QACd,SAAA,CAAU,YAAA,CACZ,CAAA,CAAA,CACF,CAAA,CACCnB,CAAAA,CAAE,2BAA2B,GAChC,CAAA,CAEAqtC,CAAAA,CAEJ,CAAA,CAGC,CAACJ,CAAAA,EACA9rC,GAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASuP,CAAAA,CACT,SAAA,CAAU,0OAAA,CAET,SAAA1Q,CAAAA,CAAE,eAAe,CAAA,CACpB,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CACF,EACF,CAEJ,CAEA,SAASstC,EAAAA,CAAc,CACrB,KAAA,CAAA5zB,EACA,MAAA,CAAA7L,CACF,CAAA,CAGG,CACD,OAAIA,CAAAA,GAAW,OAEX1M,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gFAAA,CACd,QAAA,CAAAA,GAAAA,CAAC,OACC,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,OAAA,CAAQ,WAAA,CACR,KAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAa,GAAA,CACb,aAAA,CAAc,QACd,cAAA,CAAe,OAAA,CACf,SAAA,CAAU,gBAAA,CAEV,QAAA,CAAAA,GAAAA,CAAC,YAAS,MAAA,CAAO,gBAAA,CAAiB,CAAA,CACpC,CAAA,CACF,CAAA,CAGA0M,CAAAA,GAAW,UAEX1M,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gFAAA,CACd,QAAA,CAAAF,IAAAA,CAAC,OACC,SAAA,CAAU,qCAAA,CACV,OAAA,CAAQ,WAAA,CACR,IAAA,CAAK,MAAA,CAEL,UAAAE,GAAAA,CAAC,QAAA,CAAA,CACC,EAAA,CAAG,IAAA,CACH,EAAA,CAAG,IAAA,CACH,EAAE,IAAA,CACF,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,GAAA,CACZ,SAAA,CAAU,aACZ,CAAA,CACAA,GAAAA,CAAC,MAAA,CAAA,CACC,CAAA,CAAE,mBAAA,CACF,MAAA,CAAO,eACP,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,SAAA,CAAU,YAAA,CACZ,GACF,CAAA,CACF,CAAA,CAIFA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+GAAA,CACb,SAAAuY,CAAAA,CACH,CAEJ","file":"index.mjs","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.112\";\n}\n\nexport default \"0.1.112\";\n","// =============================================================================\n// Categories — static navigation data\n//\n// Static data source. Tags are hardcoded from:\n// GET https://dev-prediction-markets-api.dflow.net/api/v1/tags_by_categories\n//\n// Slug logic mirrors mapTag() in prediction-server/internal/strategy/dflow/mapper.go:\n// slug = label (the original label string is used as the slug verbatim)\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// Static data — sourced from DFlow API (2025-03-22)\n// -----------------------------------------------------------------------------\n\n/**\n * Raw API shape from GET /api/v1/tags_by_categories.\n * Category keys map to tag arrays (null when the category has no sub-tags).\n */\nconst RAW_TAGS_BY_CATEGORIES: Record<string, string[] | null> = {\n Weather: [\n \"Daily temperature\",\n \"Snow and rain\",\n \"Climate change\",\n \"Natural disasters\",\n \"Hurricanes\",\n ],\n Companies: [\n \"IPOs\",\n \"Product launches\",\n \"KPIs\",\n \"Elon Musk\",\n \"CEOs\",\n \"Layoffs\",\n ],\n Crypto: [\n \"BTC\",\n \"15 min\",\n \"Hourly\",\n \"ETH\",\n \"SOL\",\n \"DOGE\",\n \"Pre-Market\",\n \"XRP\",\n \"BNB\",\n \"HYPE\",\n ],\n Economics: [\n \"Growth\",\n \"Fed\",\n \"Inflation\",\n \"Oil and energy\",\n \"Employment\",\n \"Housing\",\n \"Jobs & Economy\",\n \"Bankruptcy & Defaults\",\n \"GDP\",\n \"Global Central Banks\",\n ],\n Elections: [\"Primaries\", \"International elections\"],\n Entertainment: [\n \"Music\",\n \"Movies\",\n \"Music charts\",\n \"Television\",\n \"Awards\",\n \"Video games\",\n \"Oscars\",\n \"Rotten Tomatoes\",\n ],\n Financials: [\n \"S&P\",\n \"Nasdaq\",\n \"Daily\",\n \"Metals\",\n \"Treasuries\",\n \"Oil\",\n \"EUR/USD\",\n \"USD/JPY\",\n \"WTI\",\n ],\n Mentions: [\"Politicians\", \"Earnings\", \"Entertainment\"],\n Politics: [\n \"Trump\",\n \"Congress\",\n \"International\",\n \"SCOTUS & courts\",\n \"Local\",\n \"Recurring\",\n \"Iran\",\n \"House\",\n ],\n Science: [\"AI\", \"Energy\", \"Space\"],\n Social: null,\n Sports: [\n \"Soccer\",\n \"Basketball\",\n \"Baseball\",\n \"Football\",\n \"Hockey\",\n \"Golf\",\n \"Tennis\",\n \"Motorsport\",\n \"Esports\",\n \"Boxing\",\n \"MMA\",\n \"Rugby\",\n \"Lacrosse\",\n \"Mentions\",\n \"Chess\",\n \"Cricket\",\n \"Aussie Rules\",\n \"Darts\",\n ],\n World: null,\n};\n\n// -----------------------------------------------------------------------------\n// Preferred display order (matches the DFlow category taxonomy)\n// -----------------------------------------------------------------------------\n\nconst CATEGORY_ORDER: string[] = [\n \"Politics\",\n \"Sports\",\n \"Crypto\",\n \"Economics\",\n \"Financials\",\n \"Elections\",\n \"Entertainment\",\n \"Companies\",\n \"Science and Technology\",\n \"Climate and Weather\",\n \"Mentions\",\n \"Social\",\n \"World\",\n];\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/**\n * A single category entry in the static navigation model.\n *\n * Slug logic: slug === label (verbatim), matching mapTag() in the prediction\n * server's DFlow strategy. Pass the slug directly to DFlow API filters.\n */\nexport interface CategoryListItem {\n /** Category slug — equals the label; use directly as DFlow `category` filter */\n slug: string;\n /** Display label */\n label: string;\n /** Tag entries for this category (empty array when the category has no sub-tags) */\n tags: CategoryTagItem[];\n}\n\n/** A single tag entry in the static navigation model */\nexport interface CategoryTagItem {\n /** Tag slug — equals the label; use directly as DFlow `tags` filter */\n slug: string;\n /** Display label */\n label: string;\n /** Optional Phosphor icon class name (e.g. \"ph--basketball-bold\") */\n icon?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Derived static data\n// -----------------------------------------------------------------------------\n\n/**\n * Sorted category list derived from the static DFlow API snapshot.\n * Memoised at module level — computed once, never re-created.\n */\nexport const STATIC_CATEGORIES: CategoryListItem[] = (() => {\n const orderIndex = (cat: string): number => {\n const idx = CATEGORY_ORDER.indexOf(cat);\n return idx === -1 ? CATEGORY_ORDER.length : idx;\n };\n\n return Object.entries(RAW_TAGS_BY_CATEGORIES)\n .map(\n ([label, rawTags]): CategoryListItem => ({\n slug: label, // mapTag: slug = label\n label,\n tags: (rawTags ?? []).map(\n (t): CategoryTagItem => ({ slug: t, label: t }),\n ),\n }),\n )\n .sort((a, b) => orderIndex(a.slug) - orderIndex(b.slug));\n})();\n\n// -----------------------------------------------------------------------------\n// Selection type\n// -----------------------------------------------------------------------------\n\n/**\n * Selection emitted by CategoriesWidget.\n *\n * - `categorySlug = null, tagSlug = null` → \"Trending\" (no filter)\n * - `categorySlug = \"Politics\", tagSlug = null` → category selected, all its tags\n * - `categorySlug = \"Politics\", tagSlug = \"Trump\"` → specific tag selected\n */\nexport interface TagSlugSelection {\n /** Selected category slug (null = Trending / no filter) */\n categorySlug: string | null;\n /** Selected tag slug within the category (null = all tags in the category) */\n tagSlug: string | null;\n}\n","import { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Skeleton } from \"@liberfi.io/ui\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface CategoryItem {\n category: string;\n tags: string[];\n /** Optional badge text displayed above the tab (e.g. \"New\", \"Hot\") */\n badge?: string;\n}\n\nexport interface TagItem {\n label: string;\n /** Optional Phosphor icon class name (e.g. \"ph--basketball-bold\") */\n icon?: string;\n}\n\nexport interface CategoriesUIProps {\n /** List of categories to display */\n categories: CategoryItem[];\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: TagItem[];\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 /** Content rendered at the end of the primary chip row (e.g. sort/filter controls) */\n trailing?: React.ReactNode;\n /** Name of the tab that shows a pulsing dot (default: \"Trending\") */\n pulsingTab?: string;\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 trailing,\n pulsingTab = \"Trending\",\n className,\n}: CategoriesUIProps) {\n const { t } = useTranslation();\n\n const handleSelectAll = useCallback(() => {\n onCategorySelect(null);\n }, [onCategorySelect]);\n\n const trendingLabel = t(\"predict.categories.trending\");\n\n return (\n <div\n className={cn(\n \"sticky top-0 z-30 flex w-full flex-col justify-between gap-2 px-4 py-1 lg:px-2 lg:py-1\",\n className,\n )}\n >\n {/* Primary row: category tabs + trailing controls */}\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"hideScrollbar min-w-0 flex-1 overflow-x-auto overflow-y-hidden\">\n <div className=\"flex min-h-8 items-stretch gap-x-2 lg:min-h-9\">\n {/* Trending tab */}\n <Tab\n label={trendingLabel}\n isSelected={selectedCategory === null}\n onPress={handleSelectAll}\n showPulse={trendingLabel === pulsingTab}\n />\n\n {/* Separator between Trending and categories */}\n <TabSeparator />\n\n {/* Category tabs */}\n {categories.map((cat) => (\n <Tab\n key={cat.category}\n label={cat.category}\n isSelected={selectedCategory === cat.category}\n onPress={() => onCategorySelect(cat.category)}\n badge={cat.badge}\n showPulse={cat.category === pulsingTab}\n />\n ))}\n </div>\n </div>\n {trailing && <div className=\"flex-shrink-0\">{trailing}</div>}\n </div>\n\n {/* Secondary: tag chips (visible when a category is selected) */}\n {selectedCategory && activeTags.length > 0 && (\n <div className=\"hideScrollbar overflow-x-auto overflow-y-hidden flex items-center\">\n <div className=\"flex gap-x-1 pl-2 lg:w-full lg:gap-x-2\">\n <Chip\n label={t(\"predict.categories.allMarkets\")}\n isSelected={selectedTag === null}\n onPress={() => onTagSelect(null)}\n />\n {activeTags.map((tag) => (\n <Chip\n key={tag.label}\n label={tag.label}\n icon={tag.icon}\n isSelected={selectedTag === tag.label}\n onPress={() => onTagSelect(tag.label)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Tab — primary category navigation item\n// -----------------------------------------------------------------------------\n\ninterface TabProps {\n label: string;\n isSelected: boolean;\n onPress: () => void;\n badge?: string;\n showPulse?: boolean;\n}\n\nfunction Tab({ label, isSelected, onPress, badge, showPulse }: TabProps) {\n return (\n <button\n type=\"button\"\n onClick={onPress}\n className={cn(\n \"relative shrink-0 cursor-pointer whitespace-nowrap border-b p-1 text-base font-normal capitalize transition-colors\",\n isSelected\n ? \"border-primary/50 text-primary\"\n : \"border-transparent text-neutral-500 hover:text-neutral-300\",\n )}\n >\n {showPulse ? (\n <span className=\"flex items-center gap-x-1.5\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-[rgb(240,68,56)]\" />\n <span>{label}</span>\n </span>\n ) : (\n label\n )}\n\n {badge && (\n <span className=\"absolute -right-1 top-0 rounded bg-primary px-0.5 py-px text-[0.625rem] font-semibold leading-none text-neutral-950\">\n {badge}\n </span>\n )}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// TabSeparator — vertical divider between tab groups\n// -----------------------------------------------------------------------------\n\nfunction TabSeparator() {\n return (\n <span className=\"flex items-center text-neutral-600\" aria-hidden=\"true\">\n |\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Chip — secondary tag chip (pixel-perfect Jupiter clone)\n// -----------------------------------------------------------------------------\n\ninterface ChipProps {\n label: string;\n icon?: string;\n isSelected: boolean;\n onPress: () => void;\n}\n\nfunction Chip({ label, icon, isSelected, onPress }: ChipProps) {\n return (\n <button\n type=\"button\"\n onClick={onPress}\n className={cn(\n \"flex shrink-0 items-center justify-center gap-x-1 min-w-14 rounded-2xl border px-2 py-1 text-sm font-medium uppercase transition-colors cursor-pointer\",\n isSelected\n ? \"border-transparent bg-primary text-black\"\n : \"border-border/80 text-neutral-200 hover:bg-primary/10 hover:text-primary\",\n )}\n >\n {icon && <span className={cn(\"iconify size-4\", icon)} />}\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 w-full flex-col gap-2 px-4 py-1 lg:px-2 lg:py-1\">\n <div className=\"flex min-h-8 items-center gap-x-2 lg:min-h-9\">\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={i} className=\"h-6 w-16 shrink-0 rounded\" />\n ))}\n </div>\n </div>\n );\n}\n","// =============================================================================\n// CategoriesWidget\n//\n// Category / tag navigation backed by a static hardcoded snapshot (categories.script.ts).\n// Callbacks emit `TagSlugSelection` (categorySlug / tagSlug). Slug values follow the\n// DFlow mapTag() convention: slug === label verbatim.\n//\n// UI layer is shared with CategoriesUI / CategoriesSkeleton where available.\n// =============================================================================\nimport { useState, useCallback } from \"react\";\nimport {\n STATIC_CATEGORIES,\n type CategoryListItem,\n type TagSlugSelection,\n} from \"./categories.script\";\nimport { CategoriesUI, type CategoryItem, type TagItem } from \"./categories.ui\";\n\n// Re-export types so consumers can import from this single entry point.\nexport type { TagSlugSelection } from \"./categories.script\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface CategoriesWidgetProps {\n /**\n * Callback fired when the category / tag selection changes.\n *\n * Slug values follow the DFlow `mapTag()` convention (slug === label):\n * - `{ categorySlug: null, tagSlug: null }` → \"Trending\" (no filter)\n * - `{ categorySlug: \"Crypto\", tagSlug: null }` → category selected\n * - `{ categorySlug: \"Crypto\", tagSlug: \"BTC\" }` → specific tag selected\n */\n onSelect?: (selection: TagSlugSelection) => void;\n /** Content rendered at the end of the primary chip row (e.g. sort/filter controls) */\n trailing?: React.ReactNode;\n /** Optional class name applied to the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Adapter helpers\n// -----------------------------------------------------------------------------\n\n/** Convert CategoryListItem[] to the shape expected by CategoriesUI */\nfunction toUICategories(items: CategoryListItem[]): CategoryItem[] {\n return items.map((c) => ({\n category: c.label,\n tags: c.tags.map((t) => t.label),\n }));\n}\n\nfunction toUITags(cat: CategoryListItem | undefined): TagItem[] {\n if (!cat) return [];\n return cat.tags.map((t) => ({\n label: t.label,\n icon: t.icon,\n }));\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function CategoriesWidget({\n onSelect,\n trailing,\n className,\n}: CategoriesWidgetProps) {\n const [selectedCategorySlug, setSelectedCategorySlug] = useState<\n string | null\n >(null);\n const [selectedTagSlug, setSelectedTagSlug] = useState<string | null>(null);\n\n // --- handlers ---\n\n const handleCategorySelect = useCallback(\n (categoryLabel: string | null) => {\n setSelectedCategorySlug(categoryLabel); // slug === label\n setSelectedTagSlug(null);\n\n onSelect?.({\n categorySlug: categoryLabel, // null → \"Trending\"\n tagSlug: null,\n });\n },\n [onSelect],\n );\n\n const handleTagSelect = useCallback(\n (tagLabel: string | null) => {\n setSelectedTagSlug(tagLabel); // slug === label\n\n onSelect?.({\n categorySlug: selectedCategorySlug,\n tagSlug: tagLabel,\n });\n },\n [selectedCategorySlug, onSelect],\n );\n\n // --- derive UI data ---\n\n const uiCategories = toUICategories(STATIC_CATEGORIES);\n\n const activeCat = STATIC_CATEGORIES.find(\n (c) => c.slug === selectedCategorySlug,\n );\n const activeTags = toUITags(activeCat);\n\n return (\n <CategoriesUI\n categories={uiCategories}\n selectedCategory={selectedCategorySlug}\n selectedTag={selectedTagSlug}\n activeTags={activeTags}\n onCategorySelect={handleCategorySelect}\n onTagSelect={handleTagSelect}\n trailing={trailing}\n className={className}\n />\n );\n}\n","import type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport type { StandardEvent, StandardMarket } from \"../types\";\n\nexport function predictEventToStandard(event: PredictEvent): StandardEvent {\n return {\n title: event.title,\n imageUrl: event.image_url,\n };\n}\n\nexport function predictMarketToStandard(market: PredictMarket): StandardMarket {\n const yes = market.outcomes[0];\n const no = market.outcomes[1];\n return {\n question: market.question,\n yesAsk: yes?.best_ask ?? yes?.price,\n noAsk: no?.best_ask ?? no?.price,\n yesBid: yes?.best_bid,\n noBid: no?.best_bid,\n yesSubTitle: yes?.label ?? \"Yes\",\n noSubTitle: no?.label ?? \"No\",\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 {\n createContext,\n useContext,\n type PropsWithChildren,\n useMemo,\n} from \"react\";\nimport {\n useBalance,\n useDFlowKYC,\n usePolymarketSetup,\n} from \"@liberfi.io/react-predict\";\nimport { ChainNamespace } from \"@liberfi.io/types\";\nimport { useWallets } from \"@liberfi.io/wallet-connector\";\n\nexport interface PredictWalletContextValue {\n /** Connected Solana wallet address (for Kalshi). */\n solanaAddress: string | undefined;\n /** Connected EVM wallet address (for Polymarket). */\n evmAddress: string | undefined;\n /** Polymarket Safe (proxy) wallet address, derived from EOA via CREATE2. */\n polymarketSafeAddress: string | undefined;\n /** `null` when no wallet is connected or data has not loaded yet. */\n kalshiUsdcBalance: number | null;\n /** `null` when wallet not connected or setup not complete. */\n polymarketUsdcBalance: number | null;\n /** Whether the Solana wallet has completed Kalshi/DFlow KYC verification. */\n kalshiKycVerified: boolean;\n /** URL to redirect for KYC onboarding, or `null` if unavailable. */\n kalshiKycUrl: string | null;\n /** `true` while the KYC status query is loading for the first time. */\n kalshiKycLoading: boolean;\n /** Whether Polymarket wallet setup is fully complete (Safe deployed + USDC.e approved). */\n polymarketSetupVerified: boolean;\n /** Whether the Safe wallet has been deployed on Polygon. */\n polymarketSafeDeployed: boolean;\n /** Whether USDC.e is approved for the CTF Exchange. */\n polymarketTokenApproved: boolean;\n /** `true` while the Polymarket setup status is loading. */\n polymarketSetupLoading: boolean;\n /** `true` only on initial load when there is no cached data yet. */\n isLoading: boolean;\n /** `true` whenever a request is in-flight (including background refetches). */\n isFetching: boolean;\n error: Error | null;\n}\n\nconst PredictWalletContext = createContext<PredictWalletContextValue | null>(\n null,\n);\n\nexport function usePredictWallet() {\n const ctx = useContext(PredictWalletContext);\n if (!ctx) {\n throw new Error(\n \"usePredictWallet must be used within a PredictWalletProvider\",\n );\n }\n return ctx;\n}\n\nconst DEFAULT_POLLING_INTERVAL = 10_000;\n\nexport type PredictWalletProviderProps = PropsWithChildren<{\n pollingInterval?: number;\n enabled?: boolean;\n}>;\n\nexport function PredictWalletProvider({\n pollingInterval = DEFAULT_POLLING_INTERVAL,\n enabled = true,\n children,\n}: PredictWalletProviderProps) {\n // ---------------------------------------------------------------------------\n // Derive wallet addresses from wallet-connector\n // ---------------------------------------------------------------------------\n const wallets = useWallets();\n\n const solanaAddress = useMemo(\n () =>\n wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n )?.address,\n [wallets],\n );\n\n const evmAddress = useMemo(\n () =>\n wallets.find(\n (w) => w.chainNamespace === ChainNamespace.EVM && w.isConnected,\n )?.address,\n [wallets],\n );\n\n // ---------------------------------------------------------------------------\n // DFlow (Solana) USDC balance polling\n // ---------------------------------------------------------------------------\n const {\n data: kalshiBalanceData,\n isLoading: kalshiBalanceLoading,\n isFetching: kalshiBalanceFetching,\n error: kalshiBalanceError,\n } = useBalance(\n { source: \"kalshi\", user: solanaAddress ?? \"\" },\n {\n enabled: enabled && !!solanaAddress,\n refetchInterval: pollingInterval,\n },\n );\n\n // ---------------------------------------------------------------------------\n // Kalshi / DFlow KYC status polling\n // ---------------------------------------------------------------------------\n const { data: kalshiKycData, isLoading: kalshiKycLoading } = useDFlowKYC(\n solanaAddress,\n {\n enabled: enabled && !!solanaAddress,\n refetchInterval: 30_000,\n },\n );\n\n // ---------------------------------------------------------------------------\n // Polymarket wallet setup status polling\n // ---------------------------------------------------------------------------\n const { data: polySetupData, isLoading: polySetupLoading } =\n usePolymarketSetup(evmAddress, {\n enabled: enabled && !!evmAddress,\n refetchInterval: 30_000,\n });\n\n // ---------------------------------------------------------------------------\n // Polymarket (Polygon) USDC.e balance polling on Safe address\n // ---------------------------------------------------------------------------\n const polymarketSafeAddress = polySetupData?.safe_address;\n const polymarketSetupVerified = polySetupData?.verified ?? false;\n\n const {\n data: polymarketBalanceData,\n isLoading: polymarketBalanceLoading,\n isFetching: polymarketBalanceFetching,\n error: polymarketBalanceError,\n } = useBalance(\n { source: \"polymarket\", user: polymarketSafeAddress ?? \"\" },\n {\n enabled: enabled && polymarketSetupVerified && !!polymarketSafeAddress,\n refetchInterval: pollingInterval,\n },\n );\n\n // ---------------------------------------------------------------------------\n // Context value\n // ---------------------------------------------------------------------------\n const value = useMemo(\n () => ({\n solanaAddress,\n evmAddress,\n polymarketSafeAddress,\n kalshiUsdcBalance: kalshiBalanceData\n ? Number(kalshiBalanceData.balance)\n : null,\n polymarketUsdcBalance:\n polymarketSetupVerified && polymarketBalanceData\n ? Number(polymarketBalanceData.balance)\n : null,\n kalshiKycVerified: kalshiKycData?.verified ?? false,\n kalshiKycUrl: kalshiKycData?.kyc_url ?? null,\n kalshiKycLoading,\n polymarketSetupVerified,\n polymarketSafeDeployed: polySetupData?.safe_deployed ?? false,\n polymarketTokenApproved: polySetupData?.token_approved ?? false,\n polymarketSetupLoading: polySetupLoading,\n isLoading: kalshiBalanceLoading || polymarketBalanceLoading,\n isFetching: kalshiBalanceFetching || polymarketBalanceFetching,\n error: kalshiBalanceError ?? polymarketBalanceError ?? null,\n }),\n [\n solanaAddress,\n evmAddress,\n polymarketSafeAddress,\n kalshiBalanceData,\n polymarketBalanceData,\n polymarketSetupVerified,\n kalshiKycData,\n kalshiKycLoading,\n polySetupData,\n polySetupLoading,\n kalshiBalanceLoading,\n polymarketBalanceLoading,\n kalshiBalanceFetching,\n polymarketBalanceFetching,\n kalshiBalanceError,\n polymarketBalanceError,\n ],\n );\n\n return (\n <PredictWalletContext.Provider value={value}>\n {children}\n </PredictWalletContext.Provider>\n );\n}\n","import { useState, useContext, useMemo, useCallback, useEffect } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport confetti from \"canvas-confetti\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n PredictMarket,\n ProviderSource,\n CreateOrderInput,\n PolymarketSigner,\n} from \"@liberfi.io/react-predict\";\nimport {\n useDFlowQuote,\n useDFlowSubmit,\n useOrder,\n usePositions,\n usePredictClient,\n PolymarketContext,\n buildPolymarketL2Headers,\n buildCtfExchangeDomain,\n CTF_ORDER_TYPES,\n buildOrderMessage,\n buildSignedOrder,\n buildClobPayload,\n} from \"@liberfi.io/react-predict\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport {\n useAuth,\n useWallets,\n useSwitchChain,\n type EvmWalletAdapter,\n} from \"@liberfi.io/wallet-connector\";\nimport { ORDER_MIN_QUANTITY } from \"../../consts\";\nimport { usePredictWallet } from \"../../providers/PredictWalletProvider\";\n\n// ---------------------------------------------------------------------------\n// Shared form types\n// ---------------------------------------------------------------------------\n\nexport type TradeOutcome = \"yes\" | \"no\";\nexport type TradeSide = \"buy\" | \"sell\";\nexport type OrderType = \"market\" | \"limit\";\nexport type ExpirationPreset = \"5m\" | \"1h\" | \"12h\" | \"24h\" | \"eod\" | \"custom\";\nexport type DurationUnit = \"minutes\" | \"hours\" | \"days\";\n\nexport interface TradeFormValidation {\n isValid: boolean;\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseTradeFormParams {\n market: PredictMarket;\n chain?: string;\n initialOutcome?: TradeOutcome;\n initialSide?: TradeSide;\n}\n\nexport interface UseTradeFormResult {\n outcome: TradeOutcome;\n side: TradeSide;\n orderType: OrderType;\n quantity: number;\n limitPrice: number;\n shares: number;\n estimatedCost: number;\n potentialPayout: number;\n potentialProfit: number;\n usdcBalance: number | null;\n yesTokenBalance: number | null;\n noTokenBalance: number | null;\n isBalanceLoading: boolean;\n isSubmitting: boolean;\n validation: TradeFormValidation;\n supportsLimitOrder: boolean;\n kycRequired: boolean;\n kycUrl: string | null;\n setOutcome: (outcome: TradeOutcome) => void;\n setSide: (side: TradeSide) => void;\n setOrderType: (type: OrderType) => void;\n expirationEnabled: boolean;\n expirationPreset: ExpirationPreset;\n customDuration: number;\n customDurationUnit: DurationUnit;\n setQuantity: (quantity: number) => void;\n setLimitPrice: (price: number) => void;\n setExpirationEnabled: (enabled: boolean) => void;\n setExpirationPreset: (preset: ExpirationPreset) => void;\n setCustomDuration: (v: number) => void;\n setCustomDurationUnit: (u: DurationUnit) => void;\n submit: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst DURATION_UNIT_SECONDS: Record<DurationUnit, number> = {\n minutes: 60,\n hours: 3600,\n days: 86400,\n};\n\nfunction resolveExpiration(\n preset: ExpirationPreset,\n customDuration: number,\n customDurationUnit: DurationUnit,\n): number {\n const now = Math.floor(Date.now() / 1000);\n switch (preset) {\n case \"5m\":\n return now + 5 * 60;\n case \"1h\":\n return now + 60 * 60;\n case \"12h\":\n return now + 12 * 60 * 60;\n case \"24h\":\n return now + 24 * 60 * 60;\n case \"eod\": {\n const end = new Date();\n end.setUTCHours(23, 59, 59, 0);\n return Math.floor(end.getTime() / 1000);\n }\n case \"custom\":\n return now + customDuration * DURATION_UNIT_SECONDS[customDurationUnit];\n }\n}\n\nfunction fireCelebration() {\n const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 9999 };\n confetti({ ...defaults, particleCount: 80, origin: { x: 0.5, y: 0.4 } });\n setTimeout(() => {\n confetti({ ...defaults, particleCount: 40, origin: { x: 0.3, y: 0.6 } });\n }, 150);\n setTimeout(() => {\n confetti({ ...defaults, particleCount: 40, origin: { x: 0.7, y: 0.6 } });\n }, 300);\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useTradeForm({\n market,\n initialOutcome = \"yes\",\n initialSide = \"buy\",\n}: UseTradeFormParams): UseTradeFormResult {\n const { t } = useTranslation();\n const { status: authStatus } = useAuth();\n const wallets = useWallets();\n const switchChain = useSwitchChain();\n const predictClient = usePredictClient();\n const polymarketCtx = useContext(PolymarketContext);\n const queryClient = useQueryClient();\n const source: ProviderSource = market.source;\n const supportsLimitOrder = source === \"polymarket\";\n\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const evmWallet = wallets.find(\n (w): w is EvmWalletAdapter =>\n w.chainNamespace === ChainNamespace.EVM &&\n w.isConnected &&\n \"switchChain\" in w,\n );\n\n const isAuthenticated = authStatus === \"authenticated\";\n const userPublicKey = solanaWallet?.address;\n const evmAddress = evmWallet?.address;\n\n // ---------------------------------------------------------------------------\n // Local state\n // ---------------------------------------------------------------------------\n const [outcome, setOutcomeRaw] = useState<TradeOutcome>(initialOutcome);\n const [side, setSideRaw] = useState<TradeSide>(initialSide);\n const [orderType, setOrderTypeRaw] = useState<OrderType>(\"market\");\n const [quantity, setQuantityRaw] = useState<number>(NaN);\n const [limitPrice, setLimitPriceRaw] = useState<number>(NaN);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [pendingSignature, setPendingSignature] = useState<string | null>(null);\n const [pendingSellCashConvert, setPendingSellCashConvert] = useState<{\n cashAmount: string;\n collateral: string;\n } | null>(null);\n const [kycRequired, setKycRequired] = useState(false);\n const [expirationEnabled, setExpirationEnabled] = useState(false);\n const [expirationPreset, setExpirationPreset] =\n useState<ExpirationPreset>(\"1h\");\n const [customDuration, setCustomDuration] = useState(30);\n const [customDurationUnit, setCustomDurationUnit] =\n useState<DurationUnit>(\"minutes\");\n\n // ---------------------------------------------------------------------------\n // USDC balances from context\n // ---------------------------------------------------------------------------\n let contextBalance: {\n kalshiUsdcBalance: number | null;\n polymarketUsdcBalance: number | null;\n isLoading: boolean;\n } | null = null;\n let contextKycVerified = false;\n let contextKycUrl: string | null = null;\n let contextSafeAddress: string | undefined;\n try {\n const ctx = usePredictWallet();\n contextBalance = {\n kalshiUsdcBalance: ctx.kalshiUsdcBalance,\n polymarketUsdcBalance: ctx.polymarketUsdcBalance,\n isLoading: ctx.isLoading,\n };\n contextKycVerified = ctx.kalshiKycVerified;\n contextKycUrl = ctx.kalshiKycUrl;\n contextSafeAddress = ctx.polymarketSafeAddress;\n } catch {\n // Provider not mounted — fall back to local position query\n }\n\n // ---------------------------------------------------------------------------\n // Price per share from market outcomes\n // ---------------------------------------------------------------------------\n const pricePerShare = useMemo(() => {\n const idx = outcome === \"yes\" ? 0 : 1;\n const o = market.outcomes[idx];\n return side === \"buy\"\n ? (o?.best_ask ?? o?.price ?? 0.5)\n : (o?.best_bid ?? o?.price ?? 0.5);\n }, [market.outcomes, outcome, side]);\n\n const setOrderType = useCallback((type: OrderType) => {\n setOrderTypeRaw(type);\n }, []);\n\n const setOutcome = useCallback((o: TradeOutcome) => {\n setOutcomeRaw(o);\n setLimitPriceRaw(NaN);\n }, []);\n\n useEffect(() => {\n if (orderType === \"limit\" && isNaN(limitPrice)) {\n setLimitPriceRaw(Math.round(pricePerShare * 100) / 100);\n }\n }, [orderType, limitPrice, pricePerShare]);\n\n const shares = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n return side === \"buy\"\n ? pricePerShare > 0\n ? quantity / pricePerShare\n : 0\n : quantity;\n }, [side, quantity, pricePerShare]);\n\n const amountStr = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return \"0\";\n return String(Math.round(quantity * 1_000_000));\n }, [quantity]);\n\n // ---------------------------------------------------------------------------\n // DFlow mints (only used when source === \"kalshi\")\n // ---------------------------------------------------------------------------\n const yesMint = (market.provider_meta?.[\"dflow.yesMint\"] as string) ?? \"\";\n const noMint = (market.provider_meta?.[\"dflow.noMint\"] as string) ?? \"\";\n const usdcMint = SOLANA_TOKENS.stablecoins.USDC.address;\n const collateralMint =\n (market.provider_meta?.[\"dflow.collateralMint\"] as string) || \"\";\n const marketOutcomeMint = outcome === \"yes\" ? yesMint : noMint;\n\n // ---------------------------------------------------------------------------\n // Positions for share balances (fallback when context not available)\n // ---------------------------------------------------------------------------\n const positionUser =\n source === \"kalshi\" ? (userPublicKey ?? \"\") : (evmAddress ?? \"\");\n\n const { data: positionsData, isLoading: positionsLoading } = usePositions(\n { source, user: positionUser },\n { enabled: Boolean(positionUser) },\n );\n\n // ---------------------------------------------------------------------------\n // DFlow sell mint resolution — use position's actual on-chain outcome mint\n // stored in market.provider_meta by the positions API enrichment.\n // A market may have multiple collateral pools with different outcome mints;\n // dflow.outcomeMint carries the one the user actually holds.\n // ---------------------------------------------------------------------------\n const matchingPosition = useMemo(() => {\n if (!positionsData || side !== \"sell\") return null;\n return (\n positionsData.positions.find(\n (p) =>\n p.side?.toLowerCase() === outcome && p.market?.slug === market.slug,\n ) ?? null\n );\n }, [positionsData, market.slug, outcome, side]);\n\n const positionMarketMeta = matchingPosition?.market?.provider_meta;\n const effectiveOutcomeMint =\n (side === \"sell\" &&\n (positionMarketMeta?.[\"dflow.outcomeMint\"] as string)) ||\n marketOutcomeMint;\n const effectiveCollateral =\n (side === \"sell\" &&\n (positionMarketMeta?.[\"dflow.collateralMint\"] as string)) ||\n collateralMint;\n\n // Buy: USDC → outcome\n // Sell: outcome → collateral (USDC or CASH depending on collateral pool)\n const inputMint = side === \"buy\" ? usdcMint : effectiveOutcomeMint;\n const outputMint =\n side === \"buy\" ? marketOutcomeMint : effectiveCollateral || usdcMint;\n\n // ---------------------------------------------------------------------------\n // DFlow quote (only enabled for dflow source)\n // ---------------------------------------------------------------------------\n const quoteEnabled =\n source === \"kalshi\" &&\n Boolean(inputMint) &&\n Boolean(outputMint) &&\n Boolean(userPublicKey) &&\n amountStr !== \"0\";\n\n const { refetch: refetchQuote } = useDFlowQuote(\n {\n inputMint,\n outputMint,\n amount: amountStr,\n userPublicKey: userPublicKey ?? \"\",\n slippageBps: 100,\n },\n { enabled: quoteEnabled },\n );\n\n // ---------------------------------------------------------------------------\n // Resolved balances\n // ---------------------------------------------------------------------------\n const usdcBalance = useMemo(() => {\n if (contextBalance) {\n return source === \"kalshi\"\n ? contextBalance.kalshiUsdcBalance\n : contextBalance.polymarketUsdcBalance;\n }\n if (!positionsData) return null;\n const total = positionsData.positions.reduce((sum, p) => {\n if (p.side === \"USDC\" || p.side === \"collateral\")\n return sum + (p.current_value ?? 0);\n return sum;\n }, 0);\n return total || null;\n }, [contextBalance, positionsData, source]);\n\n const isBalanceLoading = contextBalance\n ? contextBalance.isLoading\n : positionsLoading;\n\n const yesTokenBalance = useMemo(() => {\n if (!positionsData) return null;\n const pos = positionsData.positions.find(\n (p) => p.side?.toLowerCase() === \"yes\" && p.market?.slug === market.slug,\n );\n return pos?.size ?? 0;\n }, [positionsData, market.slug]);\n\n const noTokenBalance = useMemo(() => {\n if (!positionsData) return null;\n const pos = positionsData.positions.find(\n (p) => p.side?.toLowerCase() === \"no\" && p.market?.slug === market.slug,\n );\n return pos?.size ?? 0;\n }, [positionsData, market.slug]);\n\n // ---------------------------------------------------------------------------\n // Cost / payout\n // ---------------------------------------------------------------------------\n const effectivePrice = useMemo(() => {\n if (orderType === \"limit\" && supportsLimitOrder && !isNaN(limitPrice)) {\n return limitPrice;\n }\n return pricePerShare;\n }, [orderType, supportsLimitOrder, limitPrice, pricePerShare]);\n\n const estimatedCost = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") return quantity;\n const bidPrice =\n outcome === \"yes\"\n ? (market.outcomes[0]?.best_bid ?? 0)\n : (market.outcomes[1]?.best_bid ?? 0);\n return quantity * bidPrice;\n }, [side, outcome, quantity, market.outcomes]);\n\n const potentialPayout = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") {\n return effectivePrice > 0 ? (quantity / effectivePrice) * 1 : 0;\n }\n return estimatedCost;\n }, [side, quantity, effectivePrice, estimatedCost]);\n\n const potentialProfit = potentialPayout - estimatedCost;\n\n // ---------------------------------------------------------------------------\n // Setters\n // ---------------------------------------------------------------------------\n const setSide = useCallback((s: TradeSide) => {\n setSideRaw(s);\n setQuantityRaw(NaN);\n }, []);\n\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 const rounded =\n side === \"buy\" ? Math.round(clamped * 100) / 100 : Math.round(clamped);\n setQuantityRaw(rounded);\n },\n [side],\n );\n\n const setLimitPrice = useCallback((v: number) => {\n if (isNaN(v)) {\n setLimitPriceRaw(NaN);\n return;\n }\n const clamped = Math.max(0.01, Math.min(0.99, v));\n setLimitPriceRaw(Math.round(clamped * 100) / 100);\n }, []);\n\n // ---------------------------------------------------------------------------\n // Validation\n // ---------------------------------------------------------------------------\n const validation = useMemo<TradeFormValidation>(() => {\n const errors: string[] = [];\n if (isNaN(quantity) || quantity < ORDER_MIN_QUANTITY) {\n errors.push(`Minimum quantity is ${ORDER_MIN_QUANTITY}`);\n }\n if (market.status !== \"open\") {\n errors.push(\"Market is not active\");\n }\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 const holdingBalance = outcome === \"yes\" ? yesTokenBalance : noTokenBalance;\n if (\n side === \"sell\" &&\n holdingBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > holdingBalance\n ) {\n errors.push(\"Insufficient shares\");\n }\n if (\n orderType === \"limit\" &&\n supportsLimitOrder &&\n (isNaN(limitPrice) || limitPrice < 0.01 || limitPrice > 0.99)\n ) {\n errors.push(\"Limit price must be between $0.01 and $0.99\");\n }\n if (\n orderType === \"limit\" &&\n supportsLimitOrder &&\n expirationEnabled &&\n expirationPreset === \"custom\" &&\n (isNaN(customDuration) || customDuration <= 0)\n ) {\n errors.push(t(\"predict.trade.expiration.invalidDate\"));\n }\n return { isValid: errors.length === 0, errors };\n }, [\n quantity,\n market.status,\n side,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n outcome,\n orderType,\n supportsLimitOrder,\n limitPrice,\n expirationEnabled,\n expirationPreset,\n customDuration,\n t,\n ]);\n\n // ---------------------------------------------------------------------------\n // DFlow submit mutation\n // ---------------------------------------------------------------------------\n const { mutateAsync: submitDFlow } = useDFlowSubmit();\n\n // ---------------------------------------------------------------------------\n // Polymarket: context is optional (null when PolymarketProvider is absent)\n // ---------------------------------------------------------------------------\n\n // ---------------------------------------------------------------------------\n // Poll order status for pending DFlow signature\n // ---------------------------------------------------------------------------\n const { data: orderStatus } = useOrder(\n { id: pendingSignature ?? \"\", source },\n { enabled: Boolean(pendingSignature) },\n );\n\n const convertCashToUsdc = useCallback(async () => {\n if (!pendingSellCashConvert || !userPublicKey || !solanaWallet) return;\n const { cashAmount, collateral } = pendingSellCashConvert;\n setPendingSellCashConvert(null);\n\n try {\n const cashQuote = await predictClient.createDFlowQuote({\n inputMint: collateral,\n outputMint: usdcMint,\n amount: cashAmount,\n userPublicKey,\n slippageBps: 100,\n });\n const cashTx = (cashQuote as Record<string, unknown>)?.transaction as\n | string\n | undefined;\n if (!cashTx) return;\n\n const txBytes = Uint8Array.from(atob(cashTx), (c) => c.charCodeAt(0));\n const signedTxBytes = await solanaWallet.signTransaction(txBytes);\n await submitDFlow({\n signedTransaction: btoa(String.fromCharCode(...signedTxBytes)),\n orderContext: {\n user_public_key: userPublicKey,\n input_mint: collateral,\n output_mint: usdcMint,\n amount: cashAmount,\n price: \"1\",\n side: \"SELL\",\n outcome: \"\",\n market_slug: \"\",\n slippage_bps: 100,\n },\n });\n } catch (err) {\n console.error(\"[TradeForm] CASH→USDC conversion failed:\", err);\n }\n }, [\n pendingSellCashConvert,\n userPublicKey,\n solanaWallet,\n predictClient,\n submitDFlow,\n usdcMint,\n ]);\n\n useEffect(() => {\n if (!orderStatus || !pendingSignature) return;\n const { status } = orderStatus;\n if (status === \"closed\") {\n setPendingSignature(null);\n if (pendingSellCashConvert) {\n // Sell confirmed — auto-convert CASH → USDC before showing success\n convertCashToUsdc().finally(() => {\n setIsSubmitting(false);\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n setQuantityRaw(NaN);\n });\n } else {\n setIsSubmitting(false);\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n setQuantityRaw(NaN);\n }\n } else if (status === \"failed\" || status === \"expired\") {\n setIsSubmitting(false);\n setPendingSignature(null);\n setPendingSellCashConvert(null);\n toast.error(t(\"predict.trade.submitError\"));\n }\n }, [\n orderStatus,\n pendingSignature,\n pendingSellCashConvert,\n convertCashToUsdc,\n t,\n ]);\n\n // ---------------------------------------------------------------------------\n // Submit — routes to DFlow or Polymarket based on source\n // ---------------------------------------------------------------------------\n const submitDFlowOrder = useCallback(async () => {\n if (!userPublicKey || !solanaWallet) return;\n\n if (!inputMint || !outputMint) {\n toast.error(\"Missing token mint addresses\");\n setIsSubmitting(false);\n return;\n }\n\n if (!contextKycVerified) {\n setKycRequired(true);\n setIsSubmitting(false);\n return;\n }\n\n const quoteResult = await refetchQuote();\n const quote = quoteResult.data;\n const quoteRecord = quote as Record<string, unknown> | undefined;\n const transaction = quoteRecord?.transaction as string | undefined;\n\n if (!transaction) {\n toast.error(t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n return;\n }\n\n // For sells to non-USDC collateral (e.g. CASH), track the outAmount\n // so we can auto-convert collateral→USDC after the sell completes.\n if (\n side === \"sell\" &&\n effectiveCollateral &&\n effectiveCollateral !== usdcMint\n ) {\n const outAmount = String(quoteRecord?.outAmount ?? \"\");\n if (outAmount && outAmount !== \"0\") {\n setPendingSellCashConvert({\n cashAmount: outAmount,\n collateral: effectiveCollateral,\n });\n }\n }\n\n const txBytes = Uint8Array.from(atob(transaction), (c) => c.charCodeAt(0));\n const signedTxBytes = await solanaWallet.signTransaction(txBytes);\n\n const result = await submitDFlow({\n signedTransaction: btoa(String.fromCharCode(...signedTxBytes)),\n orderContext: {\n user_public_key: userPublicKey,\n input_mint: inputMint,\n output_mint: outputMint,\n amount: amountStr,\n price: String(pricePerShare),\n side: side === \"buy\" ? \"BUY\" : \"SELL\",\n outcome: outcome === \"yes\" ? \"YES\" : \"NO\",\n market_slug: market.slug,\n slippage_bps: 100,\n },\n });\n\n setPendingSignature(result.signature);\n }, [\n userPublicKey,\n solanaWallet,\n predictClient,\n refetchQuote,\n submitDFlow,\n inputMint,\n outputMint,\n amountStr,\n pricePerShare,\n side,\n outcome,\n market.slug,\n effectiveCollateral,\n usdcMint,\n t,\n ]);\n\n const submitPolymarketOrder = useCallback(async () => {\n if (!evmWallet || !polymarketCtx) return;\n\n // Switch to Polygon before submitting; restore original chain afterwards\n const previousChain = evmWallet.chain;\n const needsSwitch = previousChain !== Chain.POLYGON;\n if (needsSwitch) {\n await switchChain(Chain.POLYGON);\n }\n\n try {\n const provider = await evmWallet.getEip1193Provider();\n if (!provider) {\n toast.error(t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n return;\n }\n\n const usesSafe = !!contextSafeAddress;\n const signer: PolymarketSigner = {\n address: evmWallet.address,\n signatureType: usesSafe ? 2 : 0,\n signTypedData: async (domain, types, primaryType, value) => {\n const domainFields: { name: string; type: string }[] = [];\n if (\"name\" in domain)\n domainFields.push({ name: \"name\", type: \"string\" });\n if (\"version\" in domain)\n domainFields.push({ name: \"version\", type: \"string\" });\n if (\"chainId\" in domain)\n domainFields.push({ name: \"chainId\", type: \"uint256\" });\n if (\"verifyingContract\" in domain)\n domainFields.push({ name: \"verifyingContract\", type: \"address\" });\n if (\"salt\" in domain)\n domainFields.push({ name: \"salt\", type: \"bytes32\" });\n\n const fullTypes = { EIP712Domain: domainFields, ...types };\n\n return (await provider.request({\n method: \"eth_signTypedData_v4\",\n params: [\n evmWallet.address,\n JSON.stringify({\n domain,\n types: fullTypes,\n primaryType,\n message: value,\n }),\n ],\n })) as string;\n },\n };\n\n const creds =\n polymarketCtx.credentials ?? (await polymarketCtx.authenticate(signer));\n\n const tokenIdx = outcome === \"yes\" ? 0 : 1;\n let tokenId = \"\";\n const rawClobTokenIds = market.provider_meta?.[\n \"polymarket.clobTokenIds\"\n ] as string | string[] | undefined;\n if (rawClobTokenIds) {\n const ids =\n typeof rawClobTokenIds === \"string\"\n ? (JSON.parse(rawClobTokenIds) as string[])\n : rawClobTokenIds;\n tokenId = ids[tokenIdx] ?? \"\";\n }\n\n const negRisk =\n (market.provider_meta?.[\"polymarket.negRisk\"] as boolean) ?? false;\n\n const price =\n orderType === \"limit\" && !isNaN(limitPrice)\n ? limitPrice\n : pricePerShare;\n\n const polyOrderType =\n orderType === \"limit\" ? (expirationEnabled ? \"GTD\" : \"GTC\") : \"FOK\";\n\n const sizeInShares =\n side === \"buy\" && price > 0 ? quantity / price : quantity;\n\n const input: CreateOrderInput = {\n tokenId,\n price,\n size: sizeInShares,\n side: side === \"buy\" ? \"BUY\" : \"SELL\",\n orderType: polyOrderType,\n tickSize: \"0.01\",\n negRisk,\n ...(contextSafeAddress && { funderAddress: contextSafeAddress }),\n ...(orderType === \"limit\" &&\n expirationEnabled && {\n expiration: resolveExpiration(\n expirationPreset,\n customDuration,\n customDurationUnit,\n ),\n }),\n };\n\n const domain = buildCtfExchangeDomain(negRisk);\n const orderMessage = buildOrderMessage({\n ...input,\n signerAddress: signer.address,\n signatureType: signer.signatureType,\n });\n const signature = await signer.signTypedData(\n domain,\n CTF_ORDER_TYPES as unknown as Record<string, unknown[]>,\n \"Order\",\n orderMessage as unknown as Record<string, unknown>,\n );\n const signedOrder = buildSignedOrder(\n orderMessage,\n signature,\n input.orderType,\n );\n\n // Convert to CLOB payload format (numeric salt, string side, deferExec).\n const clobPayload = buildClobPayload(signedOrder, creds.apiKey);\n\n const body = JSON.stringify(clobPayload);\n const headers = await buildPolymarketL2Headers(creds.address, {\n apiKey: creds.apiKey,\n secret: creds.secret,\n passphrase: creds.passphrase,\n method: \"POST\",\n requestPath: \"/order\",\n body,\n });\n\n await predictClient.createPolymarketOrder(\n clobPayload as unknown as CreateOrderInput,\n headers as unknown as Record<string, string>,\n );\n\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"orders\"] });\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"positions\"] });\n\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n setQuantityRaw(NaN);\n setIsSubmitting(false);\n } finally {\n if (needsSwitch && previousChain) {\n switchChain(previousChain).catch(() => {});\n }\n }\n }, [\n evmWallet,\n polymarketCtx,\n switchChain,\n outcome,\n market.provider_meta,\n orderType,\n limitPrice,\n pricePerShare,\n quantity,\n side,\n predictClient,\n queryClient,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n t,\n ]);\n\n const submit = useCallback(async () => {\n if (!validation.isValid || !isAuthenticated) return;\n\n setIsSubmitting(true);\n setPendingSignature(null);\n setKycRequired(false);\n\n try {\n if (source === \"kalshi\") {\n await submitDFlowOrder();\n } else {\n await submitPolymarketOrder();\n }\n } catch (err) {\n console.error(\"[TradeForm] submit failed:\", err);\n const detail = err instanceof Error ? err.message : undefined;\n toast.error(detail || t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n }\n }, [\n validation.isValid,\n isAuthenticated,\n source,\n submitDFlowOrder,\n submitPolymarketOrder,\n t,\n ]);\n\n return {\n outcome,\n side,\n orderType,\n quantity,\n limitPrice,\n shares,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n supportsLimitOrder,\n kycRequired,\n kycUrl: contextKycUrl,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n setOutcome,\n setSide,\n setOrderType,\n setQuantity,\n setLimitPrice,\n setExpirationEnabled,\n setExpirationPreset,\n setCustomDuration,\n setCustomDurationUnit,\n submit,\n };\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { StyledModal, ModalContent } from \"@liberfi.io/ui\";\n\nexport interface KycModalProps {\n isOpen: boolean;\n onClose: () => void;\n kycUrl: string | null;\n}\n\nexport function KycModal({ isOpen, onClose, kycUrl }: KycModalProps) {\n const { t } = useTranslation();\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n size=\"md\"\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 pt-5 pb-4\">\n <h3 className=\"text-base font-semibold text-white\">\n {t(\"predict.trade.kycModalTitle\")}\n </h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1 rounded-[10px] hover:bg-[rgba(39,39,42,0.5)] text-zinc-400 hover:text-white transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n {/* Body */}\n <div className=\"px-5 pb-5\">\n <p className=\"text-[13px] text-zinc-400 mb-4 text-left\">\n {t(\"predict.trade.kycModalDescription\")}\n </p>\n\n {/* Checklist */}\n <div className=\"flex flex-col gap-2 mb-4\">\n {(\n [\n \"predict.trade.kycModalBullet1\",\n \"predict.trade.kycModalBullet2\",\n \"predict.trade.kycModalBullet3\",\n ] as const\n ).map((key) => (\n <div\n key={key}\n className=\"flex items-center gap-2.5 text-[13px] text-zinc-300\"\n >\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-[#c7ff2e] shrink-0\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n <span>{t(key)}</span>\n </div>\n ))}\n </div>\n\n {/* KYC link */}\n {kycUrl && (\n <a\n href={kycUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-[13px] text-[#c7ff2e]/70 hover:text-[#c7ff2e] transition-colors mb-3\"\n >\n {t(\"predict.trade.goToKYC\")} →\n </a>\n )}\n\n <p className=\"text-[11px] text-zinc-500 mb-5\">\n {t(\"predict.trade.kycModalNote\")}\n </p>\n\n {/* OK button */}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-full py-2.5 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n {t(\"common.ok\")}\n </button>\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n ChevronDownIcon,\n Tabs,\n Tab,\n StyledNumberInput,\n Select,\n SelectItem,\n StyledSwitch,\n useDisclosure,\n cn,\n} from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { KycModal } from \"../kyc-modal\";\nimport type {\n TradeSide,\n TradeOutcome,\n OrderType,\n ExpirationPreset,\n DurationUnit,\n} from \"./trade-form.script\";\n\nconst USDC_LOGO = `https://s1.chainstream.io/chains/sol/tokens/${SOLANA_TOKENS.stablecoins.USDC.address}/image.png`;\n\nconst EXPIRATION_PRESETS: ExpirationPreset[] = [\n \"5m\",\n \"1h\",\n \"12h\",\n \"24h\",\n \"eod\",\n \"custom\",\n];\n\nconst EXPIRATION_PRESET_I18N = {\n \"5m\": \"predict.trade.expiration.5m\",\n \"1h\": \"predict.trade.expiration.1h\",\n \"12h\": \"predict.trade.expiration.12h\",\n \"24h\": \"predict.trade.expiration.24h\",\n eod: \"predict.trade.expiration.eod\",\n custom: \"predict.trade.expiration.custom\",\n} as const;\n\nconst DURATION_UNITS: DurationUnit[] = [\"minutes\", \"hours\", \"days\"];\n\nconst DURATION_UNIT_I18N = {\n minutes: \"predict.trade.expiration.minutes\",\n hours: \"predict.trade.expiration.hours\",\n days: \"predict.trade.expiration.days\",\n} as const;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TradeFormUIProps {\n event?: StandardEvent;\n market: StandardMarket;\n /** \"bordered\" (default) renders with border + rounded container; \"flat\" omits border (e.g. inside a modal). */\n variant?: \"bordered\" | \"flat\";\n outcome: TradeOutcome;\n side: TradeSide;\n orderType: OrderType;\n quantity: number;\n limitPrice: number;\n shares: number;\n estimatedCost: number;\n potentialPayout: number;\n potentialProfit: number;\n isSubmitting: boolean;\n usdcBalance: number | null;\n yesTokenBalance: number | null;\n noTokenBalance: number | null;\n isBalanceLoading: boolean;\n isValid: boolean;\n validationErrors: string[];\n supportsLimitOrder: boolean;\n kycRequired: boolean;\n kycUrl: string | null;\n expirationEnabled: boolean;\n expirationPreset: ExpirationPreset;\n customDuration: number;\n customDurationUnit: DurationUnit;\n onOutcomeChange: (outcome: TradeOutcome) => void;\n onSideChange: (side: TradeSide) => void;\n onOrderTypeChange: (type: OrderType) => void;\n onQuantityChange: (quantity: number) => void;\n onLimitPriceChange: (price: number) => void;\n onExpirationEnabledChange: (enabled: boolean) => void;\n onExpirationPresetChange: (preset: ExpirationPreset) => void;\n onCustomDurationChange: (v: number) => void;\n onCustomDurationUnitChange: (u: DurationUnit) => void;\n onSubmit: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function TradeFormUI({\n event,\n market,\n variant = \"bordered\",\n outcome,\n side,\n orderType,\n quantity,\n limitPrice,\n shares,\n potentialProfit,\n potentialPayout,\n estimatedCost,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n isValid,\n validationErrors,\n supportsLimitOrder,\n kycRequired,\n kycUrl,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n onOutcomeChange,\n onSideChange,\n onOrderTypeChange,\n onQuantityChange,\n onLimitPriceChange,\n onExpirationEnabledChange,\n onExpirationPresetChange,\n onCustomDurationChange,\n onCustomDurationUnitChange,\n onSubmit,\n}: TradeFormUIProps) {\n const { t } = useTranslation();\n const [showOdds, setShowOdds] = useState(false);\n const kycModal = useDisclosure();\n\n useEffect(() => {\n if (kycRequired && !kycModal.isOpen) {\n kycModal.onOpen();\n }\n }, [kycRequired]);\n\n const currentPriceCents = useMemo(() => {\n const price =\n side === \"buy\"\n ? outcome === \"yes\"\n ? market.yesAsk\n : market.noAsk\n : outcome === \"yes\"\n ? market.yesBid\n : market.noBid;\n return price != null ? parseFloat((Number(price) * 100).toFixed(2)) : null;\n }, [side, outcome, market]);\n\n const hasAmount = !isNaN(quantity) && quantity > 0;\n\n const submitLabel = useMemo(() => {\n if (isSubmitting) return t(\"predict.trade.submitting\");\n if (kycRequired) return t(\"predict.trade.kycRequired\");\n if (!hasAmount) return t(\"predict.trade.enterAmount\");\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 const winAmount =\n side === \"buy\" && potentialProfit > 0\n ? ` → Win $${potentialProfit.toFixed(2)}`\n : \"\";\n return `${sideLabel} ${outcomeLabel}${winAmount}`;\n }, [isSubmitting, kycRequired, hasAmount, side, outcome, potentialProfit, t]);\n\n const submitColor = useMemo(() => {\n return outcome === \"yes\" ? \"primary\" : \"secondary\";\n }, [outcome]);\n\n const handleHalf = () => {\n const bal = usdcBalance ?? 0;\n onQuantityChange(Math.floor((bal / 2) * 100) / 100);\n };\n const handleMax = () => {\n onQuantityChange(usdcBalance ?? 0);\n };\n\n const [showErrors, setShowErrors] = useState(false);\n\n const handleSubmitPress = () => {\n if (kycRequired) {\n kycModal.onOpen();\n return;\n }\n if (!isValid) {\n setShowErrors(true);\n return;\n }\n setShowErrors(false);\n onSubmit();\n };\n\n return (\n <>\n <div\n className={cn(\n \"flex w-full flex-col gap-y-4 p-4\",\n variant === \"bordered\" &&\n \"rounded-xl border border-default-200 bg-content1\",\n )}\n >\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={\n outcome === \"yes\" ? \"text-bullish\" : \"text-bearish\"\n }\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 {market.yesSubTitle}\n </span>\n </span>\n </div>\n </div>\n )}\n\n {/* Market/Limit order-type tabs + current price */}\n <div className=\"flex items-center justify-between\">\n {supportsLimitOrder ? (\n <Tabs\n variant=\"underlined\"\n selectedKey={orderType}\n onSelectionChange={(key) => onOrderTypeChange(key as OrderType)}\n classNames={{\n tabList: \"gap-x-4\",\n tab: \"px-0\",\n }}\n >\n <Tab key=\"market\" title={t(\"predict.trade.market\")} />\n <Tab key=\"limit\" title={t(\"predict.trade.limit\")} />\n </Tabs>\n ) : (\n <span className=\"text-sm font-medium text-foreground\">\n {t(\"predict.trade.market\")}\n </span>\n )}\n {orderType === \"limit\" && supportsLimitOrder ? (\n <StyledNumberInput\n aria-label=\"Limit price\"\n placeholder=\"50\"\n size=\"sm\"\n radius=\"none\"\n value={\n isNaN(limitPrice)\n ? undefined\n : parseFloat((limitPrice * 100).toFixed(2))\n }\n onValueChange={(v) => onLimitPriceChange(v / 100)}\n minValue={1}\n maxValue={99}\n step={1}\n formatOptions={{ maximumFractionDigits: 2 }}\n endContent={\n <span className=\"text-xl font-bold tabular-nums text-foreground\">\n ¢\n </span>\n }\n classNames={{\n base: \"w-28\",\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content2 group-data-[focus=true]:bg-content2 rounded-lg px-2 h-9 min-h-9\",\n input: \"text-xl font-bold tabular-nums text-right\",\n }}\n />\n ) : (\n currentPriceCents != null && (\n <span className=\"text-xl font-bold tabular-nums\">\n {currentPriceCents} ¢\n </span>\n )\n )}\n </div>\n\n {/* TODO: unhide when sell flow is ready */}\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 =\n 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\"\n ? t(\"predict.trade.yes\")\n : 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 {parseFloat((Number(price) * 100).toFixed(2))}¢\n </span>\n ) : null;\n })()}\n </button>\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 {/* Amount / Shares input */}\n <div className=\"flex flex-col gap-y-1.5\">\n <div className=\"flex items-center justify-between text-xs text-neutral-500\">\n <span className=\"text-sm font-medium text-foreground\">\n {side === \"buy\"\n ? t(\"predict.trade.youArePaying\")\n : t(\"predict.trade.contracts\")}\n </span>\n {side === \"buy\" && (\n <div className=\"flex items-center gap-x-2\">\n <img\n src={USDC_LOGO}\n alt=\"USDC\"\n className=\"h-3.5 w-3.5 rounded-full object-cover\"\n />\n <span className=\"font-medium text-foreground tabular-nums\">\n {usdcBalance != null ? `${usdcBalance.toFixed(2)} USDC` : \"–\"}\n </span>\n <button\n type=\"button\"\n onClick={handleHalf}\n className=\"rounded px-1.5 py-0.5 bg-content2 hover:bg-content3 transition-colors cursor-pointer text-foreground font-medium\"\n >\n {t(\"predict.trade.half\")}\n </button>\n <button\n type=\"button\"\n onClick={handleMax}\n className=\"rounded px-1.5 py-0.5 bg-content2 hover:bg-content3 transition-colors cursor-pointer text-foreground font-medium\"\n >\n {t(\"predict.trade.max\")}\n </button>\n </div>\n )}\n </div>\n <StyledNumberInput\n key={side}\n aria-label=\"Trade amount\"\n fullWidth\n placeholder=\"0\"\n radius=\"lg\"\n size=\"lg\"\n value={isNaN(quantity) ? undefined : quantity}\n onValueChange={(v) => {\n setShowErrors(false);\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 {/* Sell side quick percentage buttons */}\n {side === \"sell\" && (\n <div className=\"flex gap-x-2 justify-end\">\n {[25, 50].map((pct) => (\n <button\n key={pct}\n type=\"button\"\n onClick={() => {\n const bal =\n outcome === \"yes\"\n ? (yesTokenBalance ?? 0)\n : (noTokenBalance ?? 0);\n onQuantityChange(Math.floor((bal * pct) / 100));\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 const bal =\n outcome === \"yes\"\n ? (yesTokenBalance ?? 0)\n : (noTokenBalance ?? 0);\n onQuantityChange(bal);\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 </div>\n )}\n\n {showErrors && validationErrors.length > 0 && (\n <div className=\"flex flex-col gap-y-0.5\">\n {validationErrors.map((err) => (\n <span key={err} className=\"text-xs text-danger\">\n {err}\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Limit order expiration (GTD) — only for Polymarket limit orders */}\n {orderType === \"limit\" && supportsLimitOrder && (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-primary\">\n {t(\"predict.trade.setExpiration\")}\n </span>\n <StyledSwitch\n size=\"sm\"\n color=\"primary\"\n isSelected={expirationEnabled}\n onValueChange={onExpirationEnabledChange}\n aria-label={t(\"predict.trade.setExpiration\")}\n />\n </div>\n {expirationEnabled && (\n <>\n <Select\n aria-label={t(\"predict.trade.setExpiration\")}\n selectedKeys={[expirationPreset]}\n onSelectionChange={(keys) => {\n const val = Array.from(keys)[0] as\n | ExpirationPreset\n | undefined;\n if (val) onExpirationPresetChange(val);\n }}\n size=\"sm\"\n radius=\"lg\"\n classNames={{\n trigger:\n \"bg-content2 data-[hover=true]:bg-content2 min-h-10\",\n value: \"text-sm\",\n }}\n >\n {EXPIRATION_PRESETS.map((preset) => (\n <SelectItem key={preset}>\n {t(EXPIRATION_PRESET_I18N[preset])}\n </SelectItem>\n ))}\n </Select>\n {expirationPreset === \"custom\" && (\n <div className=\"flex gap-x-2\">\n <StyledNumberInput\n aria-label=\"Duration amount\"\n size=\"sm\"\n radius=\"lg\"\n value={isNaN(customDuration) ? undefined : customDuration}\n onValueChange={onCustomDurationChange}\n minValue={1}\n step={1}\n formatOptions={{ maximumFractionDigits: 0 }}\n classNames={{\n base: \"flex-1\",\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content2 group-data-[focus=true]:bg-content2 min-h-10\",\n input: \"text-sm\",\n }}\n />\n <Select\n aria-label=\"Duration unit\"\n selectedKeys={[customDurationUnit]}\n onSelectionChange={(keys) => {\n const val = Array.from(keys)[0] as\n | DurationUnit\n | undefined;\n if (val) onCustomDurationUnitChange(val);\n }}\n size=\"sm\"\n radius=\"lg\"\n classNames={{\n base: \"w-32\",\n trigger:\n \"bg-content2 data-[hover=true]:bg-content2 min-h-10\",\n value: \"text-sm\",\n }}\n >\n {DURATION_UNITS.map((u) => (\n <SelectItem key={u}>\n {t(DURATION_UNIT_I18N[u])}\n </SelectItem>\n ))}\n </Select>\n </div>\n )}\n </>\n )}\n </div>\n )}\n\n {/* Odds collapsible row */}\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"flex items-center justify-between text-sm\">\n <button\n type=\"button\"\n onClick={() => setShowOdds((v) => !v)}\n className=\"flex items-center gap-x-1 text-neutral-500 hover:text-foreground cursor-pointer transition-colors\"\n >\n <span>{t(\"predict.trade.odds\")}</span>\n <ChevronDownIcon\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n showOdds && \"rotate-180\",\n )}\n />\n </button>\n {currentPriceCents != null && (\n <span className=\"text-foreground font-medium tabular-nums\">\n {currentPriceCents}% chance\n </span>\n )}\n </div>\n {showOdds && (\n <div className=\"flex flex-col gap-y-1.5 border-l-2 border-default-300 pl-3 text-sm text-neutral-500\">\n <div className=\"flex items-center justify-between\">\n <span>Total Size</span>\n <span className=\"tabular-nums text-foreground\">\n {!isNaN(quantity) && quantity > 0\n ? `$${estimatedCost.toFixed(2)}`\n : \"–\"}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span>No. of Contracts</span>\n <span className=\"tabular-nums text-foreground\">\n {!isNaN(shares) && shares > 0\n ? parseFloat(shares.toFixed(2))\n : \"–\"}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span>Payout</span>\n <span className=\"tabular-nums text-foreground\">\n {!isNaN(quantity) && quantity > 0\n ? `$${potentialPayout.toFixed(2)}`\n : \"–\"}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span>Est. Profit</span>\n <span className=\"tabular-nums text-bullish\">\n {!isNaN(quantity) && quantity > 0 && potentialProfit > 0\n ? `+$${potentialProfit.toFixed(2)}`\n : \"–\"}\n </span>\n </div>\n </div>\n )}\n </div>\n\n {/* Submit button */}\n <Button\n color={submitColor as \"primary\" | \"secondary\" | \"default\"}\n fullWidth\n radius=\"lg\"\n size=\"lg\"\n isDisabled={!hasAmount || isSubmitting}\n isLoading={isSubmitting}\n onPress={handleSubmitPress}\n >\n {submitLabel}\n </Button>\n </div>\n\n <KycModal\n isOpen={kycModal.isOpen}\n onClose={kycModal.onClose}\n kycUrl={kycUrl}\n />\n </>\n );\n}\n","import { useMemo } from \"react\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport {\n predictEventToStandard,\n predictMarketToStandard,\n} from \"../../utils/predict-market-adapter\";\nimport {\n useTradeForm,\n type TradeOutcome,\n type TradeSide,\n type ExpirationPreset,\n} from \"./trade-form.script\";\nimport { TradeFormUI } from \"./trade-form.ui\";\n\nexport interface TradeFormWidgetProps {\n event?: PredictEvent;\n market: PredictMarket;\n variant?: \"bordered\" | \"flat\";\n initialSide?: TradeSide;\n initialOutcome?: TradeOutcome;\n chain?: string;\n}\n\nexport function TradeFormWidget({\n event,\n market,\n variant,\n initialSide,\n initialOutcome,\n chain,\n}: TradeFormWidgetProps) {\n const {\n outcome,\n side,\n orderType,\n quantity,\n limitPrice,\n shares,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n supportsLimitOrder,\n kycRequired,\n kycUrl,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n setOutcome,\n setSide,\n setOrderType,\n setQuantity,\n setLimitPrice,\n setExpirationEnabled,\n setExpirationPreset,\n setCustomDuration,\n setCustomDurationUnit,\n submit,\n } = useTradeForm({\n market,\n initialSide,\n initialOutcome,\n chain,\n });\n\n const authenticatedSubmit = useAuthCallback(submit);\n\n const adaptedEvent = useMemo(\n () => (event ? predictEventToStandard(event) : undefined),\n [event],\n );\n const adaptedMarket = useMemo(\n () => predictMarketToStandard(market),\n [market],\n );\n\n return (\n <TradeFormUI\n event={adaptedEvent}\n market={adaptedMarket}\n variant={variant}\n outcome={outcome}\n side={side}\n orderType={orderType}\n quantity={quantity}\n limitPrice={limitPrice}\n shares={shares}\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 supportsLimitOrder={supportsLimitOrder}\n kycRequired={kycRequired}\n kycUrl={kycUrl}\n expirationEnabled={expirationEnabled}\n expirationPreset={expirationPreset}\n customDuration={customDuration}\n customDurationUnit={customDurationUnit}\n onOutcomeChange={setOutcome}\n onSideChange={setSide}\n onOrderTypeChange={setOrderType}\n onQuantityChange={setQuantity}\n onLimitPriceChange={setLimitPrice}\n onExpirationEnabledChange={setExpirationEnabled}\n onExpirationPresetChange={setExpirationPreset}\n onCustomDurationChange={setCustomDuration}\n onCustomDurationUnitChange={setCustomDurationUnit}\n onSubmit={authenticatedSubmit}\n />\n );\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { ModalContent, StyledModal, useScreen } from \"@liberfi.io/ui\";\nimport {\n AsyncModal,\n type RenderAsyncModalProps,\n} from \"@liberfi.io/ui-scaffold\";\nimport type { TradeOutcome, TradeSide } from \"./trade-form.script\";\nimport { TradeFormWidget } from \"./trade-form.widget\";\n\nexport type PredictTradeModalParams = {\n event: PredictEvent;\n market: PredictMarket;\n initialOutcome?: TradeOutcome;\n initialSide?: TradeSide;\n chain?: string;\n};\n\nexport type PredictTradeModalResult = void;\n\nexport const PREDICT_TRADE_MODAL_ID = \"predict-trade\";\n\nexport function PredictTradeModal({\n id = PREDICT_TRADE_MODAL_ID,\n}: {\n id?: string;\n}) {\n return (\n <AsyncModal<PredictTradeModalParams, PredictTradeModalResult> id={id}>\n {(modalProps) => <PredictTradeModalContent {...modalProps} />}\n </AsyncModal>\n );\n}\n\nfunction PredictTradeModalContent({\n params,\n isOpen,\n onOpenChange,\n}: RenderAsyncModalProps<PredictTradeModalParams, PredictTradeModalResult>) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n if (!params) return null;\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size={isMobile ? \"lg\" : \"md\"}\n backdrop=\"blur\"\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 pt-5 pb-4\">\n <h3 className=\"text-base font-semibold text-white\">\n {t(\"predict.trade.action\")}\n </h3>\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className=\"p-1 rounded-[10px] hover:bg-[rgba(39,39,42,0.5)] text-zinc-400 hover:text-white transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n {/* Body */}\n <div className=\"px-5 pb-5\">\n <TradeFormWidget\n event={params.event}\n market={params.market}\n initialOutcome={params.initialOutcome}\n initialSide={params.initialSide ?? \"buy\"}\n chain={params.chain}\n variant=\"flat\"\n />\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n","// =============================================================================\n// EventsFilterUI\n//\n// Filter modal for the events list. Contains chip-based filter sections:\n// - Platform (source provider)\n// - Time Remaining\n// - Min Volume\n// - Min Liquidity\n//\n// Visual style aligned with the matches page dark zinc theme.\n// Pure presentational component — state is managed by the parent page via\n// a draft-and-apply pattern: the modal works on a draft copy of the filter\n// state, and only commits changes when \"Show Results\" is pressed.\n// =============================================================================\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { ProviderSource } from \"@liberfi.io/react-predict\";\nimport { StyledModal, ModalContent } from \"@liberfi.io/ui\";\nimport type { SortPreset } from \"./events-toolbar.ui\";\n\n// -----------------------------------------------------------------------------\n// Filter state type\n// -----------------------------------------------------------------------------\n\nexport interface EventsFilterState {\n sortPreset: SortPreset;\n sortAsc: boolean;\n source?: ProviderSource;\n timeRemaining?: string;\n minVolume?: string;\n minLiquidity?: string;\n}\n\nexport const DEFAULT_FILTER_STATE: EventsFilterState = {\n sortPreset: \"volume\",\n sortAsc: false,\n source: undefined,\n timeRemaining: undefined,\n minVolume: undefined,\n minLiquidity: undefined,\n};\n\n/** Count how many non-default filters are active (excluding sortPreset) */\nexport function countActiveFilters(state: EventsFilterState): number {\n let count = 0;\n if (state.source) count++;\n if (state.timeRemaining) count++;\n if (state.minVolume) count++;\n if (state.minLiquidity) count++;\n return count;\n}\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsFilterUIProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Callback to close the modal */\n onClose: () => void;\n /** Current committed filter state */\n value: EventsFilterState;\n /** Callback when \"Show Results\" is pressed with the new filter state */\n onChange: (state: EventsFilterState) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsFilterUI({\n isOpen,\n onClose,\n value,\n onChange,\n}: EventsFilterUIProps) {\n const { t } = useTranslation();\n\n const [draft, setDraft] = useState<EventsFilterState>(value);\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (open) {\n setDraft(value);\n } else {\n onClose();\n }\n },\n [value, onClose],\n );\n\n const handleReset = useCallback(() => {\n setDraft(DEFAULT_FILTER_STATE);\n }, []);\n\n const handleApply = useCallback(() => {\n onChange(draft);\n onClose();\n }, [draft, onChange, onClose]);\n\n const updateDraft = useCallback(\n <K extends keyof EventsFilterState>(key: K, val: EventsFilterState[K]) => {\n setDraft((prev) => ({ ...prev, [key]: val }));\n },\n [],\n );\n\n const activeCount = useMemo(() => countActiveFilters(draft), [draft]);\n\n const platformOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"polymarket\" as const, label: t(\"predict.platform.polymarket\") },\n { value: \"kalshi\" as const, label: t(\"predict.platform.kalshi\") },\n ],\n [t],\n );\n\n const timeRemainingOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1d\", label: t(\"predict.filter.lessThanDay\") },\n { value: \"7d\", label: t(\"predict.filter.lessThanWeek\") },\n { value: \"30d\", label: t(\"predict.filter.lessThanMonth\") },\n ],\n [t],\n );\n\n const volumeOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1000\", label: \">$1K\" },\n { value: \"10000\", label: \">$10K\" },\n { value: \"100000\", label: \">$100K\" },\n { value: \"1000000\", label: \">$1M\" },\n ],\n [t],\n );\n\n const liquidityOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1000\", label: \">$1K\" },\n { value: \"10000\", label: \">$10K\" },\n { value: \"100000\", label: \">$100K\" },\n { value: \"1000000\", label: \">$1M\" },\n ],\n [t],\n );\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={handleOpenChange}\n size=\"md\"\n backdrop=\"blur\"\n scrollBehavior=\"inside\"\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 pt-5 pb-4\">\n <h3 className=\"text-base font-semibold text-white\">\n {t(\"predict.filter.title\")}\n </h3>\n <CloseButton onClick={() => handleOpenChange(false)} />\n </div>\n\n {/* Body */}\n <div\n style={{\n padding: \"0 20px 16px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 20,\n }}\n >\n <FilterSection label={t(\"predict.filter.platform\")}>\n <FilterChipGroup\n options={platformOptions}\n selected={draft.source}\n onSelect={(v) =>\n updateDraft(\"source\", v as ProviderSource | undefined)\n }\n />\n </FilterSection>\n\n <FilterSection label={t(\"predict.filter.timeRemaining\")}>\n <FilterChipGroup\n options={timeRemainingOptions}\n selected={draft.timeRemaining}\n onSelect={(v) => updateDraft(\"timeRemaining\", v)}\n />\n </FilterSection>\n\n <FilterSection label={t(\"predict.filter.minVolume\")}>\n <FilterChipGroup\n options={volumeOptions}\n selected={draft.minVolume}\n onSelect={(v) => updateDraft(\"minVolume\", v)}\n />\n </FilterSection>\n\n <FilterSection label={t(\"predict.filter.minLiquidity\")}>\n <FilterChipGroup\n options={liquidityOptions}\n selected={draft.minLiquidity}\n onSelect={(v) => updateDraft(\"minLiquidity\", v)}\n />\n </FilterSection>\n </div>\n\n {/* Footer */}\n <div\n className=\"flex items-center gap-3 px-5 py-4\"\n style={{ borderTop: \"1px solid rgba(39,39,42,0.5)\" }}\n >\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center py-2.5 px-5 rounded-[10px] text-zinc-400 text-sm font-medium hover:text-white transition-colors cursor-pointer\"\n onClick={handleReset}\n >\n {t(\"predict.filter.reset\")}\n </button>\n <button\n type=\"button\"\n className=\"flex-1 inline-flex items-center justify-center gap-2 py-2.5 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer\"\n onClick={handleApply}\n >\n {t(\"predict.filter.showResults\")}\n {activeCount > 0 && (\n <span style={{ opacity: 0.7 }}>({activeCount})</span>\n )}\n </button>\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Filter section wrapper\n// -----------------------------------------------------------------------------\n\nfunction FilterSection({\n label,\n children,\n}: {\n label: string;\n children: React.ReactNode;\n}) {\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n <span\n style={{\n fontSize: 11,\n fontWeight: 500,\n color: \"#71717a\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n }}\n >\n {label}\n </span>\n {children}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// FilterChipGroup — reusable chip selection row\n// -----------------------------------------------------------------------------\n\ninterface ChipOption {\n value: string | undefined;\n label: string;\n}\n\ninterface FilterChipGroupProps {\n options: ChipOption[];\n selected: string | undefined;\n onSelect: (value: string | undefined) => void;\n allowDeselect?: boolean;\n}\n\n// -----------------------------------------------------------------------------\n// Close button (matches KYC modal style)\n// -----------------------------------------------------------------------------\n\nfunction CloseButton({ onClick }: { onClick: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"p-1 rounded-[10px] hover:bg-[rgba(39,39,42,0.5)] text-zinc-400 hover:text-white transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// FilterChipGroup — reusable chip selection row\n// -----------------------------------------------------------------------------\n\nfunction FilterChipGroup({\n options,\n selected,\n onSelect,\n allowDeselect = true,\n}: FilterChipGroupProps) {\n return (\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\n {options.map((opt) => {\n const isActive = selected === opt.value;\n return (\n <button\n key={opt.value ?? \"__all\"}\n type=\"button\"\n onClick={() => {\n if (isActive && allowDeselect) {\n onSelect(undefined);\n } else {\n onSelect(opt.value);\n }\n }}\n style={{\n flexShrink: 0,\n borderRadius: 10,\n padding: \"6px 14px\",\n fontSize: 13,\n fontWeight: 500,\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n border: isActive\n ? \"1px solid rgba(199,255,46,0.3)\"\n : \"1px solid rgba(63,63,70,0.5)\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"rgba(39,39,42,0.4)\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.8)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.4)\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","// =============================================================================\n// EventsToolbarUI\n//\n// Toolbar bar between categories and the events grid. Contains:\n// - Sort pill: sort-field dropdown + ascending/descending toggle\n// - Filter button with active-filter badge\n//\n// Visual style aligned with the matches filter bar (dark zinc theme).\n// Pure presentational component — state is managed by the parent page.\n// =============================================================================\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { EventSortField } from \"@liberfi.io/react-predict\";\nimport {\n CalendarIcon,\n ChartLineIcon,\n DropletIcon,\n TimerIcon,\n} from \"@liberfi.io/ui\";\n\n// -----------------------------------------------------------------------------\n// Sort presets\n// -----------------------------------------------------------------------------\n\nexport type SortPreset = \"start_time\" | \"volume\" | \"liquidity\" | \"ending_soon\";\n\nexport const SORT_PRESETS: Record<SortPreset, { sort_by: EventSortField }> = {\n start_time: { sort_by: \"created_at\" },\n volume: { sort_by: \"volume\" },\n liquidity: { sort_by: \"liquidity\" },\n ending_soon: { sort_by: \"end_at\" },\n};\n\nconst SORT_LABEL_KEYS = {\n start_time: \"predict.sort.startTime\",\n volume: \"predict.sort.volume\",\n liquidity: \"predict.sort.liquidity\",\n ending_soon: \"predict.sort.endingSoon\",\n} as const;\n\nconst SORT_ORDER: SortPreset[] = [\n \"start_time\",\n \"volume\",\n \"liquidity\",\n \"ending_soon\",\n];\n\n// -----------------------------------------------------------------------------\n// Shared inline styles (matches filter bar theme)\n// -----------------------------------------------------------------------------\n\nconst btnBase: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"8px 12px\",\n fontSize: 14,\n color: \"#d4d4d8\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n};\n\nconst dropdownBase: React.CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: \"100%\",\n zIndex: 20,\n marginTop: 8,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n};\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsToolbarUIProps {\n /** Currently active sort preset */\n sortPreset: SortPreset;\n /** Callback when the user picks a different sort preset */\n onSortChange: (preset: SortPreset) => void;\n /** Current sort direction: true = ascending, false = descending */\n sortAsc: boolean;\n /** Callback when the user toggles the sort direction */\n onSortAscChange: (asc: boolean) => void;\n /** Callback when the filter button is pressed */\n onFilterPress: () => void;\n /** Number of currently active filters (shown as badge count) */\n filterCount?: number;\n /** Optional class name for the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsToolbarUI({\n sortPreset,\n onSortChange,\n sortAsc,\n onSortAscChange,\n onFilterPress,\n filterCount = 0,\n className,\n}: EventsToolbarUIProps) {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = useCallback((e: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n }\n }, []);\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [handleClickOutside]);\n\n useEffect(() => {\n if (!isOpen) return;\n const onEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"keydown\", onEscape);\n return () => document.removeEventListener(\"keydown\", onEscape);\n }, [isOpen]);\n\n const ActiveIcon = SORT_ICONS[sortPreset];\n\n return (\n <div\n className={className}\n style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}\n >\n {/* Sort dropdown */}\n <div ref={dropdownRef} style={{ position: \"relative\" }}>\n <button\n type=\"button\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={() => setIsOpen((v) => !v)}\n >\n <SortIcon />\n <ActiveIcon\n className=\"size-4 shrink-0\"\n style={{ color: \"#a1a1aa\" }}\n />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {t(SORT_LABEL_KEYS[sortPreset])}\n </span>\n <ChevronDown open={isOpen} />\n </button>\n\n {isOpen && (\n <div style={{ ...dropdownBase, width: 224, padding: 4 }}>\n {SORT_ORDER.map((key) => {\n const Icon = SORT_ICONS[key];\n const isActive = sortPreset === key;\n return (\n <button\n key={key}\n type=\"button\"\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n gap: 12,\n padding: \"10px 12px\",\n textAlign: \"left\",\n fontSize: 14,\n border: \"none\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"transparent\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n borderRadius: 10,\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.5)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n onClick={() => {\n if (sortPreset === key) {\n onSortAscChange(!sortAsc);\n } else {\n onSortChange(key);\n }\n setIsOpen(false);\n }}\n >\n <Icon\n className=\"size-4 shrink-0\"\n style={{ color: isActive ? \"#c7ff2e\" : \"#71717a\" }}\n />\n <span style={{ flex: 1, fontWeight: 500 }}>\n {t(SORT_LABEL_KEYS[key])}\n </span>\n {isActive && (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 16,\n height: 16,\n color: \"#c7ff2e\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Sort direction toggle */}\n <button\n type=\"button\"\n style={{\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n width: 36,\n height: 36,\n color: \"#a1a1aa\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 14,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n e.currentTarget.style.color = \"#fff\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }}\n onClick={() => onSortAscChange(!sortAsc)}\n >\n {sortAsc ? \"↑\" : \"↓\"}\n </button>\n\n {/* Filter button */}\n <div style={{ position: \"relative\", display: \"inline-flex\" }}>\n <button\n type=\"button\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={onFilterPress}\n >\n <FilterBarIcon />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {t(\"predict.filter.title\")}\n </span>\n </button>\n {filterCount > 0 && (\n <span\n style={{\n position: \"absolute\",\n top: -4,\n right: -4,\n minWidth: 16,\n height: 16,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 8,\n background: \"#c7ff2e\",\n color: \"#000\",\n fontSize: 10,\n fontWeight: 600,\n padding: \"0 4px\",\n }}\n >\n {filterCount}\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Sort option icon map\n// -----------------------------------------------------------------------------\n\nconst SORT_ICONS: Record<\n SortPreset,\n React.FC<{ className?: string; style?: React.CSSProperties }>\n> = {\n start_time: CalendarIcon,\n volume: ChartLineIcon,\n liquidity: DropletIcon,\n ending_soon: TimerIcon,\n};\n\n// -----------------------------------------------------------------------------\n// Inline SVG icons\n// -----------------------------------------------------------------------------\n\nfunction SortIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m21 16-4 4-4-4\" />\n <path d=\"M17 20V4\" />\n <path d=\"m3 8 4-4 4 4\" />\n <path d=\"M7 4v16\" />\n </svg>\n );\n}\n\nfunction FilterBarIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\" />\n </svg>\n );\n}\n\nfunction ChevronDown({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#71717a\",\n transition: \"transform 0.15s\",\n transform: open ? \"rotate(180deg)\" : undefined,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n","// =============================================================================\n// Events list script\n//\n// Composes resolveEventsParams() and useInfiniteEvents() from @liberfi.io/react-predict.\n// Owns flattened page data and fetchMore / hasMore helpers for the events grid UI.\n// =============================================================================\nimport { useMemo, useCallback } from \"react\";\nimport type {\n PredictEvent,\n ListEventsParams,\n ResolveEventsParamsInput,\n} from \"@liberfi.io/react-predict\";\nimport {\n resolveEventsParams,\n useInfiniteEvents as usePredictInfiniteEvents,\n} from \"@liberfi.io/react-predict\";\n\nexport type {\n PredictEvent,\n ListEventsParams,\n PredictPage,\n EventSortField,\n EventStatus,\n ProviderSource,\n ResolveEventsParamsInput,\n} from \"@liberfi.io/react-predict\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/** Parameters for useEventsInfinite */\nexport type UseEventsInfiniteParams = ResolveEventsParamsInput;\n\n/** Return value of useEventsInfinite */\nexport interface UseEventsInfiniteResult {\n data: PredictEvent[];\n isLoading: boolean;\n isFetching: boolean;\n isFetchingMore: boolean;\n isError: boolean;\n error: Error | null;\n hasMore: boolean;\n fetchMore: () => void;\n refetch: () => void;\n}\n\n// -----------------------------------------------------------------------------\n// Hook\n// -----------------------------------------------------------------------------\n\n/**\n * Infinite events list hook with flattened pages for virtualized grids.\n *\n * Wraps {@link useInfiniteEvents} from `@liberfi.io/react-predict` and exposes\n * a single `data` array plus loading helpers matching legacy list-hook ergonomics.\n */\nexport function useEventsInfinite(\n params: UseEventsInfiniteParams = {},\n): UseEventsInfiniteResult {\n const baseParams = useMemo<ListEventsParams>(\n () => resolveEventsParams(params),\n [\n params.tagSlugSelection,\n params.limit,\n params.status,\n params.sort_by,\n params.sort_asc,\n params.source,\n params.with_markets,\n params.minVolume,\n params.minLiquidity,\n params.timeRemaining,\n ],\n );\n\n const {\n data: infiniteData,\n isLoading,\n isFetching,\n isFetchingNextPage: isFetchingMore,\n isError,\n error,\n hasNextPage: hasMore,\n fetchNextPage,\n refetch,\n } = usePredictInfiniteEvents(baseParams);\n\n const data = useMemo(\n () =>\n infiniteData?.pages\n .flatMap((page) => page.items)\n .filter((item): item is PredictEvent => item != null) ?? [],\n [infiniteData],\n );\n\n const fetchMore = useCallback(() => {\n void fetchNextPage();\n }, [fetchNextPage]);\n\n const refetchAll = useCallback(() => {\n void refetch();\n }, [refetch]);\n\n return {\n data,\n isLoading,\n isFetching: isFetching && !isFetchingMore,\n isFetchingMore,\n isError,\n error: error ?? null,\n hasMore: hasMore ?? false,\n fetchMore,\n refetch: refetchAll,\n };\n}\n","import { DEFAULT_PAGE_SIZE } from \"../../consts\";\n\n// ---------------------------------------------------------------------------\n// Shimmer animation keyframes (injected once per mount)\n// ---------------------------------------------------------------------------\n\nconst SHIMMER_CSS = `@keyframes evtShimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}@media(max-width:1279px){.evt-skel-grid{grid-template-columns:repeat(3,1fr)!important}}@media(max-width:1023px){.evt-skel-grid{grid-template-columns:repeat(2,1fr)!important}}@media(max-width:767px){.evt-skel-grid{grid-template-columns:1fr!important}}`;\n\n// ---------------------------------------------------------------------------\n// EventsSkeleton — card grid skeleton matching EventItem layout\n// ---------------------------------------------------------------------------\n\nexport interface EventsSkeletonProps {\n count?: number;\n}\n\nexport function EventsSkeleton({ count = 6 }: EventsSkeletonProps) {\n return (\n <>\n <style>{SHIMMER_CSS}</style>\n <div\n className=\"evt-skel-grid\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(4, 1fr)\",\n width: \"100%\",\n }}\n >\n {Array.from({ length: count }).map((_, i) => (\n <SkeletonCard key={i} index={i} />\n ))}\n </div>\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SkeletonCard — mirrors EventItem: header + 3 outcome rows + footer\n// ---------------------------------------------------------------------------\n\nfunction SkeletonCard({ index }: { index: number }) {\n const delay = index * 120;\n const shimmer: React.CSSProperties = {\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.03) 25%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0.03) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: `evtShimmer 1.8s ease-in-out infinite ${delay}ms`,\n borderRadius: 6,\n };\n\n const titleWidth = index % 3 === 0 ? \"85%\" : index % 3 === 1 ? \"70%\" : \"60%\";\n\n return (\n <div style={{ padding: 8 }}>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n }}\n >\n {/* Header: avatar + title */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"14px 14px 8px\",\n }}\n >\n <div\n style={{\n ...shimmer,\n width: 36,\n height: 36,\n borderRadius: 10,\n flexShrink: 0,\n }}\n />\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n <div style={{ ...shimmer, height: 12, width: titleWidth }} />\n <div style={{ ...shimmer, height: 10, width: \"40%\" }} />\n </div>\n </div>\n\n {/* Body: 3 outcome rows */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n padding: \"4px 14px 14px\",\n flex: 1,\n }}\n >\n {[0, 1, 2].map((j) => (\n <div\n key={j}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n }}\n >\n <div\n style={{\n ...shimmer,\n height: 11,\n width: j === 0 ? \"55%\" : j === 1 ? \"45%\" : \"35%\",\n }}\n />\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <div style={{ ...shimmer, height: 11, width: 32 }} />\n <div\n style={{\n ...shimmer,\n height: 28,\n width: 80,\n borderRadius: 8,\n }}\n />\n </div>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.15)\",\n padding: \"8px 14px\",\n }}\n >\n <div style={{ ...shimmer, height: 10, width: 56 }} />\n <div style={{ ...shimmer, height: 10, width: 72 }} />\n </div>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// EventsPageSkeleton — full page: categories + toolbar + card grid\n// ---------------------------------------------------------------------------\n\nexport interface EventsPageSkeletonProps extends EventsSkeletonProps {}\n\nexport function EventsPageSkeleton({\n count = DEFAULT_PAGE_SIZE,\n}: EventsPageSkeletonProps) {\n const bar: React.CSSProperties = {\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.03) 25%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0.03) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: \"evtShimmer 1.8s ease-in-out infinite\",\n borderRadius: 6,\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n width: \"100%\",\n maxWidth: 1680,\n margin: \"0 auto\",\n gap: 12,\n }}\n >\n <style>{SHIMMER_CSS}</style>\n\n {/* Categories placeholder */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n {[48, 64, 48, 56, 72, 56].map((w, i) => (\n <div key={i} style={{ ...bar, height: 24, width: w }} />\n ))}\n </div>\n\n {/* Toolbar placeholder */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n gap: 8,\n minHeight: 36,\n }}\n >\n <div style={{ ...bar, height: 32, width: 120, borderRadius: 10 }} />\n <div style={{ ...bar, height: 32, width: 32, borderRadius: 10 }} />\n <div style={{ ...bar, height: 32, width: 80, borderRadius: 10 }} />\n </div>\n\n {/* Card grid */}\n <div style={{ flex: 1, minHeight: 0 }}>\n <EventsSkeleton count={count} />\n </div>\n </div>\n );\n}\n","// =============================================================================\n// EventItem\n//\n// Event card with three modes:\n// 1. **List view** — header + up to 3 outcome rows with a compact Yes/No\n// pill + footer (Show More / volume).\n// 2. **Single view** — header + single market with large Yes/No buy\n// buttons + View Event link.\n// 3. **Expanded view** — header + single market with large Yes/No buy\n// buttons + Back link.\n//\n// Pixel-perfect clone of the Jupiter Prediction Market card design.\n// =============================================================================\nimport { useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n PredictEvent,\n PredictMarket,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport {\n Avatar,\n ChevronUpIcon,\n cn,\n KalshiIcon,\n Linkable,\n PolymarketIcon,\n TimerIcon,\n} from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport type EventItemProps = {\n event: PredictEvent;\n /** URL for the detail page. When set, header / Show More render as links. */\n href?: string;\n /** Custom link component (e.g. next/link). Passed to Linkable. */\n LinkComponent?: LinkComponentType;\n onSelect?: (event: PredictEvent) => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n /** Called when the card is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n};\n\n// -----------------------------------------------------------------------------\n// Constants\n// -----------------------------------------------------------------------------\n\nconst MAX_DISPLAYED_OUTCOMES = 3;\n\n// -----------------------------------------------------------------------------\n// Platform-specific hover glow colors\n// -----------------------------------------------------------------------------\n\ntype GlowColor = { border: string; shadow: string };\n\nconst SOURCE_GLOW: Record<string, GlowColor> = {\n polymarket: {\n border: \"rgba(80,162,255,0.4)\",\n shadow: \"0 2px 18px rgba(80,162,255,0.45)\",\n },\n kalshi: {\n border: \"rgba(0,212,146,0.4)\",\n shadow: \"0 2px 18px rgba(0,212,146,0.45)\",\n },\n};\n\nconst GLOW_FALLBACK: GlowColor = {\n border: \"hsl(var(--heroui-primary) / 0.4)\",\n shadow: \"0 2px 18px hsl(var(--heroui-primary) / 0.45)\",\n};\n\n// -----------------------------------------------------------------------------\n// Outcome color scheme — 8-color palette with deterministic hash selection\n// -----------------------------------------------------------------------------\n\ntype OutcomeColor = { bg: string; text: string; shadow: string };\n\nconst C_PRIMARY: OutcomeColor = {\n bg: \"hsl(var(--heroui-primary) / 0.14)\",\n text: \"hsl(var(--heroui-primary))\",\n shadow: \"hsl(var(--heroui-primary) / 0.18)\",\n};\n\nconst C_SECONDARY: OutcomeColor = {\n bg: \"hsl(var(--heroui-secondary) / 0.14)\",\n text: \"hsl(var(--heroui-secondary))\",\n shadow: \"hsl(var(--heroui-secondary) / 0.18)\",\n};\n\nconst C_RED: OutcomeColor = {\n bg: \"rgba(239, 68, 68, 0.14)\",\n text: \"rgb(239, 68, 68)\",\n shadow: \"rgba(239, 68, 68, 0.18)\",\n};\n\nconst TEAM_PALETTE: OutcomeColor[] = [\n {\n bg: \"rgba(139,92,246,0.14)\",\n text: \"rgb(139,92,246)\",\n shadow: \"rgba(139,92,246,0.18)\",\n },\n {\n bg: \"rgba(34,197,94,0.14)\",\n text: \"rgb(34,197,94)\",\n shadow: \"rgba(34,197,94,0.18)\",\n },\n {\n bg: \"rgba(0,166,212,0.14)\",\n text: \"rgb(0,166,212)\",\n shadow: \"rgba(0,166,212,0.18)\",\n },\n {\n bg: \"rgba(194,120,32,0.14)\",\n text: \"rgb(194,120,32)\",\n shadow: \"rgba(194,120,32,0.18)\",\n },\n {\n bg: \"rgba(202,138,4,0.14)\",\n text: \"rgb(202,138,4)\",\n shadow: \"rgba(202,138,4,0.18)\",\n },\n {\n bg: \"rgba(236,72,153,0.14)\",\n text: \"rgb(236,72,153)\",\n shadow: \"rgba(236,72,153,0.18)\",\n },\n {\n bg: \"rgba(99,102,241,0.14)\",\n text: \"rgb(99,102,241)\",\n shadow: \"rgba(99,102,241,0.18)\",\n },\n {\n bg: \"rgba(244,114,82,0.14)\",\n text: \"rgb(244,114,82)\",\n shadow: \"rgba(244,114,82,0.18)\",\n },\n];\n\nfunction hashString(s: string): number {\n let hash = 0;\n for (let i = 0; i < s.length; i++) {\n hash = ((hash << 5) - hash + s.charCodeAt(i)) | 0;\n }\n return Math.abs(hash);\n}\n\nfunction getOutcomeColors(market: PredictMarket): [OutcomeColor, OutcomeColor] {\n const labels =\n market.outcomes?.map((o) => o.label?.toLowerCase().trim() ?? \"\") ?? [];\n\n if (labels.some((l) => l === \"up\") && labels.some((l) => l === \"down\")) {\n return [C_PRIMARY, C_RED];\n }\n\n if (labels.some((l) => l === \"yes\") && labels.some((l) => l === \"no\")) {\n return [C_PRIMARY, C_SECONDARY];\n }\n\n const label0 = labels[0] ?? \"\";\n const label1 = labels[1] ?? \"\";\n const idx0 = hashString(label0) % TEAM_PALETTE.length;\n let idx1 = hashString(label1) % TEAM_PALETTE.length;\n if (idx1 === idx0) idx1 = (idx1 + 1) % TEAM_PALETTE.length;\n\n return [TEAM_PALETTE[idx0], TEAM_PALETTE[idx1]];\n}\n\n// -----------------------------------------------------------------------------\n// Price helpers\n// -----------------------------------------------------------------------------\n\nfunction getYesAsk(market: PredictMarket): number | null {\n const yes = market.outcomes?.[0];\n if (!yes) return null;\n return yes.best_ask ?? yes.price ?? null;\n}\n\nfunction getYesPercent(market: PredictMarket): number {\n const price = getYesAsk(market);\n return price != null ? parseFloat((price * 100).toFixed(2)) : 0;\n}\n\nfunction formatPercent(value: number): string {\n if (value <= 1 && value > 0) return \"< 1%\";\n if (value >= 99 && value < 100) return \"> 99%\";\n return `${value}%`;\n}\n\nfunction getYesCents(market: PredictMarket): string {\n const yes = market.outcomes?.[0];\n const price = yes?.best_ask ?? yes?.price ?? 0;\n return parseFloat((price * 100).toFixed(2)).toString();\n}\n\nfunction getNoCents(market: PredictMarket): string {\n const no = market.outcomes?.[1];\n if (no) {\n const price = no.best_ask ?? no.price ?? 0;\n return parseFloat((price * 100).toFixed(2)).toString();\n }\n const yes = market.outcomes?.[0];\n const yesPrice = yes?.best_ask ?? yes?.price ?? 0;\n return parseFloat(((1 - yesPrice) * 100).toFixed(2)).toString();\n}\n\n// -----------------------------------------------------------------------------\n// Countdown helpers\n// -----------------------------------------------------------------------------\n\nfunction formatCountdown(isoDate: string): string | null {\n const diff = new Date(isoDate).getTime() - Date.now();\n if (diff <= 0) return null;\n\n const d = Math.floor(diff / 86_400_000);\n const h = Math.floor((diff % 86_400_000) / 3_600_000);\n const m = Math.floor((diff % 3_600_000) / 60_000);\n\n const parts: string[] = [];\n if (d > 0) parts.push(`${d}d`);\n if (h > 0) parts.push(`${h}h`);\n parts.push(`${m}m`);\n\n return parts.join(\" \");\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nconst injectedCSS = `\n.badge-shine { position: relative; overflow: hidden; }\n.badge-shine::after {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(120deg,\n transparent 0%, transparent 30%,\n rgba(255,255,255,0.15) 45%, rgba(255,255,255,0.25) 50%,\n rgba(255,255,255,0.15) 55%, transparent 70%, transparent 100%);\n transform: translate(-200%);\n animation: badge-shine-sweep 6s ease-in-out infinite;\n}\n@keyframes badge-shine-sweep {\n 0% { transform: translate(-200%); }\n 60% { transform: translate(200%); }\n 100% { transform: translate(200%); }\n}\n`;\n\nexport function EventItem({\n event,\n href,\n LinkComponent,\n onSelect,\n onSelectOutcome,\n onHover,\n}: EventItemProps) {\n const [expandedSlug, setExpandedSlug] = useState<string | null>(null);\n\n const rawMarkets = event.markets ?? [];\n const markets = useMemo(\n () =>\n rawMarkets.length > 2\n ? [...rawMarkets].sort(\n (a, b) =>\n (b.outcomes?.[0]?.price ?? 0) - (a.outcomes?.[0]?.price ?? 0),\n )\n : rawMarkets,\n [rawMarkets],\n );\n\n const openMarkets = markets.filter((m) => m.status === \"open\");\n const singleMarket = openMarkets.length === 1;\n const displayedMarkets = openMarkets.slice(0, MAX_DISPLAYED_OUTCOMES);\n const moreCount = openMarkets.length - MAX_DISPLAYED_OUTCOMES;\n\n const formattedVolume = useMemo(() => {\n const vol = Math.round(event.volume ?? 0);\n return `$${vol.toLocaleString(\"en-US\")}`;\n }, [event.volume]);\n\n const expandedMarket = expandedSlug\n ? (openMarkets.find((m) => m.slug === expandedSlug) ?? null)\n : null;\n\n const isExpanded = !!expandedMarket || singleMarket;\n\n // -- handlers --\n\n const handleCardClick = () => {\n if (!isExpanded) {\n onSelect?.(event);\n }\n };\n\n const handleHeaderClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (expandedMarket) {\n e.preventDefault();\n setExpandedSlug(null);\n }\n };\n\n const handleShowMore = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) {\n e.preventDefault();\n onSelect?.(event);\n }\n };\n\n const footerContent = singleMarket ? (\n <SingleMarketFooter\n event={event}\n formattedVolume={formattedVolume}\n href={href}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n />\n ) : expandedMarket ? (\n <ExpandedMarketFooter onCollapse={() => setExpandedSlug(null)} />\n ) : (\n <MarketListFooter\n moreCount={moreCount}\n formattedVolume={formattedVolume}\n source={event.source}\n href={href}\n LinkComponent={LinkComponent}\n onShowMore={handleShowMore}\n />\n );\n\n return (\n <div\n className=\"group\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n width: \"100%\",\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n transition: \"all 0.2s\",\n cursor: !isExpanded ? \"pointer\" : undefined,\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n const glowColor = SOURCE_GLOW[event.source] ?? GLOW_FALLBACK;\n el.style.borderColor = glowColor.border;\n el.style.boxShadow = glowColor.shadow;\n onHover?.(event);\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(39,39,42,0.6)\";\n el.style.boxShadow = \"none\";\n }}\n onClick={handleCardClick}\n >\n <style>{injectedCSS}</style>\n\n {/* ---- Header + Body (padded) ---- */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n padding: \"14px 14px 12px\",\n gap: 8,\n }}\n >\n <CardHeader\n event={event}\n href={href}\n LinkComponent={LinkComponent}\n onClick={handleHeaderClick}\n isExpanded={isExpanded}\n />\n\n <div style={{ display: \"flex\", flexDirection: \"column\", flex: 1 }}>\n {singleMarket ? (\n <SingleMarketBody\n market={openMarkets[0]}\n event={event}\n onSelectOutcome={onSelectOutcome}\n />\n ) : expandedMarket ? (\n <ExpandedMarketBody\n market={expandedMarket}\n event={event}\n onCollapse={() => setExpandedSlug(null)}\n onSelectOutcome={onSelectOutcome}\n />\n ) : (\n <MarketListBody\n displayedMarkets={displayedMarkets}\n onMarketClick={(m) => setExpandedSlug(m.slug)}\n />\n )}\n </div>\n </div>\n\n {/* ---- Footer (edge-to-edge, outside padding) ---- */}\n <CardFooter>{footerContent}</CardFooter>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Card header (avatar + title + badges)\n// -----------------------------------------------------------------------------\n\nfunction CardHeader({\n event,\n href,\n LinkComponent,\n onClick,\n isExpanded,\n}: {\n event: PredictEvent;\n href?: string;\n LinkComponent?: LinkComponentType;\n onClick: React.MouseEventHandler;\n isExpanded: boolean;\n}) {\n const countdown = event.start_at ? formatCountdown(event.start_at) : null;\n\n const cls =\n \"group/header flex items-center gap-x-2 lg:gap-x-4 w-full text-left cursor-pointer\";\n\n return (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className={cls}\n onClick={onClick}\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n className=\"h-8 w-8 flex-shrink-0 transition-transform duration-300 group-hover/header:scale-110 lg:h-12 lg:w-12\"\n classNames={{ base: \"bg-transparent\" }}\n />\n <div className=\"flex min-w-0 flex-1 flex-col justify-center gap-y-0.5\">\n <p\n className={cn(\n \"min-w-0 text-sm font-semibold leading-snug text-slate-200 line-clamp-2 lg:text-base\",\n isExpanded && \"group-hover/header:text-neutral-400\",\n )}\n >\n {event.title}\n </p>\n {countdown && (\n <span className=\"text-[10px] leading-4 text-neutral-500\">\n Live in {countdown}\n </span>\n )}\n </div>\n <EventIndicators event={event} />\n </Linkable>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Event indicator badges (Live / Crypto Countdown / Closed)\n// -----------------------------------------------------------------------------\n\ntype BadgeType =\n | { kind: \"live\" }\n | { kind: \"crypto-short\"; label: string; color: string }\n | { kind: \"closed\" };\n\nfunction getEventBadges(event: PredictEvent): BadgeType[] {\n const badges: BadgeType[] = [];\n\n if (event.status === \"closed\") {\n badges.push({ kind: \"closed\" });\n return badges.slice(0, 2);\n }\n\n const isCrypto = event.tags?.some((t) => t.label?.toLowerCase() === \"crypto\");\n const isLive = event.tags?.some((t) => t.label?.toLowerCase() === \"live\");\n\n if (isCrypto && event.end_at) {\n const remaining = new Date(event.end_at).getTime() - Date.now();\n const fiveMin = 5 * 60 * 1000;\n const fifteenMin = 15 * 60 * 1000;\n\n if (remaining > 0 && remaining <= fifteenMin) {\n const cryptoColor = remaining <= fiveMin ? \"#ef4444\" : \"#f59e0b\";\n badges.push({\n kind: \"crypto-short\",\n label: remaining <= fiveMin ? \"5m\" : \"15m\",\n color: cryptoColor,\n });\n }\n }\n\n if (isLive) {\n badges.push({ kind: \"live\" });\n }\n\n return badges.slice(0, 2);\n}\n\nfunction EventIndicators({ event }: { event: PredictEvent }) {\n const badges = useMemo(() => getEventBadges(event), [event]);\n\n if (badges.length === 0) return null;\n\n return (\n <div className=\"flex flex-shrink-0 flex-col items-end gap-1\">\n {badges.map((badge, i) => {\n switch (badge.kind) {\n case \"live\":\n return <LiveBadge key={i} />;\n case \"crypto-short\":\n return (\n <CryptoCountdownBadge\n key={i}\n label={badge.label}\n color={badge.color}\n />\n );\n case \"closed\":\n return <ClosedBadge key={i} />;\n }\n })}\n </div>\n );\n}\n\nfunction LiveBadge() {\n const { t } = useTranslation();\n return (\n <span className=\"badge-shine relative inline-flex items-center gap-1 overflow-hidden rounded-md bg-[rgb(240,68,56)]/10 px-1.5 py-0.5 text-xs font-semibold text-[rgb(240,68,56)]\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-current\" />\n {t(\"predict.event.status.live\")}\n </span>\n );\n}\n\nfunction CryptoCountdownBadge({\n label,\n color,\n}: {\n label: string;\n color: string;\n}) {\n return (\n <span\n className=\"badge-shine relative inline-flex items-center gap-1 overflow-hidden rounded-md px-1.5 py-0.5 text-xs font-semibold\"\n style={{\n backgroundColor: `${color}26`,\n color,\n }}\n >\n <TimerIcon className=\"size-3 shrink-0\" />\n {label}\n </span>\n );\n}\n\nfunction ClosedBadge() {\n const { t } = useTranslation();\n return (\n <span className=\"inline-flex items-center rounded-md bg-neutral-800/80 px-1.5 py-0.5 text-xs font-semibold text-neutral-400\">\n {t(\"predict.event.status.closed\")}\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Market list — body (outcome rows only)\n// -----------------------------------------------------------------------------\n\nfunction MarketListBody({\n displayedMarkets,\n onMarketClick,\n}: {\n displayedMarkets: PredictMarket[];\n onMarketClick: (market: PredictMarket) => void;\n}) {\n return displayedMarkets.length > 0 ? (\n <div className=\"flex w-full flex-1 flex-col gap-y-0.5 lg:gap-y-2\">\n {displayedMarkets.map((market) => {\n const pct = getYesPercent(market);\n return (\n <button\n type=\"button\"\n key={market.id ?? `${market.source}-${market.slug}`}\n className=\"flex 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 onMarketClick(market);\n }}\n >\n <span className=\"min-w-0 flex-1 text-left text-xs text-slate-200 line-clamp-1 lg:text-sm\">\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-sm font-semibold text-slate-200 lg:text-lg\">\n {formatPercent(pct)}\n </span>\n <YesNoPill />\n </div>\n </button>\n );\n })}\n </div>\n ) : null;\n}\n\n// -----------------------------------------------------------------------------\n// Market list — footer\n// -----------------------------------------------------------------------------\n\nfunction MarketListFooter({\n moreCount,\n formattedVolume,\n source,\n href,\n LinkComponent,\n onShowMore,\n}: {\n moreCount: number;\n formattedVolume: string;\n source: ProviderSource;\n href?: string;\n LinkComponent?: LinkComponentType;\n onShowMore: React.MouseEventHandler;\n}) {\n const { t } = useTranslation();\n\n return (\n <>\n {moreCount > 0 ? (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className=\"flex items-center gap-1 text-[10px] font-normal text-zinc-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n onClick={onShowMore}\n >\n {t(\"predict.event.showMore\")}\n <ChevronRightIcon className=\"h-3 w-3\" />\n </Linkable>\n ) : (\n <div />\n )}\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={source} />\n </span>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Card footer (separated bar matching matches card style)\n// -----------------------------------------------------------------------------\n\nfunction CardFooter({ children }: { children: React.ReactNode }) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.15)\",\n padding: \"8px 14px\",\n marginTop: \"auto\",\n }}\n >\n {children}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Elevated button (matches Jupiter design exactly)\n// -----------------------------------------------------------------------------\n\nfunction ElevatedButton({\n bgColor,\n textColor,\n shadowColor,\n onClick,\n children,\n}: {\n bgColor: string;\n textColor: string;\n shadowColor: string;\n onClick: React.MouseEventHandler;\n children: React.ReactNode;\n}) {\n const handleEnter = (e: React.MouseEvent<HTMLButtonElement>) => {\n const el = e.currentTarget;\n el.style.setProperty(\"--shadow-offset\", \"2px\");\n el.style.transform = \"translateY(2px)\";\n };\n\n const handleLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n const el = e.currentTarget;\n el.style.setProperty(\"--shadow-offset\", \"4px\");\n el.style.transform = \"translateY(0px)\";\n };\n\n return (\n <button\n type=\"button\"\n className=\"flex h-12 flex-1 w-full items-center justify-center gap-x-1 overflow-hidden rounded-lg p-3 text-base font-normal hover:cursor-pointer will-change-transform [-webkit-tap-highlight-color:transparent]\"\n style={\n {\n backgroundColor: bgColor,\n color: textColor,\n \"--shadow-color\": shadowColor,\n \"--shadow-offset\": \"4px\",\n boxShadow:\n \"inset 0 -1px 0 rgba(255,255,255,0.08), 0 var(--shadow-offset, 4px) 0 var(--shadow-color, rgba(0,0,0,0.22))\",\n transition: \"transform .12s, box-shadow .12s, opacity .14s\",\n } as React.CSSProperties\n }\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n onClick={onClick}\n >\n {children}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Outcome buy buttons (shared by SingleMarketView & ExpandedMarketView)\n// -----------------------------------------------------------------------------\n\nfunction OutcomeButtons({\n market,\n event,\n onSelectOutcome,\n dynamicColors = false,\n labelFormat = \"action\",\n}: {\n market: PredictMarket;\n event: PredictEvent;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n dynamicColors?: boolean;\n /** \"action\" → \"Yes XX.X¢\" / \"No XX¢\", \"label\" → \"Label XX¢\" */\n labelFormat?: \"action\" | \"label\";\n}) {\n const { t } = useTranslation();\n const [c0, c1] = dynamicColors\n ? getOutcomeColors(market)\n : [C_PRIMARY, C_SECONDARY];\n\n const label0 = market.outcomes?.[0]?.label?.toLowerCase().trim() ?? \"\";\n const label1 = market.outcomes?.[1]?.label?.toLowerCase().trim() ?? \"\";\n const effectiveFormat =\n labelFormat === \"label\" && label0 === label1 ? \"action\" : labelFormat;\n\n const yesLabel =\n effectiveFormat === \"label\"\n ? `${market.outcomes?.[0]?.label ?? \"Yes\"} ${getYesCents(market)}¢`\n : t(\"predict.market.action.yes\", { price: getYesCents(market) });\n\n const noLabel =\n effectiveFormat === \"label\"\n ? `${market.outcomes?.[1]?.label ?? \"No\"} ${getNoCents(market)}¢`\n : t(\"predict.market.action.no\", { price: getNoCents(market) });\n\n return (\n <div className=\"flex gap-2\">\n <ElevatedButton\n bgColor={c0.bg}\n textColor={c0.text}\n shadowColor={c0.shadow}\n onClick={(e) => {\n e.stopPropagation();\n onSelectOutcome?.(event, market, \"yes\");\n }}\n >\n {yesLabel}\n </ElevatedButton>\n <ElevatedButton\n bgColor={c1.bg}\n textColor={c1.text}\n shadowColor={c1.shadow}\n onClick={(e) => {\n e.stopPropagation();\n onSelectOutcome?.(event, market, \"no\");\n }}\n >\n {noLabel}\n </ElevatedButton>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Yes / No pill (compact, used in list rows)\n// -----------------------------------------------------------------------------\n\nfunction YesNoPill() {\n const { t } = useTranslation();\n\n return (\n <span className=\"inline-flex h-7 w-[85px] items-center justify-center gap-x-3 rounded-lg p-1.5 text-xs font-semibold flex-shrink-0 bg-gradient-to-r from-primary/15 to-secondary/15 lg:h-9 lg:w-24 lg:gap-x-4 lg:p-2 lg:text-sm\">\n <span className=\"text-primary\">{t(\"predict.market.yes\")}</span>\n <span className=\"text-neutral-400\">/</span>\n <span className=\"text-secondary\">{t(\"predict.market.no\")}</span>\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Single market — body (buy buttons only)\n// -----------------------------------------------------------------------------\n\nfunction SingleMarketBody({\n market,\n event,\n onSelectOutcome,\n}: {\n market: PredictMarket;\n event: PredictEvent;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}) {\n return (\n <div style={{ flex: 1 }}>\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n dynamicColors\n labelFormat=\"label\"\n />\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Single market — footer\n// -----------------------------------------------------------------------------\n\nfunction SingleMarketFooter({\n event,\n formattedVolume,\n href,\n LinkComponent,\n onSelect,\n}: {\n event: PredictEvent;\n formattedVolume: string;\n href?: string;\n LinkComponent?: LinkComponentType;\n onSelect?: (event: PredictEvent) => void;\n}) {\n const { t } = useTranslation();\n\n const handleViewEvent = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) {\n e.preventDefault();\n onSelect?.(event);\n }\n };\n\n return (\n <>\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className=\"flex items-center gap-1 text-[10px] font-normal text-zinc-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n onClick={handleViewEvent}\n >\n {t(\"predict.event.viewEvent\")}\n <ChevronRightIcon className=\"h-3 w-3\" />\n </Linkable>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={event.source} />\n </span>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Expanded market — body (collapse toggle + buy buttons)\n// -----------------------------------------------------------------------------\n\nfunction ExpandedMarketBody({\n market,\n event,\n onCollapse,\n onSelectOutcome,\n}: {\n market: PredictMarket;\n event: PredictEvent;\n onCollapse: () => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}) {\n const pct = getYesPercent(market);\n\n return (\n <div style={{ flex: 1 }}>\n <button\n type=\"button\"\n className=\"flex h-9 w-full items-center justify-between cursor-pointer\"\n onClick={(e) => {\n e.stopPropagation();\n onCollapse();\n }}\n >\n <span className=\"min-w-0 flex-1 text-left text-xs text-slate-200 lg:text-sm\">\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n <div className=\"flex items-center gap-x-1 flex-shrink-0\">\n <span className=\"text-sm font-semibold text-slate-200 lg:text-lg\">\n {formatPercent(pct)}\n </span>\n <ChevronUpIcon className=\"h-4 w-4 text-neutral-400\" />\n </div>\n </button>\n <div style={{ marginTop: 12 }}>\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n labelFormat=\"action\"\n />\n </div>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Expanded market — footer\n// -----------------------------------------------------------------------------\n\nfunction ExpandedMarketFooter({ onCollapse }: { onCollapse: () => void }) {\n const { t } = useTranslation();\n\n return (\n <>\n <button\n type=\"button\"\n className=\"flex items-center gap-x-1 text-[10px] font-normal transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n style={{ color: \"#71717a\" }}\n onClick={(e) => {\n e.stopPropagation();\n onCollapse();\n }}\n >\n <ChevronLeftIcon className=\"h-3 w-3\" />\n {t(\"predict.event.back\")}\n </button>\n <div />\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Inline icons\n// -----------------------------------------------------------------------------\n\nfunction ChevronRightIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M4.5 2.5L8 6l-3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ChevronLeftIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M7.5 2.5L4 6l3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Source (platform) icons\n// -----------------------------------------------------------------------------\n\nfunction SourceIcon({ source }: { source: ProviderSource }) {\n const title = source === \"polymarket\" ? \"Polymarket\" : \"Kalshi\";\n return (\n <span\n className=\"inline-flex items-center gap-x-1 text-neutral-400\"\n title={title}\n >\n <span className=\"text-neutral-600\">·</span>\n {source === \"polymarket\" ? (\n <PolymarketIcon className=\"h-5 w-auto shrink-0\" />\n ) : (\n <KalshiIcon className=\"h-3 w-auto shrink-0\" />\n )}\n </span>\n );\n}\n","// =============================================================================\n// EventsUI\n//\n// Events virtual grid: PredictEvent[] with EventItem cards.\n// Layout: responsive 1-4 column grid with react-window virtualisation and\n// infinite-scroll sentinel row.\n// =============================================================================\nimport { useCallback, useRef } from \"react\";\nimport {\n List,\n type ListImperativeAPI,\n type RowComponentProps,\n} from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { Spinner } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { EventItem } from \"./event-item.ui\";\n\nconst MD = 768;\nconst LG = 1024;\nconst XL = 1280;\n\nconst GLOW_INSET = 8;\n\nconst ROW_HEIGHT_SM = 224;\nconst ROW_HEIGHT_LG = 304;\n\nconst END_ROW_HEIGHT = 114;\n\nfunction getColumnCount(width: number): number {\n if (width >= XL) return 4;\n if (width >= LG) return 3;\n if (width >= MD) return 2;\n return 1;\n}\n\nfunction getRowHeight(width: number): number {\n if (width >= LG) return ROW_HEIGHT_LG;\n return ROW_HEIGHT_SM;\n}\n\n// -----------------------------------------------------------------------------\n// EventsUI\n// -----------------------------------------------------------------------------\n\nexport type EventsUIProps = {\n events: PredictEvent[];\n hasMore?: boolean;\n onFetchMore?: () => void;\n onSelect?: (event: PredictEvent) => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n onHover?: (event: PredictEvent) => void;\n};\n\nexport function EventsUI({\n events,\n hasMore = false,\n onFetchMore,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsUIProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<ListImperativeAPI>(null);\n const { width: containerWidth = 0, height: containerHeight = 0 } =\n useResizeObserver({ ref: containerRef });\n\n const columnCount = getColumnCount(containerWidth);\n const rowHeight = getRowHeight(containerWidth);\n const dataRowCount = Math.ceil(events.length / columnCount) || 0;\n const showEndOfList = !hasMore && events.length > 0;\n const totalRowCount =\n dataRowCount + (hasMore ? 1 : 0) + (showEndOfList ? 1 : 0);\n\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 const handleScrollToTop = useCallback(() => {\n listRef.current?.scrollToRow({ index: 0, behavior: \"smooth\" });\n }, []);\n\n return (\n <div ref={containerRef} className=\"@container w-full h-full\">\n <style>{`@keyframes eventCardEnter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}`}</style>\n {containerHeight > 0 && (\n <List\n listRef={listRef}\n className=\"no-scrollbar\"\n style={{ height: containerHeight }}\n onRowsRendered={onRowsRendered}\n rowComponent={EventGridRow}\n rowCount={totalRowCount}\n rowHeight={(index) => {\n if (showEndOfList && index === totalRowCount - 1)\n return END_ROW_HEIGHT;\n if (hasMore && index >= dataRowCount) return rowHeight;\n return rowHeight;\n }}\n rowProps={{\n events,\n columnCount,\n dataRowCount,\n showEndOfList,\n totalRowCount,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n onScrollToTop: handleScrollToTop,\n }}\n />\n )}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Row component\n// -----------------------------------------------------------------------------\n\ntype EventGridRowData = {\n events: PredictEvent[];\n columnCount: number;\n dataRowCount: number;\n showEndOfList: boolean;\n totalRowCount: number;\n onSelect?: (event: PredictEvent) => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n onHover?: (event: PredictEvent) => void;\n onScrollToTop?: () => void;\n};\n\nfunction EventGridRow({\n index,\n style,\n events,\n columnCount,\n dataRowCount,\n showEndOfList,\n totalRowCount,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n onScrollToTop,\n}: RowComponentProps<EventGridRowData>) {\n if (showEndOfList && index === totalRowCount - 1) {\n return (\n <div style={style}>\n <EndOfListRow onScrollToTop={onScrollToTop} />\n </div>\n );\n }\n\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 return (\n <div style={style}>\n <div className=\"flex w-full h-full\">\n {rowEvents.map((event, i) =>\n event == null ? null : (\n <div\n className=\"flex-1 min-w-0 flex\"\n key={`${startIdx + i}-${event.source}-${event.slug}`}\n style={{\n padding: GLOW_INSET,\n animation: `eventCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) ${i * 35}ms both`,\n }}\n >\n <EventItem\n event={event}\n href={getEventHref?.(event)}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n onHover={onHover}\n />\n </div>\n ),\n )}\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\n// -----------------------------------------------------------------------------\n// End of list + Back to top\n// -----------------------------------------------------------------------------\n\nfunction EndOfListRow({ onScrollToTop }: { onScrollToTop?: () => void }) {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex w-full flex-col items-center justify-center gap-y-4 py-6\">\n <div className=\"flex w-full items-center justify-center gap-x-4\">\n <div className=\"h-px w-16 bg-neutral-700\" />\n <span className=\"text-xs font-medium text-neutral-500\">\n {t(\"predict.event.endOfList\")}\n </span>\n <div className=\"h-px w-16 bg-neutral-700\" />\n </div>\n\n <button\n type=\"button\"\n className=\"flex cursor-pointer items-center gap-x-1 text-xs font-medium text-neutral-400\"\n onClick={onScrollToTop}\n >\n <span className=\"iconify size-4 ph--arrow-up-bold\" />\n <span>{t(\"predict.event.backToTop\")}</span>\n </button>\n </div>\n );\n}\n","// =============================================================================\n// EventsWidget\n//\n// Container widget that wires useEventsInfinite (data) to EventsUI (presentation).\n// Accepts `tagSlugSelection` from the categories widget for slug-based filtering.\n// =============================================================================\nimport type {\n PredictEvent,\n PredictMarket,\n EventStatus,\n EventSortField,\n ProviderSource,\n TagSlugSelection,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport { useEventsInfinite } from \"./events.script\";\nimport { EventsSkeleton } from \"./events.skeleton\";\nimport { EventsUI } from \"./events.ui\";\n\nexport type { TagSlugSelection } from \"../categories/categories.widget\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsWidgetProps {\n /** Category / tag selection from the categories widget. */\n tagSlugSelection?: TagSlugSelection | null;\n /** Page size (default: DEFAULT_PAGE_SIZE) */\n limit?: number;\n /** Event lifecycle status filter (default: \"open\") */\n status?: EventStatus;\n /** Sort field */\n sort_by?: EventSortField;\n /** Ascending sort order (default: false → descending) */\n sort_asc?: boolean;\n /** Filter by upstream provider (undefined = all providers) */\n source?: ProviderSource;\n /** Include nested markets in the response (default: true) */\n with_markets?: boolean;\n /**\n * Client-side time-remaining filter. Keeps only events whose `end_at` is\n * within the given window: \"1d\" = < 24 h, \"7d\" = < 7 days, \"30d\" = < 30 days.\n */\n timeRemaining?: string;\n /** Client-side minimum volume filter (USD string, e.g. \"1000\"). */\n minVolume?: string;\n /** Client-side minimum liquidity filter (USD string, e.g. \"10000\"). */\n minLiquidity?: string;\n /** Callback when an event card is selected */\n onSelect?: (event: PredictEvent) => void;\n /** Callback when an outcome button (yes/no) is pressed */\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n /** Generate href for each event card. When set, cards render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a card is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function EventsWidget({\n tagSlugSelection,\n limit = DEFAULT_PAGE_SIZE,\n status,\n sort_by,\n sort_asc,\n source,\n with_markets,\n timeRemaining,\n minVolume,\n minLiquidity,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsWidgetProps) {\n const {\n data: events,\n hasMore,\n fetchMore,\n isFetching,\n } = useEventsInfinite({\n tagSlugSelection,\n limit,\n status,\n sort_by,\n sort_asc,\n source,\n with_markets,\n timeRemaining,\n minVolume,\n minLiquidity,\n });\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 getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n />\n );\n}\n","// =============================================================================\n// EventsPage\n//\n// Composes:\n// - CategoriesWidget — category / tag navigation (static data, slug-based)\n// - EventsToolbarUI — sort dropdown + filter button\n// - EventsFilterUI — filter modal (platform, sort, time, volume, liquidity)\n// - EventsWidget — events grid backed by @liberfi.io/react-predict\n//\n// Owns the sort/filter state and converts it to API params for the widget.\n// =============================================================================\nimport { useState, useCallback, useMemo } from \"react\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { useDisclosure } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport {\n CategoriesWidget,\n type TagSlugSelection,\n} from \"../categories/categories.widget\";\nimport {\n PredictTradeModal,\n PREDICT_TRADE_MODAL_ID,\n type PredictTradeModalParams,\n} from \"../trade-form/trade-form.modal\";\nimport {\n EventsFilterUI,\n countActiveFilters,\n DEFAULT_FILTER_STATE,\n type EventsFilterState,\n} from \"./events-filter.ui\";\nimport {\n EventsToolbarUI,\n SORT_PRESETS,\n type SortPreset,\n} from \"./events-toolbar.ui\";\nimport { EventsWidget } from \"./events.widget\";\n\nexport type { TagSlugSelection } from \"../categories/categories.widget\";\nexport type { SortPreset } from \"./events-toolbar.ui\";\nexport type { EventsFilterState } from \"./events-filter.ui\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsPageProps {\n /** Callback when an event card is selected */\n onSelect?: (event: PredictEvent) => void;\n /** Callback when an outcome button (yes / no) is pressed */\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n /** Generate href for each event card. When set, cards render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a card is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsPage({\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsPageProps) {\n const [tagSlugSelection, setTagSlugSelection] = useState<TagSlugSelection>({\n categorySlug: null,\n tagSlug: null,\n });\n\n const [filterState, setFilterState] =\n useState<EventsFilterState>(DEFAULT_FILTER_STATE);\n\n const {\n isOpen: isFilterOpen,\n onOpen: openFilter,\n onClose: closeFilter,\n } = useDisclosure();\n\n const { onOpen: openTradeModal } = useAsyncModal<PredictTradeModalParams>(\n PREDICT_TRADE_MODAL_ID,\n );\n\n const handleSelectOutcome = useCallback(\n (event: PredictEvent, market: PredictMarket, side: \"yes\" | \"no\") => {\n onSelectOutcome?.(event, market, side);\n openTradeModal({\n params: { event, market, initialOutcome: side },\n });\n },\n [onSelectOutcome, openTradeModal],\n );\n\n const handleCategorySelect = useCallback((selection: TagSlugSelection) => {\n setTagSlugSelection(selection);\n }, []);\n\n const handleSortChange = useCallback((preset: SortPreset) => {\n setFilterState((prev) => ({ ...prev, sortPreset: preset }));\n }, []);\n\n const handleSortAscChange = useCallback((asc: boolean) => {\n setFilterState((prev) => ({ ...prev, sortAsc: asc }));\n }, []);\n\n const handleFilterChange = useCallback((state: EventsFilterState) => {\n setFilterState(state);\n }, []);\n\n const sortBy = useMemo(\n () => SORT_PRESETS[filterState.sortPreset].sort_by,\n [filterState.sortPreset],\n );\n\n const filterCount = useMemo(\n () => countActiveFilters(filterState),\n [filterState],\n );\n\n const toolbar = useMemo(\n () => (\n <EventsToolbarUI\n sortPreset={filterState.sortPreset}\n onSortChange={handleSortChange}\n sortAsc={filterState.sortAsc}\n onSortAscChange={handleSortAscChange}\n onFilterPress={openFilter}\n filterCount={filterCount}\n />\n ),\n [\n filterState.sortPreset,\n filterState.sortAsc,\n filterCount,\n handleSortChange,\n handleSortAscChange,\n openFilter,\n ],\n );\n\n return (\n <div className=\"flex h-full w-full max-w-[1680px] mx-auto flex-col gap-y-3\">\n <CategoriesWidget onSelect={handleCategorySelect} trailing={toolbar} />\n\n <EventsFilterUI\n isOpen={isFilterOpen}\n onClose={closeFilter}\n value={filterState}\n onChange={handleFilterChange}\n />\n\n <div className=\"min-h-0 flex-1\">\n <EventsWidget\n tagSlugSelection={tagSlugSelection}\n sort_by={sortBy}\n sort_asc={filterState.sortAsc}\n source={filterState.source}\n timeRemaining={filterState.timeRemaining}\n minVolume={filterState.minVolume}\n minLiquidity={filterState.minLiquidity}\n onSelect={onSelect}\n onSelectOutcome={handleSelectOutcome}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n />\n </div>\n\n <PredictTradeModal />\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type OrderStatus,\n type PredictEvent,\n type PredictOrder,\n type PredictPosition,\n type PredictTrade,\n type ProviderSource,\n useCancelOrder,\n useInfiniteOrders,\n useInfiniteTrades,\n usePositions,\n} from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton, Spinner } from \"@liberfi.io/ui\";\n\nconst ROW_HEIGHT = 40;\nconst HEADER_HEIGHT = 36;\nconst CONTENT_HEIGHT = 480;\nconst LIST_HEIGHT = CONTENT_HEIGHT - HEADER_HEIGHT;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UserActivitySectionProps {\n event: PredictEvent;\n /** Connected wallet address. When empty the section shows a connect prompt. */\n walletAddress?: string;\n /** Callback to cancel an open order. */\n onCancelOrder?: (orderId: string) => void;\n}\n\ntype ActivityTab = \"positions\" | \"orders\" | \"trades\";\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function UserActivitySection({\n event,\n walletAddress,\n onCancelOrder,\n}: UserActivitySectionProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<ActivityTab>(\"positions\");\n\n const marketSlugs = useMemo(\n () => event.markets?.map((m) => m.slug) ?? [],\n [event.markets],\n );\n\n const { data: positionsData } = usePositions({\n source: event.source,\n user: walletAddress ?? \"\",\n });\n const positionsCount = useMemo(() => {\n if (!positionsData?.positions || !walletAddress) return 0;\n if (marketSlugs.length === 0) return positionsData.positions.length;\n return positionsData.positions.filter(\n (p) => p.market && marketSlugs.includes(p.market.slug),\n ).length;\n }, [positionsData?.positions, marketSlugs, walletAddress]);\n\n const positionsLabel =\n positionsCount > 0\n ? `${t(\"predict.positions.title\")} (${positionsCount})`\n : t(\"predict.positions.title\");\n\n const tabs: { key: ActivityTab; label: string }[] = [\n { key: \"positions\", label: positionsLabel },\n { key: \"orders\", label: t(\"predict.openOrders.title\") },\n { key: \"trades\", label: t(\"predict.tradeHistory.title\") },\n ];\n\n return (\n <div className=\"flex flex-col gap-y-2 mt-6 px-1 lg:px-4\">\n {/* Tab bar */}\n <div className=\"flex items-center gap-x-1 border-b border-border\">\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n \"px-3 py-2 text-sm font-medium transition-colors cursor-pointer\",\n activeTab === tab.key\n ? \"text-foreground border-b-2 border-primary\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n {!walletAddress ? (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height: CONTENT_HEIGHT }}\n >\n {t(\"predict.trade.connectWallet\")}\n </div>\n ) : (\n <div style={{ height: CONTENT_HEIGHT }}>\n {activeTab === \"positions\" && (\n <PositionsTab\n source={event.source}\n walletAddress={walletAddress}\n marketSlugs={marketSlugs}\n />\n )}\n {activeTab === \"orders\" && (\n <OrdersTab\n source={event.source}\n walletAddress={walletAddress}\n marketSlugs={marketSlugs}\n onCancelOrder={onCancelOrder}\n />\n )}\n {activeTab === \"trades\" && (\n <TradesTab source={event.source} walletAddress={walletAddress} />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Positions Tab — virtual list (no infinite loading)\n// ---------------------------------------------------------------------------\n\nfunction PositionsTab({\n source,\n walletAddress,\n marketSlugs,\n}: {\n source: ProviderSource;\n walletAddress: string;\n marketSlugs: string[];\n}) {\n const { t } = useTranslation();\n const { data, isLoading } = usePositions({\n source,\n user: walletAddress,\n });\n\n const positions = useMemo(() => {\n if (!data?.positions) return [];\n if (marketSlugs.length === 0) return data.positions;\n return data.positions.filter(\n (p) => p.market && marketSlugs.includes(p.market.slug),\n );\n }, [data?.positions, marketSlugs]);\n\n if (isLoading) return <TabSkeleton />;\n\n if (positions.length === 0) {\n return <EmptyState message={t(\"predict.positions.empty\")} />;\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n <div\n className=\"flex items-center text-neutral text-xs lg:text-sm font-normal shrink-0\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2 whitespace-nowrap\">\n {t(\"predict.positions.event\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.totalSize\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.value\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.avgPrice\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.markPrice\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.pnl\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.payoutIfRight\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.estSettlement\")}\n </div>\n <div className=\"w-16 shrink-0\" />\n </div>\n\n <List\n style={{ height: LIST_HEIGHT }}\n rowComponent={PositionVirtualRow}\n rowCount={positions.length}\n rowHeight={ROW_HEIGHT}\n rowProps={{\n positions,\n closeLabel: t(\"predict.positions.close\"),\n }}\n />\n </div>\n );\n}\n\ntype PositionRowData = {\n positions: PredictPosition[];\n closeLabel: string;\n};\n\nfunction PositionVirtualRow({\n index,\n style,\n positions,\n closeLabel,\n}: RowComponentProps<PositionRowData>) {\n const position = positions[index];\n if (!position) return null;\n\n const pnl = position.pnl ?? 0;\n const pnlPercent = position.pnl_percent ?? 0;\n const avgPrice = position.avg_price ?? 0;\n const currentPrice = position.current_price ?? 0;\n\n const pnlColor =\n pnl > 0 ? \"text-success\" : pnl < 0 ? \"text-danger\" : \"text-foreground\";\n const pnlSign = pnl > 0 ? \"+\" : \"\";\n\n const marketLabel =\n position.market?.outcomes?.[0]?.label ?? position.market?.question ?? \"—\";\n const sideLabel = position.side;\n const payoutIfRight = position.size;\n const value = position.size * currentPrice;\n const settlementStr = position.market?.end_at\n ? formatSettlementTime(position.market.end_at)\n : \"—\";\n\n return (\n <div\n style={style}\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-xs lg:text-sm\"\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n <div className=\"flex flex-col gap-y-0.5\">\n <span className=\"text-foreground truncate font-medium\">\n {marketLabel}\n </span>\n <span\n className={cn(\n \"text-[10px] font-medium\",\n sideLabel.toLowerCase() === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\",\n )}\n >\n {sideLabel}\n </span>\n </div>\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n {position.size}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n ${value.toFixed(2)}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n {formatPrice(avgPrice)}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n {formatPrice(currentPrice)}\n </div>\n <div\n className={cn(\n \"flex-[1.5] pr-2 text-right font-mono whitespace-nowrap\",\n pnlColor,\n )}\n >\n {pnlSign}${Math.abs(pnl).toFixed(2)}\n <span className=\"text-[10px] ml-0.5 opacity-70\">\n ({pnlSign}\n {pnlPercent.toFixed(1)}%)\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n ${payoutIfRight.toFixed(2)}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right text-neutral whitespace-nowrap\">\n {settlementStr}\n </div>\n <div className=\"w-16 shrink-0 text-right\">\n <button\n type=\"button\"\n className=\"text-xs text-neutral hover:text-foreground cursor-pointer transition-colors rounded px-2 py-0.5 border border-border hover:border-foreground/40\"\n >\n {closeLabel}\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Orders Tab — virtual list + infinite loading\n// ---------------------------------------------------------------------------\n\nfunction OrdersTab({\n source,\n walletAddress,\n marketSlugs,\n onCancelOrder,\n}: {\n source: ProviderSource;\n walletAddress: string;\n marketSlugs: string[];\n onCancelOrder?: (orderId: string) => void;\n}) {\n const { t } = useTranslation();\n const { data, isLoading, fetchNextPage, hasNextPage } = useInfiniteOrders({\n source,\n wallet_address: walletAddress,\n });\n\n const cancelMutation = useCancelOrder();\n\n const orders = useMemo(() => {\n const allItems = data?.pages?.flatMap((p) => p.items) ?? [];\n const openStatuses = new Set([\"live\", \"open\", \"submitted\", \"pending\"]);\n let filtered = allItems.filter((o) => openStatuses.has(o.status));\n if (marketSlugs.length > 0) {\n filtered = filtered.filter(\n (o) => o.market_id && marketSlugs.includes(o.market_id),\n );\n }\n return filtered;\n }, [data?.pages, marketSlugs]);\n\n const handleCancel = useCallback(\n (order: PredictOrder) => {\n if (onCancelOrder) {\n onCancelOrder(order.id);\n } else {\n cancelMutation.mutate({ source: order.source, id: order.id });\n }\n },\n [onCancelOrder, cancelMutation],\n );\n\n const itemCount = orders.length;\n const rowCount = itemCount + (hasNextPage ? 1 : 0);\n\n const isRowLoaded = useCallback(\n (index: number) => index < itemCount,\n [itemCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n await fetchNextPage();\n }, [fetchNextPage]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount,\n threshold: 5,\n });\n\n if (isLoading) return <TabSkeleton />;\n\n if (orders.length === 0 && !hasNextPage) {\n return <EmptyState message={t(\"predict.openOrders.empty\")} />;\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n <div\n className=\"flex items-center text-neutral text-xs lg:text-sm font-normal shrink-0\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"w-16 shrink-0 pr-2\">{t(\"predict.openOrders.side\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.openOrders.outcome\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.openOrders.type\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.openOrders.price\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.openOrders.filled\")}\n </div>\n <div className=\"w-20 shrink-0 pr-2\">\n {t(\"predict.openOrders.status\")}\n </div>\n <div className=\"w-16 shrink-0\" />\n </div>\n\n <List\n style={{ height: LIST_HEIGHT }}\n onRowsRendered={onRowsRendered}\n rowComponent={OrderVirtualRow}\n rowCount={rowCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{\n orders,\n itemCount,\n onCancel: handleCancel,\n isCancelling: cancelMutation.isPending,\n cancelLabel: t(\"predict.openOrders.cancel\"),\n }}\n />\n </div>\n );\n}\n\ntype OrderRowData = {\n orders: PredictOrder[];\n itemCount: number;\n onCancel: (order: PredictOrder) => void;\n isCancelling: boolean;\n cancelLabel: string;\n};\n\nfunction OrderVirtualRow({\n index,\n style,\n orders,\n itemCount,\n onCancel,\n isCancelling,\n cancelLabel,\n}: RowComponentProps<OrderRowData>) {\n if (index >= itemCount) {\n return (\n <div style={style} className=\"flex justify-center items-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const order = orders[index];\n if (!order) return null;\n\n const isBuy = order.side === \"BUY\";\n\n return (\n <div\n style={style}\n className=\"flex items-center border-b border-border/50 text-xs lg:text-sm\"\n >\n <div className=\"w-16 shrink-0 pr-2\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isBuy ? \"bg-primary/10 text-primary\" : \"bg-danger/10 text-danger\",\n )}\n >\n {order.side}\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-foreground capitalize\">\n {order.outcome ?? \"—\"}\n </div>\n <div className=\"flex-1 pr-2 text-neutral capitalize\">\n {order.order_type ?? \"limit\"}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {order.price ? formatPrice(parseFloat(order.price)) : \"—\"}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {order.size_matched ?? \"0\"}/{order.original_size ?? \"—\"}\n </div>\n <div className=\"w-20 shrink-0 pr-2\">\n <OrderStatusBadge status={order.status} />\n </div>\n <div className=\"w-16 shrink-0 text-right\">\n <button\n type=\"button\"\n onClick={() => onCancel(order)}\n disabled={isCancelling}\n className=\"text-[10px] text-danger hover:text-danger/80 cursor-pointer disabled:opacity-50 transition-colors\"\n >\n {isCancelling ? <Spinner size=\"sm\" /> : cancelLabel}\n </button>\n </div>\n </div>\n );\n}\n\nfunction OrderStatusBadge({ status }: { status: OrderStatus }) {\n const colorMap: Record<string, string> = {\n live: \"bg-success/10 text-success\",\n open: \"bg-success/10 text-success\",\n submitted: \"bg-warning/10 text-warning\",\n pending: \"bg-warning/10 text-warning\",\n matched: \"bg-primary/10 text-primary\",\n cancelled: \"bg-neutral/10 text-neutral\",\n failed: \"bg-danger/10 text-danger\",\n expired: \"bg-neutral/10 text-neutral\",\n };\n\n return (\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium capitalize\",\n colorMap[status] ?? \"bg-neutral/10 text-neutral\",\n )}\n >\n {status}\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Trades Tab — virtual list + infinite loading\n// ---------------------------------------------------------------------------\n\nfunction TradesTab({\n source,\n walletAddress,\n}: {\n source: ProviderSource;\n walletAddress: string;\n}) {\n const { t } = useTranslation();\n const { data, isLoading, fetchNextPage, hasNextPage } = useInfiniteTrades({\n source,\n wallet: walletAddress,\n limit: 50,\n });\n\n const trades = useMemo(\n () => data?.pages?.flatMap((p) => p.items) ?? [],\n [data?.pages],\n );\n\n const itemCount = trades.length;\n const rowCount = itemCount + (hasNextPage ? 1 : 0);\n\n const isRowLoaded = useCallback(\n (index: number) => index < itemCount,\n [itemCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n await fetchNextPage();\n }, [fetchNextPage]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount,\n threshold: 5,\n });\n\n if (isLoading) return <TabSkeleton />;\n\n if (trades.length === 0 && !hasNextPage) {\n return <EmptyState message={t(\"predict.tradeHistory.empty\")} />;\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n <div\n className=\"flex items-center text-neutral text-xs lg:text-sm font-normal shrink-0\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"w-16 shrink-0 pr-2\">\n {t(\"predict.tradeHistory.side\")}\n </div>\n <div className=\"flex-1 pr-2\">{t(\"predict.tradeHistory.outcome\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.tradeHistory.price\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.tradeHistory.qty\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.tradeHistory.total\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n {t(\"predict.tradeHistory.time\")}\n </div>\n </div>\n\n <List\n style={{ height: LIST_HEIGHT }}\n onRowsRendered={onRowsRendered}\n rowComponent={TradeVirtualRow}\n rowCount={rowCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{ trades, itemCount }}\n />\n </div>\n );\n}\n\ntype TradeRowData = {\n trades: PredictTrade[];\n itemCount: number;\n};\n\nfunction TradeVirtualRow({\n index,\n style,\n trades,\n itemCount,\n}: RowComponentProps<TradeRowData>) {\n if (index >= itemCount) {\n return (\n <div style={style} className=\"flex justify-center items-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const trade = trades[index];\n if (!trade) return null;\n\n const isBuy = trade.side?.toUpperCase() === \"BUY\";\n const timeStr = formatTimestamp(trade.timestamp);\n const price = trade.price ?? 0;\n const usdSize = trade.usd_size ?? 0;\n\n return (\n <div\n style={style}\n className=\"flex items-center border-b border-border/50 text-xs lg:text-sm\"\n >\n <div className=\"w-16 shrink-0 pr-2\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isBuy ? \"bg-primary/10 text-primary\" : \"bg-danger/10 text-danger\",\n )}\n >\n {trade.side}\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-foreground capitalize\">\n {trade.outcome ?? \"—\"}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatPrice(price)}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {trade.size}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n ${usdSize.toFixed(2)}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right text-neutral whitespace-nowrap\">\n {timeStr}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nfunction EmptyState({ message }: { message: string }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height: CONTENT_HEIGHT }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton() {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height: CONTENT_HEIGHT }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-8 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatPrice(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(1)}¢`;\n}\n\nfunction formatTimestamp(unixSeconds: number): string {\n const date = new Date(unixSeconds * 1000);\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const hours = date.getHours().toString().padStart(2, \"0\");\n const mins = date.getMinutes().toString().padStart(2, \"0\");\n return `${month}/${day} ${hours}:${mins}`;\n}\n\nfunction formatSettlementTime(isoString: string): string {\n try {\n const date = new Date(isoString);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return \"—\";\n }\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\nexport interface EventDetailSkeletonProps {\n marketCount?: number;\n showBack?: boolean;\n}\n\nexport function EventDetailSkeleton({\n marketCount = 4,\n showBack,\n}: EventDetailSkeletonProps) {\n return (\n <div className=\"flex w-full flex-col gap-4 animate-pulse lg:gap-6\">\n {/* Back button placeholder */}\n {showBack && <div className=\"h-5\" />}\n\n {/* Header — avatar + tags + title */}\n <div className=\"flex items-center gap-x-2 h-16 lg:h-20 lg:gap-x-4\">\n <Skeleton className=\"size-16 shrink-0 rounded-lg lg:size-20\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <Skeleton className=\"h-3.5 w-12 rounded\" />\n <Skeleton className=\"h-3.5 w-10 rounded\" />\n <Skeleton className=\"h-3.5 w-10 rounded\" />\n </div>\n <Skeleton className=\"h-5 w-full max-w-sm rounded lg:h-6\" />\n </div>\n </div>\n\n {/* Countdown */}\n <Skeleton className=\"h-4 w-48 rounded\" />\n\n {/* Chart area — legend + chart + bottom bar */}\n <div className=\"flex flex-col gap-3\">\n {/* Legend bar */}\n <div className=\"flex items-center gap-4\">\n <Skeleton className=\"h-4 w-24 rounded\" />\n <Skeleton className=\"h-4 w-20 rounded\" />\n </div>\n {/* Chart body (300px) */}\n <Skeleton className=\"h-[300px] w-full rounded-xl\" />\n {/* Bottom bar — volume + interval switcher */}\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-4 w-20 rounded\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-7 w-[200px] rounded-lg\" />\n <Skeleton className=\"h-7 w-28 rounded-lg\" />\n </div>\n </div>\n </div>\n\n {/* Markets table */}\n <div className=\"flex flex-col\">\n {/* Table header */}\n <div className=\"flex items-center py-2\">\n <div className=\"flex-1\" />\n <Skeleton className=\"h-3.5 w-14 rounded\" />\n <div className=\"flex-1\" />\n </div>\n {/* Market rows */}\n {Array.from({ length: marketCount }).map((_, i) => (\n <div\n key={i}\n className=\"flex items-center gap-x-2 border-b border-border py-2.5 lg:gap-x-3\"\n >\n <Skeleton className=\"size-5 shrink-0 rounded-lg lg:size-8\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <Skeleton className=\"h-3.5 w-32 rounded lg:h-4 lg:w-48\" />\n <Skeleton className=\"h-2.5 w-16 rounded\" />\n </div>\n <Skeleton className=\"h-4 w-10 rounded\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-8 w-16 rounded-lg lg:w-24\" />\n <Skeleton className=\"h-8 w-16 rounded-lg lg:w-24\" />\n </div>\n </div>\n ))}\n </div>\n\n {/* Rules */}\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-4 w-16 rounded\" />\n <Skeleton className=\"h-3.5 w-full rounded\" />\n <Skeleton className=\"h-3.5 w-4/5 rounded\" />\n <Skeleton className=\"h-3.5 w-3/5 rounded\" />\n </div>\n </div>\n );\n}\n\nexport function TradeFormSkeleton() {\n return (\n <div className=\"flex flex-col gap-3 rounded-xl border border-border p-4 animate-pulse\">\n <Skeleton className=\"h-10 w-full rounded-lg\" />\n <Skeleton className=\"h-24 w-full rounded-lg\" />\n <Skeleton className=\"h-10 w-full rounded-lg\" />\n </div>\n );\n}\n","// =============================================================================\n// EventMarketDepthChartUI — CSS div implementation (no Recharts)\n//\n// Reverse-engineered from Jupiter's production code (chunk-1824.js).\n//\n// Why CSS divs instead of Recharts SVG?\n// Hover performance: brightness filter applied via imperative DOM mutation —\n// zero React re-renders on hover. Recharts requires a setState → full chart\n// re-render (101 shape functions) on every mousemove.\n//\n// Visual encoding:\n// BAR HEIGHT = (cumulative / maxCumulative) ^ 0.3 (Jupiter's z-function)\n// BAR OPACITY = 1.0 (order exists at this price) | 0.5 (cumulative only)\n// HOVER = filter: brightness(1.5) applied imperatively to the bar div\n//\n// Coloring: bearish (bid/buy-Yes) | bullish (ask/sell-Yes).\n// =============================================================================\nimport { useState, useMemo, useRef, useCallback, memo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface DepthLevel {\n price: number;\n quantity: number;\n}\n\nexport interface EventMarketDepthChartUIProps {\n bids: DepthLevel[];\n asks: DepthLevel[];\n}\n\n// ---------------------------------------------------------------------------\n// Color tokens\n// ---------------------------------------------------------------------------\n\n/** Bid bars: bullish (lime-green), buying YES. */\nconst BID_COLOR = \"var(--color-bullish)\";\n/** Ask bars: bearish (orange-red), selling YES. */\nconst ASK_COLOR = \"var(--color-bearish)\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format a number using K / M / B notation (thousands-based).\n * 1500 → \"1.5K\" | 2300000 → \"2.3M\" | 1200000000 → \"1.2B\" | 999 → \"999\"\n */\nexport function formatKMB(n: number): string {\n const abs = Math.abs(n);\n if (abs >= 1_000_000_000) {\n return `${parseFloat((n / 1_000_000_000).toFixed(2))}B`;\n }\n if (abs >= 1_000_000) {\n return `${parseFloat((n / 1_000_000).toFixed(2))}M`;\n }\n if (abs >= 1_000) {\n return `${parseFloat((n / 1_000).toFixed(2))}K`;\n }\n return n.toLocaleString();\n}\n\n// ---------------------------------------------------------------------------\n// Data model\n// ---------------------------------------------------------------------------\n\nexport interface DepthSlot {\n priceCents: number;\n // (cumulative / maxCumulative)^0.3, range [0, 1]\n displayHeight: number;\n // 1.0 = actual order here; 0.5 = only cumulative depth passes through\n opacity: number;\n isBid: boolean;\n isAsk: boolean;\n bidCumTotal: number;\n askCumTotal: number;\n bidCumCost: number;\n askCumCost: number;\n}\n\n/**\n * Jupiter height formula (z function):\n * z(e, t) = e<=0 || t<=0 ? 0 : 100 * Math.pow(e/t, 0.3)\n * Returns normalized height in [0, 1].\n */\nfunction heightPow(cumulative: number, maxCumulative: number): number {\n if (cumulative <= 0 || maxCumulative <= 0) return 0;\n return Math.pow(cumulative / maxCumulative, 0.3);\n}\n\nfunction buildDepthData(bids: DepthLevel[], asks: DepthLevel[]): DepthSlot[] {\n const rawBidQty = new Float64Array(101);\n const rawAskQty = new Float64Array(101);\n\n for (const bid of bids) {\n const slot = Math.round(bid.price * 100);\n if (slot >= 0 && slot <= 100) rawBidQty[slot] += bid.quantity;\n }\n for (const ask of asks) {\n const slot = Math.round(ask.price * 100);\n if (slot >= 0 && slot <= 100) rawAskQty[slot] += ask.quantity;\n }\n\n // Bid cumulative: spread → 0¢\n let cumBid = 0;\n let cumBidCost = 0;\n const bidTotal = new Float64Array(101);\n const bidCumCostArr = new Float64Array(101);\n for (let i = 100; i >= 0; i--) {\n cumBid += rawBidQty[i];\n cumBidCost += (rawBidQty[i] * i) / 100;\n bidTotal[i] = cumBid;\n bidCumCostArr[i] = cumBidCost;\n }\n\n // Ask cumulative: spread → 100¢\n let cumAsk = 0;\n let cumAskCost = 0;\n const askTotal = new Float64Array(101);\n const askCumCostArr = new Float64Array(101);\n for (let i = 0; i <= 100; i++) {\n cumAsk += rawAskQty[i];\n cumAskCost += (rawAskQty[i] * i) / 100;\n askTotal[i] = cumAsk;\n askCumCostArr[i] = cumAskCost;\n }\n\n const maxCumulative = Math.max(bidTotal[0] ?? 0, askTotal[100] ?? 0);\n\n return Array.from({ length: 101 }, (_, i) => {\n const isBid = bidTotal[i] > 0;\n const isAsk = askTotal[i] > 0;\n const cumulative = bidTotal[i] || askTotal[i];\n const hasOrder = rawBidQty[i] > 0 || rawAskQty[i] > 0;\n\n return {\n priceCents: i,\n displayHeight: heightPow(cumulative, maxCumulative),\n opacity: cumulative > 0 ? (hasOrder ? 1 : 0.5) : 0,\n isBid,\n isAsk,\n bidCumTotal: bidTotal[i],\n askCumTotal: askTotal[i],\n bidCumCost: bidCumCostArr[i],\n askCumCost: askCumCostArr[i],\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip\n// ---------------------------------------------------------------------------\n\ninterface TooltipInfo {\n priceCents: number;\n isBid: boolean;\n cumTotal: number;\n cumCost: number;\n leftPct: number;\n}\n\nfunction DepthTooltipPanel({ info }: { info: TooltipInfo }) {\n const { t } = useTranslation();\n const color = info.isBid ? BID_COLOR : ASK_COLOR;\n const left = info.leftPct > 65 ? undefined : `${info.leftPct}%`;\n const right = info.leftPct > 65 ? `${100 - info.leftPct}%` : undefined;\n\n return (\n <div\n style={{\n position: \"absolute\",\n top: 8,\n left,\n right,\n zIndex: 10,\n background: \"rgba(17,24,39,0.95)\",\n border: \"1px solid rgba(255,255,255,0.08)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n fontSize: 12,\n color: \"#f9fafb\",\n minWidth: 140,\n pointerEvents: \"none\",\n }}\n >\n <div style={{ marginBottom: 4, fontWeight: 600 }}>\n {t(\"predict.orderBook.depthToPrice\", { price: info.priceCents })}\n </div>\n <div style={{ color }}>\n {t(\"predict.orderBook.depthContracts\", {\n amount: formatKMB(Math.round(info.cumTotal)),\n })}\n </div>\n <div style={{ color }}>${formatKMB(Math.round(info.cumCost))}</div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Single column — memo-ized so only the hovered column re-renders\n// ---------------------------------------------------------------------------\n\ninterface DepthColumnProps {\n slot: DepthSlot;\n onEnter: (slot: DepthSlot, barEl: HTMLDivElement | null) => void;\n onLeave: () => void;\n}\n\nconst DepthColumn = memo(function DepthColumn({\n slot,\n onEnter,\n onLeave,\n}: DepthColumnProps) {\n const barRef = useRef<HTMLDivElement>(null);\n const isVisible = slot.isBid || slot.isAsk;\n const bgColor = slot.isBid ? BID_COLOR : slot.isAsk ? ASK_COLOR : undefined;\n\n return (\n <div\n style={{\n position: \"absolute\",\n left: `${slot.priceCents}%`,\n // 1px transparent right border creates the same subtle column\n // separation as Jupiter's borderRightWidth: \"0.0625rem\"\n width: \"1%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n borderRight: slot.priceCents < 100 ? \"1px solid transparent\" : \"none\",\n cursor: isVisible ? \"crosshair\" : \"default\",\n }}\n onMouseEnter={() => onEnter(slot, barRef.current)}\n onMouseLeave={onLeave}\n >\n {isVisible && (\n <div\n ref={barRef}\n style={{\n position: \"absolute\",\n bottom: 0,\n left: 0,\n width: \"100%\",\n height: `${slot.displayHeight * 100}%`,\n backgroundColor: bgColor,\n opacity: slot.opacity,\n }}\n />\n )}\n </div>\n );\n});\n\n// ---------------------------------------------------------------------------\n// X-axis\n// ---------------------------------------------------------------------------\n\nconst X_TICKS = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100];\n\nfunction DepthXAxis() {\n return (\n // Mirrors Jupiter: h-6 flex items-center with top+bottom border and dim bg\n <div\n className=\"relative flex h-6 items-center border-b border-t border-border px-1\"\n style={{ background: \"rgba(0,0,0,0.15)\" }}\n >\n {X_TICKS.map((tick) => (\n <span\n key={tick}\n className=\"absolute text-neutral font-normal\"\n style={{\n fontSize: 10,\n left: `${tick}%`,\n // 0 → no offset; 100 → pull fully left; others → center\n transform:\n tick === 0\n ? \"translateX(0px)\"\n : tick === 100\n ? \"translateX(-100%)\"\n : \"translateX(-50%)\",\n }}\n >\n {tick}\n </span>\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventMarketDepthChartUI({\n bids,\n asks,\n}: EventMarketDepthChartUIProps) {\n const { t } = useTranslation();\n const data = useMemo(() => buildDepthData(bids, asks), [bids, asks]);\n\n const midPrice = useMemo(() => {\n const bestBid = bids.length > 0 ? Math.max(...bids.map((b) => b.price)) : 0;\n const bestAsk = asks.length > 0 ? Math.min(...asks.map((a) => a.price)) : 1;\n return Math.round(((bestBid + bestAsk) / 2) * 100);\n }, [bids, asks]);\n\n const hasData = useMemo(() => data.some((d) => d.isBid || d.isAsk), [data]);\n\n // Tooltip state — only this re-renders on hover, not the bar columns\n const [tooltip, setTooltip] = useState<TooltipInfo | null>(null);\n\n // Active bar element ref — we mutate DOM directly for brightness filter\n const activeBarRef = useRef<HTMLDivElement | null>(null);\n\n const handleColumnEnter = useCallback(\n (slot: DepthSlot, barEl: HTMLDivElement | null) => {\n // Remove brightness from the previously hovered bar\n if (activeBarRef.current) {\n activeBarRef.current.style.filter = \"\";\n }\n // Apply brightness to the newly hovered bar\n if (barEl) {\n barEl.style.filter = \"brightness(1.5)\";\n activeBarRef.current = barEl;\n } else {\n activeBarRef.current = null;\n }\n\n // Update tooltip (only re-renders the tooltip panel)\n if (slot.isBid || slot.isAsk) {\n setTooltip({\n priceCents: slot.priceCents,\n isBid: slot.isBid,\n cumTotal: slot.isBid ? slot.bidCumTotal : slot.askCumTotal,\n cumCost: slot.isBid ? slot.bidCumCost : slot.askCumCost,\n leftPct: slot.priceCents,\n });\n } else {\n setTooltip(null);\n }\n },\n [],\n );\n\n const handleColumnLeave = useCallback(() => {\n if (activeBarRef.current) {\n activeBarRef.current.style.filter = \"\";\n activeBarRef.current = null;\n }\n setTooltip(null);\n }, []);\n\n if (!hasData) {\n return (\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n {t(\"predict.orderBook.noData\")}\n </div>\n );\n }\n\n return (\n // Fill the parent container (flex-1 in the widget).\n // flex-col: bar area flex-grows, x-axis stays h-6.\n // overflow: hidden prevents the priceCents=100 column (left:100%+width:1%)\n // from creating a horizontal scrollbar on any ancestor.\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n height: \"100%\",\n userSelect: \"none\",\n overflow: \"hidden\",\n }}\n >\n {/* Chart area — fills available height above the X-axis */}\n <div\n style={{\n flex: 1,\n position: \"relative\",\n width: \"100%\",\n overflow: \"hidden\",\n }}\n >\n {/* Mid-price dashed reference line */}\n {midPrice > 0 && (\n <div\n style={{\n position: \"absolute\",\n left: `${midPrice}%`,\n top: 0,\n bottom: 0,\n width: 1,\n backgroundImage:\n \"repeating-linear-gradient(to bottom, #6b7280 0, #6b7280 4px, transparent 4px, transparent 8px)\",\n zIndex: 1,\n pointerEvents: \"none\",\n }}\n />\n )}\n\n {/* Tooltip */}\n {tooltip && <DepthTooltipPanel info={tooltip} />}\n\n {/* Bar columns — each memo-ized, only the hovered one re-renders */}\n {data.map((slot) => (\n <DepthColumn\n key={slot.priceCents}\n slot={slot}\n onEnter={handleColumnEnter}\n onLeave={handleColumnLeave}\n />\n ))}\n </div>\n\n {/* X-axis */}\n <DepthXAxis />\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictMarket } from \"@liberfi.io/react-predict\";\nimport { useOrderbook } from \"@liberfi.io/react-predict\";\nimport {\n Spinner,\n cn,\n OrderbookDepthIcon,\n OrderbookTableIcon,\n} from \"@liberfi.io/ui\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport {\n EventMarketDepthChartUI,\n formatKMB,\n type DepthLevel,\n} from \"./event-market-depth-chart.ui\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format a price (0–1) as cents with up to 1 decimal place.\n * Whole numbers: \"8¢\" Fractional: \"8.1¢\"\n * Matches Jupiter's display format.\n */\nfunction formatPriceCents(price: number): string {\n const cents = price * 100;\n const rounded = Math.round(cents * 10) / 10; // round to 1 decimal\n return Number.isInteger(rounded) ? `${rounded}¢` : `${rounded.toFixed(1)}¢`;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype ViewMode = \"depth\" | \"table\";\n\nexport interface EventMarketDetailWidgetProps {\n market: PredictMarket;\n /** Which outcome's orderbook to display; defaults to \"yes\". */\n outcome?: TradeOutcome;\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Loading skeleton shared by depth and table views\n// ---------------------------------------------------------------------------\n\nfunction OrderbookSkeleton() {\n const { t } = useTranslation();\n return (\n <div className=\"flex items-center justify-center gap-x-2 h-full text-neutral text-xs\">\n <Spinner size=\"sm\" />\n <span>{t(\"predict.orderBook.loading\")}</span>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventMarketDetailWidget({\n market,\n outcome = \"yes\",\n onTradeAction,\n}: EventMarketDetailWidgetProps) {\n const { t } = useTranslation();\n const [viewMode, setViewMode] = useState<ViewMode>(\"depth\");\n const isNo = outcome === \"no\";\n\n const source = market.source;\n\n const { data: orderbook, isLoading: isOrderbookLoading } = useOrderbook({\n slug: market.slug,\n source,\n });\n\n const bids = useMemo(() => {\n const raw = isNo ? orderbook?.asks : orderbook?.bids;\n return (raw ?? []).map((o) => ({\n price: isNo ? 1 - o.price : o.price,\n quantity: o.size,\n }));\n }, [orderbook?.bids, orderbook?.asks, isNo]);\n\n const asks = useMemo(() => {\n const raw = isNo ? orderbook?.bids : orderbook?.asks;\n return (raw ?? []).map((o) => ({\n price: isNo ? 1 - o.price : o.price,\n quantity: o.size,\n }));\n }, [orderbook?.bids, orderbook?.asks, isNo]);\n\n const bestBid = useMemo(\n () => (bids.length > 0 ? Math.max(...bids.map((b) => b.price)) : null),\n [bids],\n );\n const bestAsk = useMemo(\n () => (asks.length > 0 ? Math.min(...asks.map((a) => a.price)) : null),\n [asks],\n );\n const spread = useMemo(() => {\n if (bestBid == null || bestAsk == null) return null;\n const raw = (bestAsk - bestBid) * 100;\n const rounded = Math.round(raw * 10) / 10;\n return rounded;\n }, [bestBid, bestAsk]);\n\n // Fixed total height matches Jupiter (header + content = 262px).\n return (\n <div className=\"flex flex-col h-[262px]\">\n {/*\n * Header — mirrors Jupiter's exact layout:\n * [flex-1] Spread [flex-1 center] Bid | Ask [flex-1 end] icon buttons\n * Each section is flex-1 (equal thirds), no absolute positioning.\n * Button active state is text-only (no bg highlight), matching Jupiter.\n */}\n <div className=\"flex h-9 items-center border-b border-border px-1 text-xs\">\n {/* LEFT: Spread — flex-1, plain neutral text */}\n <span className=\"flex-1 text-left text-neutral\">\n {spread != null\n ? `${t(\"predict.orderBook.spread\")}: ${Number.isInteger(spread) ? `${spread}¢` : `${spread.toFixed(1)}¢`}`\n : null}\n </span>\n\n {/* CENTER: Bid | Ask — flex-1, centered */}\n <span className=\"flex flex-1 items-center justify-center gap-x-1 whitespace-nowrap\">\n {bestBid != null && (\n <span style={{ color: \"var(--color-bullish)\" }}>\n {t(\"predict.trade.bestBid\")}: {formatPriceCents(bestBid)}\n </span>\n )}\n {bestBid != null && bestAsk != null && (\n <span className=\"text-neutral\">|</span>\n )}\n {bestAsk != null && (\n <span style={{ color: \"var(--color-bearish)\" }}>\n {t(\"predict.trade.bestAsk\")}: {formatPriceCents(bestAsk)}\n </span>\n )}\n </span>\n\n {/* RIGHT: View mode toggle icons — flex-1, end-aligned, color-only active state */}\n <div className=\"flex flex-1 justify-end\">\n <button\n type=\"button\"\n title={viewMode === \"depth\" ? \"Orderbook\" : \"Depth chart\"}\n onClick={() =>\n setViewMode((prev) => (prev === \"depth\" ? \"table\" : \"depth\"))\n }\n className=\"flex items-center text-neutral transition-colors cursor-pointer hover:text-foreground\"\n >\n {viewMode === \"depth\" ? (\n <OrderbookTableIcon className=\"h-4 w-4\" />\n ) : (\n <OrderbookDepthIcon className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n </div>\n\n {/* Content area — fills the remaining height so total stays at 262px */}\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n {viewMode === \"depth\" && (\n <>\n {isOrderbookLoading ? (\n <OrderbookSkeleton />\n ) : (\n <EventMarketDepthChartUI bids={bids} asks={asks} />\n )}\n </>\n )}\n\n {viewMode === \"table\" && (\n <>\n {isOrderbookLoading ? (\n <OrderbookSkeleton />\n ) : (\n <EventOrderbookTableUI\n bids={bids}\n asks={asks}\n bestBid={bestBid ?? undefined}\n bestAsk={bestAsk ?? undefined}\n spread={spread ?? undefined}\n />\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// EventOrderbookTableUI — Jupiter-style traditional orderbook table\n// ---------------------------------------------------------------------------\n\nconst MAX_ROWS_PER_SIDE = 8;\n\ninterface EventOrderbookTableUIProps {\n bids: DepthLevel[];\n asks: DepthLevel[];\n bestBid?: number;\n bestAsk?: number;\n spread?: number;\n}\n\nfunction EventOrderbookTableUI({\n bids,\n asks,\n spread,\n}: EventOrderbookTableUIProps) {\n const { t } = useTranslation();\n\n // Asks: closest-to-spread first (ascending), take N, reverse for display (highest at top)\n const sortedAsks = useMemo(\n () =>\n [...asks]\n .sort((a, b) => a.price - b.price)\n .slice(0, MAX_ROWS_PER_SIDE)\n .reverse(),\n [asks],\n );\n\n // Bids: highest first (closest to spread at top), take N\n const sortedBids = useMemo(\n () =>\n [...bids].sort((a, b) => b.price - a.price).slice(0, MAX_ROWS_PER_SIDE),\n [bids],\n );\n\n // Max quantity across all visible rows — used for background depth bar width\n const maxQty = useMemo(() => {\n const all = [...sortedAsks, ...sortedBids].map((r) => r.quantity);\n return Math.max(...all, 1);\n }, [sortedAsks, sortedBids]);\n\n const isEmpty = sortedAsks.length === 0 && sortedBids.length === 0;\n\n if (isEmpty) {\n return (\n <div className=\"flex items-center justify-center h-full text-xs text-neutral\">\n {t(\"predict.orderBook.empty\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col h-full overflow-y-auto text-xs font-mono select-none\">\n {/* Ask rows (sell Yes / buy No) */}\n {sortedAsks.map((ask) => (\n <OrderbookRow\n key={`ask-${ask.price}`}\n price={ask.price}\n quantity={ask.quantity}\n side=\"ask\"\n maxQty={maxQty}\n />\n ))}\n\n {/* Spread separator */}\n <div className=\"flex items-center justify-center gap-x-2 py-1 border-y border-border text-neutral text-[10px]\">\n {spread != null && (\n <span>\n {t(\"predict.orderBook.spread\")}:{\" \"}\n {Number.isInteger(spread) ? `${spread}¢` : `${spread.toFixed(1)}¢`}\n </span>\n )}\n </div>\n\n {/* Bid rows (buy Yes) */}\n {sortedBids.map((bid) => (\n <OrderbookRow\n key={`bid-${bid.price}`}\n price={bid.price}\n quantity={bid.quantity}\n side=\"bid\"\n maxQty={maxQty}\n />\n ))}\n\n {/* Column headers at the bottom, matching Jupiter's layout */}\n <div className=\"grid grid-cols-3 px-2 pt-2 pb-0.5 text-[10px] text-neutral border-t border-border\">\n <span>{t(\"predict.orderBook.price\")}</span>\n <span className=\"text-center\">{t(\"predict.orderBook.contracts\")}</span>\n <span className=\"text-right\">{t(\"predict.orderBook.total\")}</span>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Single orderbook row with background depth bar\n// ---------------------------------------------------------------------------\n\ninterface OrderbookRowProps {\n price: number;\n quantity: number;\n side: \"bid\" | \"ask\";\n maxQty: number;\n}\n\nfunction OrderbookRow({ price, quantity, side, maxQty }: OrderbookRowProps) {\n const isAsk = side === \"ask\";\n const depthPct = Math.min((quantity / maxQty) * 100, 100);\n const bgClass = isAsk ? \"bg-bearish/10\" : \"bg-bullish/10\";\n const priceClass = isAsk ? \"text-bearish\" : \"text-bullish\";\n\n const formattedContracts = formatKMB(Math.round(quantity));\n const dollarValue = Math.round(quantity * price);\n const formattedTotal = `$${formatKMB(dollarValue)}`;\n\n return (\n <div className=\"relative grid grid-cols-3 px-2 py-1 hover:bg-content2 transition-colors cursor-default\">\n {/* Background depth bar */}\n <div\n className={`absolute inset-y-0 left-0 ${bgClass} transition-[width] duration-200`}\n style={{ width: `${depthPct}%` }}\n />\n {/* Price */}\n <span className={`relative z-10 ${priceClass}`}>\n {formatPriceCents(price)}\n </span>\n {/* Contracts */}\n <span className=\"relative z-10 text-foreground text-center\">\n {formattedContracts}\n </span>\n {/* Total */}\n <span className=\"relative z-10 text-foreground text-right\">\n {formattedTotal}\n </span>\n </div>\n );\n}\n","// =============================================================================\n// EventPriceChart\n//\n// Pixel-accurate clone of the Jupiter Prediction Market price chart.\n// Uses Recharts LineChart with 7 visual effects:\n// 1. Top legend (dot + label + live %)\n// 2. Real-time tooltip on hover\n// 3. Active cursor dot on each line\n// 4. Breathing pulsing dot at the last data point\n// 5. Left/right opacity overlay that follows the cursor\n// 6. Custom X/Y axis styling\n// 7. Horizontal dashed grid lines\n//\n// Accepts a PredictEvent and selects up to 4 markets to display via a chip selector.\n// =============================================================================\nimport {\n Component,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ErrorInfo,\n type ReactNode,\n} from \"react\";\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ReferenceDot,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport {\n ChartRange,\n type ChartRangeType,\n useMarketHistory,\n type MarketHistorySeries,\n} from \"@liberfi.io/react-predict\";\nimport { DEFAULT_CHART_RANGE } from \"../../consts\";\n\n// ---------------------------------------------------------------------------\n// Error boundary — prevents chart crashes from taking down the page\n// ---------------------------------------------------------------------------\n\ninterface ChartErrorBoundaryState {\n error: Error | null;\n}\n\nclass ChartErrorBoundary extends Component<\n { children: ReactNode; fallbackHeight?: number },\n ChartErrorBoundaryState\n> {\n state: ChartErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error(\"[EventPriceChart] render error:\", error, info);\n }\n\n render() {\n if (this.state.error) {\n return (\n <div\n style={{\n height: this.props.fallbackHeight ?? 320,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n <span>Chart unavailable</span>\n <span style={{ fontSize: 11, opacity: 0.7 }}>\n {this.state.error.message}\n </span>\n </div>\n );\n }\n return this.props.children;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MAX_SELECTED = 4;\n\n/** Jupiter-aligned chart colors */\nconst CHART_COLORS = [\n \"#22d3ee\", // cyan\n \"#a3e635\", // lime\n \"#f97316\", // orange\n \"#f472b6\", // pink\n \"#a78bfa\", // violet\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatTimestamp(ms: number, range?: ChartRangeType): string {\n const d = new Date(ms);\n if (range === ChartRange.ONE_DAY) {\n // e.g. \"14:30\"\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }\n // e.g. \"Mar 18\"\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n}\n\nfunction formatTooltipTimestamp(ms: number, range?: ChartRangeType): string {\n const d = new Date(ms);\n if (range === ChartRange.ONE_DAY) {\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }\n if (range === ChartRange.ONE_WEEK) {\n return d.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n}\n\nfunction formatPercent(value: number): string {\n return `${(value * 100).toFixed(2)}%`;\n}\n\n// ---------------------------------------------------------------------------\n// Interval labels\n// ---------------------------------------------------------------------------\n\nconst INTERVAL_OPTIONS: { range: ChartRangeType; label: string }[] = [\n { range: ChartRange.ONE_DAY, label: \"1D\" },\n { range: ChartRange.ONE_WEEK, label: \"1W\" },\n { range: ChartRange.ONE_MONTH, label: \"1M\" },\n { range: ChartRange.ALL, label: \"ALL\" },\n];\n\n// ---------------------------------------------------------------------------\n// IntervalSwitcher — plain text buttons, Jupiter-style\n// ---------------------------------------------------------------------------\n\ninterface IntervalSwitcherProps {\n value: ChartRangeType;\n onChange: (range: ChartRangeType) => void;\n}\n\nfunction IntervalSwitcher({ value, onChange }: IntervalSwitcherProps) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 2 }}>\n {INTERVAL_OPTIONS.map(({ range, label }) => {\n const isActive = range === value;\n return (\n <button\n key={range}\n onClick={() => onChange(range)}\n style={{\n padding: \"2px 8px\",\n border: \"none\",\n background: \"transparent\",\n color: isActive ? \"#f9fafb\" : \"#6b7280\",\n fontWeight: isActive ? 700 : 400,\n fontSize: 12,\n cursor: \"pointer\",\n borderRadius: 4,\n letterSpacing: \"0.02em\",\n transition: \"color 0.15s\",\n userSelect: \"none\",\n }}\n >\n {label}\n </button>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// useCursorOverlay\n//\n// Returns refs for the chart wrapper div and the overlay div.\n// Mouse position tracking is done at the div level (not via Recharts internals)\n// so the approach works regardless of Recharts version or SVG structure.\n// DOM style is updated imperatively — zero React re-renders on mousemove.\n// ---------------------------------------------------------------------------\n\nfunction useCursorOverlay() {\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const overlayRef = useRef<HTMLDivElement | null>(null);\n\n const onMouseMove = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n const wrapper = wrapperRef.current;\n const overlay = overlayRef.current;\n if (!wrapper || !overlay) return;\n\n const rect = wrapper.getBoundingClientRect();\n // Cursor offset as percentage of the wrapper — this is exactly where the\n // cursor is visually, so the gradient cutoff aligns perfectly with it.\n const xPct = ((e.clientX - rect.left) / rect.width) * 100;\n\n // Left of cursor: transparent (lines at full brightness).\n // Right of cursor: ~38% dark overlay, matching Jupiter's visual where\n // lines to the right appear ~30% dimmer than lines to the left.\n overlay.style.background = `linear-gradient(to right, transparent ${xPct}%, rgba(0,0,0,0.55) ${xPct}%)`;\n overlay.style.opacity = \"1\";\n }, []);\n\n const onMouseLeave = useCallback(() => {\n if (overlayRef.current) overlayRef.current.style.opacity = \"0\";\n }, []);\n\n return { wrapperRef, overlayRef, onMouseMove, onMouseLeave };\n}\n\n// ---------------------------------------------------------------------------\n// CustomTooltip\n// ---------------------------------------------------------------------------\n\ninterface CustomTooltipPayloadItem {\n dataKey: string;\n value: number | undefined;\n stroke: string;\n color: string;\n}\n\ninterface CustomTooltipProps {\n active?: boolean;\n payload?: CustomTooltipPayloadItem[];\n label?: number | string;\n labelMap: Map<string, string>;\n /** All series slugs + colors so missing entries can be shown as \"--\" */\n allSeries?: Array<{ slug: string; color: string }>;\n range?: ChartRangeType;\n}\n\nfunction CustomTooltip({\n active,\n payload,\n label,\n labelMap,\n allSeries,\n range,\n}: CustomTooltipProps) {\n if (!active || !allSeries?.length) return null;\n\n const payloadMap = new Map<string, CustomTooltipPayloadItem>();\n payload?.forEach((p) => payloadMap.set(p.dataKey, p));\n\n const items: CustomTooltipPayloadItem[] = allSeries.map((s) => {\n const existing = payloadMap.get(s.slug);\n return (\n existing ?? {\n dataKey: s.slug,\n value: undefined,\n stroke: s.color,\n color: s.color,\n }\n );\n });\n\n return (\n <div\n style={{\n background: \"rgba(10,10,10,0.92)\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n minWidth: 180,\n backdropFilter: \"blur(8px)\",\n fontSize: 12,\n }}\n >\n <div style={{ color: \"#9ca3af\", marginBottom: 6, fontWeight: 500 }}>\n {typeof label === \"number\"\n ? formatTooltipTimestamp(label, range)\n : label}\n </div>\n {items.map((p) => (\n <div\n key={p.dataKey}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 3,\n }}\n >\n <span\n style={{\n display: \"inline-block\",\n width: 3,\n height: 14,\n borderRadius: 2,\n background: p.stroke ?? p.color,\n flexShrink: 0,\n }}\n />\n <span\n style={{\n color: \"#9ca3af\",\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: 120,\n }}\n >\n {labelMap.get(p.dataKey) ?? p.dataKey}\n </span>\n <span\n style={{\n color: \"#f9fafb\",\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {p.value != null ? formatPercent(p.value) : \"--\"}\n </span>\n </div>\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// MarketSelector — dropdown multi-select, max MAX_SELECTED markets\n// ---------------------------------------------------------------------------\n\ninterface MarketSelectorProps {\n markets: PredictMarket[];\n selectedSlugs: string[];\n colorMap: Map<string, string>;\n onToggle: (slug: string) => void;\n}\n\nfunction MarketSelector({\n markets,\n selectedSlugs,\n colorMap,\n onToggle,\n}: MarketSelectorProps) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n function handleClick(e: MouseEvent) {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [open]);\n\n const atMax = selectedSlugs.length >= MAX_SELECTED;\n\n // Trigger label: show colored dots + count summary\n const triggerContent = (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n flex: 1,\n minWidth: 0,\n }}\n >\n {/* Color dots for selected markets */}\n <div style={{ display: \"flex\", gap: 3, flexShrink: 0 }}>\n {selectedSlugs.map((slug) => (\n <span\n key={slug}\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: colorMap.get(slug) ?? \"#6b7280\",\n display: \"inline-block\",\n }}\n />\n ))}\n </div>\n {/* Label */}\n <span\n style={{\n color: \"#e5e7eb\",\n fontSize: 12,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {selectedSlugs.length === 1\n ? (() => {\n const m = markets.find((mk) => mk.slug === selectedSlugs[0]);\n return m?.outcomes?.[0]?.label ?? m?.question ?? \"1 market\";\n })()\n : `${selectedSlugs.length} / ${markets.length} markets`}\n </span>\n </div>\n );\n\n return (\n <div\n ref={rootRef}\n style={{ position: \"relative\", display: \"inline-block\", width: 200 }}\n >\n {/* Trigger button */}\n <button\n onClick={() => setOpen((v) => !v)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"5px 10px\",\n borderRadius: 8,\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: \"rgba(255,255,255,0.05)\",\n cursor: \"pointer\",\n width: \"100%\",\n userSelect: \"none\",\n }}\n >\n {triggerContent}\n {/* Chevron */}\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n style={{\n flexShrink: 0,\n transform: open ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.15s\",\n color: \"#6b7280\",\n }}\n >\n <path\n d=\"M2 4l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {/* Dropdown panel */}\n {open && (\n <div\n style={{\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n left: 0,\n zIndex: 50,\n background: \"#111827\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 10,\n boxShadow: \"0 8px 24px rgba(0,0,0,0.5)\",\n minWidth: 260,\n maxWidth: 360,\n maxHeight: 320,\n overflowY: \"auto\",\n padding: \"6px 0\",\n }}\n >\n {/* Header hint */}\n <div\n style={{\n padding: \"4px 12px 8px\",\n fontSize: 11,\n color: \"#6b7280\",\n borderBottom: \"1px solid rgba(255,255,255,0.06)\",\n marginBottom: 4,\n }}\n >\n Select up to {MAX_SELECTED} markets\n </div>\n\n {markets.map((market, idx) => {\n const isSelected = selectedSlugs.includes(market.slug);\n const isDisabled = !isSelected && atMax;\n const isOnlyOne = isSelected && selectedSlugs.length === 1;\n const color = colorMap.get(market.slug) ?? \"#6b7280\";\n const yesOutcome =\n market.outcomes.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes[0];\n const pct =\n yesOutcome?.price != null\n ? `${Math.round(yesOutcome.price * 100)}%`\n : null;\n\n return (\n <button\n key={market.id ?? `${idx}-${market.slug}`}\n onClick={() => {\n if (isOnlyOne || isDisabled) return;\n onToggle(market.slug);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n width: \"100%\",\n padding: \"7px 12px\",\n border: \"none\",\n background: isSelected\n ? \"rgba(255,255,255,0.05)\"\n : \"transparent\",\n cursor: isDisabled || isOnlyOne ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.35 : 1,\n textAlign: \"left\",\n transition: \"background 0.1s\",\n }}\n onMouseEnter={(e) => {\n if (!isDisabled && !isOnlyOne)\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(255,255,255,0.07)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.background =\n isSelected ? \"rgba(255,255,255,0.05)\" : \"transparent\";\n }}\n >\n {/* Checkbox */}\n <span\n style={{\n width: 16,\n height: 16,\n borderRadius: 4,\n border: isSelected\n ? `2px solid ${color}`\n : \"2px solid rgba(255,255,255,0.2)\",\n background: isSelected ? `${color}30` : \"transparent\",\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {isSelected && (\n <svg width=\"9\" height=\"7\" viewBox=\"0 0 9 7\" fill=\"none\">\n <path\n d=\"M1 3.5L3.5 6L8 1\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n\n {/* Color dot */}\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: color,\n flexShrink: 0,\n }}\n />\n\n {/* Question text */}\n <span\n style={{\n color: isSelected ? \"#f9fafb\" : \"#9ca3af\",\n fontSize: 12,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n\n {/* Odds */}\n {pct && (\n <span\n style={{\n color,\n fontWeight: 700,\n fontSize: 12,\n flexShrink: 0,\n }}\n >\n {pct}\n </span>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Legend\n// ---------------------------------------------------------------------------\n\ninterface LegendBarProps {\n series: MarketHistorySeries[];\n colorMap: Map<string, string>;\n /** Values to display — hovered values when scrubbing, else latest values */\n displayValues: Map<string, number>;\n}\n\nfunction LegendBar({ series, colorMap, displayValues }: LegendBarProps) {\n return (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"6px 24px\",\n padding: \"0 2px\",\n }}\n >\n {series.map((s) => {\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n const value = displayValues.get(s.marketSlug);\n return (\n <div\n key={s.marketSlug}\n style={{\n display: \"inline-flex\",\n alignItems: \"flex-start\",\n gap: 6,\n }}\n >\n {/* Dot — aligned to the name row */}\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: color,\n flexShrink: 0,\n marginTop: 3,\n }}\n />\n {/* Name + percentage stacked vertically */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 1 }}>\n <span\n style={{\n color: \"#9ca3af\",\n fontSize: 12,\n lineHeight: \"17px\",\n whiteSpace: \"nowrap\",\n }}\n >\n {s.label}\n </span>\n <span\n style={{\n color: \"#f9fafb\",\n fontSize: 14,\n fontWeight: 700,\n lineHeight: \"20px\",\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {value != null ? formatPercent(value) : \"--\"}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Chart data transformation (timestamp union + forward fill)\n// ---------------------------------------------------------------------------\n\ntype ChartRow = Record<string, number>;\n\n/**\n * Compute the median of a sorted numeric array.\n * The array must be sorted ascending before calling this function.\n */\nfunction medianOfSorted(sorted: number[]): number {\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 1\n ? sorted[mid]\n : (sorted[mid - 1] + sorted[mid]) / 2;\n}\n\n/**\n * Reduce a price series to at most `maxPoints` data points using bucket\n * median. Within each bucket the median price is taken (more robust to\n * short-lived outlier spikes than the mean), and the last timestamp of\n * the bucket is kept to preserve the breathing-dot position at the end.\n */\nfunction downsampleSeries(\n data: MarketHistorySeries[\"data\"],\n maxPoints: number,\n): MarketHistorySeries[\"data\"] {\n if (data.length <= maxPoints) return data;\n\n const result: MarketHistorySeries[\"data\"] = [];\n const step = data.length / maxPoints;\n\n for (let i = 0; i < maxPoints; i++) {\n const start = Math.floor(i * step);\n const end = Math.min(Math.floor((i + 1) * step), data.length);\n const bucket = data.slice(start, end);\n const sorted = bucket.map((p) => p.price).sort((a, b) => a - b);\n result.push({\n timestamp: bucket[bucket.length - 1].timestamp,\n price: medianOfSorted(sorted),\n });\n }\n\n return result;\n}\n\nfunction buildChartData(\n series: MarketHistorySeries[],\n maxPointsPerSeries = 200,\n): ChartRow[] {\n if (series.length === 0) return [];\n\n // Downsample each series before merging to reduce visual noise\n const sampledSeries = series.map((s) => ({\n ...s,\n data: downsampleSeries(s.data, maxPointsPerSeries),\n }));\n\n const allTimestamps = new Set<number>();\n sampledSeries.forEach((s) =>\n s.data.forEach((p) => allTimestamps.add(p.timestamp)),\n );\n\n const sorted = Array.from(allTimestamps).sort((a, b) => a - b);\n\n // Build per-series lookup map\n const lookups = sampledSeries.map((s) => {\n const m = new Map<number, number>();\n s.data.forEach((p) => m.set(p.timestamp, p.price));\n return { slug: s.marketSlug, map: m };\n });\n\n const lastValues = new Map<string, number>();\n\n return sorted.map((ts) => {\n const row: ChartRow = { timestamp: ts };\n lookups.forEach(({ slug, map }) => {\n const val = map.get(ts);\n if (val !== undefined) {\n lastValues.set(slug, val);\n row[slug] = val;\n } else {\n const last = lastValues.get(slug);\n if (last !== undefined) row[slug] = last;\n }\n });\n return row;\n });\n}\n\n// ---------------------------------------------------------------------------\n// EventPriceChart\n// ---------------------------------------------------------------------------\n\nexport interface EventPriceChartProps {\n event: PredictEvent;\n isLoading?: boolean;\n /** Optional CSS class for the outer container */\n className?: string;\n /** Event total volume (shown in chart footer bar alongside interval switcher) */\n volume?: number;\n}\n\nexport function EventPriceChart(props: EventPriceChartProps) {\n return (\n <ChartErrorBoundary>\n <EventPriceChartInner {...props} />\n </ChartErrorBoundary>\n );\n}\n\nfunction EventPriceChartInner({\n event,\n isLoading: externalLoading,\n className,\n volume,\n}: EventPriceChartProps) {\n const allMarkets = useMemo(() => {\n const seen = new Set<string>();\n return (event.markets ?? []).filter((m) => {\n if (m.status !== \"open\" || seen.has(m.slug)) return false;\n seen.add(m.slug);\n return true;\n });\n }, [event.markets]);\n\n // Sort markets by YES outcome price descending so the highest-probability\n // candidates appear first in both the default selection and the dropdown.\n const sortedMarkets = useMemo(\n () =>\n [...allMarkets].sort((a, b) => {\n const priceOf = (m: PredictMarket) =>\n (\n m.outcomes.find((o) => o.label.toLowerCase() === \"yes\") ??\n m.outcomes[0]\n )?.price ?? 0;\n return priceOf(b) - priceOf(a);\n }),\n [allMarkets],\n );\n\n // Default: first MAX_SELECTED markets by price (highest first)\n const [selectedSlugs, setSelectedSlugs] = useState<string[]>(() =>\n sortedMarkets.slice(0, MAX_SELECTED).map((m) => m.slug),\n );\n\n // Chart time range (interval selector)\n const [chartRange, setChartRange] =\n useState<ChartRangeType>(DEFAULT_CHART_RANGE);\n\n // Color mapping: only selected markets get chart colors.\n // Colors are assigned by selection order so they stay stable\n // as long as the selection doesn't change.\n const colorMap = useMemo(() => {\n const map = new Map<string, string>();\n selectedSlugs.forEach((slug, idx) => {\n map.set(slug, CHART_COLORS[idx % CHART_COLORS.length]);\n });\n return map;\n }, [selectedSlugs]);\n\n const selectedMarkets = useMemo(\n () => allMarkets.filter((m) => selectedSlugs.includes(m.slug)),\n [allMarkets, selectedSlugs],\n );\n\n const { series: hookSeries, isLoading: hookLoading } = useMarketHistory(\n selectedMarkets,\n chartRange,\n );\n const isLoading = externalLoading || hookLoading;\n\n // Belt-and-suspenders: if hook returns no renderable data, generate\n // synthetic flat lines from current outcome prices so the chart is never empty.\n const series = useMemo<MarketHistorySeries[]>(() => {\n if (hookSeries.length > 0 && hookSeries.some((s) => s.data.length > 0)) {\n return hookSeries;\n }\n const now = Date.now();\n const dayMs = 86_400_000;\n return selectedMarkets.map((market) => {\n const yesOutcome =\n market.outcomes?.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes?.[0];\n const price = yesOutcome?.price ?? 0.5;\n return {\n marketSlug: market.slug,\n label: market.outcomes?.[0]?.label ?? market.question,\n data: [\n { timestamp: now - 7 * dayMs, price },\n { timestamp: now, price },\n ],\n };\n });\n }, [hookSeries, selectedMarkets]);\n\n // Fewer points for short ranges (data is already sparse); more for ALL so\n // the long history still has enough resolution without being noisy.\n const maxPointsPerSeries = useMemo(() => {\n if (chartRange === ChartRange.ONE_DAY) return 96; // ~15-min buckets\n if (chartRange === ChartRange.ONE_WEEK) return 168; // ~1-hour buckets\n if (chartRange === ChartRange.ONE_MONTH) return 180; // ~4-hour buckets\n return 300; // ALL — daily-ish buckets\n }, [chartRange]);\n\n const chartData = useMemo(\n () => buildChartData(series, maxPointsPerSeries),\n [series, maxPointsPerSeries],\n );\n\n // Y-axis domain: padded range of all values\n const yDomain = useMemo((): [number, number] => {\n if (chartData.length === 0) return [0, 1];\n let min = Infinity;\n let max = -Infinity;\n selectedSlugs.forEach((slug) => {\n chartData.forEach((row) => {\n const v = row[slug];\n if (v != null) {\n if (v < min) min = v;\n if (v > max) max = v;\n }\n });\n });\n if (!isFinite(min)) return [0, 1];\n const pad = Math.max((max - min) * 0.15, 0.05);\n return [Math.max(0, min - pad), Math.min(1, max + pad)];\n }, [chartData, selectedSlugs]);\n\n // Current values for legend (latest point)\n const currentValues = useMemo(() => {\n const map = new Map<string, number>();\n series.forEach((s) => {\n if (s.data.length > 0) {\n map.set(s.marketSlug, s.data[s.data.length - 1].price);\n }\n });\n return map;\n }, [series]);\n\n // Tooltip label map\n const labelMap = useMemo(() => {\n const map = new Map<string, string>();\n series.forEach((s) => map.set(s.marketSlug, s.label));\n return map;\n }, [series]);\n\n // All series slugs + colors for tooltip (so missing entries show \"--\")\n const tooltipSeries = useMemo(\n () =>\n series.map((s) => ({\n slug: s.marketSlug,\n color: colorMap.get(s.marketSlug) ?? \"#6b7280\",\n })),\n [series, colorMap],\n );\n\n // Effect 5: cursor overlay (left transparent / right dimmed)\n const {\n wrapperRef: chartWrapperRef,\n overlayRef: overlayDivRef,\n onMouseMove: handleWrapperMouseMove,\n onMouseLeave: handleWrapperMouseLeave,\n } = useCursorOverlay();\n\n // Market selector toggle handler\n const handleToggle = useCallback((slug: string) => {\n setSelectedSlugs((prev) => {\n if (prev.includes(slug)) {\n if (prev.length <= 1) return prev;\n return prev.filter((s) => s !== slug);\n }\n if (prev.length >= MAX_SELECTED) return prev;\n return [...prev, slug];\n });\n }, []);\n\n // Hovered values for legend.\n // Tooltip writes to refs during render (safe, no state update).\n // Wrapper onMouseMove schedules a rAF to flush ref → state after Recharts\n // has finished rendering the tooltip, so the ref is up-to-date.\n const [hoveredValues, setHoveredValues] = useState<Map<\n string,\n number\n > | null>(null);\n const hoveredValuesRef = useRef<Map<string, number> | null>(null);\n const lastPayloadKeyRef = useRef(\"\");\n const rafIdRef = useRef(0);\n\n const showChart = !isLoading && chartData.length > 0;\n\n return (\n <div\n className={className}\n style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}\n >\n {/* Legend — values update dynamically when scrubbing the chart */}\n <LegendBar\n series={series}\n colorMap={colorMap}\n displayValues={hoveredValues ?? currentValues}\n />\n\n {/* Chart */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 0 }}>\n <div\n ref={chartWrapperRef}\n style={{\n height: 300,\n width: \"100%\",\n userSelect: \"none\",\n position: \"relative\",\n }}\n onMouseMove={\n showChart\n ? (e) => {\n handleWrapperMouseMove(e);\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = requestAnimationFrame(() => {\n setHoveredValues(hoveredValuesRef.current);\n });\n }\n : undefined\n }\n onMouseLeave={\n showChart\n ? () => {\n handleWrapperMouseLeave();\n cancelAnimationFrame(rafIdRef.current);\n lastPayloadKeyRef.current = \"\";\n hoveredValuesRef.current = null;\n setHoveredValues(null);\n }\n : undefined\n }\n >\n {isLoading ? (\n <div\n style={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <div\n style={{\n width: 28,\n height: 28,\n borderRadius: \"50%\",\n border: \"2.5px solid #22d3ee\",\n borderTopColor: \"transparent\",\n animation: \"spin 0.7s linear infinite\",\n }}\n />\n </div>\n ) : chartData.length === 0 ? (\n <div\n style={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n No price history data\n </div>\n ) : (\n <>\n {/* Effect 5: left transparent / right dimmed overlay div */}\n <div\n ref={overlayDivRef}\n style={{\n position: \"absolute\",\n inset: 0,\n opacity: 0,\n pointerEvents: \"none\",\n zIndex: 1,\n }}\n />\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart\n data={chartData}\n margin={{ top: 8, right: 16, left: 0, bottom: 0 }}\n >\n {/* Effect 7: horizontal dashed grid */}\n <CartesianGrid\n horizontal\n vertical={false}\n strokeDasharray=\"3 3\"\n stroke=\"#374151\"\n opacity={0.5}\n />\n\n {/* Effect 6: X axis */}\n <XAxis\n dataKey=\"timestamp\"\n type=\"number\"\n scale=\"time\"\n domain={[\"dataMin\", \"dataMax\"]}\n tickFormatter={(ms: number) =>\n formatTimestamp(ms, chartRange)\n }\n axisLine={false}\n tickLine={false}\n tick={{ fill: \"#6b7280\", fontSize: 11 }}\n minTickGap={70}\n />\n\n {/* Effect 6: Y axis */}\n <YAxis\n domain={yDomain}\n tickFormatter={(v: number) => `${Math.round(v * 100)}%`}\n axisLine={false}\n tickLine={false}\n tick={{ fill: \"#6b7280\", fontSize: 11 }}\n width={40}\n tickCount={6}\n />\n\n {/* Effect 2: real-time tooltip */}\n <Tooltip\n content={(props) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const p = props as any;\n if (p.active && p.payload?.length) {\n const key = p.payload\n .map(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (item: any) => `${item.dataKey}:${item.value}`,\n )\n .join(\",\");\n if (key !== lastPayloadKeyRef.current) {\n lastPayloadKeyRef.current = key;\n const map = new Map<string, number>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n p.payload.forEach((item: any) => {\n if (item.value != null)\n map.set(item.dataKey, item.value);\n });\n hoveredValuesRef.current = map;\n }\n }\n return (\n <CustomTooltip\n {...p}\n labelMap={labelMap}\n allSeries={tooltipSeries}\n range={chartRange}\n />\n );\n }}\n cursor={{\n stroke: \"#4b5563\",\n strokeWidth: 1,\n strokeDasharray: \"4 4\",\n }}\n wrapperStyle={{ zIndex: 2 }}\n isAnimationActive={false}\n />\n\n {/* Lines — dot={false} to skip per-point React calls.\n * type=\"linear\" (straight segments) avoids the cubic-spline\n * overshoot that \"monotone\" produces at sharp price jumps on\n * low-liquidity forward-filled data. strokeLinejoin=\"round\"\n * softens the angle at each vertex. */}\n {series.map((s) => {\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n return (\n <Line\n key={s.marketSlug}\n type=\"linear\"\n dataKey={s.marketSlug}\n stroke={color}\n strokeWidth={2}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n dot={false}\n activeDot={{\n r: 4.5,\n strokeWidth: 2,\n stroke: \"rgba(10,10,10,0.8)\",\n fill: color,\n }}\n connectNulls\n isAnimationActive={false}\n />\n );\n })}\n\n {/* Breathing dots at each series' last data point */}\n {hoveredValues == null &&\n chartData.length > 0 &&\n series.map((s) => {\n const lastRow = chartData[chartData.length - 1];\n const yVal = lastRow[s.marketSlug];\n if (yVal == null) return null;\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n return (\n <ReferenceDot\n key={`pulse-${s.marketSlug}`}\n x={lastRow.timestamp}\n y={yVal as number}\n ifOverflow=\"extendDomain\"\n shape={(props: { cx?: number; cy?: number }) => {\n const { cx: dx, cy: dy } = props;\n if (dx == null || dy == null) return <g />;\n return (\n <g>\n <circle\n cx={dx}\n cy={dy}\n r={6}\n fill={color}\n opacity={0.3}\n >\n <animate\n attributeName=\"r\"\n values=\"4;9;4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0.4;0.05;0.4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n <circle cx={dx} cy={dy} r={3.5} fill={color} />\n </g>\n );\n }}\n />\n );\n })}\n </LineChart>\n </ResponsiveContainer>\n </>\n )}\n </div>\n\n {/* Bottom bar: [volume] [IntervalSwitcher] on row 1, [MarketSelector] on row 2 (mobile) */}\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: \"6px 8px\",\n marginTop: 6,\n }}\n >\n {volume != null && volume > 0 && (\n <span\n style={{\n color: \"#6b7280\",\n fontSize: 12,\n }}\n >\n ${Math.round(volume).toLocaleString()} vol\n </span>\n )}\n <div style={{ flex: 1, minWidth: 0 }} />\n <IntervalSwitcher value={chartRange} onChange={setChartRange} />\n {sortedMarkets.length > 1 && (\n <div\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <MarketSelector\n markets={sortedMarkets}\n selectedSlugs={selectedSlugs}\n colorMap={colorMap}\n onToggle={handleToggle}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { Fragment, useState, useMemo, useEffect, type Key } from \"react\";\nimport { useScrollCollapse } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport {\n Avatar,\n Button,\n ChevronDownIcon,\n cn,\n Dropdown,\n DropdownItem,\n DropdownMenu,\n DropdownTrigger,\n KalshiIcon,\n PolymarketIcon,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventMarketDetailWidget } from \"./event-market-detail.widget\";\nimport { EventPriceChart } from \"./event-price-chart.ui\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(market: PredictMarket): number {\n return market.outcomes[0]?.best_ask ?? market.outcomes[0]?.price ?? 0;\n}\n\nfunction formatPercent(value: number): string {\n return `${parseFloat((value * 100).toFixed(2))}%`;\n}\n\nfunction formatCents(value: number): string {\n const cents = value * 100;\n if (cents < 1 && cents > 0) return `< 1`;\n return parseFloat(cents.toFixed(2)).toString();\n}\n\n/** Display label for a market row — prefer first outcome label, fall back to question. */\nfunction getMarketLabel(market: PredictMarket): string {\n return market.outcomes?.[0]?.label ?? market.question;\n}\n\nfunction getPlatformLabel(source: string): string {\n switch (source) {\n case \"polymarket\":\n return \"Polymarket\";\n case \"kalshi\":\n return \"Kalshi\";\n default:\n return source;\n }\n}\n\nfunction formatISOTimestamp(iso: string | undefined): string {\n if (!iso) return \"—\";\n const date = new Date(iso);\n if (isNaN(date.getTime())) return \"—\";\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\n// ---------------------------------------------------------------------------\n// Countdown hook\n// ---------------------------------------------------------------------------\n\nfunction useCountdown(targetIso: string | undefined): string | null {\n const [now, setNow] = useState(0);\n\n useEffect(() => {\n if (!targetIso) return;\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [targetIso]);\n\n if (!targetIso || now === 0) return null;\n const target = new Date(targetIso).getTime();\n if (isNaN(target)) return null;\n\n const diff = target - now;\n if (diff <= 0) return null;\n\n const days = Math.floor(diff / 86400000);\n const hours = Math.floor((diff % 86400000) / 3600000);\n const mins = Math.floor((diff % 3600000) / 60000);\n const secs = Math.floor((diff % 60000) / 1000);\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n parts.push(`${String(hours).padStart(2, \"0\")}h`);\n parts.push(`${String(mins).padStart(2, \"0\")}m`);\n parts.push(`${String(secs).padStart(2, \"0\")}s`);\n return parts.join(\" \");\n}\n\nfunction formatCountdownDate(iso: string | undefined): string | null {\n if (!iso) return null;\n const d = new Date(iso);\n if (isNaN(d.getTime())) return null;\n const hours = d.getHours().toString().padStart(2, \"0\");\n const mins = d.getMinutes().toString().padStart(2, \"0\");\n const month = (d.getMonth() + 1).toString().padStart(2, \"0\");\n const day = d.getDate().toString().padStart(2, \"0\");\n const year = d.getFullYear();\n const offset = -d.getTimezoneOffset();\n const sign = offset >= 0 ? \"+\" : \"-\";\n const tzHours = String(Math.abs(Math.floor(offset / 60))).padStart(2, \"0\");\n return `${hours}:${mins} ${month}/${day}/${year} (${sign}${tzHours})`;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailUIProps {\n event: PredictEvent;\n /** Callback when a trade action is triggered */\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailUI({ event, onTradeAction }: EventDetailUIProps) {\n const { t } = useTranslation();\n const { ref: collapseRef, isCollapsed } = useScrollCollapse();\n\n const markets = useMemo(() => {\n const all = [...(event.markets || [])];\n const open = all\n .filter((m) => m.status === \"open\")\n .sort((a, b) => getYesAsk(b) - getYesAsk(a));\n const rest = all\n .filter((m) => m.status !== \"open\")\n .sort((a, b) => getYesAsk(b) - getYesAsk(a));\n return [...open, ...rest];\n }, [event.markets]);\n\n const isEnded = event.status === \"closed\" || event.status === \"voided\";\n const startCountdown = useCountdown(isEnded ? undefined : event.start_at);\n const endCountdown = useCountdown(isEnded ? undefined : event.end_at);\n const startDateFormatted = formatCountdownDate(event.start_at);\n const endDateFormatted = formatCountdownDate(event.end_at);\n\n return (\n <div className=\"w-full flex flex-col gap-y-4 lg:gap-y-6\">\n {/* Header – sticky with compact transition */}\n <div\n ref={collapseRef}\n className={`sticky top-0 z-30 flex items-center backdrop-blur-md transition-all duration-300 ${\n isCollapsed\n ? \"h-14 lg:h-16 gap-x-2 py-2 px-1 lg:px-4 -mx-1 lg:-mx-4 shadow-sm\"\n : \"h-16 lg:h-20 gap-x-2 lg:gap-x-4\"\n }`}\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n classNames={{ base: \"bg-transparent\" }}\n className={`flex-shrink-0 transition-all duration-300 ${\n isCollapsed\n ? \"!h-10 !w-10 lg:!h-12 lg:!w-12\"\n : \"!h-16 !w-16 lg:!h-20 lg:!w-20\"\n }`}\n />\n <div className=\"flex flex-col gap-0.5 min-w-0 flex-1\">\n {!isCollapsed && (\n <div className=\"flex items-center gap-1.5\">\n {event.tags?.slice(0, 3).map((tag, i) => (\n <Fragment key={tag.slug}>\n {i > 0 && <span className=\"text-sm text-neutral/50\">·</span>}\n <span className=\"text-sm text-neutral truncate\">\n {tag.label}\n </span>\n </Fragment>\n ))}\n <SourceIcon source={event.source} />\n </div>\n )}\n <span\n className={`font-semibold truncate transition-all duration-300 ${\n isCollapsed ? \"text-sm lg:text-base\" : \"text-lg lg:text-xl\"\n }`}\n >\n {event.title}\n </span>\n </div>\n </div>\n\n {/* Countdown / ended timestamp */}\n {(startCountdown || endCountdown || isEnded) && (\n <div className=\"flex items-center gap-x-2 text-xs lg:text-sm font-mono\">\n {isEnded ? (\n endDateFormatted && (\n <span className=\"text-neutral\">\n {t(\"predict.event.endedAt\", { time: endDateFormatted })}\n </span>\n )\n ) : startCountdown ? (\n <>\n <span className=\"text-foreground\">\n {t(\"predict.event.beginsIn\", { time: startCountdown })}\n </span>\n {startDateFormatted && (\n <>\n <span className=\"text-neutral/50\">·</span>\n <span className=\"text-neutral\">{startDateFormatted}</span>\n </>\n )}\n </>\n ) : endCountdown ? (\n <>\n <span className=\"text-foreground\">\n {t(\"predict.event.endsIn\", { time: endCountdown })}\n </span>\n {endDateFormatted && (\n <>\n <span className=\"text-neutral/50\">·</span>\n <span className=\"text-neutral\">{endDateFormatted}</span>\n </>\n )}\n </>\n ) : null}\n </div>\n )}\n\n {/* Chart section — volume displayed in chart footer bar */}\n <EventPriceChart event={event} volume={event.volume ?? undefined} />\n\n {/* Markets list */}\n <EventMarketsUI markets={markets} onTradeAction={onTradeAction} />\n\n {/* Rules section */}\n <EventRulesUI markets={markets} event={event} />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Markets list (Jupiter-style table layout)\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_VISIBLE_COUNT = 5;\n\ninterface EventMarketsUIProps {\n markets: PredictMarket[];\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nfunction EventMarketsUI({\n markets: rawMarkets,\n onTradeAction,\n}: EventMarketsUIProps) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const [showAll, setShowAll] = useState(false);\n const [expandedSlug, setExpandedSlug] = useState<string | null>(null);\n\n const markets = useMemo(() => {\n const seen = new Set<string>();\n return rawMarkets.filter((m) => {\n if (seen.has(m.slug)) return false;\n seen.add(m.slug);\n return true;\n });\n }, [rawMarkets]);\n\n const firstOpenSlug = markets.find((m) => m.status === \"open\")?.slug;\n const [activeKey, setActiveKey] = useState<string | null>(\n firstOpenSlug ? `${firstOpenSlug}:yes` : null,\n );\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 = (slug: string) => {\n setExpandedSlug((prev) => (prev === slug ? null : slug));\n };\n\n const handleTradeAction = (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => {\n setActiveKey(`${market.slug}:${outcome}`);\n if (!isMobile) {\n setExpandedSlug(market.slug);\n }\n onTradeAction?.(market, outcome, side);\n };\n\n return (\n <div className=\"flex flex-col\">\n {/* Table */}\n <table className=\"w-full border-collapse\">\n {/* Column header */}\n <thead>\n <tr>\n <th />\n <th className=\"py-2 text-left text-xs text-neutral font-normal lg:text-center lg:text-sm\">\n {t(\"predict.market.table.chance\")}\n </th>\n <th />\n </tr>\n </thead>\n <tbody>\n {visibleMarkets.map((market, idx) => {\n const yesPrice = getYesAsk(market);\n const noPrice =\n market.outcomes[1]?.best_ask ?? market.outcomes[1]?.price;\n const isExpanded = expandedSlug === market.slug;\n\n return (\n <MarketRow\n key={market.id ?? `${idx}-${market.slug}`}\n market={market}\n yesPrice={yesPrice}\n noPrice={noPrice ?? undefined}\n activeYes={activeKey === `${market.slug}:yes`}\n activeNo={activeKey === `${market.slug}:no`}\n isExpanded={isExpanded}\n onToggleExpand={() => toggleExpand(market.slug)}\n onTradeAction={handleTradeAction}\n />\n );\n })}\n </tbody>\n </table>\n\n {/* More Markets button */}\n {hasMore && (\n <button\n type=\"button\"\n onClick={() => setShowAll((prev) => !prev)}\n className=\"flex w-full items-center justify-start gap-x-2 py-2 pl-1 text-xs text-neutral lg:pl-2 lg:text-sm cursor-pointer hover:text-foreground transition-colors\"\n >\n <span>\n {showAll\n ? t(\"predict.event.rules.collapse\")\n : t(\"predict.event.moreMarketsLabel\")}\n </span>\n <ChevronDownIcon\n className={cn(\n \"h-4 w-4 transition-transform\",\n showAll && \"rotate-180\",\n )}\n />\n </button>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Market Row (Jupiter-style <tr>)\n// ---------------------------------------------------------------------------\n\ninterface MarketRowProps {\n market: PredictMarket;\n yesPrice: number;\n noPrice?: number;\n activeYes: boolean;\n activeNo: boolean;\n isExpanded: boolean;\n onToggleExpand: () => void;\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nfunction MarketRow({\n market,\n yesPrice,\n noPrice,\n activeYes,\n activeNo,\n isExpanded,\n onToggleExpand,\n onTradeAction,\n}: MarketRowProps) {\n const { t } = useTranslation();\n const isOpen = market.status === \"open\";\n const volumeFormatted = market.volume\n ? `$${Math.round(market.volume).toLocaleString(\"en-US\")} vol`\n : undefined;\n\n return (\n <>\n <tr\n className=\"cursor-pointer border-b border-border text-xs hover:bg-content2 lg:text-base\"\n onClick={onToggleExpand}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onToggleExpand();\n }\n }}\n >\n {/* TD1: Avatar + Name + Volume */}\n <td className=\"py-2 pl-1 lg:pl-2\">\n <div className=\"flex items-center gap-x-1 lg:gap-x-2\">\n {market.image_url && (\n <Avatar\n src={market.image_url}\n name={getMarketLabel(market)?.[0] || \"?\"}\n radius=\"lg\"\n className=\"size-5 shrink-0 lg:size-8\"\n imgProps={{ className: \"object-cover\" }}\n />\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-foreground truncate max-w-[200px] lg:max-w-[300px]\">\n {getMarketLabel(market)}\n </span>\n {volumeFormatted && (\n <span className=\"text-[8px] text-neutral lg:text-xxs\">\n {volumeFormatted}\n </span>\n )}\n </div>\n </div>\n </td>\n\n {/* TD2: Chance % */}\n <td className=\"py-2 text-left text-foreground lg:text-center\">\n {formatPercent(yesPrice)}\n </td>\n\n {/* TD3: Yes / No buttons or status badge */}\n <td className=\"py-2 pr-1 lg:pr-2\">\n {isOpen ? (\n <div className=\"flex items-center justify-end gap-x-2\">\n <button\n type=\"button\"\n className={cn(\n \"flex min-w-16 items-center justify-center whitespace-nowrap rounded-lg p-2 lg:min-w-24 cursor-pointer hover:opacity-80 transition-all\",\n activeYes\n ? \"bg-primary text-primary-foreground\"\n : \"bg-primary/10 text-primary\",\n )}\n onClick={(e) => {\n e.stopPropagation();\n onTradeAction?.(market, \"yes\", \"buy\");\n }}\n >\n {t(\"predict.market.action.yes\", {\n price: formatCents(yesPrice),\n })}\n </button>\n <button\n type=\"button\"\n className={cn(\n \"flex min-w-16 items-center justify-center whitespace-nowrap rounded-lg p-2 lg:min-w-24 cursor-pointer hover:opacity-80 transition-all\",\n activeNo\n ? \"bg-secondary text-secondary-foreground\"\n : \"bg-secondary/10 text-secondary\",\n )}\n onClick={(e) => {\n e.stopPropagation();\n onTradeAction?.(market, \"no\", \"buy\");\n }}\n >\n {noPrice != null\n ? t(\"predict.market.action.no\", {\n price: formatCents(noPrice),\n })\n : t(\"predict.market.no\")}\n </button>\n </div>\n ) : (\n <div className=\"flex items-center justify-end\">\n <span\n className={cn(\n \"inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium\",\n market.status === \"closed\"\n ? \"bg-neutral/10 text-neutral\"\n : market.status === \"voided\"\n ? \"bg-warning/10 text-warning\"\n : \"bg-primary/10 text-primary\",\n )}\n >\n {market.status === \"closed\"\n ? t(\"predict.event.status.closed\")\n : market.status === \"voided\"\n ? t(\"predict.event.status.voided\")\n : t(\"predict.event.status.pending\")}\n </span>\n </div>\n )}\n </td>\n </tr>\n\n {/* Expanded detail row */}\n {isExpanded && (\n <tr>\n <td colSpan={3} className=\"pb-3\">\n <div className=\"max-h-100 overflow-y-auto\">\n <EventMarketDetailWidget\n market={market}\n outcome={activeNo ? \"no\" : \"yes\"}\n onTradeAction={onTradeAction}\n />\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Rules\n// ---------------------------------------------------------------------------\n\ninterface EventRulesUIProps {\n markets: PredictMarket[];\n event: PredictEvent;\n}\n\nfunction EventRulesUI({ markets, event }: EventRulesUIProps) {\n const { t } = useTranslation();\n const [showFullRules, setShowFullRules] = useState(false);\n const [showTimeline, setShowTimeline] = useState(false);\n const [selectedIdx, setSelectedIdx] = useState(0);\n\n const marketsWithContent = markets.filter(\n (m) => (m.rules && m.rules.length > 0) || m.description,\n );\n if (marketsWithContent.length === 0) return null;\n\n const selectedMarket =\n marketsWithContent[selectedIdx] ?? marketsWithContent[0];\n const rulesText =\n selectedMarket.rules && selectedMarket.rules.length > 0\n ? selectedMarket.rules.join(\"\\n\\n\")\n : (selectedMarket.description ?? \"\");\n if (!rulesText) return null;\n const truncatedRules =\n rulesText.length > 200 && !showFullRules\n ? rulesText.slice(0, 200) + \"...\"\n : rulesText;\n\n return (\n <div className=\"flex flex-col gap-y-3\">\n {/* Header: title + market selector */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold text-foreground lg:text-base\">\n {t(\"predict.event.rules\")}\n </span>\n\n {marketsWithContent.length > 1 && (\n <Dropdown\n placement=\"bottom-end\"\n classNames={{\n content: \"min-w-36 bg-content1 border border-border\",\n }}\n >\n <DropdownTrigger>\n <Button\n size=\"sm\"\n variant=\"bordered\"\n radius=\"lg\"\n endContent={<ChevronDownIcon className=\"h-3.5 w-3.5\" />}\n className=\"text-xs text-foreground\"\n >\n {getMarketLabel(selectedMarket)}\n </Button>\n </DropdownTrigger>\n <DropdownMenu\n aria-label=\"Select market rules\"\n selectionMode=\"single\"\n selectedKeys={[String(selectedIdx)]}\n onAction={(key: Key) => {\n setSelectedIdx(Number(key));\n setShowFullRules(false);\n }}\n classNames={{ list: \"gap-1\" }}\n itemClasses={{ base: \"rounded-md px-3 h-8\" }}\n >\n {marketsWithContent.map((m, idx) => (\n <DropdownItem\n key={String(idx)}\n className={cn(\n idx === selectedIdx\n ? \"bg-content2 text-foreground\"\n : \"text-neutral\",\n \"data-[hover=true]:bg-content2 data-[hover=true]:text-foreground\",\n )}\n >\n {getMarketLabel(m)}\n </DropdownItem>\n ))}\n </DropdownMenu>\n </Dropdown>\n )}\n </div>\n\n {/* Rules text */}\n <div className=\"text-xs text-foreground/80 lg:text-sm whitespace-pre-wrap\">\n {truncatedRules}\n </div>\n\n {rulesText.length > 200 && (\n <button\n type=\"button\"\n onClick={() => setShowFullRules((v) => !v)}\n className=\"text-xs text-neutral hover:text-foreground cursor-pointer transition-colors self-start\"\n >\n {showFullRules\n ? t(\"predict.event.rules.collapse\")\n : t(\"predict.event.showMore\")}\n </button>\n )}\n\n {/* Timeline and payout — collapsible */}\n <button\n type=\"button\"\n onClick={() => setShowTimeline((v) => !v)}\n className=\"flex items-center justify-between w-full mt-2 text-xs font-medium text-neutral lg:text-sm cursor-pointer hover:text-foreground transition-colors\"\n >\n <span>{t(\"predict.event.timelineAndPayout\")}</span>\n <ChevronDownIcon\n className={cn(\n \"h-4 w-4 transition-transform\",\n showTimeline && \"rotate-180\",\n )}\n />\n </button>\n\n {showTimeline && (\n <>\n <div className=\"flex flex-col\">\n {(() => {\n const status = selectedMarket.status;\n const items: {\n label: string;\n value: string | null;\n isActive: boolean;\n }[] = [];\n\n if (selectedMarket.created_at) {\n items.push({\n label: t(\"predict.event.timeline.created\"),\n value: formatISOTimestamp(selectedMarket.created_at),\n isActive: true,\n });\n }\n\n items.push({\n label: t(\"predict.event.timeline.open\"),\n value: formatISOTimestamp(selectedMarket.start_at),\n isActive: status !== \"pending\",\n });\n\n if (status === \"voided\") {\n items.push({\n label: t(\"predict.event.timeline.voided\"),\n value: formatISOTimestamp(\n selectedMarket.closed_at ?? selectedMarket.end_at,\n ),\n isActive: true,\n });\n } else if (status === \"closed\") {\n items.push({\n label: t(\"predict.event.timeline.closed\"),\n value: formatISOTimestamp(\n selectedMarket.closed_at ?? selectedMarket.end_at,\n ),\n isActive: true,\n });\n } else {\n items.push({\n label: t(\"predict.event.timeline.close\"),\n value: formatISOTimestamp(selectedMarket.end_at),\n isActive: false,\n });\n }\n\n return items;\n })().map((item, index, arr) => (\n <div key={item.label} className=\"flex items-stretch gap-x-3\">\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-border bg-transparent\"\n }`}\n />\n {index < arr.length - 1 && (\n <div className=\"w-px flex-1 bg-border\" />\n )}\n </div>\n <div\n className={`flex flex-col ${index < arr.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-neutral lg:text-sm\">\n {item.value}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {/* Identifiers */}\n <div className=\"flex flex-wrap items-center gap-x-3 text-xxs text-neutral mt-2 lg:text-xs\">\n <span>\n <span className=\"text-neutral\">\n {t(\"predict.event.id.event\")}:\n </span>{\" \"}\n <span className=\"text-foreground\">{event.slug}</span>\n </span>\n <span>\n <span className=\"text-neutral\">\n {t(\"predict.event.id.market\")}:\n </span>{\" \"}\n <span className=\"text-foreground\">{selectedMarket.slug}</span>\n </span>\n <span>\n <span className=\"text-neutral\">\n {t(\"predict.event.id.source\")}:\n </span>{\" \"}\n <span className=\"text-foreground\">\n {getPlatformLabel(selectedMarket.source)}\n </span>\n </span>\n </div>\n </>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Source (platform) icon\n// ---------------------------------------------------------------------------\n\nfunction SourceIcon({ source }: { source: string }) {\n const title = source === \"polymarket\" ? \"Polymarket\" : \"Kalshi\";\n return (\n <span\n className=\"inline-flex items-center gap-x-1 text-neutral-400\"\n title={title}\n >\n <span className=\"text-neutral-600\">·</span>\n {source === \"polymarket\" ? (\n <PolymarketIcon className=\"h-5 w-auto shrink-0\" />\n ) : (\n <KalshiIcon className=\"h-3 w-auto shrink-0\" />\n )}\n </span>\n );\n}\n","import type { PredictMarket, ProviderSource } from \"@liberfi.io/react-predict\";\nimport { useEvent } from \"@liberfi.io/react-predict\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventDetailSkeleton } from \"./event-detail-skeleton\";\nimport { EventDetailUI } from \"./event-detail.ui\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailWidgetProps {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"kalshi\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: ProviderSource;\n /** Callback when a trade action is triggered (market button / orderbook click). */\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailWidget({\n eventSlug,\n source,\n onTradeAction,\n}: EventDetailWidgetProps) {\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEvent({ slug: eventSlug, source });\n\n if (isEventLoading) {\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 <EventDetailUI event={event} onTradeAction={onTradeAction} />;\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, ProviderSource } from \"@liberfi.io/react-predict\";\nimport { useSimilarEvents } from \"@liberfi.io/react-predict\";\nimport { Avatar, ChevronRightIcon } from \"@liberfi.io/ui\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SimilarEventsSectionProps {\n eventSlug: string;\n source: ProviderSource;\n /** Number of similar events to fetch (default: 4). */\n limit?: number;\n onEventClick?: (event: PredictEvent) => void;\n}\n\nexport interface SimilarEventCardProps {\n event: PredictEvent;\n onClick?: (event: PredictEvent) => void;\n}\n\n// ---------------------------------------------------------------------------\n// SimilarEventsSection\n// ---------------------------------------------------------------------------\n\nexport function SimilarEventsSection({\n eventSlug,\n source,\n limit = 4,\n onEventClick,\n}: SimilarEventsSectionProps) {\n const { t } = useTranslation();\n const { data: similarEvents, isLoading } = useSimilarEvents({\n slug: eventSlug,\n source,\n limit,\n });\n\n if (isLoading || !similarEvents || similarEvents.length === 0) return null;\n\n return (\n <div className=\"flex flex-col gap-y-3 mt-6 px-1 lg:px-0\">\n <span className=\"text-sm font-semibold text-foreground lg:text-base\">\n {t(\"predict.similar.title\")}\n </span>\n <div className=\"grid grid-cols-1 gap-3\">\n {similarEvents.map((ev) => (\n <SimilarEventCard\n key={`${ev.source}-${ev.slug}`}\n event={ev}\n onClick={onEventClick}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SimilarEventCard\n// ---------------------------------------------------------------------------\n\nexport function SimilarEventCard({ event, onClick }: SimilarEventCardProps) {\n const volume = event.volume;\n return (\n <button\n type=\"button\"\n onClick={() => onClick?.(event)}\n className=\"flex items-center gap-x-3 rounded-xl border border-border p-3 hover:bg-content2 transition-colors cursor-pointer text-left w-full\"\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title?.[0] || \"?\"}\n radius=\"lg\"\n className=\"size-8 shrink-0 bg-transparent\"\n imgProps={{ className: \"object-cover\" }}\n />\n <div className=\"flex flex-col min-w-0 flex-1\">\n <span className=\"text-sm font-medium text-foreground truncate\">\n {event.title}\n </span>\n {volume != null && volume > 0 && (\n <span className=\"text-xs text-neutral\">\n ${Math.round(volume).toLocaleString()} vol\n </span>\n )}\n </div>\n <ChevronRightIcon className=\"h-4 w-4 text-neutral shrink-0\" />\n </button>\n );\n}\n","import { useMemo, useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n PredictEvent,\n PredictMarket,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport { useEvent } from \"@liberfi.io/react-predict\";\nimport { Button, ChevronLeftIcon, useScreen } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport {\n PredictTradeModal,\n PREDICT_TRADE_MODAL_ID,\n type PredictTradeModalParams,\n} from \"../trade-form/trade-form.modal\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { TradeFormWidget } from \"../trade-form/trade-form.widget\";\nimport { UserActivitySection } from \"./event-detail-activity.ui\";\nimport {\n EventDetailSkeleton,\n TradeFormSkeleton,\n} from \"./event-detail-skeleton\";\nimport { EventDetailWidget } from \"./event-detail.widget\";\nimport { SimilarEventsSection } from \"./event-similar-events.ui\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(m: PredictMarket): number {\n return m.outcomes[0]?.best_ask ?? m.outcomes[0]?.price ?? 0;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailPageProps {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"kalshi\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: ProviderSource;\n /** Chain network for trading (default: 'solana'). */\n chain?: string;\n /** Connected wallet address for user activity (positions/orders/trades). */\n walletAddress?: string;\n /** Callback when a similar event card is clicked. Receives the clicked event. */\n onSimilarEventClick?: (event: PredictEvent) => void;\n /** Navigation callback — if provided, a \"Back\" button is shown at the top. */\n onBack?: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailPage({\n eventSlug,\n source,\n chain,\n walletAddress,\n onSimilarEventClick,\n onBack,\n}: EventDetailPageProps) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const { onOpen: openTradeModal } = useAsyncModal<PredictTradeModalParams>(\n PREDICT_TRADE_MODAL_ID,\n );\n\n const { data: event, isLoading: isEventLoading } = useEvent({\n slug: eventSlug,\n source,\n });\n\n const markets = useMemo(\n () =>\n [...(event?.markets || [])].sort((a, b) => getYesAsk(b) - getYesAsk(a)),\n [event?.markets],\n );\n\n const [tradeSelection, setTradeSelection] = useState<{\n market: PredictMarket;\n outcome: TradeOutcome;\n side: TradeSide;\n version: number;\n } | null>(null);\n\n const handleTradeAction = useCallback(\n (market: PredictMarket, outcome: TradeOutcome, side: TradeSide) => {\n setTradeSelection((prev) => ({\n market,\n outcome,\n side,\n version: (prev?.version ?? 0) + 1,\n }));\n if (isMobile && event) {\n openTradeModal({\n params: { event, market, initialOutcome: outcome, chain },\n });\n }\n },\n [isMobile, event, chain, openTradeModal],\n );\n\n const selectedMarket = tradeSelection?.market ?? markets[0];\n\n // -----------------------------------------------------------------------\n // Loading skeleton\n // -----------------------------------------------------------------------\n if (isEventLoading) {\n const hasBack = !!onBack;\n if (isMobile) {\n return <EventDetailSkeleton showBack={hasBack} />;\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 showBack={hasBack} />\n </div>\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4 max-h-[calc(100dvh-2rem)] overflow-y-auto scrollbar-thin\">\n <TradeFormSkeleton />\n </div>\n </aside>\n </div>\n );\n }\n\n const tradeFormKey = tradeSelection\n ? `${tradeSelection.market.slug}-${tradeSelection.version}`\n : (selectedMarket?.slug ?? \"default\");\n\n return (\n <div className=\"flex w-full flex-col gap-y-4 pb-12 lg:max-w-7xl lg:gap-y-8 lg:pb-16 mx-auto\">\n <div className=\"flex w-full justify-center gap-4 pt-4 lg:gap-6\">\n <div className=\"flex-auto min-w-0 flex flex-col gap-y-4 px-4 lg:gap-y-6 lg:px-0\">\n {/* back button */}\n {onBack && (\n <div className=\"flex items-center justify-between\">\n <Button\n as=\"a\"\n onPress={onBack}\n startContent={<ChevronLeftIcon className=\"h-4 w-4\" />}\n className=\"text-neutral bg-transparent h-5 min-h-5 gap-x-2 p-0 text-base w-auto min-w-auto\"\n >\n {t(\"common.back\")}\n </Button>\n </div>\n )}\n <EventDetailWidget\n eventSlug={eventSlug}\n source={source}\n onTradeAction={handleTradeAction}\n />\n </div>\n <div className=\"hidden flex-none w-md flex-col gap-y-4 lg:sticky lg:top-4 lg:flex lg:self-start\">\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\n {event && (\n <SimilarEventsSection\n eventSlug={eventSlug}\n source={event.source}\n onEventClick={onSimilarEventClick}\n />\n )}\n </div>\n </div>\n {event && (\n <div className=\"flex w-full flex-col\">\n <UserActivitySection event={event} walletAddress={walletAddress} />\n </div>\n )}\n\n <PredictTradeModal />\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport {\n candlesticksQueryKey,\n ChartRange,\n type Candlestick,\n type ChartRangeType,\n type ListCandlesticksParams,\n type PredictEvent,\n type PredictMarket,\n type ProviderSource,\n useEvent,\n usePredictClient,\n} from \"@liberfi.io/react-predict\";\nimport { DEFAULT_CHART_RANGE, MAX_PRICE_HISTORY_MARKETS } from \"../../consts\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(m: PredictMarket): number {\n return m.outcomes[0]?.best_ask ?? m.outcomes[0]?.price ?? 0;\n}\n\nfunction listCandlesticksParamsForRange(\n chartRange: ChartRangeType,\n): ListCandlesticksParams {\n switch (chartRange) {\n case ChartRange.ONE_DAY:\n return { interval: \"15m\", limit: 96 };\n case ChartRange.ONE_WEEK:\n return { interval: \"1h\", limit: 168 };\n case ChartRange.ONE_MONTH:\n return { interval: \"4h\", limit: 180 };\n case ChartRange.ALL:\n return { interval: \"1d\", limit: 300 };\n default:\n return { interval: \"1h\", limit: 100 };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport interface UseEventDetailParams {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"kalshi\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: ProviderSource;\n /** Market slugs to query candlesticks for. Default: top 4 by yesAsk. */\n candlestickMarketSlugs?: string[];\n /** Chart time range (1d / 1w / 1m / all). */\n chartRange?: ChartRangeType;\n}\n\nexport const useEventDetail = (params: UseEventDetailParams) => {\n const {\n candlestickMarketSlugs,\n chartRange = DEFAULT_CHART_RANGE,\n source,\n } = params;\n\n const client = usePredictClient();\n const candlestickParams = useMemo(\n () => listCandlesticksParamsForRange(chartRange),\n [chartRange],\n );\n\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEvent({ slug: params.eventSlug, source });\n\n const marketsToQuery = useMemo(() => {\n if (!event?.markets) return [];\n\n // Deduplicate markets by slug (backend may return duplicates)\n const seen = new Set<string>();\n const dedupedMarkets = event.markets.filter((m) => {\n if (seen.has(m.slug)) return false;\n seen.add(m.slug);\n return true;\n });\n\n const markets =\n candlestickMarketSlugs && candlestickMarketSlugs.length > 0\n ? candlestickMarketSlugs\n .slice(0, MAX_PRICE_HISTORY_MARKETS)\n .map((slug) =>\n dedupedMarkets.find((m: PredictMarket) => m.slug === slug),\n )\n .filter((m): m is PredictMarket => m !== undefined)\n : [...dedupedMarkets]\n .sort((a, b) => getYesAsk(b) - getYesAsk(a))\n .slice(0, MAX_PRICE_HISTORY_MARKETS);\n\n return markets.map((m) => m.slug);\n }, [candlestickMarketSlugs, event?.markets]);\n\n const candlestickQueries = useQueries({\n queries: marketsToQuery.map((slug) => ({\n queryKey: candlesticksQueryKey(slug, candlestickParams),\n queryFn: () => client.listCandlesticks(slug, candlestickParams),\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((slug, index) => {\n const error = candlestickQueries[index]?.error;\n if (error) errors.set(slug, error);\n });\n return errors;\n }, [marketsToQuery, candlestickQueries]);\n\n const candlesticks = useMemo(() => {\n const map = new Map<string, Candlestick[]>();\n marketsToQuery.forEach((slug, index) => {\n const data = candlestickQueries[index]?.data;\n if (data) map.set(slug, data);\n });\n return map;\n }, [marketsToQuery, candlestickQueries]);\n\n return {\n event,\n isEventLoading,\n eventError,\n candlestickParams,\n candlesticks,\n isCandlesticksLoading,\n candlestickErrors,\n };\n};\n\nexport type { PredictEvent, PredictMarket };\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAtom } from \"jotai\";\nimport { atomWithStorage } from \"jotai/utils\";\n\nconst MAX_HISTORY_SIZE = 10;\n\nconst searchHistoriesAtom = atomWithStorage<string[]>(\n \"liberfi:predict_search_histories\",\n [],\n undefined,\n { getOnInit: true },\n);\n\nexport function usePredictSearchHistory() {\n const [histories, setHistories] = useAtom(searchHistoriesAtom);\n\n const addHistory = useCallback(\n (keyword: string) => {\n const trimmed = keyword.trim();\n if (!trimmed) return;\n\n setHistories((prev) => {\n const filtered = prev.filter((h) => h !== trimmed);\n return [trimmed, ...filtered].slice(0, MAX_HISTORY_SIZE);\n });\n },\n [setHistories],\n );\n\n const clearHistories = useCallback(() => {\n setHistories([]);\n }, [setHistories]);\n\n return { histories, addHistory, clearHistories };\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Chip, TrashIcon, Button } from \"@liberfi.io/ui\";\n\nexport type SearchHistoryUIProps = {\n histories: string[];\n onSelect?: (keyword: string) => void;\n onClear?: () => void;\n className?: string;\n};\n\nexport function SearchHistoryUI({\n histories,\n onSelect,\n onClear,\n className,\n}: SearchHistoryUIProps) {\n const { t } = useTranslation();\n\n if (histories.length === 0) return null;\n\n return (\n <div className={cn(\"px-4 pb-4\", className)}>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">\n {t(\"predict.search.history\")}\n </span>\n <Button\n isIconOnly\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <TrashIcon width={20} height={20} />\n </Button>\n </div>\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {histories.map((keyword) => (\n <Chip\n key={keyword}\n size=\"sm\"\n variant=\"bordered\"\n className={cn(\n \"text-neutral\",\n \"border-border border-1\",\n \"cursor-pointer\",\n \"hover:opacity-hover\",\n )}\n onClick={() => onSelect?.(keyword)}\n >\n {keyword}\n </Chip>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { cn } from \"@liberfi.io/ui\";\nimport { usePredictSearchHistory } from \"./search-history.script\";\nimport { SearchHistoryUI } from \"./search-history.ui\";\n\nexport type SearchHistoryWidgetProps = {\n /** Callback when a history keyword is selected */\n onSelect?: (keyword: string) => void;\n className?: string;\n};\n\nexport function SearchHistoryWidget({\n onSelect,\n className,\n}: SearchHistoryWidgetProps) {\n const { histories, clearHistories } = usePredictSearchHistory();\n\n return (\n <SearchHistoryUI\n className={cn(className)}\n histories={histories}\n onSelect={onSelect}\n onClear={clearHistories}\n />\n );\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n Kbd,\n SearchIcon,\n StyledInput,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\n\nexport type SearchInputUIProps = {\n /** Controlled input value */\n value: string;\n /** Called on every keystroke */\n onValueChange: (value: string) => void;\n /** Called when clear button is pressed */\n onClear?: () => void;\n /** Called when Esc button is pressed */\n onEscape?: () => void;\n className?: string;\n};\n\nexport function SearchInputUI({\n value,\n onValueChange,\n onClear,\n onEscape,\n className,\n}: SearchInputUIProps) {\n const { t } = useTranslation();\n\n return (\n <div className={className}>\n <StyledInput\n autoFocus\n variant=\"bordered\"\n radius=\"lg\"\n value={value}\n onValueChange={onValueChange}\n placeholder={t(\"predict.search.placeholder\")}\n classNames={{\n inputWrapper: [\n \"!bg-[rgba(39,39,42,0.6)]\",\n \"!border-[rgba(63,63,70,0.5)]\",\n \"data-[hover=true]:!bg-[rgba(39,39,42,1)]\",\n \"group-data-[focus=true]:!bg-[rgba(39,39,42,1)]\",\n \"group-data-[focus=true]:!border-[rgba(63,63,70,0.8)]\",\n ].join(\" \"),\n }}\n startContent={\n <SearchIcon width={20} height={20} className=\"text-neutral\" />\n }\n endContent={\n value ? (\n <Button\n isIconOnly\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n ) : (\n <Kbd\n className=\"min-w-8 justify-center text-xs text-neutral bg-transparent border border-[rgba(63,63,70,0.5)] rounded-lg cursor-pointer select-none\"\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n onEscape?.();\n }}\n >\n Esc\n </Kbd>\n )\n }\n />\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { ProviderSource } from \"@liberfi.io/react-predict\";\nimport { KalshiIcon, PolymarketIcon, cn } from \"@liberfi.io/ui\";\n\ninterface SourceMeta {\n label: string;\n color: string;\n bgColor: string;\n icon: ReactNode;\n}\n\nconst SOURCE_META: Record<string, SourceMeta> = {\n kalshi: {\n label: \"KALSHI\",\n color: \"#00d492\",\n bgColor: \"rgba(0, 212, 146, 0.12)\",\n icon: <KalshiIcon className=\"w-3.5 h-3.5 shrink-0\" />,\n },\n polymarket: {\n label: \"POLYMARKET\",\n color: \"#50a2ff\",\n bgColor: \"rgba(43, 127, 255, 0.12)\",\n icon: <PolymarketIcon className=\"w-3.5 h-3.5 shrink-0\" />,\n },\n dflow: {\n label: \"DFLOW\",\n color: \"rgb(16, 185, 129)\",\n bgColor: \"rgba(16, 185, 129, 0.12)\",\n icon: null,\n },\n};\n\nconst DEFAULT_META: SourceMeta = {\n label: \"Unknown\",\n color: \"rgb(156, 163, 175)\",\n bgColor: \"rgba(156, 163, 175, 0.12)\",\n icon: null,\n};\n\nexport function getSourceMeta(source: ProviderSource | string): SourceMeta {\n return SOURCE_META[source] ?? DEFAULT_META;\n}\n\nexport interface SourceBadgeProps {\n source: ProviderSource | string;\n className?: string;\n}\n\nexport function SourceBadge({ source, className }: SourceBadgeProps) {\n const meta = getSourceMeta(source);\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-x-1 rounded-md px-1.5 py-0.5 text-xs font-medium\",\n className,\n )}\n style={{ backgroundColor: meta.bgColor, color: meta.color }}\n >\n {meta.icon}\n {meta.label}\n </span>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent } from \"@liberfi.io/react-predict\";\nimport { Avatar, cn, ChevronRightIcon, Linkable } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { getSourceMeta } from \"../matches/source-badge.ui\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type SearchResultItemUIProps = {\n event: PredictEvent;\n /** URL for the detail page. When set, the row renders as a link via Linkable. */\n href?: string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n onSelect?: (event: PredictEvent) => void;\n /** Called when the row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n className?: string;\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatVolume(vol: number | null | undefined): string {\n if (vol == null) return \"-\";\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${Math.round(vol / 1_000)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SearchResultItemUI({\n event,\n href,\n LinkComponent,\n onSelect,\n onHover,\n className,\n}: SearchResultItemUIProps) {\n const { t } = useTranslation();\n const firstTag = event.tags?.[0];\n const sourceMeta = getSourceMeta(event.source);\n\n const formattedVolume = useMemo(\n () => formatVolume(event.volume),\n [event.volume],\n );\n\n return (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n className={cn(\n \"group w-full h-full px-3 flex items-center gap-3\",\n \"hover:cursor-pointer hover:bg-content2 rounded-lg\",\n \"transition-colors duration-150\",\n className,\n )}\n onClick={(e) => {\n if (href && onSelect) e.preventDefault();\n onSelect?.(event);\n }}\n onMouseEnter={() => onHover?.(event)}\n >\n {/* Avatar */}\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"full\"\n className=\"h-10 w-10 flex-shrink-0\"\n />\n\n {/* Title + meta */}\n <div className=\"flex-1 min-w-0 flex flex-col justify-center gap-y-0.5\">\n <span className=\"min-w-0 text-sm font-medium line-clamp-2 group-hover:text-primary transition-colors\">\n {event.title}\n </span>\n\n <div className=\"flex items-center gap-x-2 text-[10px] font-normal text-neutral-500 lg:text-xs\">\n {/* Source icon + label */}\n <span\n className=\"inline-flex items-center gap-x-1 shrink-0\"\n style={{ color: sourceMeta.color }}\n >\n {sourceMeta.icon}\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.04em\",\n textTransform: \"uppercase\",\n }}\n >\n {sourceMeta.label}\n </span>\n </span>\n\n <span className=\"text-neutral-600\">·</span>\n\n {/* Volume */}\n <span className=\"text-neutral-400\">\n {formattedVolume} {t(\"predict.event.volume\")}\n </span>\n\n {/* Tag */}\n {firstTag && (\n <>\n <span className=\"text-neutral-600\">·</span>\n <span className=\"text-neutral-500\">{firstTag.label}</span>\n </>\n )}\n </div>\n </div>\n\n {/* Hover arrow */}\n <ChevronRightIcon\n width={16}\n height={16}\n className=\"shrink-0 text-neutral-500 opacity-0 group-hover:opacity-100 transition-opacity\"\n />\n </Linkable>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n useSearchEvents,\n type PredictEvent,\n type PredictPage,\n type ProviderSource,\n} from \"@liberfi.io/react-predict\";\n\nexport interface UseSearchResultListScriptParams {\n keyword?: string;\n limit?: number;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: ProviderSource;\n}\n\nexport function useSearchResultListScript({\n keyword = \"\",\n limit,\n source,\n}: UseSearchResultListScriptParams) {\n const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchEvents(\n {\n keyword,\n limit,\n source,\n sort_by: keyword ? undefined : \"volume\",\n sort_asc: keyword ? undefined : false,\n },\n { enabled: true },\n );\n\n const events = useMemo<PredictEvent[]>(\n () =>\n data?.pages\n .flatMap((p: PredictPage<PredictEvent>) => p.items)\n .filter((item): item is PredictEvent => item != null) ?? [],\n [data],\n );\n\n return {\n events,\n isLoading,\n isFetchingNextPage,\n hasNextPage: hasNextPage ?? false,\n fetchNextPage,\n };\n}\n","\"use client\";\n\nimport { ReactElement, useCallback, useMemo, useRef } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent } from \"@liberfi.io/react-predict\";\nimport { cn, EmptyIcon, Spinner } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { SearchResultItemUI } from \"./search-result-item.ui\";\nimport {\n useSearchResultListScript,\n type UseSearchResultListScriptParams,\n} from \"./search-result-list.script\";\n\nconst ROW_HEIGHT = 64;\n\nexport type SearchResultListWidgetProps = {\n onSelect?: (event: PredictEvent) => void;\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n className?: string;\n} & UseSearchResultListScriptParams;\n\nexport function SearchResultListWidget({\n onSelect,\n getEventHref,\n LinkComponent,\n onHover,\n className,\n ...scriptParams\n}: SearchResultListWidgetProps) {\n const { events, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchResultListScript(scriptParams);\n\n const ref = useRef<HTMLDivElement>(null);\n const { height } = useResizeObserver<HTMLDivElement>({ ref });\n\n const isItemLoaded = useCallback(\n (index: number) => index < events.length,\n [events],\n );\n\n const loadMoreItems = useCallback(async () => {\n if (hasNextPage && !isFetchingNextPage) {\n await fetchNextPage();\n }\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n const itemCount = useMemo(\n () => (hasNextPage ? events.length + 1 : events.length),\n [events, hasNextPage],\n );\n\n const onRowsLoaded = useInfiniteLoader({\n isRowLoaded: isItemLoaded,\n loadMoreRows: loadMoreItems,\n rowCount: itemCount,\n threshold: 5,\n });\n\n if (isLoading) {\n return <LoadingState className={className} />;\n }\n\n if (events.length === 0) {\n return <EmptyState className={className} />;\n }\n\n return (\n <div className={cn(\"w-full h-full flex flex-col\", className)}>\n <div className=\"flex-auto min-h-0\" ref={ref}>\n <List\n className=\"no-scrollbar\"\n style={{ height }}\n onRowsRendered={onRowsLoaded}\n rowComponent={SearchResultRow}\n rowCount={itemCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{ events, onSelect, getEventHref, LinkComponent, onHover }}\n overscanCount={5}\n />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Row renderer\n// ---------------------------------------------------------------------------\n\ninterface SearchResultRowData {\n events: PredictEvent[];\n onSelect?: (event: PredictEvent) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n onHover?: (event: PredictEvent) => void;\n}\n\nfunction SearchResultRow({\n index,\n style,\n events,\n onSelect,\n getEventHref,\n LinkComponent,\n onHover,\n}: RowComponentProps<SearchResultRowData>): ReactElement {\n const event = events[index];\n\n if (!event) {\n return (\n <div style={style} className=\"flex items-center justify-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n return (\n <div style={style}>\n <SearchResultItemUI\n event={event}\n href={getEventHref?.(event)}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onHover={onHover}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// States\n// ---------------------------------------------------------------------------\n\nfunction LoadingState({ className }: { className?: string }) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\"flex items-center justify-center gap-2 py-16\", className)}\n >\n <Spinner size=\"sm\" />\n <span className=\"text-sm text-neutral\">\n {t(\"predict.search.loading\")}\n </span>\n </div>\n );\n}\n\nfunction EmptyState({ className }: { className?: string }) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center py-16\",\n className,\n )}\n >\n <EmptyIcon width={28} height={28} className=\"text-neutral\" />\n <p className=\"mt-2 text-sm text-neutral\">\n {t(\"predict.search.noResults\")}\n </p>\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { debounce } from \"@liberfi.io/utils\";\nimport { usePredictSearchHistory } from \"./search-history.script\";\n\nexport interface UseSearchScriptParams {\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n}\n\nexport function useSearchScript({ onKeywordChange }: UseSearchScriptParams) {\n const [text, setText] = useState(\"\");\n const [keyword, setKeyword] = useState(\"\");\n const { addHistory } = usePredictSearchHistory();\n\n const onKeywordChangeStable = useCallbackRef(onKeywordChange);\n const addHistoryStable = useCallbackRef(addHistory);\n\n const debouncedSearch = useMemo(\n () =>\n debounce((v: string) => {\n setKeyword(v);\n onKeywordChangeStable(v);\n if (v) addHistoryStable(v);\n }, 500),\n [onKeywordChangeStable, addHistoryStable],\n );\n\n const setText_ = useCallback(\n (v: string) => {\n setText(v);\n debouncedSearch(v);\n },\n [debouncedSearch],\n );\n\n const setKeyword_ = useCallback(\n (value: string) => {\n debouncedSearch.cancel();\n setText(value);\n setKeyword(value);\n onKeywordChangeStable(value);\n if (value) addHistoryStable(value);\n },\n [debouncedSearch, onKeywordChangeStable, addHistoryStable],\n );\n\n const clearKeyword = useCallback(() => setKeyword_(\"\"), [setKeyword_]);\n\n return {\n text,\n keyword,\n setText: setText_,\n setKeyword: setKeyword_,\n clearKeyword,\n };\n}\n","\"use client\";\n\nimport type { PredictEvent, ProviderSource } from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { SearchHistoryWidget } from \"./search-history.widget\";\nimport { SearchInputUI } from \"./search-input.ui\";\nimport { SearchResultListWidget } from \"./search-result-list.widget\";\nimport { useSearchScript } from \"./search.script\";\n\nexport type SearchWidgetProps = {\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n /** Callback when an event is selected */\n onSelectEvent?: (event: PredictEvent) => void;\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n /** Called when the Esc button / key is pressed. */\n onEscape?: () => void;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: ProviderSource;\n};\n\nexport function SearchWidget({\n onKeywordChange,\n onSelectEvent,\n getEventHref,\n LinkComponent,\n onHover,\n onEscape,\n source,\n}: SearchWidgetProps) {\n const { text, keyword, setText, setKeyword, clearKeyword } = useSearchScript({\n onKeywordChange,\n });\n\n return (\n <div className=\"w-full h-full flex flex-col gap-3\">\n <SearchInputUI\n value={text}\n onValueChange={setText}\n onClear={clearKeyword}\n onEscape={onEscape}\n />\n {!keyword && <SearchHistoryWidget onSelect={setKeyword} />}\n <SearchResultListWidget\n className=\"flex-auto min-h-0\"\n keyword={keyword}\n onSelect={onSelectEvent}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n source={source}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, ProviderSource } from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport {\n Button,\n ModalBody,\n ModalContent,\n ModalHeader,\n StyledModal,\n useScreen,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\nimport {\n AsyncModal,\n type RenderAsyncModalProps,\n} from \"@liberfi.io/ui-scaffold\";\nimport { SearchWidget } from \"./search.widget\";\n\nexport type PredictSearchModalParams = {\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: ProviderSource;\n};\n\nexport type PredictSearchModalResult = PredictEvent;\n\nexport const PREDICT_SEARCH_MODAL_ID = \"predict-search\";\n\nexport function PredictSearchModal({\n id = PREDICT_SEARCH_MODAL_ID,\n}: {\n id?: string;\n}) {\n return (\n <AsyncModal<PredictSearchModalParams, PredictSearchModalResult> id={id}>\n {(modalProps) => <PredictSearchModalContent {...modalProps} />}\n </AsyncModal>\n );\n}\n\nfunction PredictSearchModalContent({\n params,\n isOpen,\n onOpenChange,\n onResult,\n}: RenderAsyncModalProps<PredictSearchModalParams, PredictSearchModalResult>) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const handleSelectEvent = useCallback(\n (event: PredictEvent) => {\n onResult(event);\n },\n [onResult],\n );\n\n const handleEscape = useCallback(() => {\n onOpenChange(false);\n }, [onOpenChange]);\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size={isMobile ? \"full\" : \"lg\"}\n hideCloseButton\n backdrop=\"blur\"\n radius=\"lg\"\n >\n <ModalContent\n className=\"w-full h-full\"\n style={{\n borderRadius: isMobile ? undefined : 14,\n border: isMobile ? undefined : \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: isMobile ? undefined : \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n }}\n >\n <ModalHeader className=\"sm:hidden flex items-center justify-between pt-4 pb-2\">\n <span className=\"text-base font-semibold\">\n {t(\"predict.search.title\")}\n </span>\n <Button\n isIconOnly\n onPress={() => onOpenChange(false)}\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6\"\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n </ModalHeader>\n <ModalBody className=\"p-4\">\n <SearchWidget\n getEventHref={params?.getEventHref}\n LinkComponent={params?.LinkComponent}\n onHover={params?.onHover}\n source={params?.source}\n onSelectEvent={handleSelectEvent}\n onEscape={handleEscape}\n />\n </ModalBody>\n </ModalContent>\n </StyledModal>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent } from \"@liberfi.io/react-predict\";\nimport { Button, cn, Kbd, SearchIcon, useScreen } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport {\n PREDICT_SEARCH_MODAL_ID,\n type PredictSearchModalParams,\n type PredictSearchModalResult,\n} from \"./search.modal\";\n\nexport type SearchEventsButtonProps = {\n /** Callback when an event is selected from the search modal */\n onSelectEvent?: (event: PredictEvent) => void;\n /** Params forwarded to the search modal (getEventHref, LinkComponent, onHover) */\n modalParams?: Omit<PredictSearchModalParams, never>;\n className?: string;\n};\n\nexport function SearchEventsButton({\n onSelectEvent,\n modalParams,\n className,\n}: SearchEventsButtonProps) {\n const { t } = useTranslation();\n const { isDesktop, isMobile } = useScreen();\n\n const { onOpen, onClose } = useAsyncModal<\n PredictSearchModalParams,\n PredictSearchModalResult\n >(PREDICT_SEARCH_MODAL_ID);\n\n const onSelectEventStable = useCallbackRef(onSelectEvent);\n\n const handleOpen = useCallbackRef(async () => {\n const result = await onOpen({ params: modalParams });\n if (result) {\n onSelectEventStable(result);\n }\n });\n\n const handleClose = useCallbackRef(() => {\n onClose();\n });\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n const activeElement = document.activeElement as HTMLElement | null;\n\n const isInEditableElement =\n !!activeElement &&\n (activeElement.tagName === \"INPUT\" ||\n activeElement.tagName === \"TEXTAREA\" ||\n activeElement.getAttribute(\"contenteditable\") === \"true\");\n\n if (event.key === \"/\" && !isInEditableElement) {\n event.preventDefault();\n handleOpen();\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n handleClose();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleOpen, handleClose]);\n\n return (\n <Button\n size=\"sm\"\n radius=\"full\"\n isIconOnly={!isDesktop}\n onPress={handleOpen}\n variant={isMobile ? \"flat\" : \"bordered\"}\n startContent={\n isDesktop ? <SearchIcon className=\"text-neutral\" /> : undefined\n }\n endContent={\n isDesktop ? (\n <Kbd className=\"ml-auto min-w-6 justify-center text-xs bg-transparent border border-border rounded-full\">\n /\n </Kbd>\n ) : undefined\n }\n className={cn(\n isDesktop && \"min-w-56 justify-start pl-3 pr-1.5 text-neutral\",\n className,\n )}\n >\n {isDesktop ? (\n t(\"predict.search.placeholder\")\n ) : (\n <SearchIcon className=\"text-neutral\" />\n )}\n </Button>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { MatchSortField } from \"@liberfi.io/react-predict\";\n\nexport interface MatchesFilterBarProps {\n sortBy: MatchSortField;\n onSortChange: (sort: MatchSortField) => void;\n sortAsc: boolean;\n onSortAscChange: (asc: boolean) => void;\n minVolume?: number;\n onMinVolumeChange?: (vol: number | undefined) => void;\n onRefresh?: () => void;\n}\n\nconst SORT_OPTIONS: {\n value: MatchSortField;\n labelKey: string;\n descKey: string;\n icon: \"trending-up\" | \"chart-column\" | \"flame\";\n}[] = [\n {\n value: \"spread\",\n labelKey: \"predict.matches.sort.spread\",\n descKey: \"predict.matches.sort.spreadDesc\",\n icon: \"trending-up\",\n },\n {\n value: \"volume\",\n labelKey: \"predict.matches.sort.volume\",\n descKey: \"predict.matches.sort.volumeDesc\",\n icon: \"chart-column\",\n },\n {\n value: \"confidence\",\n labelKey: \"predict.matches.sort.confidence\",\n descKey: \"predict.matches.sort.confidenceDesc\",\n icon: \"flame\",\n },\n];\n\nconst VOLUME_PRESETS = [\n { labelKey: \"predict.matches.filter.noMinimum\", label: \"$0\", value: 0 },\n { labelKey: null, label: \"$100+\", value: 100 },\n { labelKey: null, label: \"$500+\", value: 500 },\n { labelKey: null, label: \"$1K+\", value: 1_000 },\n { labelKey: null, label: \"$5K+\", value: 5_000 },\n { labelKey: null, label: \"$10K+\", value: 10_000 },\n { labelKey: null, label: \"$50K+\", value: 50_000 },\n { labelKey: null, label: \"$100K+\", value: 100_000 },\n];\n\nconst btnBase: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"8px 12px\",\n fontSize: 14,\n color: \"#d4d4d8\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n};\n\nconst dropdownBase: React.CSSProperties = {\n position: \"absolute\",\n right: 0,\n top: \"100%\",\n zIndex: 20,\n marginTop: 8,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n};\n\nfunction getVolumeLabel(\n vol: number | undefined,\n t: (key: string) => string,\n): string {\n if (!vol) return \"$5K+\";\n const preset = VOLUME_PRESETS.find((p) => p.value === vol);\n if (!preset) return `$${vol}`;\n return preset.labelKey ? t(preset.labelKey) : preset.label;\n}\n\nexport function MatchesFilterBar({\n sortBy,\n onSortChange,\n sortAsc,\n onSortAscChange,\n minVolume,\n onMinVolumeChange,\n onRefresh,\n}: MatchesFilterBarProps) {\n const { t } = useTranslation();\n const [sortOpen, setSortOpen] = useState(false);\n const [volumeOpen, setVolumeOpen] = useState(false);\n const [tooltipVisible, setTooltipVisible] = useState(false);\n const [spinning, setSpinning] = useState(false);\n const sortRef = useRef<HTMLDivElement>(null);\n const volumeRef = useRef<HTMLDivElement>(null);\n\n const currentSort =\n SORT_OPTIONS.find((o) => o.value === sortBy) ?? SORT_OPTIONS[0];\n\n const handleClickOutside = useCallback((e: MouseEvent) => {\n if (sortRef.current && !sortRef.current.contains(e.target as Node)) {\n setSortOpen(false);\n }\n if (volumeRef.current && !volumeRef.current.contains(e.target as Node)) {\n setVolumeOpen(false);\n }\n }, []);\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [handleClickOutside]);\n\n const handleRefresh = useCallback(() => {\n onRefresh?.();\n setSpinning(true);\n setTimeout(() => setSpinning(false), 700);\n }, [onRefresh]);\n\n return (\n <>\n <style>{`\n @keyframes matchRefreshSpin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}\n .match-refresh-spin{animation:matchRefreshSpin .6s ease-in-out}\n .match-btn:focus-visible{outline:2px solid #c7ff2e;outline-offset:2px;z-index:10}\n `}</style>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n {/* Sort dropdown */}\n <div ref={sortRef} style={{ position: \"relative\" }}>\n <button\n type=\"button\"\n className=\"match-btn\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={() => {\n setSortOpen((v) => !v);\n setVolumeOpen(false);\n }}\n >\n <SortIcon />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {t(currentSort.labelKey as never)}\n </span>\n <ChevronDown open={sortOpen} />\n </button>\n\n {sortOpen && (\n <div style={{ ...dropdownBase, width: 224, padding: 4 }}>\n {SORT_OPTIONS.map((opt) => {\n const isActive = sortBy === opt.value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n gap: 12,\n padding: \"10px 12px\",\n textAlign: \"left\",\n fontSize: 14,\n border: \"none\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"transparent\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n borderRadius: 10,\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.5)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n onClick={() => {\n if (sortBy === opt.value) {\n onSortAscChange(!sortAsc);\n } else {\n onSortChange(opt.value);\n }\n setSortOpen(false);\n }}\n >\n <div\n style={{\n color: isActive ? \"#c7ff2e\" : \"#71717a\",\n }}\n >\n <SortOptionIcon type={opt.icon} />\n </div>\n <div style={{ flex: 1, textAlign: \"left\" as const }}>\n <div style={{ fontWeight: 500 }}>\n {t(opt.labelKey as never)}\n </div>\n <div\n style={{\n fontSize: 11,\n color: \"#71717a\",\n marginTop: 1,\n }}\n >\n {t(opt.descKey as never)}\n </div>\n </div>\n {isActive && (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 16,\n height: 16,\n color: \"#c7ff2e\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Volume filter */}\n {onMinVolumeChange && (\n <div ref={volumeRef} style={{ position: \"relative\" }}>\n <div style={{ position: \"relative\", display: \"inline-flex\" }}>\n <button\n type=\"button\"\n className=\"match-btn\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={() => {\n setVolumeOpen((v) => !v);\n setSortOpen(false);\n }}\n >\n <FilterIcon />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {getVolumeLabel(minVolume, t as (key: string) => string)}\n </span>\n <InfoIcon\n onMouseEnter={() => setTooltipVisible(true)}\n onMouseLeave={() => setTooltipVisible(false)}\n />\n <ChevronDown open={volumeOpen} />\n </button>\n\n {/* Tooltip */}\n {tooltipVisible && (\n <div\n style={{\n position: \"absolute\",\n zIndex: 100,\n top: \"100%\",\n marginTop: 8,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: 256,\n padding: 12,\n borderRadius: 14,\n background: \"rgba(24,24,27,1)\",\n border: \"1px solid rgba(63,63,70,0.5)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n pointerEvents: \"none\",\n }}\n >\n {/* Arrow */}\n <div\n style={{\n position: \"absolute\",\n top: -6,\n left: \"50%\",\n transform: \"translateX(-50%) rotate(45deg)\",\n width: 12,\n height: 12,\n background: \"rgba(24,24,27,1)\",\n borderLeft: \"1px solid rgba(63,63,70,0.5)\",\n borderTop: \"1px solid rgba(63,63,70,0.5)\",\n }}\n />\n <div\n style={{\n position: \"relative\",\n fontSize: 12,\n color: \"#d4d4d8\",\n lineHeight: 1.625,\n }}\n >\n <div\n style={{\n fontWeight: 600,\n color: \"#fff\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n marginBottom: 8,\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#c7ff2e\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\" />\n </svg>\n {t(\"predict.matches.filter.liquidityFilter\" as never)}\n </div>\n <p style={{ color: \"#a1a1aa\", margin: \"0 0 4px\" }}>\n {t(\"predict.matches.filter.tooltipDesc\" as never)}\n </p>\n <p style={{ color: \"#71717a\", fontSize: 11, margin: 0 }}>\n {t(\"predict.matches.filter.tooltipNote\" as never)}\n </p>\n </div>\n </div>\n )}\n </div>\n\n {/* Volume dropdown */}\n {volumeOpen && (\n <div style={{ ...dropdownBase, right: 0, width: 176 }}>\n <div\n style={{\n padding: \"8px 12px\",\n borderBottom: \"1px solid rgba(39,39,42,1)\",\n }}\n >\n <span\n style={{\n fontSize: 11,\n fontWeight: 500,\n color: \"#71717a\",\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.05em\",\n }}\n >\n {t(\"predict.matches.filter.minVolumeEach\" as never)}\n </span>\n </div>\n <div style={{ padding: 4 }}>\n {VOLUME_PRESETS.map((p) => {\n const isActive =\n p.value === 0 ? !minVolume : minVolume === p.value;\n return (\n <button\n key={p.value}\n type=\"button\"\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 12px\",\n textAlign: \"left\",\n fontSize: 14,\n border: \"none\",\n cursor: \"pointer\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"transparent\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n borderRadius: 10,\n transition: \"all 0.15s\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background =\n \"rgba(39,39,42,0.5)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n onClick={() => {\n onMinVolumeChange?.(\n p.value === 0 ? undefined : p.value,\n );\n setVolumeOpen(false);\n }}\n >\n <span>\n {p.labelKey ? t(p.labelKey as never) : p.label}\n </span>\n {isActive && (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 16,\n height: 16,\n color: \"#c7ff2e\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Refresh button */}\n {onRefresh && (\n <button\n type=\"button\"\n className=\"match-btn\"\n style={{\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n width: 36,\n height: 36,\n color: \"#a1a1aa\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n e.currentTarget.style.color = \"#fff\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }}\n onClick={handleRefresh}\n >\n <svg\n className={spinning ? \"match-refresh-spin\" : undefined}\n viewBox=\"0 0 24 24\"\n style={{ width: 16, height: 16 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n </svg>\n </button>\n )}\n </div>\n </>\n );\n}\n\nfunction SortIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m21 16-4 4-4-4\" />\n <path d=\"M17 20V4\" />\n <path d=\"m3 8 4-4 4 4\" />\n <path d=\"M7 4v16\" />\n </svg>\n );\n}\n\nfunction SortOptionIcon({\n type,\n}: {\n type: \"trending-up\" | \"chart-column\" | \"flame\";\n}) {\n const style: React.CSSProperties = { width: 16, height: 16 };\n const shared = {\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n };\n\n if (type === \"trending-up\") {\n return (\n <svg {...shared} style={style}>\n <path d=\"M16 7h6v6\" />\n <path d=\"m22 7-8.5 8.5-5-5L2 17\" />\n </svg>\n );\n }\n if (type === \"chart-column\") {\n return (\n <svg {...shared} style={style}>\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n );\n }\n return (\n <svg {...shared} style={style}>\n <path d=\"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\" />\n </svg>\n );\n}\n\nfunction FilterIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\" />\n </svg>\n );\n}\n\nfunction InfoIcon({\n onMouseEnter,\n onMouseLeave,\n}: {\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n className=\"hidden sm:block\"\n style={{ width: 12, height: 12, color: \"#52525b\", flexShrink: 0 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n );\n}\n\nfunction ChevronDown({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#71717a\",\n transition: \"transform 0.15s\",\n transform: open ? \"rotate(180deg)\" : undefined,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\n\nexport interface MatchesHeroStats {\n activePairs: number;\n maxSpread: number;\n highSpreadCount: number;\n totalVolume: number;\n}\n\nexport interface MatchesHeroProps {\n stats?: MatchesHeroStats;\n}\n\nfunction formatVolume(vol: number): string {\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${(vol / 1_000).toFixed(0)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\nconst STAT_CARDS: {\n key: keyof MatchesHeroStats;\n labelKey: string;\n format: (v: number) => string;\n valueColor: string;\n gradientFrom: string;\n gradientTo: string;\n borderColor: string;\n}[] = [\n {\n key: \"activePairs\",\n labelKey: \"predict.matches.stats.activePairs\",\n format: (v) => v.toLocaleString(),\n valueColor: \"#c7ff2e\",\n gradientFrom: \"rgba(199,255,46,0.18)\",\n gradientTo: \"rgba(199,255,46,0.04)\",\n borderColor: \"rgba(199,255,46,0.18)\",\n },\n {\n key: \"maxSpread\",\n labelKey: \"predict.matches.stats.maxSpread\",\n format: (v) => `${(v * 100).toFixed(1)}%`,\n valueColor: \"#f76816\",\n gradientFrom: \"rgba(247,104,22,0.18)\",\n gradientTo: \"rgba(247,104,22,0.04)\",\n borderColor: \"rgba(247,104,22,0.18)\",\n },\n {\n key: \"highSpreadCount\",\n labelKey: \"predict.matches.stats.highSpreadCount\",\n format: (v) => v.toLocaleString(),\n valueColor: \"#17c964\",\n gradientFrom: \"rgba(23,201,100,0.18)\",\n gradientTo: \"rgba(23,201,100,0.04)\",\n borderColor: \"rgba(23,201,100,0.18)\",\n },\n {\n key: \"totalVolume\",\n labelKey: \"predict.matches.stats.totalVolume\",\n format: formatVolume,\n valueColor: \"#f5a524\",\n gradientFrom: \"rgba(245,165,36,0.18)\",\n gradientTo: \"rgba(245,165,36,0.04)\",\n borderColor: \"rgba(245,165,36,0.18)\",\n },\n];\n\nexport function MatchesHero({ stats }: MatchesHeroProps) {\n const { t } = useTranslation();\n\n return (\n <>\n <style>{`\n @keyframes match-live-ping{75%,100%{transform:scale(2.2);opacity:0}}\n @keyframes match-live-breathe{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(.85)}}\n @keyframes matchStatsEnter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}\n @keyframes matchStatCardEnter{from{opacity:0;transform:translateY(8px) scale(0.97)}to{opacity:1;transform:translateY(0) scale(1)}}\n @keyframes matchHeroTitleEnter{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n\n .matches-hero-title{font-size:32px!important;line-height:1.2!important}\n @media(min-width:640px){.matches-hero-title{font-size:38px!important}}\n @media(min-width:1024px){.matches-hero-title{font-size:46px!important}}\n\n .matches-hero-subtitle{font-size:14px}\n @media(min-width:640px){.matches-hero-subtitle{font-size:15px}}\n\n .matches-hero-outer{flex-direction:column;align-items:center;text-align:center;gap:28px}\n @media(min-width:640px){.matches-hero-outer{flex-direction:row;align-items:center;text-align:left;gap:40px}}\n @media(min-width:1024px){.matches-hero-outer{gap:56px}}\n\n .matches-hero-left{align-items:center}\n @media(min-width:640px){.matches-hero-left{align-items:flex-start}}\n\n .matches-hero-live{justify-content:center}\n @media(min-width:640px){.matches-hero-live{justify-content:flex-start}}\n\n .matches-hero-subtitle-text{text-align:center;margin:0 auto}\n @media(min-width:640px){.matches-hero-subtitle-text{text-align:left;margin:0}}\n\n .matches-stat-grid{grid-template-columns:repeat(2,1fr);width:100%;max-width:360px}\n @media(min-width:640px){.matches-stat-grid{width:340px;max-width:none}}\n @media(min-width:1024px){.matches-stat-grid{width:380px}}\n\n .matches-stat-val{font-size:20px;line-height:28px;min-height:28px}\n @media(min-width:640px){.matches-stat-val{font-size:22px;line-height:30px;min-height:30px}}\n @media(min-width:1024px){.matches-stat-val{font-size:24px;line-height:32px;min-height:32px}}\n\n .matches-stat-label{font-size:11px;line-height:16px;min-height:16px}\n @media(min-width:640px){.matches-stat-label{font-size:12px;line-height:18px;min-height:18px}}\n `}</style>\n\n <div\n className=\"matches-hero-outer\"\n style={{\n display: \"flex\",\n marginBottom: 0,\n }}\n >\n {/* Left: title group */}\n <div\n className=\"matches-hero-left\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minWidth: 0,\n flex: 1,\n animation:\n \"matchHeroTitleEnter 0.5s cubic-bezier(0.34,1.56,0.64,1) both\",\n }}\n >\n {/* Live badge */}\n <div\n className=\"matches-hero-live\"\n style={{ display: \"flex\", marginBottom: 16 }}\n >\n <div\n className=\"inline-flex items-center\"\n style={{\n gap: 8,\n borderRadius: 9999,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"6px 12px\",\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n }}\n >\n <span\n style={{\n position: \"relative\",\n display: \"flex\",\n width: 8,\n height: 8,\n }}\n >\n <span\n style={{\n position: \"absolute\",\n display: \"inline-flex\",\n width: \"100%\",\n height: \"100%\",\n borderRadius: 9999,\n background: \"#00d492\",\n opacity: 0.75,\n animation:\n \"match-live-ping 1.2s cubic-bezier(0,0,0.2,1) infinite\",\n }}\n />\n <span\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n width: 8,\n height: 8,\n borderRadius: 9999,\n background: \"#00bc7d\",\n animation: \"match-live-breathe 2.4s ease-in-out infinite\",\n }}\n />\n </span>\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: \"#d4d4d8\",\n letterSpacing: \"0.025em\",\n }}\n >\n {t(\"predict.matches.liveBadge\" as const)}\n </span>\n <span\n style={{\n borderRadius: 4,\n background: \"rgba(199,255,46,0.12)\",\n padding: \"2px 6px\",\n fontSize: 10,\n fontWeight: 600,\n color: \"#c7ff2e\",\n textTransform: \"uppercase\" as const,\n border: \"1px solid rgba(199,255,46,0.22)\",\n }}\n >\n {t(\"predict.matches.betaTag\" as const)}\n </span>\n </div>\n </div>\n\n {/* Title */}\n <h1\n className=\"matches-hero-title\"\n style={{\n fontFamily: \"var(--font-dm-sans, 'DM Sans', sans-serif)\",\n fontSize: 46,\n fontWeight: 700,\n letterSpacing: \"-1.2px\",\n lineHeight: 1.2,\n color: \"#fff\",\n margin: \"0 0 14px\",\n }}\n >\n <span style={{ color: \"#fff\" }}>\n {t(\"predict.matches.titlePrefix\" as never)}{\" \"}\n </span>\n <span\n style={{\n backgroundImage:\n \"linear-gradient(to right, #c7ff2e, #a0e515, #17c964)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\",\n }}\n >\n {t(\"predict.matches.titleHighlight\" as never)}\n </span>\n </h1>\n\n {/* Subtitle */}\n <p\n className=\"matches-hero-subtitle matches-hero-subtitle-text\"\n style={{\n lineHeight: 1.6,\n color: \"#71717a\",\n maxWidth: 460,\n }}\n >\n {String(t(\"predict.matches.heroSubtitle\" as never))\n .split(\"\\n\")\n .map((line: string, i: number) => (\n <span key={i}>\n {i > 0 && <br className=\"hidden sm:block\" />}\n {line}\n {i === 0 ? \" \" : \"\"}\n </span>\n ))}\n </p>\n </div>\n\n {/* Right: 2x2 stat grid */}\n <div\n className=\"matches-stat-grid\"\n style={{\n display: \"grid\",\n borderRadius: 16,\n border: \"1px solid rgba(39,39,42,0.5)\",\n overflow: \"hidden\",\n flexShrink: 0,\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n ...(stats\n ? {\n animation:\n \"matchStatsEnter 0.5s cubic-bezier(0.34,1.56,0.64,1) both\",\n animationDelay: \"0.1s\",\n }\n : {}),\n }}\n >\n {STAT_CARDS.map((card, idx) => (\n <div\n key={card.key}\n style={{\n padding: \"16px 20px\",\n background: stats\n ? `linear-gradient(to bottom, ${card.gradientFrom}, ${card.gradientTo})`\n : \"rgba(255,255,255,0.02)\",\n borderRight:\n idx % 2 === 0 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n borderBottom: idx < 2 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n ...(stats\n ? {\n animation:\n \"matchStatCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) both\",\n animationDelay: `${150 + idx * 60}ms`,\n }\n : {}),\n }}\n >\n <div\n className=\"matches-stat-val\"\n style={{\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: stats ? card.valueColor : \"transparent\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {stats ? (\n card.format(stats[card.key])\n ) : (\n <div\n style={{\n height: 16,\n width: 56,\n borderRadius: 4,\n background: \"rgba(255,255,255,0.06)\",\n animation: \"matchStatCardEnter 0.6s ease-out both\",\n animationDelay: `${idx * 80}ms`,\n }}\n />\n )}\n </div>\n <div\n className=\"matches-stat-label\"\n style={{\n fontWeight: 500,\n color: stats ? \"#71717a\" : \"transparent\",\n marginTop: 2,\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {stats ? (\n t(card.labelKey as never)\n ) : (\n <div\n style={{\n height: 10,\n width: 64,\n borderRadius: 4,\n background: \"rgba(255,255,255,0.04)\",\n animation: \"matchStatCardEnter 0.6s ease-out both\",\n animationDelay: `${50 + idx * 80}ms`,\n }}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n </>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchConfidenceTier,\n MatchMarketFlat,\n PredictMarket,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { getSourceMeta } from \"./source-badge.ui\";\n\nexport interface MatchMarketCardProps {\n match: MatchMarketFlat;\n onSelect?: (match: MatchMarketFlat, source: ProviderSource) => void;\n onHover?: (match: MatchMarketFlat) => void;\n getMarketHref?: (\n match: MatchMarketFlat,\n source: ProviderSource,\n ) => string | undefined;\n LinkComponent?: LinkComponentType;\n}\n\nfunction formatVolume(vol: number | null | undefined): string {\n if (vol == null) return \"-\";\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${Math.round(vol / 1_000)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\nfunction getYesPrice(market: PredictMarket): number | null {\n const yes = market.outcomes?.[0];\n return yes?.best_ask ?? yes?.price ?? null;\n}\n\nfunction getOutcomeName(market: PredictMarket): string | null {\n return market.outcomes?.[0]?.label || null;\n}\n\ntype SpreadTier = \"high\" | \"medium\" | \"low\";\n\nfunction getSpreadTier(spreadPercent: number | null): SpreadTier {\n if (spreadPercent == null) return \"low\";\n if (spreadPercent >= 3) return \"high\";\n if (spreadPercent >= 2) return \"medium\";\n return \"low\";\n}\n\nconst SPREAD_THEME: Record<\n SpreadTier,\n {\n color: string;\n bandFrom: string;\n bandTo: string;\n gaugeActive: string;\n gaugeInactive: string;\n }\n> = {\n high: {\n color: \"#f76816\",\n bandFrom: \"rgba(247,104,22,0.14)\",\n bandTo: \"rgba(247,104,22,0.03)\",\n gaugeActive: \"#f76816\",\n gaugeInactive: \"rgba(247,104,22,0.15)\",\n },\n medium: {\n color: \"#c7ff2e\",\n bandFrom: \"rgba(199,255,46,0.12)\",\n bandTo: \"rgba(199,255,46,0.02)\",\n gaugeActive: \"#c7ff2e\",\n gaugeInactive: \"rgba(199,255,46,0.15)\",\n },\n low: {\n color: \"#71717a\",\n bandFrom: \"rgba(113,113,122,0.08)\",\n bandTo: \"transparent\",\n gaugeActive: \"#71717a\",\n gaugeInactive: \"rgba(113,113,122,0.12)\",\n },\n};\n\nconst SPREAD_GLOW: Record<SpreadTier, { border: string; shadow: string }> = {\n high: {\n border: \"rgba(247,104,22,0.4)\",\n shadow: \"0 2px 18px rgba(247,104,22,0.35)\",\n },\n medium: {\n border: \"rgba(199,255,46,0.5)\",\n shadow: \"0 2px 20px rgba(199,255,46,0.45)\",\n },\n low: {\n border: \"rgba(113,113,122,0.5)\",\n shadow: \"0 2px 20px rgba(113,113,122,0.35)\",\n },\n};\n\nconst CONFIDENCE_THEME: Record<string, { dot: string; label: string }> = {\n high: { dot: \"#17c964\", label: \"predict.matches.confidenceHigh\" },\n medium: { dot: \"#f5a524\", label: \"predict.matches.confidenceMed\" },\n low: { dot: \"#71717a\", label: \"predict.matches.confidenceLow\" },\n};\n\nfunction getConfidenceTierKey(\n tier: MatchConfidenceTier | undefined,\n score: number | undefined,\n): string {\n if (tier) return tier;\n if (score == null) return \"low\";\n if (score >= 0.9) return \"high\";\n if (score >= 0.7) return \"medium\";\n return \"low\";\n}\n\nfunction SpreadGauge({ tier }: { tier: SpreadTier }) {\n const theme = SPREAD_THEME[tier];\n const filled = tier === \"high\" ? 5 : tier === \"medium\" ? 3 : 1;\n return (\n <div style={{ display: \"flex\", gap: 2, alignItems: \"center\" }}>\n {Array.from({ length: 5 }, (_, i) => (\n <div\n key={i}\n style={{\n width: 6,\n height: 10,\n borderRadius: 1.5,\n background: i < filled ? theme.gaugeActive : theme.gaugeInactive,\n transition: \"background 0.2s\",\n }}\n />\n ))}\n </div>\n );\n}\n\nconst PLATFORM_COLORS: Record<string, { text: string; icon: string }> = {\n polymarket: { text: \"#50a2ff\", icon: \"#50a2ff\" },\n kalshi: { text: \"#00d492\", icon: \"#00d492\" },\n};\n\nconst DEFAULT_PLATFORM = { text: \"#9ca3af\", icon: \"#9ca3af\" };\n\nfunction getPlatformColor(source: string) {\n return PLATFORM_COLORS[source] ?? DEFAULT_PLATFORM;\n}\n\nexport function MatchMarketCard({\n match,\n onSelect,\n onHover,\n getMarketHref,\n LinkComponent,\n}: MatchMarketCardProps) {\n const { t } = useTranslation();\n\n const priceA = getYesPrice(match.market_a);\n const priceB = getYesPrice(match.market_b);\n const spreadPercent =\n match.spread_percent != null\n ? match.spread_percent\n : match.spread != null\n ? match.spread * 100\n : null;\n\n const tier = getSpreadTier(spreadPercent);\n const theme = SPREAD_THEME[tier];\n\n const cheaperSource: ProviderSource | null =\n priceA != null && priceB != null\n ? priceA <= priceB\n ? match.source_a\n : match.source_b\n : null;\n\n const title = match.event_a_title || match.event_b_title;\n\n const confKey = getConfidenceTierKey(\n match.confidence_tier,\n match.similarity_score,\n );\n const confTheme = CONFIDENCE_THEME[confKey] ?? CONFIDENCE_THEME.low;\n\n const ctaAccent = tier === \"high\" ? \"orange\" : \"lime\";\n\n return (\n <div\n className=\"group\"\n style={{\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n transition: \"all 0.2s\",\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n const glow = SPREAD_GLOW[tier];\n el.style.borderColor = glow.border;\n el.style.boxShadow = glow.shadow;\n onHover?.(match);\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(39,39,42,0.6)\";\n el.style.boxShadow = \"none\";\n }}\n >\n {/* Spread hero band */}\n {spreadPercent != null && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 14px\",\n background: `linear-gradient(90deg, ${theme.bandFrom}, ${theme.bandTo})`,\n borderBottom: \"1px solid rgba(39,39,42,0.3)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n flexShrink: 0,\n color: theme.color,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n <span\n style={{\n fontSize: 15,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: theme.color,\n }}\n >\n {spreadPercent.toFixed(1)}%\n </span>\n <span\n style={{\n fontSize: 10,\n fontWeight: 500,\n color: \"rgba(161,161,170,0.7)\",\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.06em\",\n }}\n >\n SPREAD\n </span>\n </div>\n <SpreadGauge tier={tier} />\n </div>\n )}\n\n <div style={{ padding: \"14px 14px 12px\" }}>\n {/* Title */}\n <h3\n style={{\n fontSize: 13,\n fontWeight: 600,\n lineHeight: 1.4,\n letterSpacing: \"-0.2px\",\n color: \"#f4f4f5\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\" as const,\n margin: \"0 0 12px\",\n }}\n >\n {title}\n </h3>\n\n {/* Platform comparison rows */}\n <div\n style={{\n borderRadius: 10,\n border: \"1px solid rgba(39,39,42,0.4)\",\n overflow: \"hidden\",\n }}\n >\n <PlatformRow\n source={match.source_a}\n market={match.market_a}\n isCheaper={cheaperSource === match.source_a}\n onClick={() => onSelect?.(match, match.source_a)}\n href={getMarketHref?.(match, match.source_a)}\n LinkComponent={LinkComponent}\n />\n <div style={{ height: 1, background: \"rgba(39,39,42,0.3)\" }} />\n <PlatformRow\n source={match.source_b}\n market={match.market_b}\n isCheaper={cheaperSource === match.source_b}\n onClick={() => onSelect?.(match, match.source_b)}\n href={getMarketHref?.(match, match.source_b)}\n LinkComponent={LinkComponent}\n />\n </div>\n\n {/* CTA button */}\n {cheaperSource && spreadPercent != null && (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"flex-end\",\n marginTop: 10,\n }}\n >\n <button\n type=\"button\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"5px 12px\",\n borderRadius: 8,\n border: `1px solid ${ctaAccent === \"orange\" ? \"rgba(247,104,22,0.2)\" : \"rgba(199,255,46,0.15)\"}`,\n background:\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.08)\"\n : \"rgba(199,255,46,0.06)\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n fontSize: 11,\n fontWeight: 500,\n color:\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.9)\"\n : \"rgba(199,255,46,0.85)\",\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget;\n el.style.background =\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.14)\"\n : \"rgba(199,255,46,0.10)\";\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget;\n el.style.background =\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.08)\"\n : \"rgba(199,255,46,0.06)\";\n }}\n onClick={() => onSelect?.(match, cheaperSource)}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 12,\n height: 12,\n flexShrink: 0,\n color: ctaAccent === \"orange\" ? \"#f76816\" : \"#c7ff2e\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n {t(\"predict.matches.buyEdge\" as never, {\n platform:\n cheaperSource.charAt(0).toUpperCase() +\n cheaperSource.slice(1),\n spread: spreadPercent.toFixed(1),\n })}\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 10,\n height: 10,\n color:\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.5)\"\n : \"rgba(199,255,46,0.4)\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 12h14\" />\n <path d=\"m12 5 7 7-7 7\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.15)\",\n padding: \"8px 14px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 11, height: 11 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n {formatVolume(match.combined_volume)}\n </span>\n {match.combined_volume_24h != null &&\n match.combined_volume_24h > 0 && (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 11, height: 11 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\" />\n </svg>\n {formatVolume(match.combined_volume_24h)}{\" \"}\n {t(\"predict.matches.vol24h\" as never)}\n </span>\n )}\n </div>\n {/* Confidence tier badge */}\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 10,\n color: \"#52525b\",\n }}\n >\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: confTheme.dot,\n flexShrink: 0,\n }}\n />\n {t(confTheme.label as never)}\n </span>\n </div>\n </div>\n );\n}\n\nfunction PlatformRow({\n source,\n market,\n isCheaper,\n onClick,\n href,\n LinkComponent,\n}: {\n source: ProviderSource | string;\n market: PredictMarket;\n isCheaper: boolean;\n onClick?: () => void;\n href?: string;\n LinkComponent?: LinkComponentType;\n}) {\n const { t } = useTranslation();\n const meta = getSourceMeta(source);\n const platColor = getPlatformColor(source);\n const yesPrice = getYesPrice(market);\n const outcomeName = getOutcomeName(market);\n const volume = market.volume;\n\n const content = (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"10px 12px\",\n cursor: href || onClick ? \"pointer\" : undefined,\n transition: \"background 0.15s\",\n background: isCheaper ? \"rgba(199,255,46,0.03)\" : \"transparent\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.background = isCheaper\n ? \"rgba(199,255,46,0.06)\"\n : \"rgba(255,255,255,0.02)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.background = isCheaper\n ? \"rgba(199,255,46,0.03)\"\n : \"transparent\";\n }}\n onClick={onClick}\n >\n {/* Cheaper indicator */}\n {isCheaper ? (\n <span style={{ fontSize: 10, color: \"#c7ff2e\", flexShrink: 0 }}>★</span>\n ) : (\n <span style={{ width: 10, flexShrink: 0 }} />\n )}\n\n {/* Platform icon + name */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n width: 90,\n flexShrink: 0,\n }}\n >\n {meta.icon}\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.04em\",\n color: platColor.text,\n textTransform: \"uppercase\" as const,\n }}\n >\n {meta.label}\n </span>\n </div>\n\n {/* Outcome name + volume */}\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 1,\n }}\n >\n {outcomeName && (\n <span\n style={{\n fontSize: 10,\n color: \"#71717a\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\" as const,\n }}\n >\n {outcomeName}\n </span>\n )}\n <span style={{ fontSize: 9, color: \"#52525b\" }}>\n {formatVolume(volume)} {t(\"predict.matches.volume\" as never)}\n </span>\n </div>\n\n {/* Price */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"baseline\",\n gap: 3,\n flexShrink: 0,\n }}\n >\n <span\n style={{\n fontSize: 18,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: isCheaper ? \"#c7ff2e\" : \"#f4f4f5\",\n }}\n >\n {yesPrice != null ? (yesPrice * 100).toFixed(1) : \"-\"}\n </span>\n <span style={{ fontSize: 9, color: \"#71717a\" }}>\n {t(\"predict.matches.centsYes\" as never)}\n </span>\n </div>\n\n {/* External link icon */}\n <svg\n viewBox=\"0 0 24 24\"\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n style={{\n width: 10,\n height: 10,\n color: \"#52525b\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M7 7h10v10\" />\n <path d=\"M7 17 17 7\" />\n </svg>\n </div>\n );\n\n if (href && LinkComponent) {\n return (\n <LinkComponent href={href} className=\"block\">\n {content}\n </LinkComponent>\n );\n }\n\n return content;\n}\n","import {\n useState,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n forwardRef,\n} from \"react\";\nimport { keepPreviousData } from \"@tanstack/react-query\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchSortField,\n MatchMarketFlat,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport { useInfiniteMatchMarkets } from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { MatchMarketCard } from \"./match-market-card.ui\";\nimport type { MatchesHeroStats } from \"./matches-hero.ui\";\n\nexport interface MatchesWidgetRef {\n refetch: () => void;\n}\n\nexport interface MatchesWidgetProps {\n sortBy: MatchSortField;\n sortAsc: boolean;\n minVolume?: number;\n onSelect?: (match: MatchMarketFlat, source: ProviderSource) => void;\n onHover?: (match: MatchMarketFlat) => void;\n getMarketHref?: (\n match: MatchMarketFlat,\n source: ProviderSource,\n ) => string | undefined;\n LinkComponent?: LinkComponentType;\n onStatsChange?: (stats: MatchesHeroStats) => void;\n /** @deprecated Use onSelect instead */\n onSelectEntry?: (event: never) => void;\n /** @deprecated Use getMarketHref instead */\n getEventHref?: (event: never) => string;\n}\n\nexport const MatchesWidget = forwardRef<MatchesWidgetRef, MatchesWidgetProps>(\n function MatchesWidget(\n {\n sortBy,\n sortAsc,\n minVolume,\n onSelect,\n onHover,\n getMarketHref,\n LinkComponent,\n onStatsChange,\n },\n ref,\n ) {\n const { t } = useTranslation();\n\n const {\n data,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n isLoading,\n isPlaceholderData,\n refetch,\n } = useInfiniteMatchMarkets(\n {\n sort_by: sortBy,\n sort_asc: sortAsc,\n min_volume: minVolume,\n status: \"active\",\n limit: 20,\n },\n { placeholderData: keepPreviousData },\n );\n\n const [animKey, setAnimKey] = useState(0);\n const [prevIsPlaceholder, setPrevIsPlaceholder] = useState(false);\n\n if (prevIsPlaceholder && !isPlaceholderData) {\n setPrevIsPlaceholder(false);\n setAnimKey((k) => k + 1);\n } else if (isPlaceholderData && !prevIsPlaceholder) {\n setPrevIsPlaceholder(true);\n }\n\n // staggerBase removed: rendering iterates pages directly so each card's\n // animation delay is stable across page loads (no mass DOM reflow).\n\n useImperativeHandle(\n ref,\n () => ({\n refetch: () => {\n refetch();\n },\n }),\n [refetch],\n );\n\n const allMatches = useMemo(\n () => data?.pages.flatMap((p) => p.items ?? []) ?? [],\n [data],\n );\n\n const total = data?.pages[0]?.total;\n\n const stats = useMemo<MatchesHeroStats>(() => {\n let maxSpread = 0;\n let totalVolume = 0;\n let highSpreadCount = 0;\n\n for (const m of allMatches) {\n const spread = m.spread ?? 0;\n if (spread > maxSpread) maxSpread = spread;\n if (spread >= 0.03) highSpreadCount++;\n if (m.combined_volume != null) {\n totalVolume += m.combined_volume;\n }\n }\n\n return {\n activePairs: total ?? allMatches.length,\n maxSpread,\n highSpreadCount,\n totalVolume,\n };\n }, [allMatches, total]);\n\n useEffect(() => {\n if (stats.activePairs > 0) {\n onStatsChange?.(stats);\n }\n }, [stats, onStatsChange]);\n\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const el = sentinelRef.current;\n if (!el) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (\n entries[0]?.isIntersecting &&\n hasNextPage &&\n !isFetchingNextPage\n ) {\n fetchNextPage();\n }\n },\n { rootMargin: \"200px\" },\n );\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n // Disable elastic overscroll while more pages can load.\n // Prevents the bounce → scrollHeight change → sticky jump sequence.\n useEffect(() => {\n if (!hasNextPage) return;\n document.documentElement.style.overscrollBehaviorY = \"none\";\n return () => {\n document.documentElement.style.overscrollBehaviorY = \"\";\n };\n }, [hasNextPage]);\n\n if (isLoading) {\n return <MatchesSkeletonList />;\n }\n\n if (allMatches.length === 0) {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"80px 0\",\n color: \"rgba(255,255,255,0.35)\",\n }}\n >\n <p style={{ fontSize: 18 }}>{t(\"predict.matches.empty\")}</p>\n </div>\n );\n }\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <style>{`\n@media(max-width:1023px){.matches-card-grid{grid-template-columns:1fr!important}}\n@keyframes matchCardEnter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}\n`}</style>\n <div\n className=\"matches-card-grid\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(2, 1fr)\",\n gap: 16,\n }}\n >\n {data?.pages.map((page) =>\n page.items?.map((match, itemIndex) => (\n <div\n key={`${animKey}-${match.match_id}-${match.source_a}-${match.market_a?.slug ?? itemIndex}`}\n style={{\n animation: `matchCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) ${itemIndex * 35}ms both`,\n }}\n >\n <MatchMarketCard\n match={match}\n onSelect={onSelect}\n onHover={onHover}\n getMarketHref={getMarketHref}\n LinkComponent={LinkComponent}\n />\n </div>\n )),\n )}\n </div>\n\n {/* Infinite scroll sentinel */}\n <div\n ref={sentinelRef}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 8,\n padding: \"16px 0\",\n minHeight: 1,\n }}\n >\n <style>{`@keyframes match-load-spin{to{transform:rotate(360deg)}}`}</style>\n {isFetchingNextPage && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: \"#71717a\",\n fontSize: 13,\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ animation: \"match-load-spin 1s linear infinite\" }}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n {t(\"predict.matches.loadMore\")}\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nfunction MatchesSkeletonList() {\n return (\n <>\n <style>{`@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}@media(max-width:1023px){.matches-skeleton-grid{grid-template-columns:1fr!important}}`}</style>\n <div\n className=\"matches-skeleton-grid\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(2, 1fr)\",\n gap: 16,\n }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <SkeletonCard key={i} index={i} />\n ))}\n </div>\n </>\n );\n}\n\nfunction SkeletonCard({ index }: { index: number }) {\n const delay = index * 150;\n const shimmer: React.CSSProperties = {\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.03) 25%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0.03) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: `shimmer 1.8s ease-in-out infinite ${delay}ms`,\n borderRadius: 6,\n };\n\n return (\n <div\n style={{\n borderRadius: 16,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n justifyContent: \"space-between\",\n padding: \"16px 16px 12px\",\n }}\n >\n <div\n style={{\n ...shimmer,\n height: 14,\n width: index % 2 === 0 ? \"75%\" : \"60%\",\n }}\n />\n <div\n style={{\n ...shimmer,\n height: 24,\n width: 64,\n borderRadius: 10,\n flexShrink: 0,\n marginLeft: 12,\n }}\n />\n </div>\n\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: 16,\n padding: \"0 16px\",\n }}\n >\n {[0, 1].map((j) => (\n <div\n key={j}\n style={{\n borderRadius: 12,\n border: \"1px solid rgba(255,255,255,0.04)\",\n background: \"rgba(255,255,255,0.02)\",\n padding: 12,\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 8,\n }}\n >\n <div style={{ ...shimmer, height: 10, width: 72 }} />\n <div style={{ ...shimmer, height: 10, width: 48 }} />\n <div style={{ ...shimmer, height: 20, width: 56 }} />\n <div style={{ ...shimmer, height: 10, width: 60, marginTop: 4 }} />\n </div>\n ))}\n </div>\n\n <div style={{ padding: \"12px 16px\" }}>\n <div\n style={{\n ...shimmer,\n height: 36,\n borderRadius: 10,\n width: \"100%\",\n }}\n />\n </div>\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n padding: \"10px 16px\",\n }}\n >\n <div style={{ display: \"flex\", gap: 12 }}>\n <div style={{ ...shimmer, height: 10, width: 40 }} />\n <div style={{ ...shimmer, height: 10, width: 50 }} />\n </div>\n <div style={{ ...shimmer, height: 10, width: 56 }} />\n </div>\n </div>\n );\n}\n","import {\n useState,\n useCallback,\n useRef,\n useEffect,\n startTransition,\n} from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchSortField,\n MatchMarketFlat,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { MatchesFilterBar } from \"./matches-filter-bar.ui\";\nimport { MatchesHero, type MatchesHeroStats } from \"./matches-hero.ui\";\nimport { MatchesWidget, type MatchesWidgetRef } from \"./matches.widget\";\n\nconst SORT_TITLE_KEY: Record<MatchSortField, string> = {\n spread: \"predict.matches.topOpportunities\",\n volume: \"predict.matches.highestVolume\",\n confidence: \"predict.matches.trendingToday\",\n};\n\nexport interface MatchesPageProps {\n onSelect?: (match: MatchMarketFlat, source: ProviderSource) => void;\n onHover?: (match: MatchMarketFlat) => void;\n getMarketHref?: (\n match: MatchMarketFlat,\n source: ProviderSource,\n ) => string | undefined;\n LinkComponent?: LinkComponentType;\n /** Path to the hero background image (e.g. \"/matches-bg.webp\") */\n bgImageSrc?: string;\n /** @deprecated Use onSelect instead */\n onSelectEntry?: (event: never) => void;\n /** @deprecated Use getMarketHref instead */\n getEventHref?: (event: never) => string;\n}\n\nfunction StatusClock() {\n const [time, setTime] = useState(\"\");\n\n useEffect(() => {\n const fmt = () => {\n const d = new Date();\n return `${String(d.getHours()).padStart(2, \"0\")}:${String(d.getMinutes()).padStart(2, \"0\")}`;\n };\n setTime(fmt());\n const id = setInterval(() => setTime(fmt()), 10_000);\n return () => clearInterval(id);\n }, []);\n\n return <span>{time}</span>;\n}\n\nfunction MatchesStatusBar({ stats }: { stats?: MatchesHeroStats }) {\n const { t } = useTranslation();\n return (\n <>\n <style>{`@media(max-width:768px){.matches-status-bar{display:none!important}}`}</style>\n <div\n className=\"matches-status-bar\"\n style={{\n position: \"fixed\",\n bottom: 0,\n left: 0,\n right: 0,\n height: 28,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"0 12px\",\n background: \"rgba(12,12,13,0.8)\",\n borderTop: \"1px solid rgba(39,39,42,0.6)\",\n fontSize: 11,\n color: \"rgba(255,255,255,0.4)\",\n zIndex: 50,\n backdropFilter: \"blur(12px)\",\n WebkitBackdropFilter: \"blur(12px)\",\n flexShrink: 0,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12, color: \"#00bc7d\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 20h.01\" />\n <path d=\"M2 8.82a15 15 0 0 1 20 0\" />\n <path d=\"M5 12.859a10 10 0 0 1 14 0\" />\n <path d=\"M8.5 16.429a5 5 0 0 1 7 0\" />\n </svg>\n <span style={{ color: \"#00bc7d\", fontWeight: 500 }}>\n {t(\"predict.matches.status.live\" as never)}\n </span>\n </div>\n {/* Vertical divider */}\n <div\n style={{ width: 1, height: 14, background: \"rgba(39,39,42,0.8)\" }}\n />\n {stats && (\n <div\n className=\"hidden sm:flex\"\n style={{ alignItems: \"center\", gap: 12 }}\n >\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"#71717a\",\n }}\n >\n {/* lucide activity */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\" />\n </svg>\n <span style={{ color: \"#52525b\" }}>\n {t(\"predict.matches.status.markets\" as never)}\n </span>\n <span\n style={{\n color: \"#d4d4d8\",\n fontWeight: 500,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {stats.activePairs.toLocaleString()}\n </span>\n </span>\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"#71717a\",\n }}\n >\n {/* lucide chart-column */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n <span style={{ color: \"#52525b\" }}>\n {t(\"predict.matches.status.vol24h\" as never)}\n </span>\n <span\n style={{\n color: \"#d4d4d8\",\n fontWeight: 500,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {stats.totalVolume >= 1_000_000\n ? `$${(stats.totalVolume / 1_000_000).toFixed(1)}M`\n : stats.totalVolume >= 1_000\n ? `$${Math.round(stats.totalVolume / 1_000)}K`\n : `$${stats.totalVolume}`}\n </span>\n </span>\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {/* Docs link with lucide-file-text icon */}\n <a\n href=\"#\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n textDecoration: \"none\",\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n <path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n <path d=\"M10 9H8\" />\n <path d=\"M16 13H8\" />\n <path d=\"M16 17H8\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.docs\" as never)}\n </span>\n </a>\n {/* X link with X icon */}\n <a\n href=\"#\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n textDecoration: \"none\",\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"currentColor\"\n >\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n <span className=\"hidden lg:inline\">X</span>\n </a>\n {/* Divider */}\n <div\n style={{\n width: 1,\n height: 14,\n background: \"rgba(39,39,42,0.8)\",\n margin: \"0 4px\",\n }}\n />\n {/* Watchlist */}\n <button\n type=\"button\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 11,\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.watchlist\" as never)}\n </span>\n </button>\n <button\n type=\"button\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 11,\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.portfolio\" as never)}\n </span>\n </button>\n <button\n type=\"button\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 11,\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <path d=\"M12 17h.01\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.help\" as never)}\n </span>\n </button>\n {/* Divider */}\n <div\n style={{\n width: 1,\n height: 14,\n background: \"rgba(39,39,42,0.8)\",\n margin: \"0 4px\",\n }}\n />\n {/* Clock */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"#71717a\",\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n <StatusClock />\n </div>\n </div>\n </div>\n </>\n );\n}\n\nexport function MatchesPage({\n onSelect,\n onHover,\n getMarketHref,\n LinkComponent,\n bgImageSrc,\n}: MatchesPageProps) {\n const { t } = useTranslation();\n\n const [sortBy, setSortBy] = useState<MatchSortField>(\"spread\");\n const [sortAsc, setSortAsc] = useState(false);\n const [minVolume, setMinVolume] = useState<number | undefined>(5_000);\n const [heroStats, setHeroStats] = useState<MatchesHeroStats | undefined>();\n const widgetRef = useRef<MatchesWidgetRef>(null);\n\n const handleSortChange = useCallback((sort: MatchSortField) => {\n setSortBy(sort);\n }, []);\n\n const handleSortAscChange = useCallback((asc: boolean) => {\n setSortAsc(asc);\n }, []);\n\n const handleStatsChange = useCallback((stats: MatchesHeroStats) => {\n startTransition(() => {\n setHeroStats(stats);\n });\n }, []);\n\n const handleRefresh = useCallback(() => {\n widgetRef.current?.refetch();\n }, []);\n\n return (\n <div\n style={{\n minHeight: \"100vh\",\n position: \"relative\",\n }}\n >\n {/* Entrance animation keyframes + dot grid */}\n <style>{`\n @keyframes matchFadeIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}\n .match-fade-in{animation:matchFadeIn .5s ease-out both}\n .match-fade-in-d1{animation:matchFadeIn .5s ease-out .1s both}\n .match-fade-in-d2{animation:matchFadeIn .5s ease-out .2s both}\n `}</style>\n {/* Hero section — relative overflow-hidden with border-b like matchr */}\n <div\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n }}\n >\n {/* Background — single wide image with full-width light arcs */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 0,\n overflow: \"hidden\",\n }}\n >\n {bgImageSrc && (\n <img\n src={bgImageSrc}\n alt=\"\"\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"center center\",\n opacity: 0.3,\n mixBlendMode: \"lighten\" as const,\n maskImage:\n \"linear-gradient(to bottom, black 50%, transparent 100%)\",\n WebkitMaskImage:\n \"linear-gradient(to bottom, black 50%, transparent 100%)\",\n }}\n />\n )}\n {/* Dot grid texture */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n opacity: 0.025,\n backgroundImage:\n \"radial-gradient(circle at 1px 1px, rgb(255 255 255) 1px, transparent 0)\",\n backgroundSize: \"20px 20px\",\n }}\n />\n </div>\n <style>{`.matches-hero-wrap{padding:40px 16px 32px}@media(min-width:640px){.matches-hero-wrap{padding:48px 24px 40px}}@media(min-width:1024px){.matches-hero-wrap{padding:52px 32px 44px}}`}</style>\n <div\n className=\"match-fade-in matches-hero-wrap\"\n style={{\n position: \"relative\",\n zIndex: 2,\n maxWidth: 1152,\n margin: \"0 auto\",\n }}\n >\n <MatchesHero stats={heroStats} />\n </div>\n </div>\n\n {/* Sticky toolbar — full-width background, inner max-w-6xl */}\n <div\n style={{\n position: \"sticky\",\n top: 0,\n zIndex: 40,\n background: \"rgba(10,10,11,0.8)\",\n backdropFilter: \"blur(24px)\",\n WebkitBackdropFilter: \"blur(24px)\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n }}\n >\n <style>{`.matches-toolbar-inner{padding:12px 16px}@media(min-width:640px){.matches-toolbar-inner{padding:12px 24px}}@media(min-width:1024px){.matches-toolbar-inner{padding:12px 32px}}`}</style>\n <div\n className=\"matches-toolbar-inner\"\n style={{\n maxWidth: 1152,\n margin: \"0 auto\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n minWidth: 0,\n }}\n >\n <div\n className=\"hidden sm:flex\"\n style={{\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 32,\n height: 32,\n borderRadius: 10,\n background:\n \"linear-gradient(to bottom right, rgba(199,255,46,0.15), rgba(23,201,100,0.15))\",\n border: \"1px solid rgba(199,255,46,0.15)\",\n flexShrink: 0,\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 16, height: 16, color: \"#c7ff2e\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z\" />\n <path d=\"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12\" />\n <path d=\"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17\" />\n </svg>\n </div>\n <div style={{ minWidth: 0 }}>\n <h2\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: \"#fff\",\n margin: 0,\n letterSpacing: \"-0.28px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\" as const,\n }}\n >\n {t(SORT_TITLE_KEY[sortBy] as never)}\n </h2>\n {heroStats && heroStats.activePairs > 0 && (\n <p\n className=\"hidden sm:block\"\n style={{ fontSize: 11, color: \"#71717a\", margin: 0 }}\n >\n {t(\"predict.matches.pairsFound\" as never, {\n count: heroStats.activePairs,\n })}\n </p>\n )}\n </div>\n </div>\n <MatchesFilterBar\n sortBy={sortBy}\n onSortChange={handleSortChange}\n sortAsc={sortAsc}\n onSortAscChange={handleSortAscChange}\n minVolume={minVolume}\n onMinVolumeChange={setMinVolume}\n onRefresh={handleRefresh}\n />\n </div>\n </div>\n\n {/* Content — card grid + disclaimer, responsive padding + pb-20 */}\n <style>{`.matches-content-wrap{padding:24px 16px 80px}@media(min-width:640px){.matches-content-wrap{padding:32px 24px 80px}}@media(min-width:1024px){.matches-content-wrap{padding:24px 32px 80px}}`}</style>\n <div\n className=\"match-fade-in-d2 matches-content-wrap\"\n style={{\n position: \"relative\",\n maxWidth: 1152,\n margin: \"0 auto\",\n }}\n >\n {/* Disclaimer — shown above list so infinite scroll doesn't push it out of view */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 16,\n padding: \"8px 12px\",\n borderRadius: 8,\n border: \"1px solid rgba(39,39,42,0.4)\",\n background: \"rgba(24,24,27,0.25)\",\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#52525b\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n </svg>\n <p\n style={{\n fontSize: 11,\n color: \"#52525b\",\n lineHeight: 1.5,\n margin: 0,\n }}\n >\n <span style={{ color: \"#71717a\", fontWeight: 500 }}>\n {t(\"predict.matches.experimentalFeature\" as const)}\n </span>\n {\" — \"}\n {t(\"predict.matches.disclaimer\" as const)}\n </p>\n </div>\n\n <MatchesWidget\n ref={widgetRef}\n sortBy={sortBy}\n sortAsc={sortAsc}\n minVolume={minVolume}\n onSelect={onSelect}\n onHover={onHover}\n getMarketHref={getMarketHref}\n LinkComponent={LinkComponent}\n onStatsChange={handleStatsChange}\n />\n </div>\n <MatchesStatusBar stats={heroStats} />\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchGroup,\n MatchGroupMarket,\n PredictEvent,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { getSourceMeta } from \"./source-badge.ui\";\n\nexport interface MatchGroupCardProps {\n group: MatchGroup;\n onSelectEntry?: (event: PredictEvent) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n}\n\nfunction formatVolume(vol: number | null | undefined): string {\n if (vol == null) return \"-\";\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${Math.round(vol / 1_000)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\ninterface PlatformData {\n source: string;\n outcomeName: string | null;\n yesPrice: number | null;\n volume: number | null;\n event?: PredictEvent;\n}\n\nconst PLATFORM_COLORS: Record<\n string,\n {\n text: string;\n border: string;\n hoverBorder: string;\n bg: string;\n priceColor: string;\n priceActiveColor: string;\n }\n> = {\n polymarket: {\n text: \"#50a2ff\",\n border: \"rgba(43,127,255,0.15)\",\n hoverBorder: \"rgba(43,127,255,0.3)\",\n bg: \"rgba(43,127,255,0.05)\",\n priceColor: \"rgba(244,244,245,1)\",\n priceActiveColor: \"rgba(244,244,245,1)\",\n },\n kalshi: {\n text: \"#00d492\",\n border: \"rgba(0,212,146,0.15)\",\n hoverBorder: \"rgba(0,212,146,0.3)\",\n bg: \"rgba(0,212,146,0.05)\",\n priceColor: \"#00d492\",\n priceActiveColor: \"#00d492\",\n },\n};\n\nconst DEFAULT_PLATFORM_COLORS = {\n text: \"#9ca3af\",\n border: \"rgba(156,163,175,0.15)\",\n hoverBorder: \"rgba(156,163,175,0.3)\",\n bg: \"rgba(156,163,175,0.05)\",\n priceColor: \"rgba(244,244,245,1)\",\n priceActiveColor: \"rgba(244,244,245,1)\",\n};\n\nfunction getPlatformColors(source: string) {\n return PLATFORM_COLORS[source] ?? DEFAULT_PLATFORM_COLORS;\n}\n\nfunction getBestMarketPair(group: MatchGroup): MatchGroupMarket | null {\n if (!group.matched_markets?.length) return null;\n let best: MatchGroupMarket | null = null;\n let bestSpread = -1;\n for (const m of group.matched_markets) {\n const spread = m.spread ?? 0;\n if (spread > bestSpread) {\n bestSpread = spread;\n best = m;\n }\n }\n return best;\n}\n\nfunction extractPlatformData(\n group: MatchGroup,\n pair: MatchGroupMarket | null,\n): [PlatformData, PlatformData] {\n const entryA = group.entries.find(\n (e) => e.source === (pair?.source_a ?? group.entries[0]?.source),\n );\n const entryB = group.entries.find(\n (e) => e.source === (pair?.source_b ?? group.entries[1]?.source),\n );\n\n const getOutcome = (market: MatchGroupMarket[\"market_a\"] | undefined) => {\n if (!market?.outcomes?.[0]) return { name: null, price: null };\n const o = market.outcomes[0];\n return {\n name: o.label || null,\n price: o.best_ask ?? o.price ?? null,\n };\n };\n\n const oA = getOutcome(pair?.market_a);\n const oB = getOutcome(pair?.market_b);\n\n return [\n {\n source: pair?.source_a ?? entryA?.source ?? \"unknown\",\n outcomeName: oA.name,\n yesPrice: oA.price,\n volume: entryA?.event?.volume ?? null,\n event: entryA?.event,\n },\n {\n source: pair?.source_b ?? entryB?.source ?? \"unknown\",\n outcomeName: oB.name,\n yesPrice: oB.price,\n volume: entryB?.event?.volume ?? null,\n event: entryB?.event,\n },\n ];\n}\n\nexport function MatchGroupCard({\n group,\n onSelectEntry,\n getEventHref,\n LinkComponent,\n}: MatchGroupCardProps) {\n const { t } = useTranslation();\n const bestPair = useMemo(() => getBestMarketPair(group), [group]);\n const spreadPercent =\n group.max_spread != null ? group.max_spread * 100 : null;\n\n const [platA, platB] = useMemo(\n () => extractPlatformData(group, bestPair),\n [group, bestPair],\n );\n\n const isHighSpread = spreadPercent != null && spreadPercent >= 3;\n const cheaperIsKalshi =\n platA.yesPrice != null && platB.yesPrice != null\n ? platA.source === \"kalshi\"\n ? platA.yesPrice > platB.yesPrice\n : platB.yesPrice > platA.yesPrice\n : false;\n\n const cheapest =\n platA.yesPrice != null && platB.yesPrice != null\n ? platA.yesPrice <= platB.yesPrice\n ? platA\n : platB\n : null;\n const cheapestMeta = cheapest ? getSourceMeta(cheapest.source) : null;\n\n const ctaAccent = isHighSpread ? \"amber\" : \"violet\";\n\n return (\n <div\n className=\"group\"\n style={{\n borderRadius: 16,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n transition: \"all 0.2s\",\n position: \"relative\",\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(63,63,70,0.6)\";\n el.style.boxShadow = \"0 10px 15px -3px rgba(0,0,0,0.2)\";\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(39,39,42,0.6)\";\n el.style.boxShadow = \"none\";\n }}\n >\n {/* Spread badge — absolute top-3 right-3 */}\n {spreadPercent != null && (\n <span\n style={{\n position: \"absolute\",\n top: 12,\n right: 12,\n zIndex: 10,\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n borderRadius: 10,\n padding: \"4px 10px\",\n fontSize: 12,\n fontWeight: 600,\n border: `1px solid ${\n isHighSpread\n ? \"rgba(255,185,0,0.3)\"\n : spreadPercent >= 2\n ? \"rgba(166,132,255,0.3)\"\n : \"rgba(156,163,175,0.3)\"\n }`,\n background: isHighSpread\n ? \"rgba(255,185,0,0.15)\"\n : spreadPercent >= 2\n ? \"rgba(166,132,255,0.15)\"\n : \"rgba(156,163,175,0.12)\",\n color: isHighSpread\n ? \"#ffb900\"\n : spreadPercent >= 2\n ? \"#a684ff\"\n : \"#9ca3af\",\n }}\n >\n {/* lucide zap */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n {spreadPercent.toFixed(1)}%\n </span>\n )}\n\n {/* Card body — p-4 */}\n <div style={{ padding: 16 }}>\n {/* Title */}\n <h3\n style={{\n fontSize: 14,\n fontWeight: 600,\n lineHeight: 1.375,\n letterSpacing: \"-0.28px\",\n color: \"#f4f4f5\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\" as const,\n paddingRight: 80,\n margin: \"0 0 16px\",\n }}\n >\n {group.title}\n </h3>\n\n {/* Platform entries — grid-cols-2 gap-3 */}\n <div\n style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 12 }}\n >\n <PlatformBlock\n data={platA}\n isCheaper={cheapest === platA}\n onSelect={onSelectEntry}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n />\n <PlatformBlock\n data={platB}\n isCheaper={cheapest === platB}\n onSelect={onSelectEntry}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n />\n </div>\n\n {/* CTA bar — amber (high spread) or violet (low) */}\n {cheapest && cheapestMeta && spreadPercent != null && (\n <div\n style={{\n marginTop: 12,\n padding: \"8px 12px\",\n borderRadius: 10,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n border: `1px solid ${ctaAccent === \"amber\" ? \"rgba(255,185,0,0.15)\" : \"rgba(166,132,255,0.15)\"}`,\n background:\n ctaAccent === \"amber\"\n ? \"rgba(255,185,0,0.05)\"\n : \"rgba(166,132,255,0.05)\",\n }}\n onClick={() => cheapest.event && onSelectEntry?.(cheapest.event)}\n >\n {/* lucide zap */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n flexShrink: 0,\n color: ctaAccent === \"amber\" ? \"#ffb900\" : \"#a684ff\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n <span\n style={{\n fontSize: 11,\n fontWeight: 500,\n color:\n ctaAccent === \"amber\"\n ? \"rgba(255,185,0,0.9)\"\n : \"rgba(166,132,255,0.9)\",\n }}\n >\n {t(\"predict.matches.buyEdge\" as never, {\n platform:\n cheapest.source.charAt(0).toUpperCase() +\n cheapest.source.slice(1),\n spread: spreadPercent.toFixed(1),\n })}\n </span>\n {/* lucide arrow-right */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 12,\n height: 12,\n marginLeft: \"auto\",\n color:\n ctaAccent === \"amber\"\n ? \"rgba(255,185,0,0.5)\"\n : \"rgba(166,132,255,0.5)\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 12h14\" />\n <path d=\"m12 5 7 7-7 7\" />\n </svg>\n </div>\n )}\n </div>\n\n {/* Footer meta — px-4 py-2.5 bg-zinc-800/20 border-t */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.2)\",\n padding: \"10px 16px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {/* lucide bar-chart-3 */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n {formatVolume(group.combined_volume)}\n </span>\n {group.combined_volume_24h != null &&\n group.combined_volume_24h > 0 && (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {/* lucide flame */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\" />\n </svg>\n {formatVolume(group.combined_volume_24h)}{\" \"}\n {t(\"predict.matches.vol24h\" as never)}\n </span>\n )}\n </div>\n {group.confidence != null && (\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 10,\n color: \"#52525b\",\n }}\n >\n {/* lucide activity */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\" />\n </svg>\n {Math.round(group.confidence * 100)}%{\" \"}\n {t(\"predict.matches.match\" as never)}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction PlatformBlock({\n data,\n isCheaper,\n onSelect,\n getEventHref,\n LinkComponent,\n}: {\n data: PlatformData;\n isCheaper: boolean;\n onSelect?: (event: PredictEvent) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n}) {\n const { t } = useTranslation();\n const meta = getSourceMeta(data.source);\n const colors = getPlatformColors(data.source);\n const href = data.event ? getEventHref?.(data.event) : undefined;\n\n const content = (\n <div\n style={{\n borderRadius: 14,\n border: `1px solid ${colors.border}`,\n background: colors.bg,\n padding: 12,\n cursor: href || onSelect ? \"pointer\" : undefined,\n transition: \"border-color 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.borderColor =\n colors.hoverBorder;\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.borderColor = colors.border;\n }}\n onClick={() => data.event && onSelect?.(data.event)}\n >\n {/* Platform name row */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n marginBottom: 8,\n }}\n >\n {meta.icon}\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.05em\",\n color: colors.text,\n textTransform: \"uppercase\" as const,\n }}\n >\n {meta.label}\n </span>\n {/* External link icon — group-hover:opacity-100 */}\n <svg\n viewBox=\"0 0 24 24\"\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n style={{\n width: 10,\n height: 10,\n color: \"#52525b\",\n marginLeft: \"auto\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M7 7h10v10\" />\n <path d=\"M7 17 17 7\" />\n </svg>\n </div>\n\n {/* Outcome name — text-[10px] */}\n {data.outcomeName && (\n <div\n style={{\n fontSize: 10,\n color: \"#71717a\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\" as const,\n marginBottom: 8,\n }}\n >\n {data.outcomeName}\n </div>\n )}\n\n {/* Price — text-xl font-bold tabular-nums */}\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: 6 }}>\n <span\n style={{\n fontSize: 20,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: isCheaper ? colors.priceActiveColor : colors.priceColor,\n }}\n >\n {data.yesPrice != null ? (data.yesPrice * 100).toFixed(1) : \"-\"}\n </span>\n <span style={{ fontSize: 10, color: \"#71717a\" }}>\n {t(\"predict.matches.centsYes\" as never)}\n </span>\n </div>\n\n {/* Volume — text-[10px] text-zinc-600 mt-1.5 */}\n <div style={{ fontSize: 10, color: \"#52525b\", marginTop: 6 }}>\n {formatVolume(data.volume)} {t(\"predict.matches.volume\" as never)}\n </div>\n </div>\n );\n\n if (href && LinkComponent) {\n return (\n <LinkComponent href={href} className=\"block\">\n {content}\n </LinkComponent>\n );\n }\n\n return content;\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { MatchGroup } from \"@liberfi.io/react-predict\";\n\nexport interface MatchesStatsBarProps {\n matches: MatchGroup[];\n total?: number;\n}\n\nfunction formatVolume(vol: number): string {\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${(vol / 1_000).toFixed(1)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\nexport function MatchesStatsBar({ matches, total }: MatchesStatsBarProps) {\n const { t } = useTranslation();\n\n const stats = useMemo(() => {\n let maxSpread = 0;\n let totalVolume = 0;\n const sources = new Set<string>();\n\n for (const group of matches) {\n if (group.max_spread != null && group.max_spread > maxSpread) {\n maxSpread = group.max_spread;\n }\n if (group.combined_volume != null) {\n totalVolume += group.combined_volume;\n }\n for (const entry of group.entries) {\n sources.add(typeof entry.source === \"string\" ? entry.source : \"\");\n }\n }\n\n return {\n count: total ?? matches.length,\n maxSpread,\n totalVolume,\n platformCount: sources.size,\n };\n }, [matches, total]);\n\n return (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2 rounded-xl border border-border/60 bg-background/50 px-4 py-3 text-sm\">\n <StatItem\n label={t(\"predict.matches.stats.matchedMarkets\")}\n value={stats.count.toLocaleString()}\n />\n <Separator />\n <StatItem\n label={t(\"predict.matches.stats.totalVolume\")}\n value={formatVolume(stats.totalVolume)}\n />\n <Separator />\n <StatItem\n label={t(\"predict.matches.stats.highestSpread\")}\n value={`${(stats.maxSpread * 100).toFixed(1)}¢`}\n valueClassName=\"text-green-400\"\n />\n <Separator />\n <StatItem\n label={t(\"predict.matches.stats.platforms\")}\n value={String(stats.platformCount)}\n />\n </div>\n );\n}\n\nfunction StatItem({\n label,\n value,\n valueClassName = \"text-slate-200\",\n}: {\n label: string;\n value: string;\n valueClassName?: string;\n}) {\n return (\n <div className=\"flex items-center gap-x-1.5\">\n <span className=\"text-neutral-500\">{label}:</span>\n <span className={`font-semibold ${valueClassName}`}>{value}</span>\n </div>\n );\n}\n\nfunction Separator() {\n return <span className=\"hidden text-neutral-700 sm:inline\">|</span>;\n}\n","import { cn } from \"@liberfi.io/ui\";\n\nexport interface SpreadIndicatorProps {\n spread: number | null | undefined;\n spreadPercent?: number | null;\n arbProfit?: number | null;\n className?: string;\n}\n\nfunction formatCents(value: number): string {\n return `${(value * 100).toFixed(1)}¢`;\n}\n\nfunction getSpreadColor(spread: number): string {\n if (spread >= 0.05) return \"text-green-400\";\n if (spread >= 0.02) return \"text-yellow-400\";\n return \"text-neutral-400\";\n}\n\nexport function SpreadIndicator({\n spread,\n arbProfit,\n className,\n}: SpreadIndicatorProps) {\n if (spread == null) return null;\n\n const hasArb = arbProfit != null && arbProfit > 0;\n\n return (\n <div className={cn(\"flex items-center gap-x-2\", className)}>\n <span className={cn(\"text-sm font-semibold\", getSpreadColor(spread))}>\n {formatCents(spread)}\n </span>\n {hasArb && (\n <span className=\"text-xs text-green-500/80\">\n +{formatCents(arbProfit!)}\n </span>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type PredictTrade,\n type TradeType,\n useInfiniteTrades,\n} from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton, Spinner } from \"@liberfi.io/ui\";\n\nconst PAGE_SIZE = 10;\nconst ROW_HEIGHT = 64;\nconst HEADER_HEIGHT = 40;\nconst PAGINATION_HEIGHT = 48;\n\nexport interface ProfileHistoryProps {\n solanaAddress?: string;\n evmAddress?: string;\n listHeight: number;\n}\n\nexport function ProfileHistory({\n solanaAddress,\n evmAddress,\n listHeight,\n}: ProfileHistoryProps) {\n const { t } = useTranslation();\n const [currentPage, setCurrentPage] = useState(1);\n\n const {\n data: kalshiData,\n isLoading: kalshiLoading,\n fetchNextPage: fetchNextKalshi,\n hasNextPage: hasMoreKalshi,\n isFetchingNextPage: isFetchingKalshi,\n } = useInfiniteTrades({\n source: \"kalshi\",\n wallet: solanaAddress ?? \"\",\n limit: 50,\n });\n\n const {\n data: polyData,\n isLoading: polyLoading,\n fetchNextPage: fetchNextPoly,\n hasNextPage: hasMorePoly,\n isFetchingNextPage: isFetchingPoly,\n } = useInfiniteTrades({\n source: \"polymarket\",\n wallet: evmAddress ?? \"\",\n limit: 50,\n });\n\n const isLoading = kalshiLoading || polyLoading;\n const isFetchingMore = isFetchingKalshi || isFetchingPoly;\n const hasNextPage = hasMoreKalshi || hasMorePoly;\n\n const allTrades = useMemo(() => {\n const all: PredictTrade[] = [];\n if (kalshiData?.pages)\n all.push(...kalshiData.pages.flatMap((p) => p.items));\n if (polyData?.pages) all.push(...polyData.pages.flatMap((p) => p.items));\n all.sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0));\n return all;\n }, [kalshiData, polyData]);\n\n const totalPages = Math.max(\n 1,\n Math.ceil(allTrades.length / PAGE_SIZE) + (hasNextPage ? 1 : 0),\n );\n const pageStart = (currentPage - 1) * PAGE_SIZE;\n const pageTrades = allTrades.slice(pageStart, pageStart + PAGE_SIZE);\n\n const handlePrev = useCallback(() => {\n setCurrentPage((p) => Math.max(1, p - 1));\n }, []);\n\n const handleNext = useCallback(async () => {\n const nextPageStart = currentPage * PAGE_SIZE;\n if (nextPageStart >= allTrades.length && hasNextPage) {\n if (hasMoreKalshi) await fetchNextKalshi();\n if (hasMorePoly) await fetchNextPoly();\n }\n setCurrentPage((p) => p + 1);\n }, [\n currentPage,\n allTrades.length,\n hasNextPage,\n hasMoreKalshi,\n hasMorePoly,\n fetchNextKalshi,\n fetchNextPoly,\n ]);\n\n const canGoPrev = currentPage > 1;\n const canGoNext = currentPage * PAGE_SIZE < allTrades.length || hasNextPage;\n\n if (isLoading) return <TabSkeleton height={listHeight} />;\n\n if (allTrades.length === 0 && !hasNextPage) {\n return (\n <EmptyState\n message={t(\"predict.profile.noHistory\")}\n height={listHeight}\n />\n );\n }\n\n const contentHeight = listHeight - HEADER_HEIGHT - PAGINATION_HEIGHT;\n\n return (\n <div className=\"flex flex-col\" style={{ height: listHeight }}>\n {/* Desktop header */}\n <div\n className=\"hidden lg:flex items-center text-neutral text-xs font-normal shrink-0 border-b border-border/50\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n {t(\"predict.profile.event\")}\n </div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.action\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.status\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.price\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n {t(\"predict.profile.depositWithdraw\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">{t(\"predict.profile.pnl\")}</div>\n <div className=\"flex-1 pr-2 text-right\">{t(\"predict.profile.fee\")}</div>\n <div className=\"w-10 shrink-0\" />\n </div>\n\n {/* Desktop rows */}\n <div\n className=\"hidden lg:block overflow-y-auto\"\n style={{ height: contentHeight }}\n >\n {pageTrades.map((trade, i) => (\n <HistoryRowStatic\n key={trade.id ?? `${pageStart + i}`}\n trade={trade}\n />\n ))}\n {isFetchingMore && (\n <div className=\"flex justify-center items-center py-4\">\n <Spinner size=\"sm\" />\n </div>\n )}\n </div>\n\n {/* Desktop pagination */}\n <div\n className=\"hidden lg:flex items-center justify-center gap-2 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={handlePrev}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ← {t(\"predict.profile.previous\")}\n </button>\n\n {Array.from({ length: Math.min(totalPages, 5) }, (_, i) => {\n const page = i + 1;\n return (\n <button\n key={page}\n type=\"button\"\n onClick={() => setCurrentPage(page)}\n className={cn(\n \"w-8 h-8 rounded text-sm transition-colors cursor-pointer\",\n page === currentPage\n ? \"bg-foreground/10 text-foreground font-medium\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {page}\n </button>\n );\n })}\n\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={handleNext}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n {t(\"predict.profile.next\")} →\n </button>\n </div>\n\n {/* Mobile cards */}\n <div\n className=\"lg:hidden flex flex-col gap-2 overflow-y-auto py-2\"\n style={{ height: listHeight - PAGINATION_HEIGHT }}\n >\n {pageTrades.map((trade, i) => (\n <HistoryCard key={trade.id ?? `m-${pageStart + i}`} trade={trade} />\n ))}\n </div>\n\n {/* Mobile pagination */}\n <div\n className=\"lg:hidden flex items-center justify-center gap-3 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={handlePrev}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ←\n </button>\n <span className=\"text-sm text-foreground tabular-nums\">\n {currentPage}\n </span>\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={handleNext}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n →\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Desktop row (non-virtualized, paginated)\n// ---------------------------------------------------------------------------\n\nfunction HistoryRowStatic({ trade }: { trade: PredictTrade }) {\n const { t } = useTranslation();\n const isBuy = trade.side?.toUpperCase() === \"BUY\";\n const price = trade.price ?? 0;\n const usdSize = trade.usd_size ?? 0;\n const statusLabel = mapTradeStatus(trade.type, t);\n\n const isDeposit = isBuy;\n const depositSign = isDeposit ? \"+\" : \"-\";\n const depositColor = isDeposit ? \"text-success\" : \"text-foreground\";\n\n const eventTitle = trade.event?.title ?? trade.market?.question ?? \"—\";\n const eventImage = trade.event?.image_url;\n const outcomeLabel = trade.outcome ?? \"\";\n const timeStr = formatTimestamp(trade.timestamp);\n\n const txUrl = getTxUrl(trade);\n\n const pnlValue = extractPnl(trade);\n const feeValue = extractFee(trade);\n\n return (\n <div\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-sm\"\n style={{ height: ROW_HEIGHT }}\n >\n {/* Event */}\n <div className=\"flex-[3] min-w-0 pr-2\">\n <div className=\"flex items-center gap-2.5 min-w-0\">\n {eventImage && (\n <img\n src={eventImage}\n alt=\"\"\n className=\"w-8 h-8 rounded-full object-cover shrink-0\"\n />\n )}\n <div className=\"flex flex-col gap-y-0.5 min-w-0\">\n <span className=\"text-foreground truncate font-medium text-sm\">\n {eventTitle}\n </span>\n <span className=\"text-[11px] text-neutral\">\n {outcomeLabel && <span className=\"mr-1\">{outcomeLabel}</span>}\n <span>{timeStr}</span>\n </span>\n </div>\n </div>\n </div>\n\n {/* Action */}\n <div className=\"flex-1 pr-2\">\n <span\n className={cn(\n \"text-sm font-medium\",\n isBuy ? \"text-success\" : \"text-danger\",\n )}\n >\n {isBuy ? t(\"predict.profile.buy\") : t(\"predict.profile.sell\")}\n </span>\n </div>\n\n {/* Status */}\n <div className=\"flex-1 pr-2 text-sm text-foreground\">{statusLabel}</div>\n\n {/* Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatCents(price)}\n </div>\n\n {/* Deposit / Withdraw */}\n <div className={cn(\"flex-[1.5] pr-2 text-right font-mono\", depositColor)}>\n {usdSize > 0 ? (\n <>\n {depositSign}${usdSize.toFixed(2)}\n </>\n ) : (\n \"—\"\n )}\n </div>\n\n {/* PNL */}\n <div\n className={cn(\n \"flex-1 pr-2 text-right font-mono\",\n pnlValue !== null\n ? pnlValue >= 0\n ? \"text-success\"\n : \"text-danger\"\n : \"text-neutral\",\n )}\n >\n {pnlValue !== null\n ? `${pnlValue >= 0 ? \"+\" : \"-\"}$${Math.abs(pnlValue).toFixed(2)}`\n : \"—\"}\n </div>\n\n {/* Fee */}\n <div className=\"flex-1 pr-2 text-right font-mono text-neutral\">\n {feeValue !== null ? `$${feeValue.toFixed(2)}` : \"—\"}\n </div>\n\n {/* Tx link */}\n <div className=\"w-10 shrink-0 text-right\">\n {txUrl && (\n <a\n href={txUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-neutral hover:text-foreground transition-colors\"\n aria-label=\"View transaction\"\n >\n <ExternalLinkIcon />\n </a>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Mobile card\n// ---------------------------------------------------------------------------\n\nfunction HistoryCard({ trade }: { trade: PredictTrade }) {\n const { t } = useTranslation();\n const isBuy = trade.side?.toUpperCase() === \"BUY\";\n const price = trade.price ?? 0;\n const usdSize = trade.usd_size ?? 0;\n const statusLabel = mapTradeStatus(trade.type, t);\n const eventTitle = trade.event?.title ?? trade.market?.question ?? \"—\";\n const timeStr = formatTimestamp(trade.timestamp);\n const txUrl = getTxUrl(trade);\n\n return (\n <div className=\"rounded-lg border border-border bg-content1 p-3 flex flex-col gap-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {trade.event?.image_url && (\n <img\n src={trade.event.image_url}\n alt=\"\"\n className=\"w-6 h-6 rounded-full object-cover shrink-0\"\n />\n )}\n <span className=\"text-sm font-medium text-foreground line-clamp-2\">\n {eventTitle}\n </span>\n </div>\n <span className=\"text-[11px] text-neutral whitespace-nowrap\">\n {timeStr}\n </span>\n </div>\n <div className=\"flex items-center gap-4 text-xs flex-wrap\">\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.action\")}</span>\n <span\n className={cn(\n \"font-medium\",\n isBuy ? \"text-success\" : \"text-danger\",\n )}\n >\n {isBuy ? t(\"predict.profile.buy\") : t(\"predict.profile.sell\")}\n </span>\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.status\")}</span>\n <span className=\"text-foreground\">{statusLabel}</span>\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.price\")}</span>\n <span className=\"font-mono text-foreground\">\n {formatCents(price)}\n </span>\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">\n {t(\"predict.profile.depositWithdraw\")}\n </span>\n <span className=\"font-mono text-foreground\">\n {usdSize > 0 ? `$${usdSize.toFixed(2)}` : \"—\"}\n </span>\n </div>\n {txUrl && (\n <a\n href={txUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ml-auto text-neutral hover:text-foreground transition-colors\"\n >\n <ExternalLinkIcon />\n </a>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nfunction mapTradeStatus(type: TradeType, t: (key: string) => string): string {\n switch (type) {\n case \"TRADE\":\n return t(\"predict.profile.filled\");\n case \"REDEEM\":\n return t(\"predict.profile.claimed\");\n case \"SPLIT\":\n case \"MERGE\":\n case \"CONVERSION\":\n return t(\"predict.profile.created\");\n default:\n return type;\n }\n}\n\nfunction getTxUrl(trade: PredictTrade): string | undefined {\n if (!trade.tx_hash) return undefined;\n if (trade.source === \"polymarket\") {\n return `https://polygonscan.com/tx/${trade.tx_hash}`;\n }\n return `https://solscan.io/tx/${trade.tx_hash}`;\n}\n\nfunction extractPnl(trade: PredictTrade): number | null {\n const meta = trade.provider_meta;\n if (meta) {\n const pnl =\n meta[\"pnl\"] ??\n meta[\"profit\"] ??\n meta[\"realized_pnl\"] ??\n meta[\"dflow.pnl\"];\n if (typeof pnl === \"number\") return pnl;\n if (typeof pnl === \"string\" && pnl !== \"\") {\n const parsed = parseFloat(pnl);\n if (!Number.isNaN(parsed)) return parsed;\n }\n }\n if (trade.type === \"REDEEM\" && trade.usd_size != null) {\n return trade.usd_size;\n }\n return null;\n}\n\nfunction extractFee(trade: PredictTrade): number | null {\n const meta = trade.provider_meta;\n if (meta) {\n const fee =\n meta[\"fee\"] ?? meta[\"fees\"] ?? meta[\"trading_fee\"] ?? meta[\"dflow.fee\"];\n if (typeof fee === \"number\") return fee;\n if (typeof fee === \"string\" && fee !== \"\") {\n const parsed = parseFloat(fee);\n if (!Number.isNaN(parsed)) return parsed;\n }\n }\n return null;\n}\n\nfunction ExternalLinkIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n );\n}\n\nfunction EmptyState({ message, height }: { message: string; height: number }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton({ height }: { height: number }) {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatCents(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(cents % 1 === 0 ? 0 : 1)}¢`;\n}\n\nfunction formatTimestamp(unixSeconds: number): string {\n const date = new Date(unixSeconds * 1000);\n const hours = date.getHours().toString().padStart(2, \"0\");\n const mins = date.getMinutes().toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const year = date.getFullYear();\n const tz = date.getTimezoneOffset();\n const tzSign = tz <= 0 ? \"+\" : \"-\";\n const tzHours = String(Math.abs(Math.floor(tz / 60))).padStart(2, \"0\");\n return `${hours}:${mins} ${day}/${month}/${year} (${tzSign}${tzHours})`;\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type PredictOrder,\n useInfiniteOrders,\n useCancelOrder,\n} from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton, Spinner } from \"@liberfi.io/ui\";\n\nconst PAGE_SIZE = 10;\nconst ROW_HEIGHT = 64;\nconst HEADER_HEIGHT = 40;\nconst PAGINATION_HEIGHT = 48;\n\nexport interface ProfileOrdersProps {\n solanaAddress?: string;\n evmAddress?: string;\n listHeight: number;\n}\n\nexport function ProfileOrders({\n solanaAddress,\n evmAddress,\n listHeight,\n}: ProfileOrdersProps) {\n const { t } = useTranslation();\n const cancelMutation = useCancelOrder();\n const [currentPage, setCurrentPage] = useState(1);\n\n const {\n data: kalshiData,\n isLoading: kalshiLoading,\n fetchNextPage: fetchNextKalshi,\n hasNextPage: hasMoreKalshi,\n isFetchingNextPage: isFetchingKalshi,\n } = useInfiniteOrders({\n source: \"kalshi\",\n wallet_address: solanaAddress ?? \"\",\n });\n\n const {\n data: polyData,\n isLoading: polyLoading,\n fetchNextPage: fetchNextPoly,\n hasNextPage: hasMorePoly,\n isFetchingNextPage: isFetchingPoly,\n } = useInfiniteOrders({\n source: \"polymarket\",\n wallet_address: evmAddress ?? \"\",\n });\n\n const isLoading = kalshiLoading || polyLoading;\n const isFetchingMore = isFetchingKalshi || isFetchingPoly;\n const hasNextPage = hasMoreKalshi || hasMorePoly;\n\n const orders = useMemo(() => {\n const all: PredictOrder[] = [];\n const openStatuses = new Set([\"live\", \"open\", \"submitted\", \"pending\"]);\n if (kalshiData?.pages) {\n all.push(\n ...kalshiData.pages\n .flatMap((p) => p.items)\n .filter((o) => openStatuses.has(o.status)),\n );\n }\n if (polyData?.pages) {\n all.push(\n ...polyData.pages\n .flatMap((p) => p.items)\n .filter((o) => openStatuses.has(o.status)),\n );\n }\n return all;\n }, [kalshiData, polyData]);\n\n const handleCancel = useCallback(\n (order: PredictOrder) => {\n cancelMutation.mutate({ source: order.source, id: order.id });\n },\n [cancelMutation],\n );\n\n const totalPages = Math.max(\n 1,\n Math.ceil(orders.length / PAGE_SIZE) + (hasNextPage ? 1 : 0),\n );\n const pageStart = (currentPage - 1) * PAGE_SIZE;\n const pageOrders = orders.slice(pageStart, pageStart + PAGE_SIZE);\n\n const handlePrev = useCallback(() => {\n setCurrentPage((p) => Math.max(1, p - 1));\n }, []);\n\n const handleNext = useCallback(async () => {\n const nextPageStart = currentPage * PAGE_SIZE;\n if (nextPageStart >= orders.length && hasNextPage) {\n if (hasMoreKalshi) await fetchNextKalshi();\n if (hasMorePoly) await fetchNextPoly();\n }\n setCurrentPage((p) => p + 1);\n }, [\n currentPage,\n orders.length,\n hasNextPage,\n hasMoreKalshi,\n hasMorePoly,\n fetchNextKalshi,\n fetchNextPoly,\n ]);\n\n const canGoPrev = currentPage > 1;\n const canGoNext = currentPage * PAGE_SIZE < orders.length || hasNextPage;\n\n if (isLoading) return <TabSkeleton height={listHeight} />;\n\n if (orders.length === 0 && !hasNextPage) {\n return (\n <EmptyState message={t(\"predict.profile.noOrders\")} height={listHeight} />\n );\n }\n\n const contentHeight = listHeight - HEADER_HEIGHT - PAGINATION_HEIGHT;\n\n return (\n <div className=\"flex flex-col\" style={{ height: listHeight }}>\n {/* Desktop header */}\n <div\n className=\"hidden lg:flex items-center text-neutral text-xs font-normal shrink-0 border-b border-border/50\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n {t(\"predict.profile.event\")}\n </div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.action\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.type\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.fillPrice\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.cost\")}\n </div>\n </div>\n\n {/* Desktop rows */}\n <div\n className=\"hidden lg:block overflow-y-auto\"\n style={{ height: contentHeight }}\n >\n {pageOrders.map((order) => (\n <OrderRowStatic\n key={order.id}\n order={order}\n onCancel={handleCancel}\n />\n ))}\n {isFetchingMore && (\n <div className=\"flex justify-center items-center py-4\">\n <Spinner size=\"sm\" />\n </div>\n )}\n </div>\n\n {/* Desktop pagination */}\n <Pagination\n className=\"hidden lg:flex\"\n currentPage={currentPage}\n totalPages={totalPages}\n canGoPrev={canGoPrev}\n canGoNext={canGoNext}\n onPrev={handlePrev}\n onNext={handleNext}\n onPage={setCurrentPage}\n t={t}\n />\n\n {/* Mobile cards */}\n <div\n className=\"lg:hidden flex flex-col gap-2 overflow-y-auto py-2\"\n style={{ height: listHeight - PAGINATION_HEIGHT }}\n >\n {pageOrders.map((order) => (\n <OrderCard key={order.id} order={order} onCancel={handleCancel} />\n ))}\n </div>\n\n {/* Mobile pagination */}\n <Pagination\n className=\"lg:hidden\"\n currentPage={currentPage}\n totalPages={totalPages}\n canGoPrev={canGoPrev}\n canGoNext={canGoNext}\n onPrev={handlePrev}\n onNext={handleNext}\n onPage={setCurrentPage}\n t={t}\n compact\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Desktop row (non-virtualized, paginated)\n// ---------------------------------------------------------------------------\n\nfunction OrderRowStatic({\n order,\n onCancel,\n}: {\n order: PredictOrder;\n onCancel: (order: PredictOrder) => void;\n}) {\n const { t } = useTranslation();\n const isBuy = order.side === \"BUY\";\n const price = order.price ? parseFloat(order.price) : 0;\n const cost = order.in_amount\n ? parseFloat(order.in_amount)\n : price * parseFloat(order.original_size ?? \"0\");\n\n return (\n <div\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-sm\"\n style={{ height: ROW_HEIGHT }}\n >\n {/* Event */}\n <div className=\"flex-[3] min-w-0 pr-2\">\n <div className=\"flex flex-col gap-y-0.5 min-w-0\">\n <span className=\"text-foreground truncate font-medium\">\n {order.outcome ?? order.market_id ?? \"—\"}\n </span>\n </div>\n </div>\n\n {/* Action */}\n <div className=\"flex-1 pr-2\">\n <span\n className={cn(\n \"text-sm font-medium\",\n isBuy ? \"text-success\" : \"text-danger\",\n )}\n >\n {isBuy ? t(\"predict.profile.buy\") : t(\"predict.profile.sell\")}\n </span>\n </div>\n\n {/* Type */}\n <div className=\"flex-1 pr-2 text-neutral capitalize text-sm\">\n {order.order_type ?? \"limit\"}\n </div>\n\n {/* Fill Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {price > 0 ? formatCents(price) : \"—\"}\n </div>\n\n {/* Cost */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {cost > 0 ? `$${cost.toFixed(2)}` : \"—\"}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Mobile card\n// ---------------------------------------------------------------------------\n\nfunction OrderCard({\n order,\n onCancel,\n}: {\n order: PredictOrder;\n onCancel: (order: PredictOrder) => void;\n}) {\n const { t } = useTranslation();\n const isBuy = order.side === \"BUY\";\n const price = order.price ? parseFloat(order.price) : 0;\n\n return (\n <div className=\"rounded-lg border border-border bg-content1 p-3 flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n \"text-xs font-medium px-1.5 py-0.5 rounded\",\n isBuy ? \"bg-success/10 text-success\" : \"bg-danger/10 text-danger\",\n )}\n >\n {order.side}\n </span>\n <span className=\"text-sm text-foreground capitalize\">\n {order.outcome ?? \"—\"}\n </span>\n </div>\n <span className=\"text-xs text-neutral capitalize\">\n {order.order_type ?? \"limit\"}\n </span>\n </div>\n <div className=\"flex items-center gap-4 text-xs\">\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.fillPrice\")}</span>\n <span className=\"font-mono text-foreground\">\n {price > 0 ? formatCents(price) : \"—\"}\n </span>\n </div>\n <div className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={() => onCancel(order)}\n className=\"text-xs text-danger hover:text-danger/80 cursor-pointer border border-border rounded px-2 py-1\"\n >\n {t(\"predict.orders.cancel\")}\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nfunction Pagination({\n className,\n currentPage,\n totalPages,\n canGoPrev,\n canGoNext,\n onPrev,\n onNext,\n onPage,\n t,\n compact,\n}: {\n className?: string;\n currentPage: number;\n totalPages: number;\n canGoPrev: boolean;\n canGoNext: boolean;\n onPrev: () => void;\n onNext: () => void;\n onPage: (page: number) => void;\n t: (key: string) => string;\n compact?: boolean;\n}) {\n if (compact) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-3 shrink-0\",\n className,\n )}\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={onPrev}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ←\n </button>\n <span className=\"text-sm text-foreground tabular-nums\">\n {currentPage}\n </span>\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={onNext}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n →\n </button>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-2 shrink-0\",\n className,\n )}\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={onPrev}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ← {t(\"predict.profile.previous\")}\n </button>\n {Array.from({ length: Math.min(totalPages, 5) }, (_, i) => {\n const page = i + 1;\n return (\n <button\n key={page}\n type=\"button\"\n onClick={() => onPage(page)}\n className={cn(\n \"w-8 h-8 rounded text-sm transition-colors cursor-pointer\",\n page === currentPage\n ? \"bg-foreground/10 text-foreground font-medium\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {page}\n </button>\n );\n })}\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={onNext}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n {t(\"predict.profile.next\")} →\n </button>\n </div>\n );\n}\n\nfunction EmptyState({ message, height }: { message: string; height: number }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton({ height }: { height: number }) {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatCents(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(cents % 1 === 0 ? 0 : 1)}¢`;\n}\n","import { useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictPosition } from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton } from \"@liberfi.io/ui\";\n\nconst PAGE_SIZE = 10;\nconst ROW_HEIGHT = 64;\nconst HEADER_HEIGHT = 40;\nconst PAGINATION_HEIGHT = 48;\n\nexport interface ProfilePositionsProps {\n positions: PredictPosition[];\n isLoading: boolean;\n listHeight: number;\n onClosePosition?: (position: PredictPosition) => void;\n onEventClick?: (event: PredictEvent) => void;\n}\n\nexport function ProfilePositions({\n positions,\n isLoading,\n listHeight,\n onClosePosition,\n onEventClick,\n}: ProfilePositionsProps) {\n const { t } = useTranslation();\n const [currentPage, setCurrentPage] = useState(1);\n\n const handleCloseAll = useCallback(() => {\n for (const pos of positions) {\n onClosePosition?.(pos);\n }\n }, [positions, onClosePosition]);\n\n if (isLoading) return <TabSkeleton height={listHeight} />;\n\n if (positions.length === 0) {\n return (\n <EmptyState\n message={t(\"predict.profile.noPositions\")}\n height={listHeight}\n />\n );\n }\n\n const totalPages = Math.max(1, Math.ceil(positions.length / PAGE_SIZE));\n const pageStart = (currentPage - 1) * PAGE_SIZE;\n const pagePositions = positions.slice(pageStart, pageStart + PAGE_SIZE);\n const canGoPrev = currentPage > 1;\n const canGoNext = currentPage < totalPages;\n const contentHeight = listHeight - HEADER_HEIGHT - PAGINATION_HEIGHT;\n\n return (\n <div className=\"flex flex-col\" style={{ height: listHeight }}>\n {/* Desktop header */}\n <div\n className=\"hidden lg:flex items-center text-neutral text-xs font-normal shrink-0 border-b border-border/50\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n {t(\"predict.profile.event\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.totalSize\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.value\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.avgPrice\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.markPrice\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n <span>{t(\"predict.profile.pnl\")}</span>\n <span className=\"text-[10px] ml-1 opacity-60\">\n ({t(\"predict.profile.pnlExcludeFees\")})\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.payoutIfRight\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n {t(\"predict.profile.estSettlement\")}\n </div>\n <div className=\"w-20 shrink-0 text-right\">\n {onClosePosition && positions.length > 0 && (\n <button\n type=\"button\"\n onClick={handleCloseAll}\n className=\"text-xs text-primary hover:text-primary/80 cursor-pointer transition-colors\"\n >\n {t(\"predict.profile.closeAll\")}\n </button>\n )}\n </div>\n </div>\n\n {/* Desktop rows */}\n <div\n className=\"hidden lg:block overflow-y-auto\"\n style={{ height: contentHeight }}\n >\n {pagePositions.map((pos, i) => (\n <PositionRowStatic\n key={`${pos.source}-${pos.market?.slug ?? pageStart + i}`}\n position={pos}\n onClosePosition={onClosePosition}\n onEventClick={onEventClick}\n />\n ))}\n </div>\n\n {/* Desktop pagination */}\n <div\n className=\"hidden lg:flex items-center justify-center gap-2 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ← {t(\"predict.profile.previous\")}\n </button>\n {Array.from({ length: Math.min(totalPages, 5) }, (_, i) => {\n const page = i + 1;\n return (\n <button\n key={page}\n type=\"button\"\n onClick={() => setCurrentPage(page)}\n className={cn(\n \"w-8 h-8 rounded text-sm transition-colors cursor-pointer\",\n page === currentPage\n ? \"bg-foreground/10 text-foreground font-medium\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {page}\n </button>\n );\n })}\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={() => setCurrentPage((p) => p + 1)}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n {t(\"predict.profile.next\")} →\n </button>\n </div>\n\n {/* Mobile cards */}\n <div\n className=\"lg:hidden flex flex-col gap-2 overflow-y-auto py-2\"\n style={{ height: listHeight - PAGINATION_HEIGHT }}\n >\n {pagePositions.map((pos, i) => (\n <PositionCard\n key={`${pos.source}-${pos.market?.slug ?? `m-${pageStart + i}`}`}\n position={pos}\n onClose={onClosePosition}\n onEventClick={onEventClick}\n />\n ))}\n </div>\n\n {/* Mobile pagination */}\n <div\n className=\"lg:hidden flex items-center justify-center gap-3 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ←\n </button>\n <span className=\"text-sm text-foreground tabular-nums\">\n {currentPage}\n </span>\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={() => setCurrentPage((p) => p + 1)}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n →\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Desktop row (non-virtualized, paginated)\n// ---------------------------------------------------------------------------\n\nfunction PositionRowStatic({\n position: pos,\n onClosePosition,\n onEventClick,\n}: {\n position: PredictPosition;\n onClosePosition?: (position: PredictPosition) => void;\n onEventClick?: (event: PredictEvent) => void;\n}) {\n const { t } = useTranslation();\n\n const pnl = pos.pnl ?? 0;\n const pnlPercent = pos.pnl_percent ?? 0;\n const avgPrice = pos.avg_price ?? 0;\n const currentPrice = pos.current_price ?? 0;\n const value = pos.current_value ?? pos.size * currentPrice;\n const payoutIfRight = pos.size;\n\n const pnlColor =\n pnl > 0 ? \"text-success\" : pnl < 0 ? \"text-danger\" : \"text-foreground\";\n const pnlSign = pnl > 0 ? \"+\" : \"\";\n\n const eventTitle = pos.event?.title ?? pos.market?.question ?? \"—\";\n const eventImage = pos.event?.image_url;\n const outcomeSide = pos.side;\n const outcomeLabel = pos.market?.outcomes?.[0]?.label ?? \"\";\n\n const settlementStr = pos.market?.end_at\n ? formatSettlementTime(pos.market.end_at)\n : \"—\";\n\n return (\n <div\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-sm\"\n style={{ height: ROW_HEIGHT }}\n >\n {/* Event cell */}\n <div className=\"flex-[3] min-w-0 pr-2\">\n <button\n type=\"button\"\n className=\"flex items-center gap-2.5 min-w-0 cursor-pointer text-left\"\n onClick={() => pos.event && onEventClick?.(pos.event)}\n >\n {eventImage && (\n <img\n src={eventImage}\n alt=\"\"\n className=\"w-8 h-8 rounded-full object-cover shrink-0\"\n />\n )}\n <div className=\"flex flex-col gap-y-0.5 min-w-0\">\n <span className=\"text-foreground truncate font-medium text-sm\">\n {eventTitle}\n </span>\n <span className=\"text-[11px] text-neutral\">\n <span\n className={cn(\n \"font-medium\",\n outcomeSide.toLowerCase() === \"yes\"\n ? \"text-success\"\n : \"text-danger\",\n )}\n >\n {outcomeSide}\n </span>\n {outcomeLabel && (\n <>\n <span className=\"mx-1\">·</span>\n <span>{outcomeLabel}</span>\n </>\n )}\n </span>\n </div>\n </button>\n </div>\n\n {/* Total Size */}\n <div className=\"flex-1 pr-2 text-right\">\n <div className=\"flex flex-col items-end\">\n <span className=\"font-mono text-foreground\">${value.toFixed(2)}</span>\n <span className=\"text-[10px] text-neutral\">\n {t(\"predict.profile.contracts\", { count: pos.size })}\n </span>\n </div>\n </div>\n\n {/* Value */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n ${(pos.size * avgPrice).toFixed(2)}\n </div>\n\n {/* Avg Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatCents(avgPrice)}\n </div>\n\n {/* Mark Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatCents(currentPrice)}\n </div>\n\n {/* PNL */}\n <div className={cn(\"flex-[1.5] pr-2 text-right font-mono\", pnlColor)}>\n <span>\n {pnlSign}${Math.abs(pnl).toFixed(2)}\n </span>\n <span className=\"text-[10px] ml-0.5 opacity-70\">\n ({pnlSign}\n {pnlPercent.toFixed(2)}%)\n </span>\n </div>\n\n {/* Payout if right */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n ${payoutIfRight.toFixed(2)}\n </div>\n\n {/* Est. Settlement */}\n <div className=\"flex-[1.5] pr-2 text-right text-neutral whitespace-nowrap text-xs\">\n {settlementStr}\n </div>\n\n {/* Close */}\n <div className=\"w-20 shrink-0 text-right\">\n {onClosePosition && (\n <button\n type=\"button\"\n onClick={() => onClosePosition(pos)}\n className=\"inline-flex items-center gap-1 text-xs text-neutral hover:text-foreground cursor-pointer transition-colors\"\n >\n <span className=\"text-danger\">✕</span>\n {t(\"predict.profile.close\")}\n </button>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Mobile card\n// ---------------------------------------------------------------------------\n\nfunction PositionCard({\n position: pos,\n onClose,\n onEventClick,\n}: {\n position: PredictPosition;\n onClose?: (pos: PredictPosition) => void;\n onEventClick?: (event: PredictEvent) => void;\n}) {\n const { t } = useTranslation();\n const pnl = pos.pnl ?? 0;\n const pnlPercent = pos.pnl_percent ?? 0;\n const currentPrice = pos.current_price ?? 0;\n const pnlColor =\n pnl > 0 ? \"text-success\" : pnl < 0 ? \"text-danger\" : \"text-foreground\";\n const pnlSign = pnl > 0 ? \"+\" : \"\";\n const eventTitle = pos.event?.title ?? pos.market?.question ?? \"—\";\n\n return (\n <div className=\"rounded-lg border border-border bg-content1 p-3 flex flex-col gap-2\">\n <button\n type=\"button\"\n className=\"flex items-start justify-between gap-2 text-left cursor-pointer\"\n onClick={() => pos.event && onEventClick?.(pos.event)}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n {pos.event?.image_url && (\n <img\n src={pos.event.image_url}\n alt=\"\"\n className=\"w-7 h-7 rounded-full object-cover shrink-0\"\n />\n )}\n <span className=\"text-sm font-medium text-foreground line-clamp-2\">\n {eventTitle}\n </span>\n </div>\n <span\n className={cn(\n \"shrink-0 text-xs font-medium px-1.5 py-0.5 rounded\",\n pos.side.toLowerCase() === \"yes\"\n ? \"bg-success/10 text-success\"\n : \"bg-danger/10 text-danger\",\n )}\n >\n {pos.side}\n </span>\n </button>\n <div className=\"flex items-center gap-4 text-xs flex-wrap\">\n <MobileStat\n label={t(\"predict.profile.totalSize\")}\n value={`${pos.size}`}\n />\n <MobileStat\n label={t(\"predict.profile.markPrice\")}\n value={formatCents(currentPrice)}\n />\n <MobileStat\n label={t(\"predict.profile.pnl\")}\n value={`${pnlSign}$${Math.abs(pnl).toFixed(2)} (${pnlSign}${pnlPercent.toFixed(1)}%)`}\n className={pnlColor}\n />\n <MobileStat\n label={t(\"predict.profile.payoutIfRight\")}\n value={`$${pos.size.toFixed(2)}`}\n />\n </div>\n {onClose && (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={() => onClose(pos)}\n className=\"text-xs text-danger hover:text-danger/80 cursor-pointer transition-colors border border-border rounded px-2 py-1\"\n >\n {t(\"predict.profile.close\")}\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nfunction MobileStat({\n label,\n value,\n className,\n}: {\n label: string;\n value: string;\n className?: string;\n}) {\n return (\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{label}</span>\n <span className={cn(\"font-mono text-foreground\", className)}>\n {value}\n </span>\n </div>\n );\n}\n\nfunction EmptyState({ message, height }: { message: string; height: number }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton({ height }: { height: number }) {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatCents(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(cents % 1 === 0 ? 0 : 1)}¢`;\n}\n\nfunction formatSettlementTime(isoString: string): string {\n try {\n const date = new Date(isoString);\n const hours = date.getHours().toString().padStart(2, \"0\");\n const mins = date.getMinutes().toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const year = date.getFullYear();\n const tz = date.getTimezoneOffset();\n const tzSign = tz <= 0 ? \"+\" : \"-\";\n const tzHours = String(Math.abs(Math.floor(tz / 60))).padStart(2, \"0\");\n return `${hours}:${mins} ${day}/${month}/${year} (${tzSign}${tzHours})`;\n } catch {\n return \"—\";\n }\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictPosition, PredictTrade } from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton } from \"@liberfi.io/ui\";\n\nexport interface ProfileStatsProps {\n positions: PredictPosition[];\n trades: PredictTrade[];\n isLoading: boolean;\n}\n\nexport function ProfileStats({\n positions,\n trades,\n isLoading,\n}: ProfileStatsProps) {\n const { t } = useTranslation();\n\n const stats = useMemo(() => {\n let realizedPnl = 0;\n let positionsValue = 0;\n for (const p of positions) {\n realizedPnl += p.realized_pnl ?? 0;\n positionsValue += p.current_value ?? p.size * (p.current_price ?? 0);\n }\n\n let volume = 0;\n let wins = 0;\n let settled = 0;\n for (const tr of trades) {\n volume += tr.usd_size ?? 0;\n if (tr.type === \"REDEEM\") {\n settled++;\n if ((tr.usd_size ?? 0) > 0) wins++;\n }\n }\n\n const winRateStr = settled > 0 ? `${wins} / ${settled}` : \"0 / 0\";\n\n return { realizedPnl, positionsValue, volume, winRateStr };\n }, [positions, trades]);\n\n const pnlColor =\n stats.realizedPnl > 0\n ? \"text-success\"\n : stats.realizedPnl < 0\n ? \"text-danger\"\n : \"text-foreground\";\n const pnlSign = stats.realizedPnl > 0 ? \"+\" : \"\";\n\n return (\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 py-8\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-xl text-neutral\">\n {t(\"predict.profile.realizedPnl\")}\n </span>\n {isLoading ? (\n <Skeleton className=\"h-14 w-48 rounded-md\" />\n ) : (\n <span className={cn(\"text-5xl font-bold tabular-nums\", pnlColor)}>\n {pnlSign}${Math.abs(stats.realizedPnl).toFixed(2)}\n </span>\n )}\n </div>\n\n <div className=\"flex items-end gap-8 sm:gap-10\">\n <StatCard\n label={t(\"predict.profile.winRate\")}\n value={stats.winRateStr}\n isLoading={isLoading}\n />\n <StatCard\n label={t(\"predict.profile.positions\")}\n value={`$${stats.positionsValue.toFixed(2)}`}\n isLoading={isLoading}\n />\n <StatCard\n label={t(\"predict.profile.volume\")}\n value={`$${stats.volume.toFixed(2)}`}\n isLoading={isLoading}\n />\n </div>\n </div>\n );\n}\n\nfunction StatCard({\n label,\n value,\n isLoading,\n}: {\n label: string;\n value: string;\n isLoading: boolean;\n}) {\n return (\n <div className=\"flex flex-col items-end gap-0.5\">\n <span className=\"text-sm text-neutral whitespace-nowrap\">{label}</span>\n {isLoading ? (\n <Skeleton className=\"h-6 w-14 rounded-md\" />\n ) : (\n <span className=\"text-base font-semibold tabular-nums text-foreground\">\n {value}\n </span>\n )}\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type PredictEvent,\n type PredictPosition,\n usePositions,\n useInfiniteTrades,\n} from \"@liberfi.io/react-predict\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { ProfileHistory } from \"./profile-history.ui\";\nimport { ProfileOrders } from \"./profile-orders.ui\";\nimport { ProfilePositions } from \"./profile-positions.ui\";\nimport { ProfileStats } from \"./profile-stats.ui\";\n\ntype ProfileTab = \"positions\" | \"orders\" | \"history\";\n\nconst LIST_HEIGHT = 600;\n\nexport interface ProfilePageProps {\n /** Solana wallet address (for Kalshi/DFlow positions). */\n solanaAddress?: string;\n /** EVM wallet address (for Polymarket positions). */\n evmAddress?: string;\n /** Called when user clicks Close on a position. */\n onClosePosition?: (position: PredictPosition) => void;\n /** Called when user clicks an event name. */\n onEventClick?: (event: PredictEvent) => void;\n}\n\nexport function ProfilePage({\n solanaAddress,\n evmAddress,\n onClosePosition,\n onEventClick,\n}: ProfilePageProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<ProfileTab>(\"positions\");\n\n const hasWallet = Boolean(solanaAddress || evmAddress);\n\n // Positions data (used by stats + positions tab)\n const { data: kalshiPositions, isLoading: kalshiPosLoading } = usePositions({\n source: \"kalshi\",\n user: solanaAddress ?? \"\",\n });\n const { data: polyPositions, isLoading: polyPosLoading } = usePositions({\n source: \"polymarket\",\n user: evmAddress ?? \"\",\n });\n\n const allPositions = useMemo(() => {\n const all: PredictPosition[] = [];\n if (kalshiPositions?.positions) all.push(...kalshiPositions.positions);\n if (polyPositions?.positions) all.push(...polyPositions.positions);\n return all;\n }, [kalshiPositions, polyPositions]);\n\n const positionsLoading = kalshiPosLoading || polyPosLoading;\n\n // Trades data (used by stats — fetch first page for stats aggregation)\n const { data: kalshiTrades, isLoading: kalshiTradesLoading } =\n useInfiniteTrades({\n source: \"kalshi\",\n wallet: solanaAddress ?? \"\",\n limit: 100,\n });\n const { data: polyTrades, isLoading: polyTradesLoading } = useInfiniteTrades({\n source: \"polymarket\",\n wallet: evmAddress ?? \"\",\n limit: 100,\n });\n\n const allTrades = useMemo(() => {\n const all = [\n ...(kalshiTrades?.pages?.flatMap((p) => p.items) ?? []),\n ...(polyTrades?.pages?.flatMap((p) => p.items) ?? []),\n ];\n return all;\n }, [kalshiTrades, polyTrades]);\n\n const statsLoading =\n positionsLoading || kalshiTradesLoading || polyTradesLoading;\n\n const positionsCount = allPositions.length;\n const positionsTabLabel =\n positionsCount > 0\n ? `${t(\"predict.profile.positionsTab\")} (${positionsCount})`\n : t(\"predict.profile.positionsTab\");\n\n const tabs: { key: ProfileTab; label: string }[] = [\n { key: \"positions\", label: positionsTabLabel },\n { key: \"orders\", label: t(\"predict.profile.openOrdersTab\") },\n { key: \"history\", label: t(\"predict.profile.historyTab\") },\n ];\n\n if (!hasWallet) {\n return (\n <div className=\"flex items-center justify-center text-sm text-neutral py-24 px-4\">\n {t(\"predict.profile.connectWallet\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col max-w-[1280px] mx-auto w-full px-4 max-sm:px-2\">\n {/* Stats header */}\n <ProfileStats\n positions={allPositions}\n trades={allTrades}\n isLoading={statsLoading}\n />\n\n {/* Tab navigation */}\n <div className=\"flex items-center gap-1 border-b border-border\">\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n \"px-3 py-3 text-base font-normal transition-colors cursor-pointer whitespace-nowrap\",\n activeTab === tab.key\n ? \"text-foreground border-b-2 border-foreground\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"py-2\">\n {activeTab === \"positions\" && (\n <ProfilePositions\n positions={allPositions}\n isLoading={positionsLoading}\n listHeight={LIST_HEIGHT}\n onClosePosition={onClosePosition}\n onEventClick={onEventClick}\n />\n )}\n {activeTab === \"orders\" && (\n <ProfileOrders\n solanaAddress={solanaAddress}\n evmAddress={evmAddress}\n listHeight={LIST_HEIGHT}\n />\n )}\n {activeTab === \"history\" && (\n <ProfileHistory\n solanaAddress={solanaAddress}\n evmAddress={evmAddress}\n listHeight={LIST_HEIGHT}\n />\n )}\n </div>\n </div>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { StyledModal, ModalContent } from \"@liberfi.io/ui\";\n\nexport interface SetupModalProps {\n isOpen: boolean;\n onClose: () => void;\n evmAddress: string;\n safeDeployed: boolean;\n tokenApproved: boolean;\n onDeployAndApprove: () => Promise<void>;\n}\n\ntype StepStatus = \"pending\" | \"running\" | \"done\";\n\nexport function SetupModal({\n isOpen,\n onClose,\n safeDeployed,\n tokenApproved,\n onDeployAndApprove,\n}: SetupModalProps) {\n const { t } = useTranslation();\n\n const [setupRunning, setSetupRunning] = useState(false);\n const [setupError, setSetupError] = useState<string | null>(null);\n const [optimisticDone, setOptimisticDone] = useState(false);\n\n const effectiveSafeDeployed = safeDeployed || optimisticDone;\n const effectiveTokenApproved = tokenApproved || optimisticDone;\n\n const step1Status: StepStatus = effectiveSafeDeployed\n ? \"done\"\n : setupRunning\n ? \"running\"\n : \"pending\";\n const step2Status: StepStatus = effectiveTokenApproved\n ? \"done\"\n : effectiveSafeDeployed && setupRunning\n ? \"running\"\n : \"pending\";\n\n const allDone = effectiveSafeDeployed && effectiveTokenApproved;\n\n const handleSetup = useCallback(async () => {\n setSetupError(null);\n setOptimisticDone(false);\n setSetupRunning(true);\n try {\n await onDeployAndApprove();\n setOptimisticDone(true);\n } catch (err) {\n setSetupError(err instanceof Error ? err.message : String(err));\n } finally {\n setSetupRunning(false);\n }\n }, [onDeployAndApprove]);\n\n const steps: {\n key: string;\n label: string;\n desc: string;\n status: StepStatus;\n }[] = [\n {\n key: \"step1\",\n label: t(\"predict.setup.step1\"),\n desc: t(\"predict.setup.step1Desc\" as never),\n status: step1Status,\n },\n {\n key: \"step2\",\n label: t(\"predict.setup.step2\"),\n desc: t(\"predict.setup.step2Desc\" as never),\n status: step2Status,\n },\n ];\n\n const handleAction = () => {\n if (allDone) {\n onClose();\n } else {\n handleSetup();\n }\n };\n\n const actionLabel = allDone\n ? t(\"predict.setup.done\")\n : t(\"predict.setup.setupButton\");\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n size=\"md\"\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 pt-5 pb-4\">\n <h3 className=\"text-base font-semibold text-white\">\n {t(\"predict.setup.modalTitle\")}\n </h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1 rounded-[10px] hover:bg-[rgba(39,39,42,0.5)] text-zinc-400 hover:text-white transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n {/* Body */}\n <div className=\"px-5 pb-5 space-y-4\">\n <p className=\"text-[13px] text-zinc-400 text-left\">\n {t(\"predict.setup.modalDescription\")}\n </p>\n\n {/* Steps */}\n <div className=\"space-y-2.5\">\n {steps.map((step, idx) => (\n <div\n key={step.key}\n className=\"flex gap-3 rounded-[10px] border border-zinc-700/50 bg-zinc-800/50 px-3 py-3\"\n >\n <StepIndicator index={idx + 1} status={step.status} />\n <div className=\"flex-1 min-w-0 pt-0.5\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-zinc-200\">\n {step.label}\n </p>\n <span\n className={`text-[11px] leading-none ${\n step.status === \"done\"\n ? \"text-[#c7ff2e]\"\n : step.status === \"running\"\n ? \"text-[#c7ff2e]/70\"\n : \"text-zinc-500\"\n }`}\n >\n {step.status === \"done\"\n ? t(\"predict.setup.stepComplete\")\n : step.status === \"running\"\n ? t(\"predict.setup.stepRunning\")\n : t(\"predict.setup.stepPending\")}\n </span>\n </div>\n <p className=\"text-xs text-zinc-500 mt-1\">{step.desc}</p>\n </div>\n </div>\n ))}\n </div>\n\n {setupError && (\n <div className=\"rounded-[10px] bg-red-500/10 border border-red-500/20 px-3 py-2\">\n <p className=\"text-xs text-red-400\">{setupError}</p>\n </div>\n )}\n\n {/* Action button */}\n <button\n type=\"button\"\n onClick={handleAction}\n disabled={setupRunning}\n className={\n allDone\n ? \"w-full py-3 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n : \"w-full py-3 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n }\n >\n {setupRunning ? (\n <span className=\"inline-flex items-center gap-2\">\n <svg\n className=\"animate-spin h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n className=\"opacity-25\"\n />\n <path\n d=\"M4 12a8 8 0 018-8\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n className=\"opacity-75\"\n />\n </svg>\n {t(\"predict.setup.stepRunning\")}\n </span>\n ) : (\n actionLabel\n )}\n </button>\n\n {/* Cancel */}\n {!allDone && (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-full py-2.5 rounded-[10px] text-sm text-zinc-400 hover:text-white hover:bg-[rgba(39,39,42,0.5)] transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n {t(\"common.cancel\")}\n </button>\n )}\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n\nfunction StepIndicator({\n index,\n status,\n}: {\n index: number;\n status: StepStatus;\n}) {\n if (status === \"done\") {\n return (\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[#c7ff2e]/15 shrink-0\">\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-[#c7ff2e]\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </span>\n );\n }\n if (status === \"running\") {\n return (\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[#c7ff2e]/10 shrink-0\">\n <svg\n className=\"animate-spin h-4 w-4 text-[#c7ff2e]\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n className=\"opacity-25\"\n />\n <path\n d=\"M4 12a8 8 0 018-8\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n className=\"opacity-75\"\n />\n </svg>\n </span>\n );\n }\n return (\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-zinc-700/50 text-xs font-bold text-zinc-400 shrink-0\">\n {index}\n </span>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/components/categories/categories.script.ts","../src/components/categories/categories.ui.tsx","../src/components/categories/categories.widget.tsx","../src/utils/predict-market-adapter.ts","../src/consts/index.ts","../src/providers/PredictWalletProvider.tsx","../src/components/trade-form/trade-form.script.ts","../src/components/kyc-modal/kyc-modal.ui.tsx","../src/components/trade-form/trade-form.ui.tsx","../src/components/trade-form/trade-form.widget.tsx","../src/components/trade-form/trade-form.modal.tsx","../src/components/events/events-filter.ui.tsx","../src/components/events/events-toolbar.ui.tsx","../src/components/events/events.script.ts","../src/components/events/events.skeleton.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/event-detail/event-detail-activity.ui.tsx","../src/components/event-detail/event-detail-skeleton.tsx","../src/components/event-detail/event-market-depth-chart.ui.tsx","../src/components/event-detail/event-market-detail.widget.tsx","../src/components/event-detail/event-price-chart.ui.tsx","../src/components/event-detail/event-detail.ui.tsx","../src/components/event-detail/event-detail.widget.tsx","../src/components/event-detail/event-similar-events.ui.tsx","../src/components/event-detail/event-detail.page.tsx","../src/components/event-detail/event-detail.scripts.ts","../src/components/search/search-history.script.ts","../src/components/search/search-history.ui.tsx","../src/components/search/search-history.widget.tsx","../src/components/search/search-input.ui.tsx","../src/components/matches/source-badge.ui.tsx","../src/components/search/search-result-item.ui.tsx","../src/components/search/search-result-list.script.ts","../src/components/search/search-result-list.widget.tsx","../src/components/search/search.script.ts","../src/components/search/search.widget.tsx","../src/components/search/search.modal.tsx","../src/components/search/search-events-button.tsx","../src/components/matches/matches-filter-bar.ui.tsx","../src/components/matches/matches-hero.ui.tsx","../src/components/matches/match-market-card.ui.tsx","../src/components/matches/matches.widget.tsx","../src/components/matches/matches.page.tsx","../src/components/matches/match-group-card.ui.tsx","../src/components/matches/matches-stats-bar.ui.tsx","../src/components/matches/spread-indicator.ui.tsx","../src/components/profile/profile-history.ui.tsx","../src/components/profile/profile-orders.ui.tsx","../src/components/profile/profile-positions.ui.tsx","../src/components/profile/profile-stats.ui.tsx","../src/components/profile/profile.page.tsx","../src/components/setup-modal/setup-modal.ui.tsx"],"names":["version_default","RAW_TAGS_BY_CATEGORIES","CATEGORY_ORDER","STATIC_CATEGORIES","orderIndex","cat","idx","label","rawTags","t","a","b","CategoriesUI","categories","selectedCategory","selectedTag","activeTags","onCategorySelect","onTagSelect","trailing","pulsingTab","className","useTranslation","handleSelectAll","useCallback","trendingLabel","jsxs","cn","jsx","Tab","TabSeparator","Chip","tag","isSelected","onPress","badge","showPulse","icon","CategoriesSkeleton","count","_","i","Skeleton","toUICategories","items","c","toUITags","CategoriesWidget","onSelect","selectedCategorySlug","setSelectedCategorySlug","useState","selectedTagSlug","setSelectedTagSlug","handleCategorySelect","categoryLabel","handleTagSelect","tagLabel","uiCategories","activeCat","predictEventToStandard","event","predictMarketToStandard","market","yes","no","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","PredictWalletContext","createContext","usePredictWallet","ctx","useContext","DEFAULT_POLLING_INTERVAL","PredictWalletProvider","pollingInterval","enabled","children","wallets","useWallets","solanaAddress","useMemo","w","ChainNamespace","evmAddress","kalshiBalanceData","kalshiBalanceLoading","kalshiBalanceFetching","kalshiBalanceError","useBalance","kalshiKycData","kalshiKycLoading","useDFlowKYC","polySetupData","polySetupLoading","usePolymarketSetup","polymarketSafeAddress","polymarketSetupVerified","polymarketBalanceData","polymarketBalanceLoading","polymarketBalanceFetching","polymarketBalanceError","value","DURATION_UNIT_SECONDS","resolveExpiration","preset","customDuration","customDurationUnit","now","end","fireCelebration","defaults","confetti","useTradeForm","initialOutcome","initialSide","authStatus","useAuth","switchChain","useSwitchChain","predictClient","usePredictClient","polymarketCtx","PolymarketContext","queryClient","useQueryClient","source","supportsLimitOrder","solanaWallet","evmWallet","isAuthenticated","userPublicKey","clobTokenId","raw","tickSizeData","useTickSize","tickSize","outcome","setOutcomeRaw","side","setSideRaw","orderType","setOrderTypeRaw","quantity","setQuantityRaw","limitPrice","setLimitPriceRaw","isSubmitting","setIsSubmitting","pendingSignature","setPendingSignature","pendingSellCashConvert","setPendingSellCashConvert","kycRequired","setKycRequired","expirationEnabled","setExpirationEnabled","expirationPreset","setExpirationPreset","setCustomDuration","setCustomDurationUnit","contextBalance","contextKycVerified","contextKycUrl","contextSafeAddress","pricePerShare","o","setOrderType","type","setOutcome","useEffect","shares","amountStr","yesMint","noMint","usdcMint","SOLANA_TOKENS","collateralMint","marketOutcomeMint","positionUser","positionsData","positionsLoading","usePositions","positionMarketMeta","p","effectiveOutcomeMint","effectiveCollateral","inputMint","outputMint","quoteEnabled","refetchQuote","useDFlowQuote","usdcBalance","sum","isBalanceLoading","yesTokenBalance","noTokenBalance","effectivePrice","estimatedCost","bidPrice","potentialPayout","potentialProfit","setSide","s","setQuantity","v","clamped","rounded","setLimitPrice","resetForm","validation","errors","holdingBalance","submitDFlow","useDFlowSubmit","orderStatus","useOrder","convertCashToUsdc","cashAmount","collateral","cashTx","txBytes","signedTxBytes","status","toast","submitDFlowOrder","quoteRecord","transaction","outAmount","result","submitPolymarketOrder","previousChain","needsSwitch","Chain","provider","usesSafe","signer","domain","types","primaryType","domainFields","fullTypes","creds","tokenIdx","tokenId","rawClobTokenIds","negRisk","price","polyOrderType","sizeInShares","input","buildCtfExchangeDomain","orderMessage","buildOrderMessage","signature","CTF_ORDER_TYPES","signedOrder","buildSignedOrder","clobPayload","buildClobPayload","body","headers","buildPolymarketL2Headers","submit","err","detail","KycModal","isOpen","onClose","kycUrl","StyledModal","open","ModalContent","key","USDC_LOGO","EXPIRATION_PRESETS","EXPIRATION_PRESET_I18N","DURATION_UNITS","DURATION_UNIT_I18N","TradeFormUI","variant","isValid","validationErrors","onOutcomeChange","onSideChange","onOrderTypeChange","onQuantityChange","onLimitPriceChange","onExpirationEnabledChange","onExpirationPresetChange","onCustomDurationChange","onCustomDurationUnitChange","onSubmit","showOdds","setShowOdds","kycModal","useDisclosure","currentPriceCents","hasAmount","submitLabel","sideLabel","outcomeLabel","winAmount","submitColor","handleHalf","handleMax","showErrors","setShowErrors","handleSubmitPress","Fragment","Tabs","StyledNumberInput","pct","StyledSwitch","Select","keys","val","SelectItem","u","ChevronDownIcon","Button","TradeFormWidget","chain","authenticatedSubmit","useAuthCallback","adaptedEvent","adaptedMarket","PREDICT_TRADE_MODAL_ID","PredictTradeModal","id","AsyncModal","modalProps","PredictTradeModalContent","params","onOpenChange","isMobile","useScreen","DEFAULT_FILTER_STATE","countActiveFilters","state","EventsFilterUI","onChange","draft","setDraft","handleOpenChange","handleReset","handleApply","updateDraft","prev","activeCount","platformOptions","timeRemainingOptions","volumeOptions","liquidityOptions","CloseButton","FilterSection","FilterChipGroup","onClick","options","selected","allowDeselect","opt","isActive","e","SORT_PRESETS","SORT_LABEL_KEYS","SORT_ORDER","btnBase","dropdownBase","EventsToolbarUI","sortPreset","onSortChange","sortAsc","onSortAscChange","onFilterPress","filterCount","setIsOpen","dropdownRef","useRef","handleClickOutside","onEscape","ActiveIcon","SORT_ICONS","SortIcon","ChevronDown","Icon","FilterBarIcon","CalendarIcon","ChartLineIcon","DropletIcon","TimerIcon","useEventsInfinite","baseParams","resolveEventsParams","infiniteData","isLoading","isFetching","isFetchingMore","isError","error","hasMore","fetchNextPage","refetch","usePredictInfiniteEvents","data","page","item","fetchMore","refetchAll","SHIMMER_CSS","EventsSkeleton","SkeletonCard","index","shimmer","titleWidth","j","EventsPageSkeleton","bar","MAX_DISPLAYED_OUTCOMES","SOURCE_GLOW","GLOW_FALLBACK","C_PRIMARY","C_SECONDARY","C_RED","TEAM_PALETTE","hashString","hash","getOutcomeColors","labels","l","label0","label1","idx0","idx1","getYesAsk","getYesPercent","formatPercent","getYesCents","getNoCents","yesPrice","formatCountdown","isoDate","diff","d","h","m","parts","injectedCSS","EventItem","href","LinkComponent","onSelectOutcome","onHover","expandedSlug","setExpandedSlug","rawMarkets","openMarkets","singleMarket","displayedMarkets","moreCount","formattedVolume","expandedMarket","isExpanded","handleCardClick","handleHeaderClick","handleShowMore","footerContent","SingleMarketFooter","ExpandedMarketFooter","MarketListFooter","el","glowColor","CardHeader","SingleMarketBody","ExpandedMarketBody","MarketListBody","CardFooter","countdown","Linkable","Avatar","EventIndicators","getEventBadges","badges","isCrypto","isLive","remaining","fiveMin","fifteenMin","cryptoColor","LiveBadge","CryptoCountdownBadge","ClosedBadge","color","onMarketClick","YesNoPill","onShowMore","ChevronRightIcon","SourceIcon","ElevatedButton","bgColor","textColor","shadowColor","OutcomeButtons","dynamicColors","labelFormat","c0","c1","effectiveFormat","yesLabel","noLabel","onCollapse","ChevronUpIcon","ChevronLeftIcon","PolymarketIcon","KalshiIcon","MD","LG","XL","GLOW_INSET","ROW_HEIGHT_SM","ROW_HEIGHT_LG","END_ROW_HEIGHT","getColumnCount","width","getRowHeight","EventsUI","events","onFetchMore","getEventHref","containerRef","listRef","containerWidth","containerHeight","useResizeObserver","columnCount","rowHeight","dataRowCount","showEndOfList","totalRowCount","isRowLoaded","loadMoreRows","onRowsRendered","useInfiniteLoader","handleScrollToTop","List","EventGridRow","style","onScrollToTop","EndOfListRow","Spinner","startIdx","rowEvents","emptySlots","EventsWidget","tagSlugSelection","limit","sort_by","sort_asc","with_markets","timeRemaining","minVolume","minLiquidity","EventsPage","setTagSlugSelection","filterState","setFilterState","isFilterOpen","openFilter","closeFilter","openTradeModal","useAsyncModal","handleSelectOutcome","selection","handleSortChange","handleSortAscChange","asc","handleFilterChange","sortBy","toolbar","ROW_HEIGHT","HEADER_HEIGHT","CONTENT_HEIGHT","LIST_HEIGHT","UserActivitySection","walletAddress","onCancelOrder","activeTab","setActiveTab","marketSlugs","positionsCount","tabs","tab","PositionsTab","OrdersTab","TradesTab","positions","TabSkeleton","EmptyState","PositionVirtualRow","closeLabel","position","pnl","pnlPercent","avgPrice","currentPrice","pnlColor","pnlSign","marketLabel","payoutIfRight","settlementStr","formatSettlementTime","formatPrice","hasNextPage","useInfiniteOrders","cancelMutation","useCancelOrder","orders","allItems","openStatuses","filtered","handleCancel","order","itemCount","rowCount","OrderVirtualRow","onCancel","isCancelling","cancelLabel","isBuy","OrderStatusBadge","useInfiniteTrades","trades","TradeVirtualRow","trade","timeStr","formatTimestamp","usdSize","message","cents","unixSeconds","date","month","day","hours","mins","isoString","EventDetailSkeleton","marketCount","showBack","TradeFormSkeleton","BID_COLOR","ASK_COLOR","formatKMB","n","abs","heightPow","cumulative","maxCumulative","buildDepthData","bids","asks","rawBidQty","rawAskQty","bid","slot","ask","cumBid","cumBidCost","bidTotal","bidCumCostArr","cumAsk","cumAskCost","askTotal","askCumCostArr","isBid","isAsk","hasOrder","DepthTooltipPanel","info","left","right","DepthColumn","memo","onEnter","onLeave","barRef","isVisible","X_TICKS","DepthXAxis","tick","EventMarketDepthChartUI","midPrice","bestBid","bestAsk","hasData","tooltip","setTooltip","activeBarRef","handleColumnEnter","barEl","handleColumnLeave","formatPriceCents","OrderbookSkeleton","EventMarketDetailWidget","onTradeAction","viewMode","setViewMode","isNo","orderbook","isOrderbookLoading","useOrderbook","spread","OrderbookTableIcon","OrderbookDepthIcon","EventOrderbookTableUI","MAX_ROWS_PER_SIDE","sortedAsks","sortedBids","maxQty","all","r","OrderbookRow","depthPct","bgClass","priceClass","formattedContracts","dollarValue","formattedTotal","ChartErrorBoundary","Component","MAX_SELECTED","CHART_COLORS","ms","range","formatTooltipTimestamp","INTERVAL_OPTIONS","IntervalSwitcher","useCursorOverlay","wrapperRef","overlayRef","onMouseMove","wrapper","overlay","rect","xPct","onMouseLeave","CustomTooltip","active","payload","labelMap","allSeries","payloadMap","MarketSelector","markets","selectedSlugs","colorMap","onToggle","setOpen","rootRef","handleClick","atMax","triggerContent","slug","mk","isDisabled","isOnlyOne","yesOutcome","LegendBar","series","displayValues","medianOfSorted","sorted","mid","downsampleSeries","maxPoints","step","start","bucket","buildChartData","maxPointsPerSeries","sampledSeries","allTimestamps","lookups","lastValues","ts","row","map","last","EventPriceChart","props","EventPriceChartInner","externalLoading","volume","allMarkets","seen","sortedMarkets","priceOf","setSelectedSlugs","chartRange","setChartRange","selectedMarkets","hookSeries","hookLoading","useMarketHistory","dayMs","chartData","yDomain","min","max","pad","currentValues","tooltipSeries","chartWrapperRef","overlayDivRef","handleWrapperMouseMove","handleWrapperMouseLeave","handleToggle","hoveredValues","setHoveredValues","hoveredValuesRef","lastPayloadKeyRef","rafIdRef","showChart","ResponsiveContainer","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","Line","lastRow","yVal","ReferenceDot","dx","dy","formatCents","getMarketLabel","getPlatformLabel","formatISOTimestamp","iso","year","minutes","useCountdown","targetIso","setNow","target","days","secs","formatCountdownDate","offset","sign","tzHours","EventDetailUI","collapseRef","isCollapsed","useScrollCollapse","rest","isEnded","startCountdown","endCountdown","startDateFormatted","endDateFormatted","EventMarketsUI","EventRulesUI","DEFAULT_VISIBLE_COUNT","showAll","setShowAll","firstOpenSlug","activeKey","setActiveKey","visibleMarkets","toggleExpand","handleTradeAction","noPrice","MarketRow","activeYes","activeNo","onToggleExpand","volumeFormatted","showFullRules","setShowFullRules","showTimeline","setShowTimeline","selectedIdx","setSelectedIdx","marketsWithContent","selectedMarket","rulesText","truncatedRules","Dropdown","DropdownTrigger","DropdownMenu","DropdownItem","arr","EventDetailWidget","eventSlug","isEventLoading","eventError","useEvent","SimilarEventsSection","onEventClick","similarEvents","useSimilarEvents","ev","SimilarEventCard","EventDetailPage","onSimilarEventClick","onBack","tradeSelection","setTradeSelection","hasBack","tradeFormKey","listCandlesticksParamsForRange","useEventDetail","candlestickMarketSlugs","client","candlestickParams","marketsToQuery","dedupedMarkets","candlestickQueries","useQueries","candlesticksQueryKey","isCandlesticksLoading","q","candlestickErrors","candlesticks","MAX_HISTORY_SIZE","searchHistoriesAtom","atomWithStorage","usePredictSearchHistory","histories","setHistories","useAtom","addHistory","keyword","trimmed","clearHistories","SearchHistoryUI","onClear","TrashIcon","SearchHistoryWidget","SearchInputUI","onValueChange","StyledInput","SearchIcon","XCloseIcon","Kbd","SOURCE_META","DEFAULT_META","getSourceMeta","SourceBadge","meta","formatVolume","vol","SearchResultItemUI","firstTag","sourceMeta","useSearchResultListScript","isFetchingNextPage","useSearchEvents","SearchResultListWidget","scriptParams","ref","height","isItemLoaded","loadMoreItems","onRowsLoaded","LoadingState","SearchResultRow","EmptyIcon","useSearchScript","onKeywordChange","text","setText","setKeyword","onKeywordChangeStable","useCallbackRef","addHistoryStable","debouncedSearch","debounce","setText_","setKeyword_","clearKeyword","SearchWidget","onSelectEvent","PREDICT_SEARCH_MODAL_ID","PredictSearchModal","PredictSearchModalContent","onResult","handleSelectEvent","handleEscape","ModalHeader","ModalBody","SearchEventsButton","modalParams","isDesktop","onOpen","onSelectEventStable","handleOpen","handleClose","handleKeyDown","activeElement","isInEditableElement","SORT_OPTIONS","VOLUME_PRESETS","getVolumeLabel","MatchesFilterBar","onMinVolumeChange","onRefresh","sortOpen","setSortOpen","volumeOpen","setVolumeOpen","tooltipVisible","setTooltipVisible","spinning","setSpinning","sortRef","volumeRef","currentSort","handleRefresh","SortOptionIcon","FilterIcon","InfoIcon","shared","onMouseEnter","STAT_CARDS","MatchesHero","stats","line","card","getYesPrice","getOutcomeName","getSpreadTier","spreadPercent","SPREAD_THEME","SPREAD_GLOW","CONFIDENCE_THEME","getConfidenceTierKey","tier","score","SpreadGauge","theme","filled","PLATFORM_COLORS","DEFAULT_PLATFORM","getPlatformColor","MatchMarketCard","match","getMarketHref","priceA","priceB","cheaperSource","title","confKey","confTheme","ctaAccent","glow","PlatformRow","isCheaper","platColor","outcomeName","content","MatchesWidget","forwardRef","onStatsChange","isPlaceholderData","useInfiniteMatchMarkets","keepPreviousData","animKey","setAnimKey","prevIsPlaceholder","setPrevIsPlaceholder","k","useImperativeHandle","allMatches","total","maxSpread","totalVolume","highSpreadCount","sentinelRef","observer","entries","MatchesSkeletonList","itemIndex","SORT_TITLE_KEY","StatusClock","time","setTime","fmt","MatchesStatusBar","MatchesPage","bgImageSrc","setSortBy","setSortAsc","setMinVolume","heroStats","setHeroStats","widgetRef","sort","handleStatsChange","startTransition","DEFAULT_PLATFORM_COLORS","getPlatformColors","getBestMarketPair","group","best","bestSpread","extractPlatformData","pair","entryA","entryB","getOutcome","oA","oB","MatchGroupCard","onSelectEntry","bestPair","platA","platB","isHighSpread","cheapest","cheapestMeta","PlatformBlock","colors","MatchesStatsBar","matches","sources","entry","StatItem","Separator","valueClassName","getSpreadColor","SpreadIndicator","arbProfit","hasArb","PAGE_SIZE","PAGINATION_HEIGHT","ProfileHistory","listHeight","currentPage","setCurrentPage","kalshiData","kalshiLoading","fetchNextKalshi","hasMoreKalshi","isFetchingKalshi","polyData","polyLoading","fetchNextPoly","hasMorePoly","isFetchingPoly","allTrades","totalPages","pageStart","pageTrades","handlePrev","handleNext","canGoPrev","canGoNext","contentHeight","HistoryRowStatic","HistoryCard","statusLabel","mapTradeStatus","isDeposit","depositSign","depositColor","eventTitle","eventImage","txUrl","getTxUrl","pnlValue","extractPnl","feeValue","extractFee","ExternalLinkIcon","parsed","fee","tz","tzSign","ProfileOrders","pageOrders","OrderRowStatic","Pagination","OrderCard","cost","onPrev","onNext","onPage","compact","ProfilePositions","onClosePosition","handleCloseAll","pos","pagePositions","PositionRowStatic","PositionCard","outcomeSide","MobileStat","ProfileStats","realizedPnl","positionsValue","wins","settled","tr","winRateStr","StatCard","ProfilePage","hasWallet","kalshiPositions","kalshiPosLoading","polyPositions","polyPosLoading","allPositions","kalshiTrades","kalshiTradesLoading","polyTrades","polyTradesLoading","statsLoading","SetupModal","safeDeployed","tokenApproved","onDeployAndApprove","setupRunning","setSetupRunning","setupError","setSetupError","optimisticDone","setOptimisticDone","effectiveSafeDeployed","effectiveTokenApproved","step1Status","step2Status","allDone","handleSetup","steps","handleAction","actionLabel","StepIndicator"],"mappings":"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","file":"index.mjs","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.113\";\n}\n\nexport default \"0.1.113\";\n","// =============================================================================\n// Categories — static navigation data\n//\n// Static data source. Tags are hardcoded from:\n// GET https://dev-prediction-markets-api.dflow.net/api/v1/tags_by_categories\n//\n// Slug logic mirrors mapTag() in prediction-server/internal/strategy/dflow/mapper.go:\n// slug = label (the original label string is used as the slug verbatim)\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// Static data — sourced from DFlow API (2025-03-22)\n// -----------------------------------------------------------------------------\n\n/**\n * Raw API shape from GET /api/v1/tags_by_categories.\n * Category keys map to tag arrays (null when the category has no sub-tags).\n */\nconst RAW_TAGS_BY_CATEGORIES: Record<string, string[] | null> = {\n Weather: [\n \"Daily temperature\",\n \"Snow and rain\",\n \"Climate change\",\n \"Natural disasters\",\n \"Hurricanes\",\n ],\n Companies: [\n \"IPOs\",\n \"Product launches\",\n \"KPIs\",\n \"Elon Musk\",\n \"CEOs\",\n \"Layoffs\",\n ],\n Crypto: [\n \"BTC\",\n \"15 min\",\n \"Hourly\",\n \"ETH\",\n \"SOL\",\n \"DOGE\",\n \"Pre-Market\",\n \"XRP\",\n \"BNB\",\n \"HYPE\",\n ],\n Economics: [\n \"Growth\",\n \"Fed\",\n \"Inflation\",\n \"Oil and energy\",\n \"Employment\",\n \"Housing\",\n \"Jobs & Economy\",\n \"Bankruptcy & Defaults\",\n \"GDP\",\n \"Global Central Banks\",\n ],\n Elections: [\"Primaries\", \"International elections\"],\n Entertainment: [\n \"Music\",\n \"Movies\",\n \"Music charts\",\n \"Television\",\n \"Awards\",\n \"Video games\",\n \"Oscars\",\n \"Rotten Tomatoes\",\n ],\n Financials: [\n \"S&P\",\n \"Nasdaq\",\n \"Daily\",\n \"Metals\",\n \"Treasuries\",\n \"Oil\",\n \"EUR/USD\",\n \"USD/JPY\",\n \"WTI\",\n ],\n Mentions: [\"Politicians\", \"Earnings\", \"Entertainment\"],\n Politics: [\n \"Trump\",\n \"Congress\",\n \"International\",\n \"SCOTUS & courts\",\n \"Local\",\n \"Recurring\",\n \"Iran\",\n \"House\",\n ],\n Science: [\"AI\", \"Energy\", \"Space\"],\n Social: null,\n Sports: [\n \"Soccer\",\n \"Basketball\",\n \"Baseball\",\n \"Football\",\n \"Hockey\",\n \"Golf\",\n \"Tennis\",\n \"Motorsport\",\n \"Esports\",\n \"Boxing\",\n \"MMA\",\n \"Rugby\",\n \"Lacrosse\",\n \"Mentions\",\n \"Chess\",\n \"Cricket\",\n \"Aussie Rules\",\n \"Darts\",\n ],\n World: null,\n};\n\n// -----------------------------------------------------------------------------\n// Preferred display order (matches the DFlow category taxonomy)\n// -----------------------------------------------------------------------------\n\nconst CATEGORY_ORDER: string[] = [\n \"Politics\",\n \"Sports\",\n \"Crypto\",\n \"Economics\",\n \"Financials\",\n \"Elections\",\n \"Entertainment\",\n \"Companies\",\n \"Science and Technology\",\n \"Climate and Weather\",\n \"Mentions\",\n \"Social\",\n \"World\",\n];\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/**\n * A single category entry in the static navigation model.\n *\n * Slug logic: slug === label (verbatim), matching mapTag() in the prediction\n * server's DFlow strategy. Pass the slug directly to DFlow API filters.\n */\nexport interface CategoryListItem {\n /** Category slug — equals the label; use directly as DFlow `category` filter */\n slug: string;\n /** Display label */\n label: string;\n /** Tag entries for this category (empty array when the category has no sub-tags) */\n tags: CategoryTagItem[];\n}\n\n/** A single tag entry in the static navigation model */\nexport interface CategoryTagItem {\n /** Tag slug — equals the label; use directly as DFlow `tags` filter */\n slug: string;\n /** Display label */\n label: string;\n /** Optional Phosphor icon class name (e.g. \"ph--basketball-bold\") */\n icon?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Derived static data\n// -----------------------------------------------------------------------------\n\n/**\n * Sorted category list derived from the static DFlow API snapshot.\n * Memoised at module level — computed once, never re-created.\n */\nexport const STATIC_CATEGORIES: CategoryListItem[] = (() => {\n const orderIndex = (cat: string): number => {\n const idx = CATEGORY_ORDER.indexOf(cat);\n return idx === -1 ? CATEGORY_ORDER.length : idx;\n };\n\n return Object.entries(RAW_TAGS_BY_CATEGORIES)\n .map(\n ([label, rawTags]): CategoryListItem => ({\n slug: label, // mapTag: slug = label\n label,\n tags: (rawTags ?? []).map(\n (t): CategoryTagItem => ({ slug: t, label: t }),\n ),\n }),\n )\n .sort((a, b) => orderIndex(a.slug) - orderIndex(b.slug));\n})();\n\n// -----------------------------------------------------------------------------\n// Selection type\n// -----------------------------------------------------------------------------\n\n/**\n * Selection emitted by CategoriesWidget.\n *\n * - `categorySlug = null, tagSlug = null` → \"Trending\" (no filter)\n * - `categorySlug = \"Politics\", tagSlug = null` → category selected, all its tags\n * - `categorySlug = \"Politics\", tagSlug = \"Trump\"` → specific tag selected\n */\nexport interface TagSlugSelection {\n /** Selected category slug (null = Trending / no filter) */\n categorySlug: string | null;\n /** Selected tag slug within the category (null = all tags in the category) */\n tagSlug: string | null;\n}\n","import { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Skeleton } from \"@liberfi.io/ui\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface CategoryItem {\n category: string;\n tags: string[];\n /** Optional badge text displayed above the tab (e.g. \"New\", \"Hot\") */\n badge?: string;\n}\n\nexport interface TagItem {\n label: string;\n /** Optional Phosphor icon class name (e.g. \"ph--basketball-bold\") */\n icon?: string;\n}\n\nexport interface CategoriesUIProps {\n /** List of categories to display */\n categories: CategoryItem[];\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: TagItem[];\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 /** Content rendered at the end of the primary chip row (e.g. sort/filter controls) */\n trailing?: React.ReactNode;\n /** Name of the tab that shows a pulsing dot (default: \"Trending\") */\n pulsingTab?: string;\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 trailing,\n pulsingTab = \"Trending\",\n className,\n}: CategoriesUIProps) {\n const { t } = useTranslation();\n\n const handleSelectAll = useCallback(() => {\n onCategorySelect(null);\n }, [onCategorySelect]);\n\n const trendingLabel = t(\"predict.categories.trending\");\n\n return (\n <div\n className={cn(\n \"sticky top-0 z-30 flex w-full flex-col justify-between gap-2 px-4 py-1 lg:px-2 lg:py-1\",\n className,\n )}\n >\n {/* Primary row: category tabs + trailing controls */}\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"hideScrollbar min-w-0 flex-1 overflow-x-auto overflow-y-hidden\">\n <div className=\"flex min-h-8 items-stretch gap-x-2 lg:min-h-9\">\n {/* Trending tab */}\n <Tab\n label={trendingLabel}\n isSelected={selectedCategory === null}\n onPress={handleSelectAll}\n showPulse={trendingLabel === pulsingTab}\n />\n\n {/* Separator between Trending and categories */}\n <TabSeparator />\n\n {/* Category tabs */}\n {categories.map((cat) => (\n <Tab\n key={cat.category}\n label={cat.category}\n isSelected={selectedCategory === cat.category}\n onPress={() => onCategorySelect(cat.category)}\n badge={cat.badge}\n showPulse={cat.category === pulsingTab}\n />\n ))}\n </div>\n </div>\n {trailing && <div className=\"flex-shrink-0\">{trailing}</div>}\n </div>\n\n {/* Secondary: tag chips (visible when a category is selected) */}\n {selectedCategory && activeTags.length > 0 && (\n <div className=\"hideScrollbar overflow-x-auto overflow-y-hidden flex items-center\">\n <div className=\"flex gap-x-1 pl-2 lg:w-full lg:gap-x-2\">\n <Chip\n label={t(\"predict.categories.allMarkets\")}\n isSelected={selectedTag === null}\n onPress={() => onTagSelect(null)}\n />\n {activeTags.map((tag) => (\n <Chip\n key={tag.label}\n label={tag.label}\n icon={tag.icon}\n isSelected={selectedTag === tag.label}\n onPress={() => onTagSelect(tag.label)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Tab — primary category navigation item\n// -----------------------------------------------------------------------------\n\ninterface TabProps {\n label: string;\n isSelected: boolean;\n onPress: () => void;\n badge?: string;\n showPulse?: boolean;\n}\n\nfunction Tab({ label, isSelected, onPress, badge, showPulse }: TabProps) {\n return (\n <button\n type=\"button\"\n onClick={onPress}\n className={cn(\n \"relative shrink-0 cursor-pointer whitespace-nowrap border-b p-1 text-base font-normal capitalize transition-colors\",\n isSelected\n ? \"border-primary/50 text-primary\"\n : \"border-transparent text-neutral-500 hover:text-neutral-300\",\n )}\n >\n {showPulse ? (\n <span className=\"flex items-center gap-x-1.5\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-[rgb(240,68,56)]\" />\n <span>{label}</span>\n </span>\n ) : (\n label\n )}\n\n {badge && (\n <span className=\"absolute -right-1 top-0 rounded bg-primary px-0.5 py-px text-[0.625rem] font-semibold leading-none text-neutral-950\">\n {badge}\n </span>\n )}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// TabSeparator — vertical divider between tab groups\n// -----------------------------------------------------------------------------\n\nfunction TabSeparator() {\n return (\n <span className=\"flex items-center text-neutral-600\" aria-hidden=\"true\">\n |\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Chip — secondary tag chip (pixel-perfect Jupiter clone)\n// -----------------------------------------------------------------------------\n\ninterface ChipProps {\n label: string;\n icon?: string;\n isSelected: boolean;\n onPress: () => void;\n}\n\nfunction Chip({ label, icon, isSelected, onPress }: ChipProps) {\n return (\n <button\n type=\"button\"\n onClick={onPress}\n className={cn(\n \"flex shrink-0 items-center justify-center gap-x-1 min-w-14 rounded-2xl border px-2 py-1 text-sm font-medium uppercase transition-colors cursor-pointer\",\n isSelected\n ? \"border-transparent bg-primary text-black\"\n : \"border-border/80 text-neutral-200 hover:bg-primary/10 hover:text-primary\",\n )}\n >\n {icon && <span className={cn(\"iconify size-4\", icon)} />}\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 w-full flex-col gap-2 px-4 py-1 lg:px-2 lg:py-1\">\n <div className=\"flex min-h-8 items-center gap-x-2 lg:min-h-9\">\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={i} className=\"h-6 w-16 shrink-0 rounded\" />\n ))}\n </div>\n </div>\n );\n}\n","// =============================================================================\n// CategoriesWidget\n//\n// Category / tag navigation backed by a static hardcoded snapshot (categories.script.ts).\n// Callbacks emit `TagSlugSelection` (categorySlug / tagSlug). Slug values follow the\n// DFlow mapTag() convention: slug === label verbatim.\n//\n// UI layer is shared with CategoriesUI / CategoriesSkeleton where available.\n// =============================================================================\nimport { useState, useCallback } from \"react\";\nimport {\n STATIC_CATEGORIES,\n type CategoryListItem,\n type TagSlugSelection,\n} from \"./categories.script\";\nimport { CategoriesUI, type CategoryItem, type TagItem } from \"./categories.ui\";\n\n// Re-export types so consumers can import from this single entry point.\nexport type { TagSlugSelection } from \"./categories.script\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface CategoriesWidgetProps {\n /**\n * Callback fired when the category / tag selection changes.\n *\n * Slug values follow the DFlow `mapTag()` convention (slug === label):\n * - `{ categorySlug: null, tagSlug: null }` → \"Trending\" (no filter)\n * - `{ categorySlug: \"Crypto\", tagSlug: null }` → category selected\n * - `{ categorySlug: \"Crypto\", tagSlug: \"BTC\" }` → specific tag selected\n */\n onSelect?: (selection: TagSlugSelection) => void;\n /** Content rendered at the end of the primary chip row (e.g. sort/filter controls) */\n trailing?: React.ReactNode;\n /** Optional class name applied to the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Adapter helpers\n// -----------------------------------------------------------------------------\n\n/** Convert CategoryListItem[] to the shape expected by CategoriesUI */\nfunction toUICategories(items: CategoryListItem[]): CategoryItem[] {\n return items.map((c) => ({\n category: c.label,\n tags: c.tags.map((t) => t.label),\n }));\n}\n\nfunction toUITags(cat: CategoryListItem | undefined): TagItem[] {\n if (!cat) return [];\n return cat.tags.map((t) => ({\n label: t.label,\n icon: t.icon,\n }));\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function CategoriesWidget({\n onSelect,\n trailing,\n className,\n}: CategoriesWidgetProps) {\n const [selectedCategorySlug, setSelectedCategorySlug] = useState<\n string | null\n >(null);\n const [selectedTagSlug, setSelectedTagSlug] = useState<string | null>(null);\n\n // --- handlers ---\n\n const handleCategorySelect = useCallback(\n (categoryLabel: string | null) => {\n setSelectedCategorySlug(categoryLabel); // slug === label\n setSelectedTagSlug(null);\n\n onSelect?.({\n categorySlug: categoryLabel, // null → \"Trending\"\n tagSlug: null,\n });\n },\n [onSelect],\n );\n\n const handleTagSelect = useCallback(\n (tagLabel: string | null) => {\n setSelectedTagSlug(tagLabel); // slug === label\n\n onSelect?.({\n categorySlug: selectedCategorySlug,\n tagSlug: tagLabel,\n });\n },\n [selectedCategorySlug, onSelect],\n );\n\n // --- derive UI data ---\n\n const uiCategories = toUICategories(STATIC_CATEGORIES);\n\n const activeCat = STATIC_CATEGORIES.find(\n (c) => c.slug === selectedCategorySlug,\n );\n const activeTags = toUITags(activeCat);\n\n return (\n <CategoriesUI\n categories={uiCategories}\n selectedCategory={selectedCategorySlug}\n selectedTag={selectedTagSlug}\n activeTags={activeTags}\n onCategorySelect={handleCategorySelect}\n onTagSelect={handleTagSelect}\n trailing={trailing}\n className={className}\n />\n );\n}\n","import type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport type { StandardEvent, StandardMarket } from \"../types\";\n\nexport function predictEventToStandard(event: PredictEvent): StandardEvent {\n return {\n title: event.title,\n imageUrl: event.image_url,\n };\n}\n\nexport function predictMarketToStandard(market: PredictMarket): StandardMarket {\n const yes = market.outcomes[0];\n const no = market.outcomes[1];\n return {\n question: market.question,\n yesAsk: yes?.best_ask ?? yes?.price,\n noAsk: no?.best_ask ?? no?.price,\n yesBid: yes?.best_bid,\n noBid: no?.best_bid,\n yesSubTitle: yes?.label ?? \"Yes\",\n noSubTitle: no?.label ?? \"No\",\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 {\n createContext,\n useContext,\n type PropsWithChildren,\n useMemo,\n} from \"react\";\nimport {\n useBalance,\n useDFlowKYC,\n usePolymarketSetup,\n} from \"@liberfi.io/react-predict\";\nimport { ChainNamespace } from \"@liberfi.io/types\";\nimport { useWallets } from \"@liberfi.io/wallet-connector\";\n\nexport interface PredictWalletContextValue {\n /** Connected Solana wallet address (for Kalshi). */\n solanaAddress: string | undefined;\n /** Connected EVM wallet address (for Polymarket). */\n evmAddress: string | undefined;\n /** Polymarket Safe (proxy) wallet address, derived from EOA via CREATE2. */\n polymarketSafeAddress: string | undefined;\n /** `null` when no wallet is connected or data has not loaded yet. */\n kalshiUsdcBalance: number | null;\n /** `null` when wallet not connected or setup not complete. */\n polymarketUsdcBalance: number | null;\n /** Whether the Solana wallet has completed Kalshi/DFlow KYC verification. */\n kalshiKycVerified: boolean;\n /** URL to redirect for KYC onboarding, or `null` if unavailable. */\n kalshiKycUrl: string | null;\n /** `true` while the KYC status query is loading for the first time. */\n kalshiKycLoading: boolean;\n /** Whether Polymarket wallet setup is fully complete (Safe deployed + USDC.e approved). */\n polymarketSetupVerified: boolean;\n /** Whether the Safe wallet has been deployed on Polygon. */\n polymarketSafeDeployed: boolean;\n /** Whether USDC.e is approved for the CTF Exchange. */\n polymarketTokenApproved: boolean;\n /** `true` while the Polymarket setup status is loading. */\n polymarketSetupLoading: boolean;\n /** `true` only on initial load when there is no cached data yet. */\n isLoading: boolean;\n /** `true` whenever a request is in-flight (including background refetches). */\n isFetching: boolean;\n error: Error | null;\n}\n\nconst PredictWalletContext = createContext<PredictWalletContextValue | null>(\n null,\n);\n\nexport function usePredictWallet() {\n const ctx = useContext(PredictWalletContext);\n if (!ctx) {\n throw new Error(\n \"usePredictWallet must be used within a PredictWalletProvider\",\n );\n }\n return ctx;\n}\n\nconst DEFAULT_POLLING_INTERVAL = 10_000;\n\nexport type PredictWalletProviderProps = PropsWithChildren<{\n pollingInterval?: number;\n enabled?: boolean;\n}>;\n\nexport function PredictWalletProvider({\n pollingInterval = DEFAULT_POLLING_INTERVAL,\n enabled = true,\n children,\n}: PredictWalletProviderProps) {\n // ---------------------------------------------------------------------------\n // Derive wallet addresses from wallet-connector\n // ---------------------------------------------------------------------------\n const wallets = useWallets();\n\n const solanaAddress = useMemo(\n () =>\n wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n )?.address,\n [wallets],\n );\n\n const evmAddress = useMemo(\n () =>\n wallets.find(\n (w) => w.chainNamespace === ChainNamespace.EVM && w.isConnected,\n )?.address,\n [wallets],\n );\n\n // ---------------------------------------------------------------------------\n // DFlow (Solana) USDC balance polling\n // ---------------------------------------------------------------------------\n const {\n data: kalshiBalanceData,\n isLoading: kalshiBalanceLoading,\n isFetching: kalshiBalanceFetching,\n error: kalshiBalanceError,\n } = useBalance(\n { source: \"kalshi\", user: solanaAddress ?? \"\" },\n {\n enabled: enabled && !!solanaAddress,\n refetchInterval: pollingInterval,\n },\n );\n\n // ---------------------------------------------------------------------------\n // Kalshi / DFlow KYC status polling\n // ---------------------------------------------------------------------------\n const { data: kalshiKycData, isLoading: kalshiKycLoading } = useDFlowKYC(\n solanaAddress,\n {\n enabled: enabled && !!solanaAddress,\n refetchInterval: 30_000,\n },\n );\n\n // ---------------------------------------------------------------------------\n // Polymarket wallet setup status polling\n // ---------------------------------------------------------------------------\n const { data: polySetupData, isLoading: polySetupLoading } =\n usePolymarketSetup(evmAddress, {\n enabled: enabled && !!evmAddress,\n refetchInterval: 30_000,\n });\n\n // ---------------------------------------------------------------------------\n // Polymarket (Polygon) USDC.e balance polling\n // The backend derives the Safe address from the EOA via CREATE2, so we\n // always pass the EOA here — consistent with positions and trades queries.\n // ---------------------------------------------------------------------------\n const polymarketSafeAddress = polySetupData?.safe_address;\n const polymarketSetupVerified = polySetupData?.verified ?? false;\n\n const {\n data: polymarketBalanceData,\n isLoading: polymarketBalanceLoading,\n isFetching: polymarketBalanceFetching,\n error: polymarketBalanceError,\n } = useBalance(\n { source: \"polymarket\", user: evmAddress ?? \"\" },\n {\n enabled: enabled && polymarketSetupVerified && !!evmAddress,\n refetchInterval: pollingInterval,\n },\n );\n\n // ---------------------------------------------------------------------------\n // Context value\n // ---------------------------------------------------------------------------\n const value = useMemo(\n () => ({\n solanaAddress,\n evmAddress,\n polymarketSafeAddress,\n kalshiUsdcBalance: kalshiBalanceData\n ? Number(kalshiBalanceData.balance)\n : null,\n polymarketUsdcBalance:\n polymarketSetupVerified && polymarketBalanceData\n ? Number(polymarketBalanceData.balance)\n : null,\n kalshiKycVerified: kalshiKycData?.verified ?? false,\n kalshiKycUrl: kalshiKycData?.kyc_url ?? null,\n kalshiKycLoading,\n polymarketSetupVerified,\n polymarketSafeDeployed: polySetupData?.safe_deployed ?? false,\n polymarketTokenApproved: polySetupData?.token_approved ?? false,\n polymarketSetupLoading: polySetupLoading,\n isLoading: kalshiBalanceLoading || polymarketBalanceLoading,\n isFetching: kalshiBalanceFetching || polymarketBalanceFetching,\n error: kalshiBalanceError ?? polymarketBalanceError ?? null,\n }),\n [\n solanaAddress,\n evmAddress,\n polymarketSafeAddress,\n kalshiBalanceData,\n polymarketBalanceData,\n polymarketSetupVerified,\n kalshiKycData,\n kalshiKycLoading,\n polySetupData,\n polySetupLoading,\n kalshiBalanceLoading,\n polymarketBalanceLoading,\n kalshiBalanceFetching,\n polymarketBalanceFetching,\n kalshiBalanceError,\n polymarketBalanceError,\n ],\n );\n\n return (\n <PredictWalletContext.Provider value={value}>\n {children}\n </PredictWalletContext.Provider>\n );\n}\n","import { useState, useContext, useMemo, useCallback, useEffect } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport confetti from \"canvas-confetti\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n PredictMarket,\n ProviderSource,\n CreateOrderInput,\n PolymarketSigner,\n} from \"@liberfi.io/react-predict\";\nimport {\n useDFlowQuote,\n useDFlowSubmit,\n useOrder,\n usePositions,\n usePredictClient,\n useTickSize,\n PolymarketContext,\n buildPolymarketL2Headers,\n buildCtfExchangeDomain,\n CTF_ORDER_TYPES,\n buildOrderMessage,\n buildSignedOrder,\n buildClobPayload,\n} from \"@liberfi.io/react-predict\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport {\n useAuth,\n useWallets,\n useSwitchChain,\n type EvmWalletAdapter,\n} from \"@liberfi.io/wallet-connector\";\nimport { ORDER_MIN_QUANTITY } from \"../../consts\";\nimport { usePredictWallet } from \"../../providers/PredictWalletProvider\";\n\n// ---------------------------------------------------------------------------\n// Shared form types\n// ---------------------------------------------------------------------------\n\nexport type TradeOutcome = \"yes\" | \"no\";\nexport type TradeSide = \"buy\" | \"sell\";\nexport type OrderType = \"market\" | \"limit\";\nexport type ExpirationPreset = \"5m\" | \"1h\" | \"12h\" | \"24h\" | \"eod\" | \"custom\";\nexport type DurationUnit = \"minutes\" | \"hours\" | \"days\";\n\nexport interface TradeFormValidation {\n isValid: boolean;\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseTradeFormParams {\n market: PredictMarket;\n chain?: string;\n initialOutcome?: TradeOutcome;\n initialSide?: TradeSide;\n}\n\nexport interface UseTradeFormResult {\n outcome: TradeOutcome;\n side: TradeSide;\n orderType: OrderType;\n quantity: number;\n limitPrice: number;\n shares: number;\n estimatedCost: number;\n potentialPayout: number;\n potentialProfit: number;\n usdcBalance: number | null;\n yesTokenBalance: number | null;\n noTokenBalance: number | null;\n isBalanceLoading: boolean;\n isSubmitting: boolean;\n validation: TradeFormValidation;\n supportsLimitOrder: boolean;\n kycRequired: boolean;\n kycUrl: string | null;\n setOutcome: (outcome: TradeOutcome) => void;\n setSide: (side: TradeSide) => void;\n setOrderType: (type: OrderType) => void;\n expirationEnabled: boolean;\n expirationPreset: ExpirationPreset;\n customDuration: number;\n customDurationUnit: DurationUnit;\n setQuantity: (quantity: number) => void;\n setLimitPrice: (price: number) => void;\n setExpirationEnabled: (enabled: boolean) => void;\n setExpirationPreset: (preset: ExpirationPreset) => void;\n setCustomDuration: (v: number) => void;\n setCustomDurationUnit: (u: DurationUnit) => void;\n submit: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst DURATION_UNIT_SECONDS: Record<DurationUnit, number> = {\n minutes: 60,\n hours: 3600,\n days: 86400,\n};\n\nfunction resolveExpiration(\n preset: ExpirationPreset,\n customDuration: number,\n customDurationUnit: DurationUnit,\n): number {\n const now = Math.floor(Date.now() / 1000);\n switch (preset) {\n case \"5m\":\n return now + 5 * 60;\n case \"1h\":\n return now + 60 * 60;\n case \"12h\":\n return now + 12 * 60 * 60;\n case \"24h\":\n return now + 24 * 60 * 60;\n case \"eod\": {\n const end = new Date();\n end.setUTCHours(23, 59, 59, 0);\n return Math.floor(end.getTime() / 1000);\n }\n case \"custom\":\n return now + customDuration * DURATION_UNIT_SECONDS[customDurationUnit];\n }\n}\n\nfunction fireCelebration() {\n const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 9999 };\n confetti({ ...defaults, particleCount: 80, origin: { x: 0.5, y: 0.4 } });\n setTimeout(() => {\n confetti({ ...defaults, particleCount: 40, origin: { x: 0.3, y: 0.6 } });\n }, 150);\n setTimeout(() => {\n confetti({ ...defaults, particleCount: 40, origin: { x: 0.7, y: 0.6 } });\n }, 300);\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useTradeForm({\n market,\n initialOutcome = \"yes\",\n initialSide = \"buy\",\n}: UseTradeFormParams): UseTradeFormResult {\n const { t } = useTranslation();\n const { status: authStatus } = useAuth();\n const wallets = useWallets();\n const switchChain = useSwitchChain();\n const predictClient = usePredictClient();\n const polymarketCtx = useContext(PolymarketContext);\n const queryClient = useQueryClient();\n const source: ProviderSource = market.source;\n const supportsLimitOrder = source === \"polymarket\";\n\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const evmWallet = wallets.find(\n (w): w is EvmWalletAdapter =>\n w.chainNamespace === ChainNamespace.EVM &&\n w.isConnected &&\n \"switchChain\" in w,\n );\n\n const isAuthenticated = authStatus === \"authenticated\";\n const userPublicKey = solanaWallet?.address;\n const evmAddress = evmWallet?.address;\n\n // ---------------------------------------------------------------------------\n // Polymarket tick size — query the actual tick size for this market's token\n // ---------------------------------------------------------------------------\n const clobTokenId = useMemo(() => {\n if (source !== \"polymarket\") return undefined;\n const raw = market.provider_meta?.[\"polymarket.clobTokenIds\"] as\n | string\n | string[]\n | undefined;\n if (!raw) return undefined;\n const ids = typeof raw === \"string\" ? (JSON.parse(raw) as string[]) : raw;\n return ids[0];\n }, [source, market.provider_meta]);\n\n const { data: tickSizeData } = useTickSize(clobTokenId);\n const tickSize = (\n tickSizeData?.minimum_tick_size\n ? String(tickSizeData.minimum_tick_size)\n : \"0.01\"\n ) as \"0.1\" | \"0.01\" | \"0.001\" | \"0.0001\";\n\n // ---------------------------------------------------------------------------\n // Local state\n // ---------------------------------------------------------------------------\n const [outcome, setOutcomeRaw] = useState<TradeOutcome>(initialOutcome);\n const [side, setSideRaw] = useState<TradeSide>(initialSide);\n const [orderType, setOrderTypeRaw] = useState<OrderType>(\"market\");\n const [quantity, setQuantityRaw] = useState<number>(NaN);\n const [limitPrice, setLimitPriceRaw] = useState<number>(NaN);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [pendingSignature, setPendingSignature] = useState<string | null>(null);\n const [pendingSellCashConvert, setPendingSellCashConvert] = useState<{\n cashAmount: string;\n collateral: string;\n } | null>(null);\n const [kycRequired, setKycRequired] = useState(false);\n const [expirationEnabled, setExpirationEnabled] = useState(false);\n const [expirationPreset, setExpirationPreset] =\n useState<ExpirationPreset>(\"1h\");\n const [customDuration, setCustomDuration] = useState(30);\n const [customDurationUnit, setCustomDurationUnit] =\n useState<DurationUnit>(\"minutes\");\n\n // ---------------------------------------------------------------------------\n // USDC balances from context\n // ---------------------------------------------------------------------------\n let contextBalance: {\n kalshiUsdcBalance: number | null;\n polymarketUsdcBalance: number | null;\n isLoading: boolean;\n } | null = null;\n let contextKycVerified = false;\n let contextKycUrl: string | null = null;\n let contextSafeAddress: string | undefined;\n try {\n const ctx = usePredictWallet();\n contextBalance = {\n kalshiUsdcBalance: ctx.kalshiUsdcBalance,\n polymarketUsdcBalance: ctx.polymarketUsdcBalance,\n isLoading: ctx.isLoading,\n };\n contextKycVerified = ctx.kalshiKycVerified;\n contextKycUrl = ctx.kalshiKycUrl;\n contextSafeAddress = ctx.polymarketSafeAddress;\n } catch {\n // Provider not mounted — fall back to local position query\n }\n\n // ---------------------------------------------------------------------------\n // Price per share from market outcomes\n // ---------------------------------------------------------------------------\n const pricePerShare = useMemo(() => {\n const idx = outcome === \"yes\" ? 0 : 1;\n const o = market.outcomes[idx];\n return side === \"buy\"\n ? (o?.best_ask ?? o?.price ?? 0.5)\n : (o?.best_bid ?? o?.price ?? 0.5);\n }, [market.outcomes, outcome, side]);\n\n const setOrderType = useCallback((type: OrderType) => {\n setOrderTypeRaw(type);\n }, []);\n\n const setOutcome = useCallback((o: TradeOutcome) => {\n setOutcomeRaw(o);\n setLimitPriceRaw(NaN);\n }, []);\n\n useEffect(() => {\n if (orderType === \"limit\" && isNaN(limitPrice)) {\n setLimitPriceRaw(Math.round(pricePerShare * 100) / 100);\n }\n }, [orderType, limitPrice, pricePerShare]);\n\n const shares = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n return side === \"buy\"\n ? pricePerShare > 0\n ? quantity / pricePerShare\n : 0\n : quantity;\n }, [side, quantity, pricePerShare]);\n\n const amountStr = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return \"0\";\n return String(Math.round(quantity * 1_000_000));\n }, [quantity]);\n\n // ---------------------------------------------------------------------------\n // DFlow mints (only used when source === \"kalshi\")\n // ---------------------------------------------------------------------------\n const yesMint = (market.provider_meta?.[\"dflow.yesMint\"] as string) ?? \"\";\n const noMint = (market.provider_meta?.[\"dflow.noMint\"] as string) ?? \"\";\n const usdcMint = SOLANA_TOKENS.stablecoins.USDC.address;\n const collateralMint =\n (market.provider_meta?.[\"dflow.collateralMint\"] as string) || \"\";\n const marketOutcomeMint = outcome === \"yes\" ? yesMint : noMint;\n\n // ---------------------------------------------------------------------------\n // Positions for share balances (fallback when context not available)\n // ---------------------------------------------------------------------------\n const positionUser =\n source === \"kalshi\" ? (userPublicKey ?? \"\") : (evmAddress ?? \"\");\n\n const { data: positionsData, isLoading: positionsLoading } = usePositions(\n { source, user: positionUser },\n { enabled: Boolean(positionUser) },\n );\n\n // ---------------------------------------------------------------------------\n // DFlow sell mint resolution — use position's actual on-chain outcome mint\n // stored in market.provider_meta by the positions API enrichment.\n // A market may have multiple collateral pools with different outcome mints;\n // dflow.outcomeMint carries the one the user actually holds.\n // ---------------------------------------------------------------------------\n const matchingPosition = useMemo(() => {\n if (!positionsData || side !== \"sell\") return null;\n return (\n positionsData.positions.find(\n (p) =>\n p.side?.toLowerCase() === outcome && p.market?.slug === market.slug,\n ) ?? null\n );\n }, [positionsData, market.slug, outcome, side]);\n\n const positionMarketMeta = matchingPosition?.market?.provider_meta;\n const effectiveOutcomeMint =\n (side === \"sell\" &&\n (positionMarketMeta?.[\"dflow.outcomeMint\"] as string)) ||\n marketOutcomeMint;\n const effectiveCollateral =\n (side === \"sell\" &&\n (positionMarketMeta?.[\"dflow.collateralMint\"] as string)) ||\n collateralMint;\n\n // Buy: USDC → outcome\n // Sell: outcome → collateral (USDC or CASH depending on collateral pool)\n const inputMint = side === \"buy\" ? usdcMint : effectiveOutcomeMint;\n const outputMint =\n side === \"buy\" ? marketOutcomeMint : effectiveCollateral || usdcMint;\n\n // ---------------------------------------------------------------------------\n // DFlow quote (only enabled for dflow source)\n // ---------------------------------------------------------------------------\n const quoteEnabled =\n source === \"kalshi\" &&\n Boolean(inputMint) &&\n Boolean(outputMint) &&\n Boolean(userPublicKey) &&\n amountStr !== \"0\";\n\n const { refetch: refetchQuote } = useDFlowQuote(\n {\n inputMint,\n outputMint,\n amount: amountStr,\n userPublicKey: userPublicKey ?? \"\",\n slippageBps: 100,\n },\n { enabled: quoteEnabled },\n );\n\n // ---------------------------------------------------------------------------\n // Resolved balances\n // ---------------------------------------------------------------------------\n const usdcBalance = useMemo(() => {\n if (contextBalance) {\n return source === \"kalshi\"\n ? contextBalance.kalshiUsdcBalance\n : contextBalance.polymarketUsdcBalance;\n }\n if (!positionsData) return null;\n const total = positionsData.positions.reduce((sum, p) => {\n if (p.side === \"USDC\" || p.side === \"collateral\")\n return sum + (p.current_value ?? 0);\n return sum;\n }, 0);\n return total || null;\n }, [contextBalance, positionsData, source]);\n\n const isBalanceLoading = contextBalance\n ? contextBalance.isLoading\n : positionsLoading;\n\n const yesTokenBalance = useMemo(() => {\n if (!positionsData) return null;\n const pos = positionsData.positions.find(\n (p) => p.side?.toLowerCase() === \"yes\" && p.market?.slug === market.slug,\n );\n return pos?.size ?? 0;\n }, [positionsData, market.slug]);\n\n const noTokenBalance = useMemo(() => {\n if (!positionsData) return null;\n const pos = positionsData.positions.find(\n (p) => p.side?.toLowerCase() === \"no\" && p.market?.slug === market.slug,\n );\n return pos?.size ?? 0;\n }, [positionsData, market.slug]);\n\n // ---------------------------------------------------------------------------\n // Cost / payout\n // ---------------------------------------------------------------------------\n const effectivePrice = useMemo(() => {\n if (orderType === \"limit\" && supportsLimitOrder && !isNaN(limitPrice)) {\n return limitPrice;\n }\n return pricePerShare;\n }, [orderType, supportsLimitOrder, limitPrice, pricePerShare]);\n\n const estimatedCost = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") return quantity;\n const bidPrice =\n outcome === \"yes\"\n ? (market.outcomes[0]?.best_bid ?? 0)\n : (market.outcomes[1]?.best_bid ?? 0);\n return quantity * bidPrice;\n }, [side, outcome, quantity, market.outcomes]);\n\n const potentialPayout = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") {\n return effectivePrice > 0 ? (quantity / effectivePrice) * 1 : 0;\n }\n return estimatedCost;\n }, [side, quantity, effectivePrice, estimatedCost]);\n\n const potentialProfit = potentialPayout - estimatedCost;\n\n // ---------------------------------------------------------------------------\n // Setters\n // ---------------------------------------------------------------------------\n const setSide = useCallback((s: TradeSide) => {\n setSideRaw(s);\n setQuantityRaw(NaN);\n }, []);\n\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 const rounded =\n side === \"buy\" ? Math.round(clamped * 100) / 100 : Math.round(clamped);\n setQuantityRaw(rounded);\n },\n [side],\n );\n\n const setLimitPrice = useCallback((v: number) => {\n if (isNaN(v)) {\n setLimitPriceRaw(NaN);\n return;\n }\n const clamped = Math.max(0.01, Math.min(0.99, v));\n setLimitPriceRaw(Math.round(clamped * 100) / 100);\n }, []);\n\n const resetForm = useCallback(() => {\n setQuantityRaw(NaN);\n setLimitPriceRaw(NaN);\n setOrderTypeRaw(\"market\");\n setExpirationEnabled(false);\n setExpirationPreset(\"1h\");\n setCustomDuration(30);\n setCustomDurationUnit(\"minutes\");\n }, []);\n\n // ---------------------------------------------------------------------------\n // Validation\n // ---------------------------------------------------------------------------\n const validation = useMemo<TradeFormValidation>(() => {\n const errors: string[] = [];\n if (isNaN(quantity) || quantity < ORDER_MIN_QUANTITY) {\n errors.push(`Minimum quantity is ${ORDER_MIN_QUANTITY}`);\n }\n if (market.status !== \"open\") {\n errors.push(\"Market is not active\");\n }\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 const holdingBalance = outcome === \"yes\" ? yesTokenBalance : noTokenBalance;\n if (\n side === \"sell\" &&\n holdingBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > holdingBalance\n ) {\n errors.push(\"Insufficient shares\");\n }\n if (\n orderType === \"limit\" &&\n supportsLimitOrder &&\n (isNaN(limitPrice) || limitPrice < 0.01 || limitPrice > 0.99)\n ) {\n errors.push(\"Limit price must be between $0.01 and $0.99\");\n }\n if (\n orderType === \"limit\" &&\n supportsLimitOrder &&\n expirationEnabled &&\n expirationPreset === \"custom\" &&\n (isNaN(customDuration) || customDuration <= 0)\n ) {\n errors.push(t(\"predict.trade.expiration.invalidDate\"));\n }\n return { isValid: errors.length === 0, errors };\n }, [\n quantity,\n market.status,\n side,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n outcome,\n orderType,\n supportsLimitOrder,\n limitPrice,\n expirationEnabled,\n expirationPreset,\n customDuration,\n t,\n ]);\n\n // ---------------------------------------------------------------------------\n // DFlow submit mutation\n // ---------------------------------------------------------------------------\n const { mutateAsync: submitDFlow } = useDFlowSubmit();\n\n // ---------------------------------------------------------------------------\n // Polymarket: context is optional (null when PolymarketProvider is absent)\n // ---------------------------------------------------------------------------\n\n // ---------------------------------------------------------------------------\n // Poll order status for pending DFlow signature\n // ---------------------------------------------------------------------------\n const { data: orderStatus } = useOrder(\n { id: pendingSignature ?? \"\", source },\n { enabled: Boolean(pendingSignature) },\n );\n\n const convertCashToUsdc = useCallback(async () => {\n if (!pendingSellCashConvert || !userPublicKey || !solanaWallet) return;\n const { cashAmount, collateral } = pendingSellCashConvert;\n setPendingSellCashConvert(null);\n\n try {\n const cashQuote = await predictClient.createDFlowQuote({\n inputMint: collateral,\n outputMint: usdcMint,\n amount: cashAmount,\n userPublicKey,\n slippageBps: 100,\n });\n const cashTx = (cashQuote as Record<string, unknown>)?.transaction as\n | string\n | undefined;\n if (!cashTx) return;\n\n const txBytes = Uint8Array.from(atob(cashTx), (c) => c.charCodeAt(0));\n const signedTxBytes = await solanaWallet.signTransaction(txBytes);\n await submitDFlow({\n signedTransaction: btoa(String.fromCharCode(...signedTxBytes)),\n orderContext: {\n user_public_key: userPublicKey,\n input_mint: collateral,\n output_mint: usdcMint,\n amount: cashAmount,\n price: \"1\",\n side: \"SELL\",\n outcome: \"\",\n market_slug: \"\",\n slippage_bps: 100,\n },\n });\n } catch (err) {\n console.error(\"[TradeForm] CASH→USDC conversion failed:\", err);\n }\n }, [\n pendingSellCashConvert,\n userPublicKey,\n solanaWallet,\n predictClient,\n submitDFlow,\n usdcMint,\n ]);\n\n useEffect(() => {\n if (!orderStatus || !pendingSignature) return;\n const { status } = orderStatus;\n if (status === \"closed\") {\n setPendingSignature(null);\n if (pendingSellCashConvert) {\n // Sell confirmed — auto-convert CASH → USDC before showing success\n convertCashToUsdc().finally(() => {\n setIsSubmitting(false);\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n resetForm();\n });\n } else {\n setIsSubmitting(false);\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n resetForm();\n }\n } else if (status === \"failed\" || status === \"expired\") {\n setIsSubmitting(false);\n setPendingSignature(null);\n setPendingSellCashConvert(null);\n toast.error(t(\"predict.trade.submitError\"));\n }\n }, [\n orderStatus,\n pendingSignature,\n pendingSellCashConvert,\n convertCashToUsdc,\n resetForm,\n t,\n ]);\n\n // ---------------------------------------------------------------------------\n // Submit — routes to DFlow or Polymarket based on source\n // ---------------------------------------------------------------------------\n const submitDFlowOrder = useCallback(async () => {\n if (!userPublicKey || !solanaWallet) return;\n\n if (!inputMint || !outputMint) {\n toast.error(\"Missing token mint addresses\");\n setIsSubmitting(false);\n return;\n }\n\n if (!contextKycVerified) {\n setKycRequired(true);\n setIsSubmitting(false);\n return;\n }\n\n const quoteResult = await refetchQuote();\n const quote = quoteResult.data;\n const quoteRecord = quote as Record<string, unknown> | undefined;\n const transaction = quoteRecord?.transaction as string | undefined;\n\n if (!transaction) {\n toast.error(t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n return;\n }\n\n // For sells to non-USDC collateral (e.g. CASH), track the outAmount\n // so we can auto-convert collateral→USDC after the sell completes.\n if (\n side === \"sell\" &&\n effectiveCollateral &&\n effectiveCollateral !== usdcMint\n ) {\n const outAmount = String(quoteRecord?.outAmount ?? \"\");\n if (outAmount && outAmount !== \"0\") {\n setPendingSellCashConvert({\n cashAmount: outAmount,\n collateral: effectiveCollateral,\n });\n }\n }\n\n const txBytes = Uint8Array.from(atob(transaction), (c) => c.charCodeAt(0));\n const signedTxBytes = await solanaWallet.signTransaction(txBytes);\n\n const result = await submitDFlow({\n signedTransaction: btoa(String.fromCharCode(...signedTxBytes)),\n orderContext: {\n user_public_key: userPublicKey,\n input_mint: inputMint,\n output_mint: outputMint,\n amount: amountStr,\n price: String(pricePerShare),\n side: side === \"buy\" ? \"BUY\" : \"SELL\",\n outcome: outcome === \"yes\" ? \"YES\" : \"NO\",\n market_slug: market.slug,\n slippage_bps: 100,\n },\n });\n\n setPendingSignature(result.signature);\n }, [\n userPublicKey,\n solanaWallet,\n predictClient,\n refetchQuote,\n submitDFlow,\n inputMint,\n outputMint,\n amountStr,\n pricePerShare,\n side,\n outcome,\n market.slug,\n effectiveCollateral,\n usdcMint,\n t,\n ]);\n\n const submitPolymarketOrder = useCallback(async () => {\n if (!evmWallet || !polymarketCtx) return;\n\n // Switch to Polygon before submitting; restore original chain afterwards\n const previousChain = evmWallet.chain;\n const needsSwitch = previousChain !== Chain.POLYGON;\n if (needsSwitch) {\n await switchChain(Chain.POLYGON);\n }\n\n try {\n const provider = await evmWallet.getEip1193Provider();\n if (!provider) {\n toast.error(t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n return;\n }\n\n const usesSafe = !!contextSafeAddress;\n const signer: PolymarketSigner = {\n address: evmWallet.address,\n signatureType: usesSafe ? 2 : 0,\n signTypedData: async (domain, types, primaryType, value) => {\n const domainFields: { name: string; type: string }[] = [];\n if (\"name\" in domain)\n domainFields.push({ name: \"name\", type: \"string\" });\n if (\"version\" in domain)\n domainFields.push({ name: \"version\", type: \"string\" });\n if (\"chainId\" in domain)\n domainFields.push({ name: \"chainId\", type: \"uint256\" });\n if (\"verifyingContract\" in domain)\n domainFields.push({ name: \"verifyingContract\", type: \"address\" });\n if (\"salt\" in domain)\n domainFields.push({ name: \"salt\", type: \"bytes32\" });\n\n const fullTypes = { EIP712Domain: domainFields, ...types };\n\n return (await provider.request({\n method: \"eth_signTypedData_v4\",\n params: [\n evmWallet.address,\n JSON.stringify({\n domain,\n types: fullTypes,\n primaryType,\n message: value,\n }),\n ],\n })) as string;\n },\n };\n\n const creds =\n polymarketCtx.credentials ?? (await polymarketCtx.authenticate(signer));\n\n const tokenIdx = outcome === \"yes\" ? 0 : 1;\n let tokenId = \"\";\n const rawClobTokenIds = market.provider_meta?.[\n \"polymarket.clobTokenIds\"\n ] as string | string[] | undefined;\n if (rawClobTokenIds) {\n const ids =\n typeof rawClobTokenIds === \"string\"\n ? (JSON.parse(rawClobTokenIds) as string[])\n : rawClobTokenIds;\n tokenId = ids[tokenIdx] ?? \"\";\n }\n\n const negRisk =\n (market.provider_meta?.[\"polymarket.negRisk\"] as boolean) ?? false;\n\n const price =\n orderType === \"limit\" && !isNaN(limitPrice)\n ? limitPrice\n : pricePerShare;\n\n const polyOrderType =\n orderType === \"limit\" ? (expirationEnabled ? \"GTD\" : \"GTC\") : \"FOK\";\n\n const sizeInShares =\n side === \"buy\" && price > 0 ? quantity / price : quantity;\n\n const input: CreateOrderInput = {\n tokenId,\n price,\n size: sizeInShares,\n side: side === \"buy\" ? \"BUY\" : \"SELL\",\n orderType: polyOrderType,\n tickSize,\n negRisk,\n ...(contextSafeAddress && { funderAddress: contextSafeAddress }),\n ...(orderType === \"limit\" &&\n expirationEnabled && {\n expiration: resolveExpiration(\n expirationPreset,\n customDuration,\n customDurationUnit,\n ),\n }),\n };\n\n const domain = buildCtfExchangeDomain(negRisk);\n const orderMessage = buildOrderMessage({\n ...input,\n signerAddress: signer.address,\n signatureType: signer.signatureType,\n });\n const signature = await signer.signTypedData(\n domain,\n CTF_ORDER_TYPES as unknown as Record<string, unknown[]>,\n \"Order\",\n orderMessage as unknown as Record<string, unknown>,\n );\n const signedOrder = buildSignedOrder(\n orderMessage,\n signature,\n input.orderType,\n );\n\n // Convert to CLOB payload format (numeric salt, string side, deferExec).\n const clobPayload = buildClobPayload(signedOrder, creds.apiKey);\n\n const body = JSON.stringify(clobPayload);\n const headers = await buildPolymarketL2Headers(creds.address, {\n apiKey: creds.apiKey,\n secret: creds.secret,\n passphrase: creds.passphrase,\n method: \"POST\",\n requestPath: \"/order\",\n body,\n });\n\n await predictClient.createPolymarketOrder(\n clobPayload as unknown as CreateOrderInput,\n headers as unknown as Record<string, string>,\n );\n\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"orders\"] });\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"positions\"] });\n\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n resetForm();\n setIsSubmitting(false);\n } finally {\n if (needsSwitch && previousChain) {\n switchChain(previousChain).catch(() => {});\n }\n }\n }, [\n evmWallet,\n polymarketCtx,\n switchChain,\n outcome,\n market.provider_meta,\n orderType,\n limitPrice,\n pricePerShare,\n quantity,\n side,\n predictClient,\n queryClient,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n resetForm,\n t,\n ]);\n\n const submit = useCallback(async () => {\n if (!validation.isValid || !isAuthenticated) return;\n\n setIsSubmitting(true);\n setPendingSignature(null);\n setKycRequired(false);\n\n try {\n if (source === \"kalshi\") {\n await submitDFlowOrder();\n } else {\n await submitPolymarketOrder();\n }\n } catch (err) {\n console.error(\"[TradeForm] submit failed:\", err);\n const detail = err instanceof Error ? err.message : undefined;\n toast.error(detail || t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n }\n }, [\n validation.isValid,\n isAuthenticated,\n source,\n submitDFlowOrder,\n submitPolymarketOrder,\n t,\n ]);\n\n return {\n outcome,\n side,\n orderType,\n quantity,\n limitPrice,\n shares,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n supportsLimitOrder,\n kycRequired,\n kycUrl: contextKycUrl,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n setOutcome,\n setSide,\n setOrderType,\n setQuantity,\n setLimitPrice,\n setExpirationEnabled,\n setExpirationPreset,\n setCustomDuration,\n setCustomDurationUnit,\n submit,\n };\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { StyledModal, ModalContent } from \"@liberfi.io/ui\";\n\nexport interface KycModalProps {\n isOpen: boolean;\n onClose: () => void;\n kycUrl: string | null;\n}\n\nexport function KycModal({ isOpen, onClose, kycUrl }: KycModalProps) {\n const { t } = useTranslation();\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n size=\"md\"\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 pt-5 pb-4\">\n <h3 className=\"text-base font-semibold text-white\">\n {t(\"predict.trade.kycModalTitle\")}\n </h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1 rounded-[10px] hover:bg-[rgba(39,39,42,0.5)] text-zinc-400 hover:text-white transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n {/* Body */}\n <div className=\"px-5 pb-5\">\n <p className=\"text-[13px] text-zinc-400 mb-4 text-left\">\n {t(\"predict.trade.kycModalDescription\")}\n </p>\n\n {/* Checklist */}\n <div className=\"flex flex-col gap-2 mb-4\">\n {(\n [\n \"predict.trade.kycModalBullet1\",\n \"predict.trade.kycModalBullet2\",\n \"predict.trade.kycModalBullet3\",\n ] as const\n ).map((key) => (\n <div\n key={key}\n className=\"flex items-center gap-2.5 text-[13px] text-zinc-300\"\n >\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-[#c7ff2e] shrink-0\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n <span>{t(key)}</span>\n </div>\n ))}\n </div>\n\n {/* KYC link */}\n {kycUrl && (\n <a\n href={kycUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-[13px] text-[#c7ff2e]/70 hover:text-[#c7ff2e] transition-colors mb-3\"\n >\n {t(\"predict.trade.goToKYC\")} →\n </a>\n )}\n\n <p className=\"text-[11px] text-zinc-500 mb-5\">\n {t(\"predict.trade.kycModalNote\")}\n </p>\n\n {/* OK button */}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-full py-2.5 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n {t(\"common.ok\")}\n </button>\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n ChevronDownIcon,\n Tabs,\n Tab,\n StyledNumberInput,\n Select,\n SelectItem,\n StyledSwitch,\n useDisclosure,\n cn,\n} from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { KycModal } from \"../kyc-modal\";\nimport type {\n TradeSide,\n TradeOutcome,\n OrderType,\n ExpirationPreset,\n DurationUnit,\n} from \"./trade-form.script\";\n\nconst USDC_LOGO = `https://s1.chainstream.io/chains/sol/tokens/${SOLANA_TOKENS.stablecoins.USDC.address}/image.png`;\n\nconst EXPIRATION_PRESETS: ExpirationPreset[] = [\n \"5m\",\n \"1h\",\n \"12h\",\n \"24h\",\n \"eod\",\n \"custom\",\n];\n\nconst EXPIRATION_PRESET_I18N = {\n \"5m\": \"predict.trade.expiration.5m\",\n \"1h\": \"predict.trade.expiration.1h\",\n \"12h\": \"predict.trade.expiration.12h\",\n \"24h\": \"predict.trade.expiration.24h\",\n eod: \"predict.trade.expiration.eod\",\n custom: \"predict.trade.expiration.custom\",\n} as const;\n\nconst DURATION_UNITS: DurationUnit[] = [\"minutes\", \"hours\", \"days\"];\n\nconst DURATION_UNIT_I18N = {\n minutes: \"predict.trade.expiration.minutes\",\n hours: \"predict.trade.expiration.hours\",\n days: \"predict.trade.expiration.days\",\n} as const;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TradeFormUIProps {\n event?: StandardEvent;\n market: StandardMarket;\n /** \"bordered\" (default) renders with border + rounded container; \"flat\" omits border (e.g. inside a modal). */\n variant?: \"bordered\" | \"flat\";\n outcome: TradeOutcome;\n side: TradeSide;\n orderType: OrderType;\n quantity: number;\n limitPrice: number;\n shares: number;\n estimatedCost: number;\n potentialPayout: number;\n potentialProfit: number;\n isSubmitting: boolean;\n usdcBalance: number | null;\n yesTokenBalance: number | null;\n noTokenBalance: number | null;\n isBalanceLoading: boolean;\n isValid: boolean;\n validationErrors: string[];\n supportsLimitOrder: boolean;\n kycRequired: boolean;\n kycUrl: string | null;\n expirationEnabled: boolean;\n expirationPreset: ExpirationPreset;\n customDuration: number;\n customDurationUnit: DurationUnit;\n onOutcomeChange: (outcome: TradeOutcome) => void;\n onSideChange: (side: TradeSide) => void;\n onOrderTypeChange: (type: OrderType) => void;\n onQuantityChange: (quantity: number) => void;\n onLimitPriceChange: (price: number) => void;\n onExpirationEnabledChange: (enabled: boolean) => void;\n onExpirationPresetChange: (preset: ExpirationPreset) => void;\n onCustomDurationChange: (v: number) => void;\n onCustomDurationUnitChange: (u: DurationUnit) => void;\n onSubmit: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function TradeFormUI({\n event,\n market,\n variant = \"bordered\",\n outcome,\n side,\n orderType,\n quantity,\n limitPrice,\n shares,\n potentialProfit,\n potentialPayout,\n estimatedCost,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n isValid,\n validationErrors,\n supportsLimitOrder,\n kycRequired,\n kycUrl,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n onOutcomeChange,\n onSideChange,\n onOrderTypeChange,\n onQuantityChange,\n onLimitPriceChange,\n onExpirationEnabledChange,\n onExpirationPresetChange,\n onCustomDurationChange,\n onCustomDurationUnitChange,\n onSubmit,\n}: TradeFormUIProps) {\n const { t } = useTranslation();\n const [showOdds, setShowOdds] = useState(false);\n const kycModal = useDisclosure();\n\n useEffect(() => {\n if (kycRequired && !kycModal.isOpen) {\n kycModal.onOpen();\n }\n }, [kycRequired]);\n\n const currentPriceCents = useMemo(() => {\n const price =\n side === \"buy\"\n ? outcome === \"yes\"\n ? market.yesAsk\n : market.noAsk\n : outcome === \"yes\"\n ? market.yesBid\n : market.noBid;\n return price != null ? parseFloat((Number(price) * 100).toFixed(2)) : null;\n }, [side, outcome, market]);\n\n const hasAmount = !isNaN(quantity) && quantity > 0;\n\n const submitLabel = useMemo(() => {\n if (isSubmitting) return t(\"predict.trade.submitting\");\n if (kycRequired) return t(\"predict.trade.kycRequired\");\n if (!hasAmount) return t(\"predict.trade.enterAmount\");\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 const winAmount =\n side === \"buy\" && potentialProfit > 0\n ? ` → Win $${potentialProfit.toFixed(2)}`\n : \"\";\n return `${sideLabel} ${outcomeLabel}${winAmount}`;\n }, [isSubmitting, kycRequired, hasAmount, side, outcome, potentialProfit, t]);\n\n const submitColor = useMemo(() => {\n return outcome === \"yes\" ? \"primary\" : \"secondary\";\n }, [outcome]);\n\n const handleHalf = () => {\n const bal = usdcBalance ?? 0;\n onQuantityChange(Math.floor((bal / 2) * 100) / 100);\n };\n const handleMax = () => {\n onQuantityChange(usdcBalance ?? 0);\n };\n\n const [showErrors, setShowErrors] = useState(false);\n\n const handleSubmitPress = () => {\n if (kycRequired) {\n kycModal.onOpen();\n return;\n }\n if (!isValid) {\n setShowErrors(true);\n return;\n }\n setShowErrors(false);\n onSubmit();\n };\n\n return (\n <>\n <div\n className={cn(\n \"flex w-full flex-col gap-y-4 p-4\",\n variant === \"bordered\" &&\n \"rounded-xl border border-default-200 bg-content1\",\n )}\n >\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={\n outcome === \"yes\" ? \"text-bullish\" : \"text-bearish\"\n }\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 {market.yesSubTitle}\n </span>\n </span>\n </div>\n </div>\n )}\n\n {/* Market/Limit order-type tabs + current price */}\n <div className=\"flex items-center justify-between\">\n {supportsLimitOrder ? (\n <Tabs\n variant=\"underlined\"\n selectedKey={orderType}\n onSelectionChange={(key) => onOrderTypeChange(key as OrderType)}\n classNames={{\n tabList: \"gap-x-4\",\n tab: \"px-0\",\n }}\n >\n <Tab key=\"market\" title={t(\"predict.trade.market\")} />\n <Tab key=\"limit\" title={t(\"predict.trade.limit\")} />\n </Tabs>\n ) : (\n <span className=\"text-sm font-medium text-foreground\">\n {t(\"predict.trade.market\")}\n </span>\n )}\n {orderType === \"limit\" && supportsLimitOrder ? (\n <StyledNumberInput\n aria-label=\"Limit price\"\n placeholder=\"50\"\n size=\"sm\"\n radius=\"none\"\n value={\n isNaN(limitPrice)\n ? undefined\n : parseFloat((limitPrice * 100).toFixed(2))\n }\n onValueChange={(v) => onLimitPriceChange(v / 100)}\n minValue={1}\n maxValue={99}\n step={1}\n formatOptions={{ maximumFractionDigits: 2 }}\n endContent={\n <span className=\"text-xl font-bold tabular-nums text-foreground\">\n ¢\n </span>\n }\n classNames={{\n base: \"w-28\",\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content2 group-data-[focus=true]:bg-content2 rounded-lg px-2 h-9 min-h-9\",\n input: \"text-xl font-bold tabular-nums text-right\",\n }}\n />\n ) : (\n currentPriceCents != null && (\n <span className=\"text-xl font-bold tabular-nums\">\n {currentPriceCents} ¢\n </span>\n )\n )}\n </div>\n\n {/* TODO: unhide when sell flow is ready */}\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 =\n 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\"\n ? t(\"predict.trade.yes\")\n : 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 {parseFloat((Number(price) * 100).toFixed(2))}¢\n </span>\n ) : null;\n })()}\n </button>\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 {/* Amount / Shares input */}\n <div className=\"flex flex-col gap-y-1.5\">\n <div className=\"flex items-center justify-between text-xs text-neutral-500\">\n <span className=\"text-sm font-medium text-foreground\">\n {side === \"buy\"\n ? t(\"predict.trade.youArePaying\")\n : t(\"predict.trade.contracts\")}\n </span>\n {side === \"buy\" && (\n <div className=\"flex items-center gap-x-2\">\n <img\n src={USDC_LOGO}\n alt=\"USDC\"\n className=\"h-3.5 w-3.5 rounded-full object-cover\"\n />\n <span className=\"font-medium text-foreground tabular-nums\">\n {usdcBalance != null ? `${usdcBalance.toFixed(2)} USDC` : \"–\"}\n </span>\n <button\n type=\"button\"\n onClick={handleHalf}\n className=\"rounded px-1.5 py-0.5 bg-content2 hover:bg-content3 transition-colors cursor-pointer text-foreground font-medium\"\n >\n {t(\"predict.trade.half\")}\n </button>\n <button\n type=\"button\"\n onClick={handleMax}\n className=\"rounded px-1.5 py-0.5 bg-content2 hover:bg-content3 transition-colors cursor-pointer text-foreground font-medium\"\n >\n {t(\"predict.trade.max\")}\n </button>\n </div>\n )}\n </div>\n <StyledNumberInput\n key={side}\n aria-label=\"Trade amount\"\n fullWidth\n placeholder=\"0\"\n radius=\"lg\"\n size=\"lg\"\n value={isNaN(quantity) ? undefined : quantity}\n onValueChange={(v) => {\n setShowErrors(false);\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 {/* Sell side quick percentage buttons */}\n {side === \"sell\" && (\n <div className=\"flex gap-x-2 justify-end\">\n {[25, 50].map((pct) => (\n <button\n key={pct}\n type=\"button\"\n onClick={() => {\n const bal =\n outcome === \"yes\"\n ? (yesTokenBalance ?? 0)\n : (noTokenBalance ?? 0);\n onQuantityChange(Math.floor((bal * pct) / 100));\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 const bal =\n outcome === \"yes\"\n ? (yesTokenBalance ?? 0)\n : (noTokenBalance ?? 0);\n onQuantityChange(bal);\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 </div>\n )}\n\n {showErrors && validationErrors.length > 0 && (\n <div className=\"flex flex-col gap-y-0.5\">\n {validationErrors.map((err) => (\n <span key={err} className=\"text-xs text-danger\">\n {err}\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Limit order expiration (GTD) — only for Polymarket limit orders */}\n {orderType === \"limit\" && supportsLimitOrder && (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-primary\">\n {t(\"predict.trade.setExpiration\")}\n </span>\n <StyledSwitch\n size=\"sm\"\n color=\"primary\"\n isSelected={expirationEnabled}\n onValueChange={onExpirationEnabledChange}\n aria-label={t(\"predict.trade.setExpiration\")}\n />\n </div>\n {expirationEnabled && (\n <>\n <Select\n aria-label={t(\"predict.trade.setExpiration\")}\n selectedKeys={[expirationPreset]}\n onSelectionChange={(keys) => {\n const val = Array.from(keys)[0] as\n | ExpirationPreset\n | undefined;\n if (val) onExpirationPresetChange(val);\n }}\n size=\"sm\"\n radius=\"lg\"\n classNames={{\n trigger:\n \"bg-content2 data-[hover=true]:bg-content2 min-h-10\",\n value: \"text-sm\",\n }}\n >\n {EXPIRATION_PRESETS.map((preset) => (\n <SelectItem key={preset}>\n {t(EXPIRATION_PRESET_I18N[preset])}\n </SelectItem>\n ))}\n </Select>\n {expirationPreset === \"custom\" && (\n <div className=\"flex gap-x-2\">\n <StyledNumberInput\n aria-label=\"Duration amount\"\n size=\"sm\"\n radius=\"lg\"\n value={isNaN(customDuration) ? undefined : customDuration}\n onValueChange={onCustomDurationChange}\n minValue={1}\n step={1}\n formatOptions={{ maximumFractionDigits: 0 }}\n classNames={{\n base: \"flex-1\",\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content2 group-data-[focus=true]:bg-content2 min-h-10\",\n input: \"text-sm\",\n }}\n />\n <Select\n aria-label=\"Duration unit\"\n selectedKeys={[customDurationUnit]}\n onSelectionChange={(keys) => {\n const val = Array.from(keys)[0] as\n | DurationUnit\n | undefined;\n if (val) onCustomDurationUnitChange(val);\n }}\n size=\"sm\"\n radius=\"lg\"\n classNames={{\n base: \"w-32\",\n trigger:\n \"bg-content2 data-[hover=true]:bg-content2 min-h-10\",\n value: \"text-sm\",\n }}\n >\n {DURATION_UNITS.map((u) => (\n <SelectItem key={u}>\n {t(DURATION_UNIT_I18N[u])}\n </SelectItem>\n ))}\n </Select>\n </div>\n )}\n </>\n )}\n </div>\n )}\n\n {/* Odds collapsible row */}\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"flex items-center justify-between text-sm\">\n <button\n type=\"button\"\n onClick={() => setShowOdds((v) => !v)}\n className=\"flex items-center gap-x-1 text-neutral-500 hover:text-foreground cursor-pointer transition-colors\"\n >\n <span>{t(\"predict.trade.odds\")}</span>\n <ChevronDownIcon\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n showOdds && \"rotate-180\",\n )}\n />\n </button>\n {currentPriceCents != null && (\n <span className=\"text-foreground font-medium tabular-nums\">\n {currentPriceCents}% chance\n </span>\n )}\n </div>\n {showOdds && (\n <div className=\"flex flex-col gap-y-1.5 border-l-2 border-default-300 pl-3 text-sm text-neutral-500\">\n <div className=\"flex items-center justify-between\">\n <span>Total Size</span>\n <span className=\"tabular-nums text-foreground\">\n {!isNaN(quantity) && quantity > 0\n ? `$${estimatedCost.toFixed(2)}`\n : \"–\"}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span>No. of Contracts</span>\n <span className=\"tabular-nums text-foreground\">\n {!isNaN(shares) && shares > 0\n ? parseFloat(shares.toFixed(2))\n : \"–\"}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span>Payout</span>\n <span className=\"tabular-nums text-foreground\">\n {!isNaN(quantity) && quantity > 0\n ? `$${potentialPayout.toFixed(2)}`\n : \"–\"}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span>Est. Profit</span>\n <span className=\"tabular-nums text-bullish\">\n {!isNaN(quantity) && quantity > 0 && potentialProfit > 0\n ? `+$${potentialProfit.toFixed(2)}`\n : \"–\"}\n </span>\n </div>\n </div>\n )}\n </div>\n\n {/* Submit button */}\n <Button\n color={submitColor as \"primary\" | \"secondary\" | \"default\"}\n fullWidth\n radius=\"lg\"\n size=\"lg\"\n isDisabled={!hasAmount || isSubmitting}\n isLoading={isSubmitting}\n onPress={handleSubmitPress}\n >\n {submitLabel}\n </Button>\n </div>\n\n <KycModal\n isOpen={kycModal.isOpen}\n onClose={kycModal.onClose}\n kycUrl={kycUrl}\n />\n </>\n );\n}\n","import { useMemo } from \"react\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport {\n predictEventToStandard,\n predictMarketToStandard,\n} from \"../../utils/predict-market-adapter\";\nimport {\n useTradeForm,\n type TradeOutcome,\n type TradeSide,\n type ExpirationPreset,\n} from \"./trade-form.script\";\nimport { TradeFormUI } from \"./trade-form.ui\";\n\nexport interface TradeFormWidgetProps {\n event?: PredictEvent;\n market: PredictMarket;\n variant?: \"bordered\" | \"flat\";\n initialSide?: TradeSide;\n initialOutcome?: TradeOutcome;\n chain?: string;\n}\n\nexport function TradeFormWidget({\n event,\n market,\n variant,\n initialSide,\n initialOutcome,\n chain,\n}: TradeFormWidgetProps) {\n const {\n outcome,\n side,\n orderType,\n quantity,\n limitPrice,\n shares,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n supportsLimitOrder,\n kycRequired,\n kycUrl,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n setOutcome,\n setSide,\n setOrderType,\n setQuantity,\n setLimitPrice,\n setExpirationEnabled,\n setExpirationPreset,\n setCustomDuration,\n setCustomDurationUnit,\n submit,\n } = useTradeForm({\n market,\n initialSide,\n initialOutcome,\n chain,\n });\n\n const authenticatedSubmit = useAuthCallback(submit);\n\n const adaptedEvent = useMemo(\n () => (event ? predictEventToStandard(event) : undefined),\n [event],\n );\n const adaptedMarket = useMemo(\n () => predictMarketToStandard(market),\n [market],\n );\n\n return (\n <TradeFormUI\n event={adaptedEvent}\n market={adaptedMarket}\n variant={variant}\n outcome={outcome}\n side={side}\n orderType={orderType}\n quantity={quantity}\n limitPrice={limitPrice}\n shares={shares}\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 supportsLimitOrder={supportsLimitOrder}\n kycRequired={kycRequired}\n kycUrl={kycUrl}\n expirationEnabled={expirationEnabled}\n expirationPreset={expirationPreset}\n customDuration={customDuration}\n customDurationUnit={customDurationUnit}\n onOutcomeChange={setOutcome}\n onSideChange={setSide}\n onOrderTypeChange={setOrderType}\n onQuantityChange={setQuantity}\n onLimitPriceChange={setLimitPrice}\n onExpirationEnabledChange={setExpirationEnabled}\n onExpirationPresetChange={setExpirationPreset}\n onCustomDurationChange={setCustomDuration}\n onCustomDurationUnitChange={setCustomDurationUnit}\n onSubmit={authenticatedSubmit}\n />\n );\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { ModalContent, StyledModal, useScreen } from \"@liberfi.io/ui\";\nimport {\n AsyncModal,\n type RenderAsyncModalProps,\n} from \"@liberfi.io/ui-scaffold\";\nimport type { TradeOutcome, TradeSide } from \"./trade-form.script\";\nimport { TradeFormWidget } from \"./trade-form.widget\";\n\nexport type PredictTradeModalParams = {\n event: PredictEvent;\n market: PredictMarket;\n initialOutcome?: TradeOutcome;\n initialSide?: TradeSide;\n chain?: string;\n};\n\nexport type PredictTradeModalResult = void;\n\nexport const PREDICT_TRADE_MODAL_ID = \"predict-trade\";\n\nexport function PredictTradeModal({\n id = PREDICT_TRADE_MODAL_ID,\n}: {\n id?: string;\n}) {\n return (\n <AsyncModal<PredictTradeModalParams, PredictTradeModalResult> id={id}>\n {(modalProps) => <PredictTradeModalContent {...modalProps} />}\n </AsyncModal>\n );\n}\n\nfunction PredictTradeModalContent({\n params,\n isOpen,\n onOpenChange,\n}: RenderAsyncModalProps<PredictTradeModalParams, PredictTradeModalResult>) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n if (!params) return null;\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size={isMobile ? \"lg\" : \"md\"}\n backdrop=\"blur\"\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 pt-5 pb-4\">\n <h3 className=\"text-base font-semibold text-white\">\n {t(\"predict.trade.action\")}\n </h3>\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className=\"p-1 rounded-[10px] hover:bg-[rgba(39,39,42,0.5)] text-zinc-400 hover:text-white transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n {/* Body */}\n <div className=\"px-5 pb-5\">\n <TradeFormWidget\n event={params.event}\n market={params.market}\n initialOutcome={params.initialOutcome}\n initialSide={params.initialSide ?? \"buy\"}\n chain={params.chain}\n variant=\"flat\"\n />\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n","// =============================================================================\n// EventsFilterUI\n//\n// Filter modal for the events list. Contains chip-based filter sections:\n// - Platform (source provider)\n// - Time Remaining\n// - Min Volume\n// - Min Liquidity\n//\n// Visual style aligned with the matches page dark zinc theme.\n// Pure presentational component — state is managed by the parent page via\n// a draft-and-apply pattern: the modal works on a draft copy of the filter\n// state, and only commits changes when \"Show Results\" is pressed.\n// =============================================================================\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { ProviderSource } from \"@liberfi.io/react-predict\";\nimport { StyledModal, ModalContent } from \"@liberfi.io/ui\";\nimport type { SortPreset } from \"./events-toolbar.ui\";\n\n// -----------------------------------------------------------------------------\n// Filter state type\n// -----------------------------------------------------------------------------\n\nexport interface EventsFilterState {\n sortPreset: SortPreset;\n sortAsc: boolean;\n source?: ProviderSource;\n timeRemaining?: string;\n minVolume?: string;\n minLiquidity?: string;\n}\n\nexport const DEFAULT_FILTER_STATE: EventsFilterState = {\n sortPreset: \"volume\",\n sortAsc: false,\n source: undefined,\n timeRemaining: undefined,\n minVolume: undefined,\n minLiquidity: undefined,\n};\n\n/** Count how many non-default filters are active (excluding sortPreset) */\nexport function countActiveFilters(state: EventsFilterState): number {\n let count = 0;\n if (state.source) count++;\n if (state.timeRemaining) count++;\n if (state.minVolume) count++;\n if (state.minLiquidity) count++;\n return count;\n}\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsFilterUIProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Callback to close the modal */\n onClose: () => void;\n /** Current committed filter state */\n value: EventsFilterState;\n /** Callback when \"Show Results\" is pressed with the new filter state */\n onChange: (state: EventsFilterState) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsFilterUI({\n isOpen,\n onClose,\n value,\n onChange,\n}: EventsFilterUIProps) {\n const { t } = useTranslation();\n\n const [draft, setDraft] = useState<EventsFilterState>(value);\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (open) {\n setDraft(value);\n } else {\n onClose();\n }\n },\n [value, onClose],\n );\n\n const handleReset = useCallback(() => {\n setDraft(DEFAULT_FILTER_STATE);\n }, []);\n\n const handleApply = useCallback(() => {\n onChange(draft);\n onClose();\n }, [draft, onChange, onClose]);\n\n const updateDraft = useCallback(\n <K extends keyof EventsFilterState>(key: K, val: EventsFilterState[K]) => {\n setDraft((prev) => ({ ...prev, [key]: val }));\n },\n [],\n );\n\n const activeCount = useMemo(() => countActiveFilters(draft), [draft]);\n\n const platformOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"polymarket\" as const, label: t(\"predict.platform.polymarket\") },\n { value: \"kalshi\" as const, label: t(\"predict.platform.kalshi\") },\n ],\n [t],\n );\n\n const timeRemainingOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1d\", label: t(\"predict.filter.lessThanDay\") },\n { value: \"7d\", label: t(\"predict.filter.lessThanWeek\") },\n { value: \"30d\", label: t(\"predict.filter.lessThanMonth\") },\n ],\n [t],\n );\n\n const volumeOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1000\", label: \">$1K\" },\n { value: \"10000\", label: \">$10K\" },\n { value: \"100000\", label: \">$100K\" },\n { value: \"1000000\", label: \">$1M\" },\n ],\n [t],\n );\n\n const liquidityOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1000\", label: \">$1K\" },\n { value: \"10000\", label: \">$10K\" },\n { value: \"100000\", label: \">$100K\" },\n { value: \"1000000\", label: \">$1M\" },\n ],\n [t],\n );\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={handleOpenChange}\n size=\"md\"\n backdrop=\"blur\"\n scrollBehavior=\"inside\"\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 pt-5 pb-4\">\n <h3 className=\"text-base font-semibold text-white\">\n {t(\"predict.filter.title\")}\n </h3>\n <CloseButton onClick={() => handleOpenChange(false)} />\n </div>\n\n {/* Body */}\n <div\n style={{\n padding: \"0 20px 16px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 20,\n }}\n >\n <FilterSection label={t(\"predict.filter.platform\")}>\n <FilterChipGroup\n options={platformOptions}\n selected={draft.source}\n onSelect={(v) =>\n updateDraft(\"source\", v as ProviderSource | undefined)\n }\n />\n </FilterSection>\n\n <FilterSection label={t(\"predict.filter.timeRemaining\")}>\n <FilterChipGroup\n options={timeRemainingOptions}\n selected={draft.timeRemaining}\n onSelect={(v) => updateDraft(\"timeRemaining\", v)}\n />\n </FilterSection>\n\n <FilterSection label={t(\"predict.filter.minVolume\")}>\n <FilterChipGroup\n options={volumeOptions}\n selected={draft.minVolume}\n onSelect={(v) => updateDraft(\"minVolume\", v)}\n />\n </FilterSection>\n\n <FilterSection label={t(\"predict.filter.minLiquidity\")}>\n <FilterChipGroup\n options={liquidityOptions}\n selected={draft.minLiquidity}\n onSelect={(v) => updateDraft(\"minLiquidity\", v)}\n />\n </FilterSection>\n </div>\n\n {/* Footer */}\n <div\n className=\"flex items-center gap-3 px-5 py-4\"\n style={{ borderTop: \"1px solid rgba(39,39,42,0.5)\" }}\n >\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center py-2.5 px-5 rounded-[10px] text-zinc-400 text-sm font-medium hover:text-white transition-colors cursor-pointer\"\n onClick={handleReset}\n >\n {t(\"predict.filter.reset\")}\n </button>\n <button\n type=\"button\"\n className=\"flex-1 inline-flex items-center justify-center gap-2 py-2.5 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer\"\n onClick={handleApply}\n >\n {t(\"predict.filter.showResults\")}\n {activeCount > 0 && (\n <span style={{ opacity: 0.7 }}>({activeCount})</span>\n )}\n </button>\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Filter section wrapper\n// -----------------------------------------------------------------------------\n\nfunction FilterSection({\n label,\n children,\n}: {\n label: string;\n children: React.ReactNode;\n}) {\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n <span\n style={{\n fontSize: 11,\n fontWeight: 500,\n color: \"#71717a\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n }}\n >\n {label}\n </span>\n {children}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// FilterChipGroup — reusable chip selection row\n// -----------------------------------------------------------------------------\n\ninterface ChipOption {\n value: string | undefined;\n label: string;\n}\n\ninterface FilterChipGroupProps {\n options: ChipOption[];\n selected: string | undefined;\n onSelect: (value: string | undefined) => void;\n allowDeselect?: boolean;\n}\n\n// -----------------------------------------------------------------------------\n// Close button (matches KYC modal style)\n// -----------------------------------------------------------------------------\n\nfunction CloseButton({ onClick }: { onClick: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"p-1 rounded-[10px] hover:bg-[rgba(39,39,42,0.5)] text-zinc-400 hover:text-white transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// FilterChipGroup — reusable chip selection row\n// -----------------------------------------------------------------------------\n\nfunction FilterChipGroup({\n options,\n selected,\n onSelect,\n allowDeselect = true,\n}: FilterChipGroupProps) {\n return (\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\n {options.map((opt) => {\n const isActive = selected === opt.value;\n return (\n <button\n key={opt.value ?? \"__all\"}\n type=\"button\"\n onClick={() => {\n if (isActive && allowDeselect) {\n onSelect(undefined);\n } else {\n onSelect(opt.value);\n }\n }}\n style={{\n flexShrink: 0,\n borderRadius: 10,\n padding: \"6px 14px\",\n fontSize: 13,\n fontWeight: 500,\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n border: isActive\n ? \"1px solid rgba(199,255,46,0.3)\"\n : \"1px solid rgba(63,63,70,0.5)\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"rgba(39,39,42,0.4)\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.8)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.4)\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","// =============================================================================\n// EventsToolbarUI\n//\n// Toolbar bar between categories and the events grid. Contains:\n// - Sort pill: sort-field dropdown + ascending/descending toggle\n// - Filter button with active-filter badge\n//\n// Visual style aligned with the matches filter bar (dark zinc theme).\n// Pure presentational component — state is managed by the parent page.\n// =============================================================================\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { EventSortField } from \"@liberfi.io/react-predict\";\nimport {\n CalendarIcon,\n ChartLineIcon,\n DropletIcon,\n TimerIcon,\n} from \"@liberfi.io/ui\";\n\n// -----------------------------------------------------------------------------\n// Sort presets\n// -----------------------------------------------------------------------------\n\nexport type SortPreset = \"start_time\" | \"volume\" | \"liquidity\" | \"ending_soon\";\n\nexport const SORT_PRESETS: Record<SortPreset, { sort_by: EventSortField }> = {\n start_time: { sort_by: \"created_at\" },\n volume: { sort_by: \"volume\" },\n liquidity: { sort_by: \"liquidity\" },\n ending_soon: { sort_by: \"end_at\" },\n};\n\nconst SORT_LABEL_KEYS = {\n start_time: \"predict.sort.startTime\",\n volume: \"predict.sort.volume\",\n liquidity: \"predict.sort.liquidity\",\n ending_soon: \"predict.sort.endingSoon\",\n} as const;\n\nconst SORT_ORDER: SortPreset[] = [\n \"start_time\",\n \"volume\",\n \"liquidity\",\n \"ending_soon\",\n];\n\n// -----------------------------------------------------------------------------\n// Shared inline styles (matches filter bar theme)\n// -----------------------------------------------------------------------------\n\nconst btnBase: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"8px 12px\",\n fontSize: 14,\n color: \"#d4d4d8\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n};\n\nconst dropdownBase: React.CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: \"100%\",\n zIndex: 20,\n marginTop: 8,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n};\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsToolbarUIProps {\n /** Currently active sort preset */\n sortPreset: SortPreset;\n /** Callback when the user picks a different sort preset */\n onSortChange: (preset: SortPreset) => void;\n /** Current sort direction: true = ascending, false = descending */\n sortAsc: boolean;\n /** Callback when the user toggles the sort direction */\n onSortAscChange: (asc: boolean) => void;\n /** Callback when the filter button is pressed */\n onFilterPress: () => void;\n /** Number of currently active filters (shown as badge count) */\n filterCount?: number;\n /** Optional class name for the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsToolbarUI({\n sortPreset,\n onSortChange,\n sortAsc,\n onSortAscChange,\n onFilterPress,\n filterCount = 0,\n className,\n}: EventsToolbarUIProps) {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = useCallback((e: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n }\n }, []);\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [handleClickOutside]);\n\n useEffect(() => {\n if (!isOpen) return;\n const onEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"keydown\", onEscape);\n return () => document.removeEventListener(\"keydown\", onEscape);\n }, [isOpen]);\n\n const ActiveIcon = SORT_ICONS[sortPreset];\n\n return (\n <div\n className={className}\n style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}\n >\n {/* Sort dropdown */}\n <div ref={dropdownRef} style={{ position: \"relative\" }}>\n <button\n type=\"button\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={() => setIsOpen((v) => !v)}\n >\n <SortIcon />\n <ActiveIcon\n className=\"size-4 shrink-0\"\n style={{ color: \"#a1a1aa\" }}\n />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {t(SORT_LABEL_KEYS[sortPreset])}\n </span>\n <ChevronDown open={isOpen} />\n </button>\n\n {isOpen && (\n <div style={{ ...dropdownBase, width: 224, padding: 4 }}>\n {SORT_ORDER.map((key) => {\n const Icon = SORT_ICONS[key];\n const isActive = sortPreset === key;\n return (\n <button\n key={key}\n type=\"button\"\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n gap: 12,\n padding: \"10px 12px\",\n textAlign: \"left\",\n fontSize: 14,\n border: \"none\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"transparent\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n borderRadius: 10,\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.5)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n onClick={() => {\n if (sortPreset === key) {\n onSortAscChange(!sortAsc);\n } else {\n onSortChange(key);\n }\n setIsOpen(false);\n }}\n >\n <Icon\n className=\"size-4 shrink-0\"\n style={{ color: isActive ? \"#c7ff2e\" : \"#71717a\" }}\n />\n <span style={{ flex: 1, fontWeight: 500 }}>\n {t(SORT_LABEL_KEYS[key])}\n </span>\n {isActive && (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 16,\n height: 16,\n color: \"#c7ff2e\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Sort direction toggle */}\n <button\n type=\"button\"\n style={{\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n width: 36,\n height: 36,\n color: \"#a1a1aa\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 14,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n e.currentTarget.style.color = \"#fff\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }}\n onClick={() => onSortAscChange(!sortAsc)}\n >\n {sortAsc ? \"↑\" : \"↓\"}\n </button>\n\n {/* Filter button */}\n <div style={{ position: \"relative\", display: \"inline-flex\" }}>\n <button\n type=\"button\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={onFilterPress}\n >\n <FilterBarIcon />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {t(\"predict.filter.title\")}\n </span>\n </button>\n {filterCount > 0 && (\n <span\n style={{\n position: \"absolute\",\n top: -4,\n right: -4,\n minWidth: 16,\n height: 16,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 8,\n background: \"#c7ff2e\",\n color: \"#000\",\n fontSize: 10,\n fontWeight: 600,\n padding: \"0 4px\",\n }}\n >\n {filterCount}\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Sort option icon map\n// -----------------------------------------------------------------------------\n\nconst SORT_ICONS: Record<\n SortPreset,\n React.FC<{ className?: string; style?: React.CSSProperties }>\n> = {\n start_time: CalendarIcon,\n volume: ChartLineIcon,\n liquidity: DropletIcon,\n ending_soon: TimerIcon,\n};\n\n// -----------------------------------------------------------------------------\n// Inline SVG icons\n// -----------------------------------------------------------------------------\n\nfunction SortIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m21 16-4 4-4-4\" />\n <path d=\"M17 20V4\" />\n <path d=\"m3 8 4-4 4 4\" />\n <path d=\"M7 4v16\" />\n </svg>\n );\n}\n\nfunction FilterBarIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\" />\n </svg>\n );\n}\n\nfunction ChevronDown({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#71717a\",\n transition: \"transform 0.15s\",\n transform: open ? \"rotate(180deg)\" : undefined,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n","// =============================================================================\n// Events list script\n//\n// Composes resolveEventsParams() and useInfiniteEvents() from @liberfi.io/react-predict.\n// Owns flattened page data and fetchMore / hasMore helpers for the events grid UI.\n// =============================================================================\nimport { useMemo, useCallback } from \"react\";\nimport type {\n PredictEvent,\n ListEventsParams,\n ResolveEventsParamsInput,\n} from \"@liberfi.io/react-predict\";\nimport {\n resolveEventsParams,\n useInfiniteEvents as usePredictInfiniteEvents,\n} from \"@liberfi.io/react-predict\";\n\nexport type {\n PredictEvent,\n ListEventsParams,\n PredictPage,\n EventSortField,\n EventStatus,\n ProviderSource,\n ResolveEventsParamsInput,\n} from \"@liberfi.io/react-predict\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/** Parameters for useEventsInfinite */\nexport type UseEventsInfiniteParams = ResolveEventsParamsInput;\n\n/** Return value of useEventsInfinite */\nexport interface UseEventsInfiniteResult {\n data: PredictEvent[];\n isLoading: boolean;\n isFetching: boolean;\n isFetchingMore: boolean;\n isError: boolean;\n error: Error | null;\n hasMore: boolean;\n fetchMore: () => void;\n refetch: () => void;\n}\n\n// -----------------------------------------------------------------------------\n// Hook\n// -----------------------------------------------------------------------------\n\n/**\n * Infinite events list hook with flattened pages for virtualized grids.\n *\n * Wraps {@link useInfiniteEvents} from `@liberfi.io/react-predict` and exposes\n * a single `data` array plus loading helpers matching legacy list-hook ergonomics.\n */\nexport function useEventsInfinite(\n params: UseEventsInfiniteParams = {},\n): UseEventsInfiniteResult {\n const baseParams = useMemo<ListEventsParams>(\n () => resolveEventsParams(params),\n [\n params.tagSlugSelection,\n params.limit,\n params.status,\n params.sort_by,\n params.sort_asc,\n params.source,\n params.with_markets,\n params.minVolume,\n params.minLiquidity,\n params.timeRemaining,\n ],\n );\n\n const {\n data: infiniteData,\n isLoading,\n isFetching,\n isFetchingNextPage: isFetchingMore,\n isError,\n error,\n hasNextPage: hasMore,\n fetchNextPage,\n refetch,\n } = usePredictInfiniteEvents(baseParams);\n\n const data = useMemo(\n () =>\n infiniteData?.pages\n .flatMap((page) => page.items)\n .filter((item): item is PredictEvent => item != null) ?? [],\n [infiniteData],\n );\n\n const fetchMore = useCallback(() => {\n void fetchNextPage();\n }, [fetchNextPage]);\n\n const refetchAll = useCallback(() => {\n void refetch();\n }, [refetch]);\n\n return {\n data,\n isLoading,\n isFetching: isFetching && !isFetchingMore,\n isFetchingMore,\n isError,\n error: error ?? null,\n hasMore: hasMore ?? false,\n fetchMore,\n refetch: refetchAll,\n };\n}\n","import { DEFAULT_PAGE_SIZE } from \"../../consts\";\n\n// ---------------------------------------------------------------------------\n// Shimmer animation keyframes (injected once per mount)\n// ---------------------------------------------------------------------------\n\nconst SHIMMER_CSS = `@keyframes evtShimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}@media(max-width:1279px){.evt-skel-grid{grid-template-columns:repeat(3,1fr)!important}}@media(max-width:1023px){.evt-skel-grid{grid-template-columns:repeat(2,1fr)!important}}@media(max-width:767px){.evt-skel-grid{grid-template-columns:1fr!important}}`;\n\n// ---------------------------------------------------------------------------\n// EventsSkeleton — card grid skeleton matching EventItem layout\n// ---------------------------------------------------------------------------\n\nexport interface EventsSkeletonProps {\n count?: number;\n}\n\nexport function EventsSkeleton({ count = 6 }: EventsSkeletonProps) {\n return (\n <>\n <style>{SHIMMER_CSS}</style>\n <div\n className=\"evt-skel-grid\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(4, 1fr)\",\n width: \"100%\",\n }}\n >\n {Array.from({ length: count }).map((_, i) => (\n <SkeletonCard key={i} index={i} />\n ))}\n </div>\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SkeletonCard — mirrors EventItem: header + 3 outcome rows + footer\n// ---------------------------------------------------------------------------\n\nfunction SkeletonCard({ index }: { index: number }) {\n const delay = index * 120;\n const shimmer: React.CSSProperties = {\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.03) 25%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0.03) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: `evtShimmer 1.8s ease-in-out infinite ${delay}ms`,\n borderRadius: 6,\n };\n\n const titleWidth = index % 3 === 0 ? \"85%\" : index % 3 === 1 ? \"70%\" : \"60%\";\n\n return (\n <div style={{ padding: 8 }}>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n }}\n >\n {/* Header: avatar + title */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"14px 14px 8px\",\n }}\n >\n <div\n style={{\n ...shimmer,\n width: 36,\n height: 36,\n borderRadius: 10,\n flexShrink: 0,\n }}\n />\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n <div style={{ ...shimmer, height: 12, width: titleWidth }} />\n <div style={{ ...shimmer, height: 10, width: \"40%\" }} />\n </div>\n </div>\n\n {/* Body: 3 outcome rows */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n padding: \"4px 14px 14px\",\n flex: 1,\n }}\n >\n {[0, 1, 2].map((j) => (\n <div\n key={j}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n }}\n >\n <div\n style={{\n ...shimmer,\n height: 11,\n width: j === 0 ? \"55%\" : j === 1 ? \"45%\" : \"35%\",\n }}\n />\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <div style={{ ...shimmer, height: 11, width: 32 }} />\n <div\n style={{\n ...shimmer,\n height: 28,\n width: 80,\n borderRadius: 8,\n }}\n />\n </div>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.15)\",\n padding: \"8px 14px\",\n }}\n >\n <div style={{ ...shimmer, height: 10, width: 56 }} />\n <div style={{ ...shimmer, height: 10, width: 72 }} />\n </div>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// EventsPageSkeleton — full page: categories + toolbar + card grid\n// ---------------------------------------------------------------------------\n\nexport interface EventsPageSkeletonProps extends EventsSkeletonProps {}\n\nexport function EventsPageSkeleton({\n count = DEFAULT_PAGE_SIZE,\n}: EventsPageSkeletonProps) {\n const bar: React.CSSProperties = {\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.03) 25%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0.03) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: \"evtShimmer 1.8s ease-in-out infinite\",\n borderRadius: 6,\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n width: \"100%\",\n maxWidth: 1680,\n margin: \"0 auto\",\n gap: 12,\n }}\n >\n <style>{SHIMMER_CSS}</style>\n\n {/* Categories placeholder */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n {[48, 64, 48, 56, 72, 56].map((w, i) => (\n <div key={i} style={{ ...bar, height: 24, width: w }} />\n ))}\n </div>\n\n {/* Toolbar placeholder */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n gap: 8,\n minHeight: 36,\n }}\n >\n <div style={{ ...bar, height: 32, width: 120, borderRadius: 10 }} />\n <div style={{ ...bar, height: 32, width: 32, borderRadius: 10 }} />\n <div style={{ ...bar, height: 32, width: 80, borderRadius: 10 }} />\n </div>\n\n {/* Card grid */}\n <div style={{ flex: 1, minHeight: 0 }}>\n <EventsSkeleton count={count} />\n </div>\n </div>\n );\n}\n","// =============================================================================\n// EventItem\n//\n// Event card with three modes:\n// 1. **List view** — header + up to 3 outcome rows with a compact Yes/No\n// pill + footer (Show More / volume).\n// 2. **Single view** — header + single market with large Yes/No buy\n// buttons + View Event link.\n// 3. **Expanded view** — header + single market with large Yes/No buy\n// buttons + Back link.\n//\n// Pixel-perfect clone of the Jupiter Prediction Market card design.\n// =============================================================================\nimport { useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n PredictEvent,\n PredictMarket,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport {\n Avatar,\n ChevronUpIcon,\n cn,\n KalshiIcon,\n Linkable,\n PolymarketIcon,\n TimerIcon,\n} from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport type EventItemProps = {\n event: PredictEvent;\n /** URL for the detail page. When set, header / Show More render as links. */\n href?: string;\n /** Custom link component (e.g. next/link). Passed to Linkable. */\n LinkComponent?: LinkComponentType;\n onSelect?: (event: PredictEvent) => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n /** Called when the card is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n};\n\n// -----------------------------------------------------------------------------\n// Constants\n// -----------------------------------------------------------------------------\n\nconst MAX_DISPLAYED_OUTCOMES = 3;\n\n// -----------------------------------------------------------------------------\n// Platform-specific hover glow colors\n// -----------------------------------------------------------------------------\n\ntype GlowColor = { border: string; shadow: string };\n\nconst SOURCE_GLOW: Record<string, GlowColor> = {\n polymarket: {\n border: \"rgba(80,162,255,0.4)\",\n shadow: \"0 2px 18px rgba(80,162,255,0.45)\",\n },\n kalshi: {\n border: \"rgba(0,212,146,0.4)\",\n shadow: \"0 2px 18px rgba(0,212,146,0.45)\",\n },\n};\n\nconst GLOW_FALLBACK: GlowColor = {\n border: \"hsl(var(--heroui-primary) / 0.4)\",\n shadow: \"0 2px 18px hsl(var(--heroui-primary) / 0.45)\",\n};\n\n// -----------------------------------------------------------------------------\n// Outcome color scheme — 8-color palette with deterministic hash selection\n// -----------------------------------------------------------------------------\n\ntype OutcomeColor = { bg: string; text: string; shadow: string };\n\nconst C_PRIMARY: OutcomeColor = {\n bg: \"hsl(var(--heroui-primary) / 0.14)\",\n text: \"hsl(var(--heroui-primary))\",\n shadow: \"hsl(var(--heroui-primary) / 0.18)\",\n};\n\nconst C_SECONDARY: OutcomeColor = {\n bg: \"hsl(var(--heroui-secondary) / 0.14)\",\n text: \"hsl(var(--heroui-secondary))\",\n shadow: \"hsl(var(--heroui-secondary) / 0.18)\",\n};\n\nconst C_RED: OutcomeColor = {\n bg: \"rgba(239, 68, 68, 0.14)\",\n text: \"rgb(239, 68, 68)\",\n shadow: \"rgba(239, 68, 68, 0.18)\",\n};\n\nconst TEAM_PALETTE: OutcomeColor[] = [\n {\n bg: \"rgba(139,92,246,0.14)\",\n text: \"rgb(139,92,246)\",\n shadow: \"rgba(139,92,246,0.18)\",\n },\n {\n bg: \"rgba(34,197,94,0.14)\",\n text: \"rgb(34,197,94)\",\n shadow: \"rgba(34,197,94,0.18)\",\n },\n {\n bg: \"rgba(0,166,212,0.14)\",\n text: \"rgb(0,166,212)\",\n shadow: \"rgba(0,166,212,0.18)\",\n },\n {\n bg: \"rgba(194,120,32,0.14)\",\n text: \"rgb(194,120,32)\",\n shadow: \"rgba(194,120,32,0.18)\",\n },\n {\n bg: \"rgba(202,138,4,0.14)\",\n text: \"rgb(202,138,4)\",\n shadow: \"rgba(202,138,4,0.18)\",\n },\n {\n bg: \"rgba(236,72,153,0.14)\",\n text: \"rgb(236,72,153)\",\n shadow: \"rgba(236,72,153,0.18)\",\n },\n {\n bg: \"rgba(99,102,241,0.14)\",\n text: \"rgb(99,102,241)\",\n shadow: \"rgba(99,102,241,0.18)\",\n },\n {\n bg: \"rgba(244,114,82,0.14)\",\n text: \"rgb(244,114,82)\",\n shadow: \"rgba(244,114,82,0.18)\",\n },\n];\n\nfunction hashString(s: string): number {\n let hash = 0;\n for (let i = 0; i < s.length; i++) {\n hash = ((hash << 5) - hash + s.charCodeAt(i)) | 0;\n }\n return Math.abs(hash);\n}\n\nfunction getOutcomeColors(market: PredictMarket): [OutcomeColor, OutcomeColor] {\n const labels =\n market.outcomes?.map((o) => o.label?.toLowerCase().trim() ?? \"\") ?? [];\n\n if (labels.some((l) => l === \"up\") && labels.some((l) => l === \"down\")) {\n return [C_PRIMARY, C_RED];\n }\n\n if (labels.some((l) => l === \"yes\") && labels.some((l) => l === \"no\")) {\n return [C_PRIMARY, C_SECONDARY];\n }\n\n const label0 = labels[0] ?? \"\";\n const label1 = labels[1] ?? \"\";\n const idx0 = hashString(label0) % TEAM_PALETTE.length;\n let idx1 = hashString(label1) % TEAM_PALETTE.length;\n if (idx1 === idx0) idx1 = (idx1 + 1) % TEAM_PALETTE.length;\n\n return [TEAM_PALETTE[idx0], TEAM_PALETTE[idx1]];\n}\n\n// -----------------------------------------------------------------------------\n// Price helpers\n// -----------------------------------------------------------------------------\n\nfunction getYesAsk(market: PredictMarket): number | null {\n const yes = market.outcomes?.[0];\n if (!yes) return null;\n return yes.best_ask ?? yes.price ?? null;\n}\n\nfunction getYesPercent(market: PredictMarket): number {\n const price = getYesAsk(market);\n return price != null ? parseFloat((price * 100).toFixed(2)) : 0;\n}\n\nfunction formatPercent(value: number): string {\n if (value <= 1 && value > 0) return \"< 1%\";\n if (value >= 99 && value < 100) return \"> 99%\";\n return `${value}%`;\n}\n\nfunction getYesCents(market: PredictMarket): string {\n const yes = market.outcomes?.[0];\n const price = yes?.best_ask ?? yes?.price ?? 0;\n return parseFloat((price * 100).toFixed(2)).toString();\n}\n\nfunction getNoCents(market: PredictMarket): string {\n const no = market.outcomes?.[1];\n if (no) {\n const price = no.best_ask ?? no.price ?? 0;\n return parseFloat((price * 100).toFixed(2)).toString();\n }\n const yes = market.outcomes?.[0];\n const yesPrice = yes?.best_ask ?? yes?.price ?? 0;\n return parseFloat(((1 - yesPrice) * 100).toFixed(2)).toString();\n}\n\n// -----------------------------------------------------------------------------\n// Countdown helpers\n// -----------------------------------------------------------------------------\n\nfunction formatCountdown(isoDate: string): string | null {\n const diff = new Date(isoDate).getTime() - Date.now();\n if (diff <= 0) return null;\n\n const d = Math.floor(diff / 86_400_000);\n const h = Math.floor((diff % 86_400_000) / 3_600_000);\n const m = Math.floor((diff % 3_600_000) / 60_000);\n\n const parts: string[] = [];\n if (d > 0) parts.push(`${d}d`);\n if (h > 0) parts.push(`${h}h`);\n parts.push(`${m}m`);\n\n return parts.join(\" \");\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nconst injectedCSS = `\n.badge-shine { position: relative; overflow: hidden; }\n.badge-shine::after {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(120deg,\n transparent 0%, transparent 30%,\n rgba(255,255,255,0.15) 45%, rgba(255,255,255,0.25) 50%,\n rgba(255,255,255,0.15) 55%, transparent 70%, transparent 100%);\n transform: translate(-200%);\n animation: badge-shine-sweep 6s ease-in-out infinite;\n}\n@keyframes badge-shine-sweep {\n 0% { transform: translate(-200%); }\n 60% { transform: translate(200%); }\n 100% { transform: translate(200%); }\n}\n`;\n\nexport function EventItem({\n event,\n href,\n LinkComponent,\n onSelect,\n onSelectOutcome,\n onHover,\n}: EventItemProps) {\n const [expandedSlug, setExpandedSlug] = useState<string | null>(null);\n\n const rawMarkets = event.markets ?? [];\n const markets = useMemo(\n () =>\n rawMarkets.length > 2\n ? [...rawMarkets].sort(\n (a, b) =>\n (b.outcomes?.[0]?.price ?? 0) - (a.outcomes?.[0]?.price ?? 0),\n )\n : rawMarkets,\n [rawMarkets],\n );\n\n const openMarkets = markets.filter((m) => m.status === \"open\");\n const singleMarket = openMarkets.length === 1;\n const displayedMarkets = openMarkets.slice(0, MAX_DISPLAYED_OUTCOMES);\n const moreCount = openMarkets.length - MAX_DISPLAYED_OUTCOMES;\n\n const formattedVolume = useMemo(() => {\n const vol = Math.round(event.volume ?? 0);\n return `$${vol.toLocaleString(\"en-US\")}`;\n }, [event.volume]);\n\n const expandedMarket = expandedSlug\n ? (openMarkets.find((m) => m.slug === expandedSlug) ?? null)\n : null;\n\n const isExpanded = !!expandedMarket || singleMarket;\n\n // -- handlers --\n\n const handleCardClick = () => {\n if (!isExpanded) {\n onSelect?.(event);\n }\n };\n\n const handleHeaderClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (expandedMarket) {\n e.preventDefault();\n setExpandedSlug(null);\n }\n };\n\n const handleShowMore = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) {\n e.preventDefault();\n onSelect?.(event);\n }\n };\n\n const footerContent = singleMarket ? (\n <SingleMarketFooter\n event={event}\n formattedVolume={formattedVolume}\n href={href}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n />\n ) : expandedMarket ? (\n <ExpandedMarketFooter onCollapse={() => setExpandedSlug(null)} />\n ) : (\n <MarketListFooter\n moreCount={moreCount}\n formattedVolume={formattedVolume}\n source={event.source}\n href={href}\n LinkComponent={LinkComponent}\n onShowMore={handleShowMore}\n />\n );\n\n return (\n <div\n className=\"group\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n width: \"100%\",\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n transition: \"all 0.2s\",\n cursor: !isExpanded ? \"pointer\" : undefined,\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n const glowColor = SOURCE_GLOW[event.source] ?? GLOW_FALLBACK;\n el.style.borderColor = glowColor.border;\n el.style.boxShadow = glowColor.shadow;\n onHover?.(event);\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(39,39,42,0.6)\";\n el.style.boxShadow = \"none\";\n }}\n onClick={handleCardClick}\n >\n <style>{injectedCSS}</style>\n\n {/* ---- Header + Body (padded) ---- */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n padding: \"14px 14px 12px\",\n gap: 8,\n }}\n >\n <CardHeader\n event={event}\n href={href}\n LinkComponent={LinkComponent}\n onClick={handleHeaderClick}\n isExpanded={isExpanded}\n />\n\n <div style={{ display: \"flex\", flexDirection: \"column\", flex: 1 }}>\n {singleMarket ? (\n <SingleMarketBody\n market={openMarkets[0]}\n event={event}\n onSelectOutcome={onSelectOutcome}\n />\n ) : expandedMarket ? (\n <ExpandedMarketBody\n market={expandedMarket}\n event={event}\n onCollapse={() => setExpandedSlug(null)}\n onSelectOutcome={onSelectOutcome}\n />\n ) : (\n <MarketListBody\n displayedMarkets={displayedMarkets}\n onMarketClick={(m) => setExpandedSlug(m.slug)}\n />\n )}\n </div>\n </div>\n\n {/* ---- Footer (edge-to-edge, outside padding) ---- */}\n <CardFooter>{footerContent}</CardFooter>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Card header (avatar + title + badges)\n// -----------------------------------------------------------------------------\n\nfunction CardHeader({\n event,\n href,\n LinkComponent,\n onClick,\n isExpanded,\n}: {\n event: PredictEvent;\n href?: string;\n LinkComponent?: LinkComponentType;\n onClick: React.MouseEventHandler;\n isExpanded: boolean;\n}) {\n const countdown = event.start_at ? formatCountdown(event.start_at) : null;\n\n const cls =\n \"group/header flex items-center gap-x-2 lg:gap-x-4 w-full text-left cursor-pointer\";\n\n return (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className={cls}\n onClick={onClick}\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n className=\"h-8 w-8 flex-shrink-0 transition-transform duration-300 group-hover/header:scale-110 lg:h-12 lg:w-12\"\n classNames={{ base: \"bg-transparent\" }}\n />\n <div className=\"flex min-w-0 flex-1 flex-col justify-center gap-y-0.5\">\n <p\n className={cn(\n \"min-w-0 text-sm font-semibold leading-snug text-slate-200 line-clamp-2 lg:text-base\",\n isExpanded && \"group-hover/header:text-neutral-400\",\n )}\n >\n {event.title}\n </p>\n {countdown && (\n <span className=\"text-[10px] leading-4 text-neutral-500\">\n Live in {countdown}\n </span>\n )}\n </div>\n <EventIndicators event={event} />\n </Linkable>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Event indicator badges (Live / Crypto Countdown / Closed)\n// -----------------------------------------------------------------------------\n\ntype BadgeType =\n | { kind: \"live\" }\n | { kind: \"crypto-short\"; label: string; color: string }\n | { kind: \"closed\" };\n\nfunction getEventBadges(event: PredictEvent): BadgeType[] {\n const badges: BadgeType[] = [];\n\n if (event.status === \"closed\") {\n badges.push({ kind: \"closed\" });\n return badges.slice(0, 2);\n }\n\n const isCrypto = event.tags?.some((t) => t.label?.toLowerCase() === \"crypto\");\n const isLive = event.tags?.some((t) => t.label?.toLowerCase() === \"live\");\n\n if (isCrypto && event.end_at) {\n const remaining = new Date(event.end_at).getTime() - Date.now();\n const fiveMin = 5 * 60 * 1000;\n const fifteenMin = 15 * 60 * 1000;\n\n if (remaining > 0 && remaining <= fifteenMin) {\n const cryptoColor = remaining <= fiveMin ? \"#ef4444\" : \"#f59e0b\";\n badges.push({\n kind: \"crypto-short\",\n label: remaining <= fiveMin ? \"5m\" : \"15m\",\n color: cryptoColor,\n });\n }\n }\n\n if (isLive) {\n badges.push({ kind: \"live\" });\n }\n\n return badges.slice(0, 2);\n}\n\nfunction EventIndicators({ event }: { event: PredictEvent }) {\n const badges = useMemo(() => getEventBadges(event), [event]);\n\n if (badges.length === 0) return null;\n\n return (\n <div className=\"flex flex-shrink-0 flex-col items-end gap-1\">\n {badges.map((badge, i) => {\n switch (badge.kind) {\n case \"live\":\n return <LiveBadge key={i} />;\n case \"crypto-short\":\n return (\n <CryptoCountdownBadge\n key={i}\n label={badge.label}\n color={badge.color}\n />\n );\n case \"closed\":\n return <ClosedBadge key={i} />;\n }\n })}\n </div>\n );\n}\n\nfunction LiveBadge() {\n const { t } = useTranslation();\n return (\n <span className=\"badge-shine relative inline-flex items-center gap-1 overflow-hidden rounded-md bg-[rgb(240,68,56)]/10 px-1.5 py-0.5 text-xs font-semibold text-[rgb(240,68,56)]\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-current\" />\n {t(\"predict.event.status.live\")}\n </span>\n );\n}\n\nfunction CryptoCountdownBadge({\n label,\n color,\n}: {\n label: string;\n color: string;\n}) {\n return (\n <span\n className=\"badge-shine relative inline-flex items-center gap-1 overflow-hidden rounded-md px-1.5 py-0.5 text-xs font-semibold\"\n style={{\n backgroundColor: `${color}26`,\n color,\n }}\n >\n <TimerIcon className=\"size-3 shrink-0\" />\n {label}\n </span>\n );\n}\n\nfunction ClosedBadge() {\n const { t } = useTranslation();\n return (\n <span className=\"inline-flex items-center rounded-md bg-neutral-800/80 px-1.5 py-0.5 text-xs font-semibold text-neutral-400\">\n {t(\"predict.event.status.closed\")}\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Market list — body (outcome rows only)\n// -----------------------------------------------------------------------------\n\nfunction MarketListBody({\n displayedMarkets,\n onMarketClick,\n}: {\n displayedMarkets: PredictMarket[];\n onMarketClick: (market: PredictMarket) => void;\n}) {\n return displayedMarkets.length > 0 ? (\n <div className=\"flex w-full flex-1 flex-col gap-y-0.5 lg:gap-y-2\">\n {displayedMarkets.map((market) => {\n const pct = getYesPercent(market);\n return (\n <button\n type=\"button\"\n key={market.id ?? `${market.source}-${market.slug}`}\n className=\"flex 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 onMarketClick(market);\n }}\n >\n <span className=\"min-w-0 flex-1 text-left text-xs text-slate-200 line-clamp-1 lg:text-sm\">\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-sm font-semibold text-slate-200 lg:text-lg\">\n {formatPercent(pct)}\n </span>\n <YesNoPill />\n </div>\n </button>\n );\n })}\n </div>\n ) : null;\n}\n\n// -----------------------------------------------------------------------------\n// Market list — footer\n// -----------------------------------------------------------------------------\n\nfunction MarketListFooter({\n moreCount,\n formattedVolume,\n source,\n href,\n LinkComponent,\n onShowMore,\n}: {\n moreCount: number;\n formattedVolume: string;\n source: ProviderSource;\n href?: string;\n LinkComponent?: LinkComponentType;\n onShowMore: React.MouseEventHandler;\n}) {\n const { t } = useTranslation();\n\n return (\n <>\n {moreCount > 0 ? (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className=\"flex items-center gap-1 text-[10px] font-normal text-zinc-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n onClick={onShowMore}\n >\n {t(\"predict.event.showMore\")}\n <ChevronRightIcon className=\"h-3 w-3\" />\n </Linkable>\n ) : (\n <div />\n )}\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={source} />\n </span>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Card footer (separated bar matching matches card style)\n// -----------------------------------------------------------------------------\n\nfunction CardFooter({ children }: { children: React.ReactNode }) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.15)\",\n padding: \"8px 14px\",\n marginTop: \"auto\",\n }}\n >\n {children}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Elevated button (matches Jupiter design exactly)\n// -----------------------------------------------------------------------------\n\nfunction ElevatedButton({\n bgColor,\n textColor,\n shadowColor,\n onClick,\n children,\n}: {\n bgColor: string;\n textColor: string;\n shadowColor: string;\n onClick: React.MouseEventHandler;\n children: React.ReactNode;\n}) {\n const handleEnter = (e: React.MouseEvent<HTMLButtonElement>) => {\n const el = e.currentTarget;\n el.style.setProperty(\"--shadow-offset\", \"2px\");\n el.style.transform = \"translateY(2px)\";\n };\n\n const handleLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n const el = e.currentTarget;\n el.style.setProperty(\"--shadow-offset\", \"4px\");\n el.style.transform = \"translateY(0px)\";\n };\n\n return (\n <button\n type=\"button\"\n className=\"flex h-12 flex-1 w-full items-center justify-center gap-x-1 overflow-hidden rounded-lg p-3 text-base font-normal hover:cursor-pointer will-change-transform [-webkit-tap-highlight-color:transparent]\"\n style={\n {\n backgroundColor: bgColor,\n color: textColor,\n \"--shadow-color\": shadowColor,\n \"--shadow-offset\": \"4px\",\n boxShadow:\n \"inset 0 -1px 0 rgba(255,255,255,0.08), 0 var(--shadow-offset, 4px) 0 var(--shadow-color, rgba(0,0,0,0.22))\",\n transition: \"transform .12s, box-shadow .12s, opacity .14s\",\n } as React.CSSProperties\n }\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n onClick={onClick}\n >\n {children}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Outcome buy buttons (shared by SingleMarketView & ExpandedMarketView)\n// -----------------------------------------------------------------------------\n\nfunction OutcomeButtons({\n market,\n event,\n onSelectOutcome,\n dynamicColors = false,\n labelFormat = \"action\",\n}: {\n market: PredictMarket;\n event: PredictEvent;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n dynamicColors?: boolean;\n /** \"action\" → \"Yes XX.X¢\" / \"No XX¢\", \"label\" → \"Label XX¢\" */\n labelFormat?: \"action\" | \"label\";\n}) {\n const { t } = useTranslation();\n const [c0, c1] = dynamicColors\n ? getOutcomeColors(market)\n : [C_PRIMARY, C_SECONDARY];\n\n const label0 = market.outcomes?.[0]?.label?.toLowerCase().trim() ?? \"\";\n const label1 = market.outcomes?.[1]?.label?.toLowerCase().trim() ?? \"\";\n const effectiveFormat =\n labelFormat === \"label\" && label0 === label1 ? \"action\" : labelFormat;\n\n const yesLabel =\n effectiveFormat === \"label\"\n ? `${market.outcomes?.[0]?.label ?? \"Yes\"} ${getYesCents(market)}¢`\n : t(\"predict.market.action.yes\", { price: getYesCents(market) });\n\n const noLabel =\n effectiveFormat === \"label\"\n ? `${market.outcomes?.[1]?.label ?? \"No\"} ${getNoCents(market)}¢`\n : t(\"predict.market.action.no\", { price: getNoCents(market) });\n\n return (\n <div className=\"flex gap-2\">\n <ElevatedButton\n bgColor={c0.bg}\n textColor={c0.text}\n shadowColor={c0.shadow}\n onClick={(e) => {\n e.stopPropagation();\n onSelectOutcome?.(event, market, \"yes\");\n }}\n >\n {yesLabel}\n </ElevatedButton>\n <ElevatedButton\n bgColor={c1.bg}\n textColor={c1.text}\n shadowColor={c1.shadow}\n onClick={(e) => {\n e.stopPropagation();\n onSelectOutcome?.(event, market, \"no\");\n }}\n >\n {noLabel}\n </ElevatedButton>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Yes / No pill (compact, used in list rows)\n// -----------------------------------------------------------------------------\n\nfunction YesNoPill() {\n const { t } = useTranslation();\n\n return (\n <span className=\"inline-flex h-7 w-[85px] items-center justify-center gap-x-3 rounded-lg p-1.5 text-xs font-semibold flex-shrink-0 bg-gradient-to-r from-primary/15 to-secondary/15 lg:h-9 lg:w-24 lg:gap-x-4 lg:p-2 lg:text-sm\">\n <span className=\"text-primary\">{t(\"predict.market.yes\")}</span>\n <span className=\"text-neutral-400\">/</span>\n <span className=\"text-secondary\">{t(\"predict.market.no\")}</span>\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Single market — body (buy buttons only)\n// -----------------------------------------------------------------------------\n\nfunction SingleMarketBody({\n market,\n event,\n onSelectOutcome,\n}: {\n market: PredictMarket;\n event: PredictEvent;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}) {\n return (\n <div style={{ flex: 1 }}>\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n dynamicColors\n labelFormat=\"label\"\n />\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Single market — footer\n// -----------------------------------------------------------------------------\n\nfunction SingleMarketFooter({\n event,\n formattedVolume,\n href,\n LinkComponent,\n onSelect,\n}: {\n event: PredictEvent;\n formattedVolume: string;\n href?: string;\n LinkComponent?: LinkComponentType;\n onSelect?: (event: PredictEvent) => void;\n}) {\n const { t } = useTranslation();\n\n const handleViewEvent = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) {\n e.preventDefault();\n onSelect?.(event);\n }\n };\n\n return (\n <>\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className=\"flex items-center gap-1 text-[10px] font-normal text-zinc-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n onClick={handleViewEvent}\n >\n {t(\"predict.event.viewEvent\")}\n <ChevronRightIcon className=\"h-3 w-3\" />\n </Linkable>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={event.source} />\n </span>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Expanded market — body (collapse toggle + buy buttons)\n// -----------------------------------------------------------------------------\n\nfunction ExpandedMarketBody({\n market,\n event,\n onCollapse,\n onSelectOutcome,\n}: {\n market: PredictMarket;\n event: PredictEvent;\n onCollapse: () => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}) {\n const pct = getYesPercent(market);\n\n return (\n <div style={{ flex: 1 }}>\n <button\n type=\"button\"\n className=\"flex h-9 w-full items-center justify-between cursor-pointer\"\n onClick={(e) => {\n e.stopPropagation();\n onCollapse();\n }}\n >\n <span className=\"min-w-0 flex-1 text-left text-xs text-slate-200 lg:text-sm\">\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n <div className=\"flex items-center gap-x-1 flex-shrink-0\">\n <span className=\"text-sm font-semibold text-slate-200 lg:text-lg\">\n {formatPercent(pct)}\n </span>\n <ChevronUpIcon className=\"h-4 w-4 text-neutral-400\" />\n </div>\n </button>\n <div style={{ marginTop: 12 }}>\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n labelFormat=\"action\"\n />\n </div>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Expanded market — footer\n// -----------------------------------------------------------------------------\n\nfunction ExpandedMarketFooter({ onCollapse }: { onCollapse: () => void }) {\n const { t } = useTranslation();\n\n return (\n <>\n <button\n type=\"button\"\n className=\"flex items-center gap-x-1 text-[10px] font-normal transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n style={{ color: \"#71717a\" }}\n onClick={(e) => {\n e.stopPropagation();\n onCollapse();\n }}\n >\n <ChevronLeftIcon className=\"h-3 w-3\" />\n {t(\"predict.event.back\")}\n </button>\n <div />\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Inline icons\n// -----------------------------------------------------------------------------\n\nfunction ChevronRightIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M4.5 2.5L8 6l-3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ChevronLeftIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M7.5 2.5L4 6l3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Source (platform) icons\n// -----------------------------------------------------------------------------\n\nfunction SourceIcon({ source }: { source: ProviderSource }) {\n const title = source === \"polymarket\" ? \"Polymarket\" : \"Kalshi\";\n return (\n <span\n className=\"inline-flex items-center gap-x-1 text-neutral-400\"\n title={title}\n >\n <span className=\"text-neutral-600\">·</span>\n {source === \"polymarket\" ? (\n <PolymarketIcon className=\"h-5 w-auto shrink-0\" />\n ) : (\n <KalshiIcon className=\"h-3 w-auto shrink-0\" />\n )}\n </span>\n );\n}\n","// =============================================================================\n// EventsUI\n//\n// Events virtual grid: PredictEvent[] with EventItem cards.\n// Layout: responsive 1-4 column grid with react-window virtualisation and\n// infinite-scroll sentinel row.\n// =============================================================================\nimport { useCallback, useRef } from \"react\";\nimport {\n List,\n type ListImperativeAPI,\n type RowComponentProps,\n} from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { Spinner } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { EventItem } from \"./event-item.ui\";\n\nconst MD = 768;\nconst LG = 1024;\nconst XL = 1280;\n\nconst GLOW_INSET = 8;\n\nconst ROW_HEIGHT_SM = 224;\nconst ROW_HEIGHT_LG = 304;\n\nconst END_ROW_HEIGHT = 114;\n\nfunction getColumnCount(width: number): number {\n if (width >= XL) return 4;\n if (width >= LG) return 3;\n if (width >= MD) return 2;\n return 1;\n}\n\nfunction getRowHeight(width: number): number {\n if (width >= LG) return ROW_HEIGHT_LG;\n return ROW_HEIGHT_SM;\n}\n\n// -----------------------------------------------------------------------------\n// EventsUI\n// -----------------------------------------------------------------------------\n\nexport type EventsUIProps = {\n events: PredictEvent[];\n hasMore?: boolean;\n onFetchMore?: () => void;\n onSelect?: (event: PredictEvent) => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n onHover?: (event: PredictEvent) => void;\n};\n\nexport function EventsUI({\n events,\n hasMore = false,\n onFetchMore,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsUIProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<ListImperativeAPI>(null);\n const { width: containerWidth = 0, height: containerHeight = 0 } =\n useResizeObserver({ ref: containerRef });\n\n const columnCount = getColumnCount(containerWidth);\n const rowHeight = getRowHeight(containerWidth);\n const dataRowCount = Math.ceil(events.length / columnCount) || 0;\n const showEndOfList = !hasMore && events.length > 0;\n const totalRowCount =\n dataRowCount + (hasMore ? 1 : 0) + (showEndOfList ? 1 : 0);\n\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 const handleScrollToTop = useCallback(() => {\n listRef.current?.scrollToRow({ index: 0, behavior: \"smooth\" });\n }, []);\n\n return (\n <div ref={containerRef} className=\"@container w-full h-full\">\n <style>{`@keyframes eventCardEnter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}`}</style>\n {containerHeight > 0 && (\n <List\n listRef={listRef}\n className=\"no-scrollbar\"\n style={{ height: containerHeight }}\n onRowsRendered={onRowsRendered}\n rowComponent={EventGridRow}\n rowCount={totalRowCount}\n rowHeight={(index) => {\n if (showEndOfList && index === totalRowCount - 1)\n return END_ROW_HEIGHT;\n if (hasMore && index >= dataRowCount) return rowHeight;\n return rowHeight;\n }}\n rowProps={{\n events,\n columnCount,\n dataRowCount,\n showEndOfList,\n totalRowCount,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n onScrollToTop: handleScrollToTop,\n }}\n />\n )}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Row component\n// -----------------------------------------------------------------------------\n\ntype EventGridRowData = {\n events: PredictEvent[];\n columnCount: number;\n dataRowCount: number;\n showEndOfList: boolean;\n totalRowCount: number;\n onSelect?: (event: PredictEvent) => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n onHover?: (event: PredictEvent) => void;\n onScrollToTop?: () => void;\n};\n\nfunction EventGridRow({\n index,\n style,\n events,\n columnCount,\n dataRowCount,\n showEndOfList,\n totalRowCount,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n onScrollToTop,\n}: RowComponentProps<EventGridRowData>) {\n if (showEndOfList && index === totalRowCount - 1) {\n return (\n <div style={style}>\n <EndOfListRow onScrollToTop={onScrollToTop} />\n </div>\n );\n }\n\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 return (\n <div style={style}>\n <div className=\"flex w-full h-full\">\n {rowEvents.map((event, i) =>\n event == null ? null : (\n <div\n className=\"flex-1 min-w-0 flex\"\n key={`${startIdx + i}-${event.source}-${event.slug}`}\n style={{\n padding: GLOW_INSET,\n animation: `eventCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) ${i * 35}ms both`,\n }}\n >\n <EventItem\n event={event}\n href={getEventHref?.(event)}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n onHover={onHover}\n />\n </div>\n ),\n )}\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\n// -----------------------------------------------------------------------------\n// End of list + Back to top\n// -----------------------------------------------------------------------------\n\nfunction EndOfListRow({ onScrollToTop }: { onScrollToTop?: () => void }) {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex w-full flex-col items-center justify-center gap-y-4 py-6\">\n <div className=\"flex w-full items-center justify-center gap-x-4\">\n <div className=\"h-px w-16 bg-neutral-700\" />\n <span className=\"text-xs font-medium text-neutral-500\">\n {t(\"predict.event.endOfList\")}\n </span>\n <div className=\"h-px w-16 bg-neutral-700\" />\n </div>\n\n <button\n type=\"button\"\n className=\"flex cursor-pointer items-center gap-x-1 text-xs font-medium text-neutral-400\"\n onClick={onScrollToTop}\n >\n <span className=\"iconify size-4 ph--arrow-up-bold\" />\n <span>{t(\"predict.event.backToTop\")}</span>\n </button>\n </div>\n );\n}\n","// =============================================================================\n// EventsWidget\n//\n// Container widget that wires useEventsInfinite (data) to EventsUI (presentation).\n// Accepts `tagSlugSelection` from the categories widget for slug-based filtering.\n// =============================================================================\nimport type {\n PredictEvent,\n PredictMarket,\n EventStatus,\n EventSortField,\n ProviderSource,\n TagSlugSelection,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport { useEventsInfinite } from \"./events.script\";\nimport { EventsSkeleton } from \"./events.skeleton\";\nimport { EventsUI } from \"./events.ui\";\n\nexport type { TagSlugSelection } from \"../categories/categories.widget\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsWidgetProps {\n /** Category / tag selection from the categories widget. */\n tagSlugSelection?: TagSlugSelection | null;\n /** Page size (default: DEFAULT_PAGE_SIZE) */\n limit?: number;\n /** Event lifecycle status filter (default: \"open\") */\n status?: EventStatus;\n /** Sort field */\n sort_by?: EventSortField;\n /** Ascending sort order (default: false → descending) */\n sort_asc?: boolean;\n /** Filter by upstream provider (undefined = all providers) */\n source?: ProviderSource;\n /** Include nested markets in the response (default: true) */\n with_markets?: boolean;\n /**\n * Client-side time-remaining filter. Keeps only events whose `end_at` is\n * within the given window: \"1d\" = < 24 h, \"7d\" = < 7 days, \"30d\" = < 30 days.\n */\n timeRemaining?: string;\n /** Client-side minimum volume filter (USD string, e.g. \"1000\"). */\n minVolume?: string;\n /** Client-side minimum liquidity filter (USD string, e.g. \"10000\"). */\n minLiquidity?: string;\n /** Callback when an event card is selected */\n onSelect?: (event: PredictEvent) => void;\n /** Callback when an outcome button (yes/no) is pressed */\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n /** Generate href for each event card. When set, cards render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a card is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function EventsWidget({\n tagSlugSelection,\n limit = DEFAULT_PAGE_SIZE,\n status,\n sort_by,\n sort_asc,\n source,\n with_markets,\n timeRemaining,\n minVolume,\n minLiquidity,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsWidgetProps) {\n const {\n data: events,\n hasMore,\n fetchMore,\n isFetching,\n } = useEventsInfinite({\n tagSlugSelection,\n limit,\n status,\n sort_by,\n sort_asc,\n source,\n with_markets,\n timeRemaining,\n minVolume,\n minLiquidity,\n });\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 getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n />\n );\n}\n","// =============================================================================\n// EventsPage\n//\n// Composes:\n// - CategoriesWidget — category / tag navigation (static data, slug-based)\n// - EventsToolbarUI — sort dropdown + filter button\n// - EventsFilterUI — filter modal (platform, sort, time, volume, liquidity)\n// - EventsWidget — events grid backed by @liberfi.io/react-predict\n//\n// Owns the sort/filter state and converts it to API params for the widget.\n// =============================================================================\nimport { useState, useCallback, useMemo } from \"react\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { useDisclosure } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport {\n CategoriesWidget,\n type TagSlugSelection,\n} from \"../categories/categories.widget\";\nimport {\n PredictTradeModal,\n PREDICT_TRADE_MODAL_ID,\n type PredictTradeModalParams,\n} from \"../trade-form/trade-form.modal\";\nimport {\n EventsFilterUI,\n countActiveFilters,\n DEFAULT_FILTER_STATE,\n type EventsFilterState,\n} from \"./events-filter.ui\";\nimport {\n EventsToolbarUI,\n SORT_PRESETS,\n type SortPreset,\n} from \"./events-toolbar.ui\";\nimport { EventsWidget } from \"./events.widget\";\n\nexport type { TagSlugSelection } from \"../categories/categories.widget\";\nexport type { SortPreset } from \"./events-toolbar.ui\";\nexport type { EventsFilterState } from \"./events-filter.ui\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsPageProps {\n /** Callback when an event card is selected */\n onSelect?: (event: PredictEvent) => void;\n /** Callback when an outcome button (yes / no) is pressed */\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n /** Generate href for each event card. When set, cards render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a card is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsPage({\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsPageProps) {\n const [tagSlugSelection, setTagSlugSelection] = useState<TagSlugSelection>({\n categorySlug: null,\n tagSlug: null,\n });\n\n const [filterState, setFilterState] =\n useState<EventsFilterState>(DEFAULT_FILTER_STATE);\n\n const {\n isOpen: isFilterOpen,\n onOpen: openFilter,\n onClose: closeFilter,\n } = useDisclosure();\n\n const { onOpen: openTradeModal } = useAsyncModal<PredictTradeModalParams>(\n PREDICT_TRADE_MODAL_ID,\n );\n\n const handleSelectOutcome = useCallback(\n (event: PredictEvent, market: PredictMarket, side: \"yes\" | \"no\") => {\n onSelectOutcome?.(event, market, side);\n openTradeModal({\n params: { event, market, initialOutcome: side },\n });\n },\n [onSelectOutcome, openTradeModal],\n );\n\n const handleCategorySelect = useCallback((selection: TagSlugSelection) => {\n setTagSlugSelection(selection);\n }, []);\n\n const handleSortChange = useCallback((preset: SortPreset) => {\n setFilterState((prev) => ({ ...prev, sortPreset: preset }));\n }, []);\n\n const handleSortAscChange = useCallback((asc: boolean) => {\n setFilterState((prev) => ({ ...prev, sortAsc: asc }));\n }, []);\n\n const handleFilterChange = useCallback((state: EventsFilterState) => {\n setFilterState(state);\n }, []);\n\n const sortBy = useMemo(\n () => SORT_PRESETS[filterState.sortPreset].sort_by,\n [filterState.sortPreset],\n );\n\n const filterCount = useMemo(\n () => countActiveFilters(filterState),\n [filterState],\n );\n\n const toolbar = useMemo(\n () => (\n <EventsToolbarUI\n sortPreset={filterState.sortPreset}\n onSortChange={handleSortChange}\n sortAsc={filterState.sortAsc}\n onSortAscChange={handleSortAscChange}\n onFilterPress={openFilter}\n filterCount={filterCount}\n />\n ),\n [\n filterState.sortPreset,\n filterState.sortAsc,\n filterCount,\n handleSortChange,\n handleSortAscChange,\n openFilter,\n ],\n );\n\n return (\n <div className=\"flex h-full w-full max-w-[1680px] mx-auto flex-col gap-y-3\">\n <CategoriesWidget onSelect={handleCategorySelect} trailing={toolbar} />\n\n <EventsFilterUI\n isOpen={isFilterOpen}\n onClose={closeFilter}\n value={filterState}\n onChange={handleFilterChange}\n />\n\n <div className=\"min-h-0 flex-1\">\n <EventsWidget\n tagSlugSelection={tagSlugSelection}\n sort_by={sortBy}\n sort_asc={filterState.sortAsc}\n source={filterState.source}\n timeRemaining={filterState.timeRemaining}\n minVolume={filterState.minVolume}\n minLiquidity={filterState.minLiquidity}\n onSelect={onSelect}\n onSelectOutcome={handleSelectOutcome}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n />\n </div>\n\n <PredictTradeModal />\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type OrderStatus,\n type PredictEvent,\n type PredictOrder,\n type PredictPosition,\n type PredictTrade,\n type ProviderSource,\n useCancelOrder,\n useInfiniteOrders,\n useInfiniteTrades,\n usePositions,\n} from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton, Spinner } from \"@liberfi.io/ui\";\n\nconst ROW_HEIGHT = 40;\nconst HEADER_HEIGHT = 36;\nconst CONTENT_HEIGHT = 480;\nconst LIST_HEIGHT = CONTENT_HEIGHT - HEADER_HEIGHT;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UserActivitySectionProps {\n event: PredictEvent;\n /** Connected wallet address. When empty the section shows a connect prompt. */\n walletAddress?: string;\n /** Callback to cancel an open order. */\n onCancelOrder?: (orderId: string) => void;\n}\n\ntype ActivityTab = \"positions\" | \"orders\" | \"trades\";\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function UserActivitySection({\n event,\n walletAddress,\n onCancelOrder,\n}: UserActivitySectionProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<ActivityTab>(\"positions\");\n\n const marketSlugs = useMemo(\n () => event.markets?.map((m) => m.slug) ?? [],\n [event.markets],\n );\n\n const { data: positionsData } = usePositions({\n source: event.source,\n user: walletAddress ?? \"\",\n });\n const positionsCount = useMemo(() => {\n if (!positionsData?.positions || !walletAddress) return 0;\n if (marketSlugs.length === 0) return positionsData.positions.length;\n return positionsData.positions.filter(\n (p) => p.market && marketSlugs.includes(p.market.slug),\n ).length;\n }, [positionsData?.positions, marketSlugs, walletAddress]);\n\n const positionsLabel =\n positionsCount > 0\n ? `${t(\"predict.positions.title\")} (${positionsCount})`\n : t(\"predict.positions.title\");\n\n const tabs: { key: ActivityTab; label: string }[] = [\n { key: \"positions\", label: positionsLabel },\n { key: \"orders\", label: t(\"predict.openOrders.title\") },\n { key: \"trades\", label: t(\"predict.tradeHistory.title\") },\n ];\n\n return (\n <div className=\"flex flex-col gap-y-2 mt-6 px-1 lg:px-4\">\n {/* Tab bar */}\n <div className=\"flex items-center gap-x-1 border-b border-border\">\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n \"px-3 py-2 text-sm font-medium transition-colors cursor-pointer\",\n activeTab === tab.key\n ? \"text-foreground border-b-2 border-primary\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n {!walletAddress ? (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height: CONTENT_HEIGHT }}\n >\n {t(\"predict.trade.connectWallet\")}\n </div>\n ) : (\n <div style={{ height: CONTENT_HEIGHT }}>\n {activeTab === \"positions\" && (\n <PositionsTab\n source={event.source}\n walletAddress={walletAddress}\n marketSlugs={marketSlugs}\n />\n )}\n {activeTab === \"orders\" && (\n <OrdersTab\n source={event.source}\n walletAddress={walletAddress}\n marketSlugs={marketSlugs}\n onCancelOrder={onCancelOrder}\n />\n )}\n {activeTab === \"trades\" && (\n <TradesTab source={event.source} walletAddress={walletAddress} />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Positions Tab — virtual list (no infinite loading)\n// ---------------------------------------------------------------------------\n\nfunction PositionsTab({\n source,\n walletAddress,\n marketSlugs,\n}: {\n source: ProviderSource;\n walletAddress: string;\n marketSlugs: string[];\n}) {\n const { t } = useTranslation();\n const { data, isLoading } = usePositions({\n source,\n user: walletAddress,\n });\n\n const positions = useMemo(() => {\n if (!data?.positions) return [];\n if (marketSlugs.length === 0) return data.positions;\n return data.positions.filter(\n (p) => p.market && marketSlugs.includes(p.market.slug),\n );\n }, [data?.positions, marketSlugs]);\n\n if (isLoading) return <TabSkeleton />;\n\n if (positions.length === 0) {\n return <EmptyState message={t(\"predict.positions.empty\")} />;\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n <div\n className=\"flex items-center text-neutral text-xs lg:text-sm font-normal shrink-0\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2 whitespace-nowrap\">\n {t(\"predict.positions.event\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.totalSize\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.value\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.avgPrice\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.markPrice\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.pnl\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.payoutIfRight\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.estSettlement\")}\n </div>\n <div className=\"w-16 shrink-0\" />\n </div>\n\n <List\n style={{ height: LIST_HEIGHT }}\n rowComponent={PositionVirtualRow}\n rowCount={positions.length}\n rowHeight={ROW_HEIGHT}\n rowProps={{\n positions,\n closeLabel: t(\"predict.positions.close\"),\n }}\n />\n </div>\n );\n}\n\ntype PositionRowData = {\n positions: PredictPosition[];\n closeLabel: string;\n};\n\nfunction PositionVirtualRow({\n index,\n style,\n positions,\n closeLabel,\n}: RowComponentProps<PositionRowData>) {\n const position = positions[index];\n if (!position) return null;\n\n const pnl = position.pnl ?? 0;\n const pnlPercent = position.pnl_percent ?? 0;\n const avgPrice = position.avg_price ?? 0;\n const currentPrice = position.current_price ?? 0;\n\n const pnlColor =\n pnl > 0 ? \"text-success\" : pnl < 0 ? \"text-danger\" : \"text-foreground\";\n const pnlSign = pnl > 0 ? \"+\" : \"\";\n\n const marketLabel =\n position.market?.outcomes?.[0]?.label ?? position.market?.question ?? \"—\";\n const sideLabel = position.side;\n const payoutIfRight = position.size;\n const value = position.size * currentPrice;\n const settlementStr = position.market?.end_at\n ? formatSettlementTime(position.market.end_at)\n : \"—\";\n\n return (\n <div\n style={style}\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-xs lg:text-sm\"\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n <div className=\"flex flex-col gap-y-0.5\">\n <span className=\"text-foreground truncate font-medium\">\n {marketLabel}\n </span>\n <span\n className={cn(\n \"text-[10px] font-medium\",\n sideLabel.toLowerCase() === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\",\n )}\n >\n {sideLabel}\n </span>\n </div>\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n {position.size}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n ${value.toFixed(2)}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n {formatPrice(avgPrice)}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n {formatPrice(currentPrice)}\n </div>\n <div\n className={cn(\n \"flex-[1.5] pr-2 text-right font-mono whitespace-nowrap\",\n pnlColor,\n )}\n >\n {pnlSign}${Math.abs(pnl).toFixed(2)}\n <span className=\"text-[10px] ml-0.5 opacity-70\">\n ({pnlSign}\n {pnlPercent.toFixed(1)}%)\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n ${payoutIfRight.toFixed(2)}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right text-neutral whitespace-nowrap\">\n {settlementStr}\n </div>\n <div className=\"w-16 shrink-0 text-right\">\n <button\n type=\"button\"\n className=\"text-xs text-neutral hover:text-foreground cursor-pointer transition-colors rounded px-2 py-0.5 border border-border hover:border-foreground/40\"\n >\n {closeLabel}\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Orders Tab — virtual list + infinite loading\n// ---------------------------------------------------------------------------\n\nfunction OrdersTab({\n source,\n walletAddress,\n marketSlugs,\n onCancelOrder,\n}: {\n source: ProviderSource;\n walletAddress: string;\n marketSlugs: string[];\n onCancelOrder?: (orderId: string) => void;\n}) {\n const { t } = useTranslation();\n const { data, isLoading, fetchNextPage, hasNextPage } = useInfiniteOrders({\n source,\n wallet_address: walletAddress,\n });\n\n const cancelMutation = useCancelOrder();\n\n const orders = useMemo(() => {\n const allItems = data?.pages?.flatMap((p) => p.items) ?? [];\n const openStatuses = new Set([\"live\", \"open\", \"submitted\", \"pending\"]);\n let filtered = allItems.filter((o) => openStatuses.has(o.status));\n if (marketSlugs.length > 0) {\n filtered = filtered.filter(\n (o) => o.market_id && marketSlugs.includes(o.market_id),\n );\n }\n return filtered;\n }, [data?.pages, marketSlugs]);\n\n const handleCancel = useCallback(\n (order: PredictOrder) => {\n if (onCancelOrder) {\n onCancelOrder(order.id);\n } else {\n cancelMutation.mutate({ source: order.source, id: order.id });\n }\n },\n [onCancelOrder, cancelMutation],\n );\n\n const itemCount = orders.length;\n const rowCount = itemCount + (hasNextPage ? 1 : 0);\n\n const isRowLoaded = useCallback(\n (index: number) => index < itemCount,\n [itemCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n await fetchNextPage();\n }, [fetchNextPage]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount,\n threshold: 5,\n });\n\n if (isLoading) return <TabSkeleton />;\n\n if (orders.length === 0 && !hasNextPage) {\n return <EmptyState message={t(\"predict.openOrders.empty\")} />;\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n <div\n className=\"flex items-center text-neutral text-xs lg:text-sm font-normal shrink-0\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"w-16 shrink-0 pr-2\">{t(\"predict.openOrders.side\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.openOrders.outcome\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.openOrders.type\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.openOrders.price\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.openOrders.filled\")}\n </div>\n <div className=\"w-20 shrink-0 pr-2\">\n {t(\"predict.openOrders.status\")}\n </div>\n <div className=\"w-16 shrink-0\" />\n </div>\n\n <List\n style={{ height: LIST_HEIGHT }}\n onRowsRendered={onRowsRendered}\n rowComponent={OrderVirtualRow}\n rowCount={rowCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{\n orders,\n itemCount,\n onCancel: handleCancel,\n isCancelling: cancelMutation.isPending,\n cancelLabel: t(\"predict.openOrders.cancel\"),\n }}\n />\n </div>\n );\n}\n\ntype OrderRowData = {\n orders: PredictOrder[];\n itemCount: number;\n onCancel: (order: PredictOrder) => void;\n isCancelling: boolean;\n cancelLabel: string;\n};\n\nfunction OrderVirtualRow({\n index,\n style,\n orders,\n itemCount,\n onCancel,\n isCancelling,\n cancelLabel,\n}: RowComponentProps<OrderRowData>) {\n if (index >= itemCount) {\n return (\n <div style={style} className=\"flex justify-center items-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const order = orders[index];\n if (!order) return null;\n\n const isBuy = order.side === \"BUY\";\n\n return (\n <div\n style={style}\n className=\"flex items-center border-b border-border/50 text-xs lg:text-sm\"\n >\n <div className=\"w-16 shrink-0 pr-2\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isBuy ? \"bg-primary/10 text-primary\" : \"bg-danger/10 text-danger\",\n )}\n >\n {order.side}\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-foreground capitalize\">\n {order.outcome ?? \"—\"}\n </div>\n <div className=\"flex-1 pr-2 text-neutral capitalize\">\n {order.order_type ?? \"limit\"}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {order.price ? formatPrice(parseFloat(order.price)) : \"—\"}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {order.size_matched ?? \"0\"}/{order.original_size ?? \"—\"}\n </div>\n <div className=\"w-20 shrink-0 pr-2\">\n <OrderStatusBadge status={order.status} />\n </div>\n <div className=\"w-16 shrink-0 text-right\">\n <button\n type=\"button\"\n onClick={() => onCancel(order)}\n disabled={isCancelling}\n className=\"text-[10px] text-danger hover:text-danger/80 cursor-pointer disabled:opacity-50 transition-colors\"\n >\n {isCancelling ? <Spinner size=\"sm\" /> : cancelLabel}\n </button>\n </div>\n </div>\n );\n}\n\nfunction OrderStatusBadge({ status }: { status: OrderStatus }) {\n const colorMap: Record<string, string> = {\n live: \"bg-success/10 text-success\",\n open: \"bg-success/10 text-success\",\n submitted: \"bg-warning/10 text-warning\",\n pending: \"bg-warning/10 text-warning\",\n matched: \"bg-primary/10 text-primary\",\n cancelled: \"bg-neutral/10 text-neutral\",\n failed: \"bg-danger/10 text-danger\",\n expired: \"bg-neutral/10 text-neutral\",\n };\n\n return (\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium capitalize\",\n colorMap[status] ?? \"bg-neutral/10 text-neutral\",\n )}\n >\n {status}\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Trades Tab — virtual list + infinite loading\n// ---------------------------------------------------------------------------\n\nfunction TradesTab({\n source,\n walletAddress,\n}: {\n source: ProviderSource;\n walletAddress: string;\n}) {\n const { t } = useTranslation();\n const { data, isLoading, fetchNextPage, hasNextPage } = useInfiniteTrades({\n source,\n wallet: walletAddress,\n limit: 50,\n });\n\n const trades = useMemo(\n () => data?.pages?.flatMap((p) => p.items) ?? [],\n [data?.pages],\n );\n\n const itemCount = trades.length;\n const rowCount = itemCount + (hasNextPage ? 1 : 0);\n\n const isRowLoaded = useCallback(\n (index: number) => index < itemCount,\n [itemCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n await fetchNextPage();\n }, [fetchNextPage]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount,\n threshold: 5,\n });\n\n if (isLoading) return <TabSkeleton />;\n\n if (trades.length === 0 && !hasNextPage) {\n return <EmptyState message={t(\"predict.tradeHistory.empty\")} />;\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n <div\n className=\"flex items-center text-neutral text-xs lg:text-sm font-normal shrink-0\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"w-16 shrink-0 pr-2\">\n {t(\"predict.tradeHistory.side\")}\n </div>\n <div className=\"flex-1 pr-2\">{t(\"predict.tradeHistory.outcome\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.tradeHistory.price\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.tradeHistory.qty\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.tradeHistory.total\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n {t(\"predict.tradeHistory.time\")}\n </div>\n </div>\n\n <List\n style={{ height: LIST_HEIGHT }}\n onRowsRendered={onRowsRendered}\n rowComponent={TradeVirtualRow}\n rowCount={rowCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{ trades, itemCount }}\n />\n </div>\n );\n}\n\ntype TradeRowData = {\n trades: PredictTrade[];\n itemCount: number;\n};\n\nfunction TradeVirtualRow({\n index,\n style,\n trades,\n itemCount,\n}: RowComponentProps<TradeRowData>) {\n if (index >= itemCount) {\n return (\n <div style={style} className=\"flex justify-center items-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const trade = trades[index];\n if (!trade) return null;\n\n const isBuy = trade.side?.toUpperCase() === \"BUY\";\n const timeStr = formatTimestamp(trade.timestamp);\n const price = trade.price ?? 0;\n const usdSize = trade.usd_size ?? 0;\n\n return (\n <div\n style={style}\n className=\"flex items-center border-b border-border/50 text-xs lg:text-sm\"\n >\n <div className=\"w-16 shrink-0 pr-2\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isBuy ? \"bg-primary/10 text-primary\" : \"bg-danger/10 text-danger\",\n )}\n >\n {trade.side}\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-foreground capitalize\">\n {trade.outcome ?? \"—\"}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatPrice(price)}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {trade.size}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n ${usdSize.toFixed(2)}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right text-neutral whitespace-nowrap\">\n {timeStr}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nfunction EmptyState({ message }: { message: string }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height: CONTENT_HEIGHT }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton() {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height: CONTENT_HEIGHT }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-8 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatPrice(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(1)}¢`;\n}\n\nfunction formatTimestamp(unixSeconds: number): string {\n const date = new Date(unixSeconds * 1000);\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const hours = date.getHours().toString().padStart(2, \"0\");\n const mins = date.getMinutes().toString().padStart(2, \"0\");\n return `${month}/${day} ${hours}:${mins}`;\n}\n\nfunction formatSettlementTime(isoString: string): string {\n try {\n const date = new Date(isoString);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return \"—\";\n }\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\nexport interface EventDetailSkeletonProps {\n marketCount?: number;\n showBack?: boolean;\n}\n\nexport function EventDetailSkeleton({\n marketCount = 4,\n showBack,\n}: EventDetailSkeletonProps) {\n return (\n <div className=\"flex w-full flex-col gap-4 animate-pulse lg:gap-6\">\n {/* Back button placeholder */}\n {showBack && <div className=\"h-5\" />}\n\n {/* Header — avatar + tags + title */}\n <div className=\"flex items-center gap-x-2 h-16 lg:h-20 lg:gap-x-4\">\n <Skeleton className=\"size-16 shrink-0 rounded-lg lg:size-20\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <Skeleton className=\"h-3.5 w-12 rounded\" />\n <Skeleton className=\"h-3.5 w-10 rounded\" />\n <Skeleton className=\"h-3.5 w-10 rounded\" />\n </div>\n <Skeleton className=\"h-5 w-full max-w-sm rounded lg:h-6\" />\n </div>\n </div>\n\n {/* Countdown */}\n <Skeleton className=\"h-4 w-48 rounded\" />\n\n {/* Chart area — legend + chart + bottom bar */}\n <div className=\"flex flex-col gap-3\">\n {/* Legend bar */}\n <div className=\"flex items-center gap-4\">\n <Skeleton className=\"h-4 w-24 rounded\" />\n <Skeleton className=\"h-4 w-20 rounded\" />\n </div>\n {/* Chart body (300px) */}\n <Skeleton className=\"h-[300px] w-full rounded-xl\" />\n {/* Bottom bar — volume + interval switcher */}\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-4 w-20 rounded\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-7 w-[200px] rounded-lg\" />\n <Skeleton className=\"h-7 w-28 rounded-lg\" />\n </div>\n </div>\n </div>\n\n {/* Markets table */}\n <div className=\"flex flex-col\">\n {/* Table header */}\n <div className=\"flex items-center py-2\">\n <div className=\"flex-1\" />\n <Skeleton className=\"h-3.5 w-14 rounded\" />\n <div className=\"flex-1\" />\n </div>\n {/* Market rows */}\n {Array.from({ length: marketCount }).map((_, i) => (\n <div\n key={i}\n className=\"flex items-center gap-x-2 border-b border-border py-2.5 lg:gap-x-3\"\n >\n <Skeleton className=\"size-5 shrink-0 rounded-lg lg:size-8\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <Skeleton className=\"h-3.5 w-32 rounded lg:h-4 lg:w-48\" />\n <Skeleton className=\"h-2.5 w-16 rounded\" />\n </div>\n <Skeleton className=\"h-4 w-10 rounded\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-8 w-16 rounded-lg lg:w-24\" />\n <Skeleton className=\"h-8 w-16 rounded-lg lg:w-24\" />\n </div>\n </div>\n ))}\n </div>\n\n {/* Rules */}\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-4 w-16 rounded\" />\n <Skeleton className=\"h-3.5 w-full rounded\" />\n <Skeleton className=\"h-3.5 w-4/5 rounded\" />\n <Skeleton className=\"h-3.5 w-3/5 rounded\" />\n </div>\n </div>\n );\n}\n\nexport function TradeFormSkeleton() {\n return (\n <div className=\"flex flex-col gap-3 rounded-xl border border-border p-4 animate-pulse\">\n <Skeleton className=\"h-10 w-full rounded-lg\" />\n <Skeleton className=\"h-24 w-full rounded-lg\" />\n <Skeleton className=\"h-10 w-full rounded-lg\" />\n </div>\n );\n}\n","// =============================================================================\n// EventMarketDepthChartUI — CSS div implementation (no Recharts)\n//\n// Reverse-engineered from Jupiter's production code (chunk-1824.js).\n//\n// Why CSS divs instead of Recharts SVG?\n// Hover performance: brightness filter applied via imperative DOM mutation —\n// zero React re-renders on hover. Recharts requires a setState → full chart\n// re-render (101 shape functions) on every mousemove.\n//\n// Visual encoding:\n// BAR HEIGHT = (cumulative / maxCumulative) ^ 0.3 (Jupiter's z-function)\n// BAR OPACITY = 1.0 (order exists at this price) | 0.5 (cumulative only)\n// HOVER = filter: brightness(1.5) applied imperatively to the bar div\n//\n// Coloring: bearish (bid/buy-Yes) | bullish (ask/sell-Yes).\n// =============================================================================\nimport { useState, useMemo, useRef, useCallback, memo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface DepthLevel {\n price: number;\n quantity: number;\n}\n\nexport interface EventMarketDepthChartUIProps {\n bids: DepthLevel[];\n asks: DepthLevel[];\n}\n\n// ---------------------------------------------------------------------------\n// Color tokens\n// ---------------------------------------------------------------------------\n\n/** Bid bars: bullish (lime-green), buying YES. */\nconst BID_COLOR = \"var(--color-bullish)\";\n/** Ask bars: bearish (orange-red), selling YES. */\nconst ASK_COLOR = \"var(--color-bearish)\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format a number using K / M / B notation (thousands-based).\n * 1500 → \"1.5K\" | 2300000 → \"2.3M\" | 1200000000 → \"1.2B\" | 999 → \"999\"\n */\nexport function formatKMB(n: number): string {\n const abs = Math.abs(n);\n if (abs >= 1_000_000_000) {\n return `${parseFloat((n / 1_000_000_000).toFixed(2))}B`;\n }\n if (abs >= 1_000_000) {\n return `${parseFloat((n / 1_000_000).toFixed(2))}M`;\n }\n if (abs >= 1_000) {\n return `${parseFloat((n / 1_000).toFixed(2))}K`;\n }\n return n.toLocaleString();\n}\n\n// ---------------------------------------------------------------------------\n// Data model\n// ---------------------------------------------------------------------------\n\nexport interface DepthSlot {\n priceCents: number;\n // (cumulative / maxCumulative)^0.3, range [0, 1]\n displayHeight: number;\n // 1.0 = actual order here; 0.5 = only cumulative depth passes through\n opacity: number;\n isBid: boolean;\n isAsk: boolean;\n bidCumTotal: number;\n askCumTotal: number;\n bidCumCost: number;\n askCumCost: number;\n}\n\n/**\n * Jupiter height formula (z function):\n * z(e, t) = e<=0 || t<=0 ? 0 : 100 * Math.pow(e/t, 0.3)\n * Returns normalized height in [0, 1].\n */\nfunction heightPow(cumulative: number, maxCumulative: number): number {\n if (cumulative <= 0 || maxCumulative <= 0) return 0;\n return Math.pow(cumulative / maxCumulative, 0.3);\n}\n\nfunction buildDepthData(bids: DepthLevel[], asks: DepthLevel[]): DepthSlot[] {\n const rawBidQty = new Float64Array(101);\n const rawAskQty = new Float64Array(101);\n\n for (const bid of bids) {\n const slot = Math.round(bid.price * 100);\n if (slot >= 0 && slot <= 100) rawBidQty[slot] += bid.quantity;\n }\n for (const ask of asks) {\n const slot = Math.round(ask.price * 100);\n if (slot >= 0 && slot <= 100) rawAskQty[slot] += ask.quantity;\n }\n\n // Bid cumulative: spread → 0¢\n let cumBid = 0;\n let cumBidCost = 0;\n const bidTotal = new Float64Array(101);\n const bidCumCostArr = new Float64Array(101);\n for (let i = 100; i >= 0; i--) {\n cumBid += rawBidQty[i];\n cumBidCost += (rawBidQty[i] * i) / 100;\n bidTotal[i] = cumBid;\n bidCumCostArr[i] = cumBidCost;\n }\n\n // Ask cumulative: spread → 100¢\n let cumAsk = 0;\n let cumAskCost = 0;\n const askTotal = new Float64Array(101);\n const askCumCostArr = new Float64Array(101);\n for (let i = 0; i <= 100; i++) {\n cumAsk += rawAskQty[i];\n cumAskCost += (rawAskQty[i] * i) / 100;\n askTotal[i] = cumAsk;\n askCumCostArr[i] = cumAskCost;\n }\n\n const maxCumulative = Math.max(bidTotal[0] ?? 0, askTotal[100] ?? 0);\n\n return Array.from({ length: 101 }, (_, i) => {\n const isBid = bidTotal[i] > 0;\n const isAsk = askTotal[i] > 0;\n const cumulative = bidTotal[i] || askTotal[i];\n const hasOrder = rawBidQty[i] > 0 || rawAskQty[i] > 0;\n\n return {\n priceCents: i,\n displayHeight: heightPow(cumulative, maxCumulative),\n opacity: cumulative > 0 ? (hasOrder ? 1 : 0.5) : 0,\n isBid,\n isAsk,\n bidCumTotal: bidTotal[i],\n askCumTotal: askTotal[i],\n bidCumCost: bidCumCostArr[i],\n askCumCost: askCumCostArr[i],\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip\n// ---------------------------------------------------------------------------\n\ninterface TooltipInfo {\n priceCents: number;\n isBid: boolean;\n cumTotal: number;\n cumCost: number;\n leftPct: number;\n}\n\nfunction DepthTooltipPanel({ info }: { info: TooltipInfo }) {\n const { t } = useTranslation();\n const color = info.isBid ? BID_COLOR : ASK_COLOR;\n const left = info.leftPct > 65 ? undefined : `${info.leftPct}%`;\n const right = info.leftPct > 65 ? `${100 - info.leftPct}%` : undefined;\n\n return (\n <div\n style={{\n position: \"absolute\",\n top: 8,\n left,\n right,\n zIndex: 10,\n background: \"rgba(17,24,39,0.95)\",\n border: \"1px solid rgba(255,255,255,0.08)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n fontSize: 12,\n color: \"#f9fafb\",\n minWidth: 140,\n pointerEvents: \"none\",\n }}\n >\n <div style={{ marginBottom: 4, fontWeight: 600 }}>\n {t(\"predict.orderBook.depthToPrice\", { price: info.priceCents })}\n </div>\n <div style={{ color }}>\n {t(\"predict.orderBook.depthContracts\", {\n amount: formatKMB(Math.round(info.cumTotal)),\n })}\n </div>\n <div style={{ color }}>${formatKMB(Math.round(info.cumCost))}</div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Single column — memo-ized so only the hovered column re-renders\n// ---------------------------------------------------------------------------\n\ninterface DepthColumnProps {\n slot: DepthSlot;\n onEnter: (slot: DepthSlot, barEl: HTMLDivElement | null) => void;\n onLeave: () => void;\n}\n\nconst DepthColumn = memo(function DepthColumn({\n slot,\n onEnter,\n onLeave,\n}: DepthColumnProps) {\n const barRef = useRef<HTMLDivElement>(null);\n const isVisible = slot.isBid || slot.isAsk;\n const bgColor = slot.isBid ? BID_COLOR : slot.isAsk ? ASK_COLOR : undefined;\n\n return (\n <div\n style={{\n position: \"absolute\",\n left: `${slot.priceCents}%`,\n // 1px transparent right border creates the same subtle column\n // separation as Jupiter's borderRightWidth: \"0.0625rem\"\n width: \"1%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n borderRight: slot.priceCents < 100 ? \"1px solid transparent\" : \"none\",\n cursor: isVisible ? \"crosshair\" : \"default\",\n }}\n onMouseEnter={() => onEnter(slot, barRef.current)}\n onMouseLeave={onLeave}\n >\n {isVisible && (\n <div\n ref={barRef}\n style={{\n position: \"absolute\",\n bottom: 0,\n left: 0,\n width: \"100%\",\n height: `${slot.displayHeight * 100}%`,\n backgroundColor: bgColor,\n opacity: slot.opacity,\n }}\n />\n )}\n </div>\n );\n});\n\n// ---------------------------------------------------------------------------\n// X-axis\n// ---------------------------------------------------------------------------\n\nconst X_TICKS = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100];\n\nfunction DepthXAxis() {\n return (\n // Mirrors Jupiter: h-6 flex items-center with top+bottom border and dim bg\n <div\n className=\"relative flex h-6 items-center border-b border-t border-border px-1\"\n style={{ background: \"rgba(0,0,0,0.15)\" }}\n >\n {X_TICKS.map((tick) => (\n <span\n key={tick}\n className=\"absolute text-neutral font-normal\"\n style={{\n fontSize: 10,\n left: `${tick}%`,\n // 0 → no offset; 100 → pull fully left; others → center\n transform:\n tick === 0\n ? \"translateX(0px)\"\n : tick === 100\n ? \"translateX(-100%)\"\n : \"translateX(-50%)\",\n }}\n >\n {tick}\n </span>\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventMarketDepthChartUI({\n bids,\n asks,\n}: EventMarketDepthChartUIProps) {\n const { t } = useTranslation();\n const data = useMemo(() => buildDepthData(bids, asks), [bids, asks]);\n\n const midPrice = useMemo(() => {\n const bestBid = bids.length > 0 ? Math.max(...bids.map((b) => b.price)) : 0;\n const bestAsk = asks.length > 0 ? Math.min(...asks.map((a) => a.price)) : 1;\n return Math.round(((bestBid + bestAsk) / 2) * 100);\n }, [bids, asks]);\n\n const hasData = useMemo(() => data.some((d) => d.isBid || d.isAsk), [data]);\n\n // Tooltip state — only this re-renders on hover, not the bar columns\n const [tooltip, setTooltip] = useState<TooltipInfo | null>(null);\n\n // Active bar element ref — we mutate DOM directly for brightness filter\n const activeBarRef = useRef<HTMLDivElement | null>(null);\n\n const handleColumnEnter = useCallback(\n (slot: DepthSlot, barEl: HTMLDivElement | null) => {\n // Remove brightness from the previously hovered bar\n if (activeBarRef.current) {\n activeBarRef.current.style.filter = \"\";\n }\n // Apply brightness to the newly hovered bar\n if (barEl) {\n barEl.style.filter = \"brightness(1.5)\";\n activeBarRef.current = barEl;\n } else {\n activeBarRef.current = null;\n }\n\n // Update tooltip (only re-renders the tooltip panel)\n if (slot.isBid || slot.isAsk) {\n setTooltip({\n priceCents: slot.priceCents,\n isBid: slot.isBid,\n cumTotal: slot.isBid ? slot.bidCumTotal : slot.askCumTotal,\n cumCost: slot.isBid ? slot.bidCumCost : slot.askCumCost,\n leftPct: slot.priceCents,\n });\n } else {\n setTooltip(null);\n }\n },\n [],\n );\n\n const handleColumnLeave = useCallback(() => {\n if (activeBarRef.current) {\n activeBarRef.current.style.filter = \"\";\n activeBarRef.current = null;\n }\n setTooltip(null);\n }, []);\n\n if (!hasData) {\n return (\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n {t(\"predict.orderBook.noData\")}\n </div>\n );\n }\n\n return (\n // Fill the parent container (flex-1 in the widget).\n // flex-col: bar area flex-grows, x-axis stays h-6.\n // overflow: hidden prevents the priceCents=100 column (left:100%+width:1%)\n // from creating a horizontal scrollbar on any ancestor.\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n height: \"100%\",\n userSelect: \"none\",\n overflow: \"hidden\",\n }}\n >\n {/* Chart area — fills available height above the X-axis */}\n <div\n style={{\n flex: 1,\n position: \"relative\",\n width: \"100%\",\n overflow: \"hidden\",\n }}\n >\n {/* Mid-price dashed reference line */}\n {midPrice > 0 && (\n <div\n style={{\n position: \"absolute\",\n left: `${midPrice}%`,\n top: 0,\n bottom: 0,\n width: 1,\n backgroundImage:\n \"repeating-linear-gradient(to bottom, #6b7280 0, #6b7280 4px, transparent 4px, transparent 8px)\",\n zIndex: 1,\n pointerEvents: \"none\",\n }}\n />\n )}\n\n {/* Tooltip */}\n {tooltip && <DepthTooltipPanel info={tooltip} />}\n\n {/* Bar columns — each memo-ized, only the hovered one re-renders */}\n {data.map((slot) => (\n <DepthColumn\n key={slot.priceCents}\n slot={slot}\n onEnter={handleColumnEnter}\n onLeave={handleColumnLeave}\n />\n ))}\n </div>\n\n {/* X-axis */}\n <DepthXAxis />\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictMarket } from \"@liberfi.io/react-predict\";\nimport { useOrderbook } from \"@liberfi.io/react-predict\";\nimport {\n Spinner,\n cn,\n OrderbookDepthIcon,\n OrderbookTableIcon,\n} from \"@liberfi.io/ui\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport {\n EventMarketDepthChartUI,\n formatKMB,\n type DepthLevel,\n} from \"./event-market-depth-chart.ui\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format a price (0–1) as cents with up to 1 decimal place.\n * Whole numbers: \"8¢\" Fractional: \"8.1¢\"\n * Matches Jupiter's display format.\n */\nfunction formatPriceCents(price: number): string {\n const cents = price * 100;\n const rounded = Math.round(cents * 10) / 10; // round to 1 decimal\n return Number.isInteger(rounded) ? `${rounded}¢` : `${rounded.toFixed(1)}¢`;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype ViewMode = \"depth\" | \"table\";\n\nexport interface EventMarketDetailWidgetProps {\n market: PredictMarket;\n /** Which outcome's orderbook to display; defaults to \"yes\". */\n outcome?: TradeOutcome;\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Loading skeleton shared by depth and table views\n// ---------------------------------------------------------------------------\n\nfunction OrderbookSkeleton() {\n const { t } = useTranslation();\n return (\n <div className=\"flex items-center justify-center gap-x-2 h-full text-neutral text-xs\">\n <Spinner size=\"sm\" />\n <span>{t(\"predict.orderBook.loading\")}</span>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventMarketDetailWidget({\n market,\n outcome = \"yes\",\n onTradeAction,\n}: EventMarketDetailWidgetProps) {\n const { t } = useTranslation();\n const [viewMode, setViewMode] = useState<ViewMode>(\"depth\");\n const isNo = outcome === \"no\";\n\n const source = market.source;\n\n const { data: orderbook, isLoading: isOrderbookLoading } = useOrderbook({\n slug: market.slug,\n source,\n });\n\n const bids = useMemo(() => {\n const raw = isNo ? orderbook?.asks : orderbook?.bids;\n return (raw ?? []).map((o) => ({\n price: isNo ? 1 - o.price : o.price,\n quantity: o.size,\n }));\n }, [orderbook?.bids, orderbook?.asks, isNo]);\n\n const asks = useMemo(() => {\n const raw = isNo ? orderbook?.bids : orderbook?.asks;\n return (raw ?? []).map((o) => ({\n price: isNo ? 1 - o.price : o.price,\n quantity: o.size,\n }));\n }, [orderbook?.bids, orderbook?.asks, isNo]);\n\n const bestBid = useMemo(\n () => (bids.length > 0 ? Math.max(...bids.map((b) => b.price)) : null),\n [bids],\n );\n const bestAsk = useMemo(\n () => (asks.length > 0 ? Math.min(...asks.map((a) => a.price)) : null),\n [asks],\n );\n const spread = useMemo(() => {\n if (bestBid == null || bestAsk == null) return null;\n const raw = (bestAsk - bestBid) * 100;\n const rounded = Math.round(raw * 10) / 10;\n return rounded;\n }, [bestBid, bestAsk]);\n\n // Fixed total height matches Jupiter (header + content = 262px).\n return (\n <div className=\"flex flex-col h-[262px]\">\n {/*\n * Header — mirrors Jupiter's exact layout:\n * [flex-1] Spread [flex-1 center] Bid | Ask [flex-1 end] icon buttons\n * Each section is flex-1 (equal thirds), no absolute positioning.\n * Button active state is text-only (no bg highlight), matching Jupiter.\n */}\n <div className=\"flex h-9 items-center border-b border-border px-1 text-xs\">\n {/* LEFT: Spread — flex-1, plain neutral text */}\n <span className=\"flex-1 text-left text-neutral\">\n {spread != null\n ? `${t(\"predict.orderBook.spread\")}: ${Number.isInteger(spread) ? `${spread}¢` : `${spread.toFixed(1)}¢`}`\n : null}\n </span>\n\n {/* CENTER: Bid | Ask — flex-1, centered */}\n <span className=\"flex flex-1 items-center justify-center gap-x-1 whitespace-nowrap\">\n {bestBid != null && (\n <span style={{ color: \"var(--color-bullish)\" }}>\n {t(\"predict.trade.bestBid\")}: {formatPriceCents(bestBid)}\n </span>\n )}\n {bestBid != null && bestAsk != null && (\n <span className=\"text-neutral\">|</span>\n )}\n {bestAsk != null && (\n <span style={{ color: \"var(--color-bearish)\" }}>\n {t(\"predict.trade.bestAsk\")}: {formatPriceCents(bestAsk)}\n </span>\n )}\n </span>\n\n {/* RIGHT: View mode toggle icons — flex-1, end-aligned, color-only active state */}\n <div className=\"flex flex-1 justify-end\">\n <button\n type=\"button\"\n title={viewMode === \"depth\" ? \"Orderbook\" : \"Depth chart\"}\n onClick={() =>\n setViewMode((prev) => (prev === \"depth\" ? \"table\" : \"depth\"))\n }\n className=\"flex items-center text-neutral transition-colors cursor-pointer hover:text-foreground\"\n >\n {viewMode === \"depth\" ? (\n <OrderbookTableIcon className=\"h-4 w-4\" />\n ) : (\n <OrderbookDepthIcon className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n </div>\n\n {/* Content area — fills the remaining height so total stays at 262px */}\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n {viewMode === \"depth\" && (\n <>\n {isOrderbookLoading ? (\n <OrderbookSkeleton />\n ) : (\n <EventMarketDepthChartUI bids={bids} asks={asks} />\n )}\n </>\n )}\n\n {viewMode === \"table\" && (\n <>\n {isOrderbookLoading ? (\n <OrderbookSkeleton />\n ) : (\n <EventOrderbookTableUI\n bids={bids}\n asks={asks}\n bestBid={bestBid ?? undefined}\n bestAsk={bestAsk ?? undefined}\n spread={spread ?? undefined}\n />\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// EventOrderbookTableUI — Jupiter-style traditional orderbook table\n// ---------------------------------------------------------------------------\n\nconst MAX_ROWS_PER_SIDE = 8;\n\ninterface EventOrderbookTableUIProps {\n bids: DepthLevel[];\n asks: DepthLevel[];\n bestBid?: number;\n bestAsk?: number;\n spread?: number;\n}\n\nfunction EventOrderbookTableUI({\n bids,\n asks,\n spread,\n}: EventOrderbookTableUIProps) {\n const { t } = useTranslation();\n\n // Asks: closest-to-spread first (ascending), take N, reverse for display (highest at top)\n const sortedAsks = useMemo(\n () =>\n [...asks]\n .sort((a, b) => a.price - b.price)\n .slice(0, MAX_ROWS_PER_SIDE)\n .reverse(),\n [asks],\n );\n\n // Bids: highest first (closest to spread at top), take N\n const sortedBids = useMemo(\n () =>\n [...bids].sort((a, b) => b.price - a.price).slice(0, MAX_ROWS_PER_SIDE),\n [bids],\n );\n\n // Max quantity across all visible rows — used for background depth bar width\n const maxQty = useMemo(() => {\n const all = [...sortedAsks, ...sortedBids].map((r) => r.quantity);\n return Math.max(...all, 1);\n }, [sortedAsks, sortedBids]);\n\n const isEmpty = sortedAsks.length === 0 && sortedBids.length === 0;\n\n if (isEmpty) {\n return (\n <div className=\"flex items-center justify-center h-full text-xs text-neutral\">\n {t(\"predict.orderBook.empty\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col h-full overflow-y-auto text-xs font-mono select-none\">\n {/* Ask rows (sell Yes / buy No) */}\n {sortedAsks.map((ask) => (\n <OrderbookRow\n key={`ask-${ask.price}`}\n price={ask.price}\n quantity={ask.quantity}\n side=\"ask\"\n maxQty={maxQty}\n />\n ))}\n\n {/* Spread separator */}\n <div className=\"flex items-center justify-center gap-x-2 py-1 border-y border-border text-neutral text-[10px]\">\n {spread != null && (\n <span>\n {t(\"predict.orderBook.spread\")}:{\" \"}\n {Number.isInteger(spread) ? `${spread}¢` : `${spread.toFixed(1)}¢`}\n </span>\n )}\n </div>\n\n {/* Bid rows (buy Yes) */}\n {sortedBids.map((bid) => (\n <OrderbookRow\n key={`bid-${bid.price}`}\n price={bid.price}\n quantity={bid.quantity}\n side=\"bid\"\n maxQty={maxQty}\n />\n ))}\n\n {/* Column headers at the bottom, matching Jupiter's layout */}\n <div className=\"grid grid-cols-3 px-2 pt-2 pb-0.5 text-[10px] text-neutral border-t border-border\">\n <span>{t(\"predict.orderBook.price\")}</span>\n <span className=\"text-center\">{t(\"predict.orderBook.contracts\")}</span>\n <span className=\"text-right\">{t(\"predict.orderBook.total\")}</span>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Single orderbook row with background depth bar\n// ---------------------------------------------------------------------------\n\ninterface OrderbookRowProps {\n price: number;\n quantity: number;\n side: \"bid\" | \"ask\";\n maxQty: number;\n}\n\nfunction OrderbookRow({ price, quantity, side, maxQty }: OrderbookRowProps) {\n const isAsk = side === \"ask\";\n const depthPct = Math.min((quantity / maxQty) * 100, 100);\n const bgClass = isAsk ? \"bg-bearish/10\" : \"bg-bullish/10\";\n const priceClass = isAsk ? \"text-bearish\" : \"text-bullish\";\n\n const formattedContracts = formatKMB(Math.round(quantity));\n const dollarValue = Math.round(quantity * price);\n const formattedTotal = `$${formatKMB(dollarValue)}`;\n\n return (\n <div className=\"relative grid grid-cols-3 px-2 py-1 hover:bg-content2 transition-colors cursor-default\">\n {/* Background depth bar */}\n <div\n className={`absolute inset-y-0 left-0 ${bgClass} transition-[width] duration-200`}\n style={{ width: `${depthPct}%` }}\n />\n {/* Price */}\n <span className={`relative z-10 ${priceClass}`}>\n {formatPriceCents(price)}\n </span>\n {/* Contracts */}\n <span className=\"relative z-10 text-foreground text-center\">\n {formattedContracts}\n </span>\n {/* Total */}\n <span className=\"relative z-10 text-foreground text-right\">\n {formattedTotal}\n </span>\n </div>\n );\n}\n","// =============================================================================\n// EventPriceChart\n//\n// Pixel-accurate clone of the Jupiter Prediction Market price chart.\n// Uses Recharts LineChart with 7 visual effects:\n// 1. Top legend (dot + label + live %)\n// 2. Real-time tooltip on hover\n// 3. Active cursor dot on each line\n// 4. Breathing pulsing dot at the last data point\n// 5. Left/right opacity overlay that follows the cursor\n// 6. Custom X/Y axis styling\n// 7. Horizontal dashed grid lines\n//\n// Accepts a PredictEvent and selects up to 4 markets to display via a chip selector.\n// =============================================================================\nimport {\n Component,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ErrorInfo,\n type ReactNode,\n} from \"react\";\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ReferenceDot,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport {\n ChartRange,\n type ChartRangeType,\n useMarketHistory,\n type MarketHistorySeries,\n} from \"@liberfi.io/react-predict\";\nimport { DEFAULT_CHART_RANGE } from \"../../consts\";\n\n// ---------------------------------------------------------------------------\n// Error boundary — prevents chart crashes from taking down the page\n// ---------------------------------------------------------------------------\n\ninterface ChartErrorBoundaryState {\n error: Error | null;\n}\n\nclass ChartErrorBoundary extends Component<\n { children: ReactNode; fallbackHeight?: number },\n ChartErrorBoundaryState\n> {\n state: ChartErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error(\"[EventPriceChart] render error:\", error, info);\n }\n\n render() {\n if (this.state.error) {\n return (\n <div\n style={{\n height: this.props.fallbackHeight ?? 320,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n <span>Chart unavailable</span>\n <span style={{ fontSize: 11, opacity: 0.7 }}>\n {this.state.error.message}\n </span>\n </div>\n );\n }\n return this.props.children;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MAX_SELECTED = 4;\n\n/** Jupiter-aligned chart colors */\nconst CHART_COLORS = [\n \"#22d3ee\", // cyan\n \"#a3e635\", // lime\n \"#f97316\", // orange\n \"#f472b6\", // pink\n \"#a78bfa\", // violet\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatTimestamp(ms: number, range?: ChartRangeType): string {\n const d = new Date(ms);\n if (range === ChartRange.ONE_DAY) {\n // e.g. \"14:30\"\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }\n // e.g. \"Mar 18\"\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n}\n\nfunction formatTooltipTimestamp(ms: number, range?: ChartRangeType): string {\n const d = new Date(ms);\n if (range === ChartRange.ONE_DAY) {\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }\n if (range === ChartRange.ONE_WEEK) {\n return d.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n}\n\nfunction formatPercent(value: number): string {\n return `${(value * 100).toFixed(2)}%`;\n}\n\n// ---------------------------------------------------------------------------\n// Interval labels\n// ---------------------------------------------------------------------------\n\nconst INTERVAL_OPTIONS: { range: ChartRangeType; label: string }[] = [\n { range: ChartRange.ONE_DAY, label: \"1D\" },\n { range: ChartRange.ONE_WEEK, label: \"1W\" },\n { range: ChartRange.ONE_MONTH, label: \"1M\" },\n { range: ChartRange.ALL, label: \"ALL\" },\n];\n\n// ---------------------------------------------------------------------------\n// IntervalSwitcher — plain text buttons, Jupiter-style\n// ---------------------------------------------------------------------------\n\ninterface IntervalSwitcherProps {\n value: ChartRangeType;\n onChange: (range: ChartRangeType) => void;\n}\n\nfunction IntervalSwitcher({ value, onChange }: IntervalSwitcherProps) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 2 }}>\n {INTERVAL_OPTIONS.map(({ range, label }) => {\n const isActive = range === value;\n return (\n <button\n key={range}\n onClick={() => onChange(range)}\n style={{\n padding: \"2px 8px\",\n border: \"none\",\n background: \"transparent\",\n color: isActive ? \"#f9fafb\" : \"#6b7280\",\n fontWeight: isActive ? 700 : 400,\n fontSize: 12,\n cursor: \"pointer\",\n borderRadius: 4,\n letterSpacing: \"0.02em\",\n transition: \"color 0.15s\",\n userSelect: \"none\",\n }}\n >\n {label}\n </button>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// useCursorOverlay\n//\n// Returns refs for the chart wrapper div and the overlay div.\n// Mouse position tracking is done at the div level (not via Recharts internals)\n// so the approach works regardless of Recharts version or SVG structure.\n// DOM style is updated imperatively — zero React re-renders on mousemove.\n// ---------------------------------------------------------------------------\n\nfunction useCursorOverlay() {\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const overlayRef = useRef<HTMLDivElement | null>(null);\n\n const onMouseMove = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n const wrapper = wrapperRef.current;\n const overlay = overlayRef.current;\n if (!wrapper || !overlay) return;\n\n const rect = wrapper.getBoundingClientRect();\n // Cursor offset as percentage of the wrapper — this is exactly where the\n // cursor is visually, so the gradient cutoff aligns perfectly with it.\n const xPct = ((e.clientX - rect.left) / rect.width) * 100;\n\n // Left of cursor: transparent (lines at full brightness).\n // Right of cursor: ~38% dark overlay, matching Jupiter's visual where\n // lines to the right appear ~30% dimmer than lines to the left.\n overlay.style.background = `linear-gradient(to right, transparent ${xPct}%, rgba(0,0,0,0.55) ${xPct}%)`;\n overlay.style.opacity = \"1\";\n }, []);\n\n const onMouseLeave = useCallback(() => {\n if (overlayRef.current) overlayRef.current.style.opacity = \"0\";\n }, []);\n\n return { wrapperRef, overlayRef, onMouseMove, onMouseLeave };\n}\n\n// ---------------------------------------------------------------------------\n// CustomTooltip\n// ---------------------------------------------------------------------------\n\ninterface CustomTooltipPayloadItem {\n dataKey: string;\n value: number | undefined;\n stroke: string;\n color: string;\n}\n\ninterface CustomTooltipProps {\n active?: boolean;\n payload?: CustomTooltipPayloadItem[];\n label?: number | string;\n labelMap: Map<string, string>;\n /** All series slugs + colors so missing entries can be shown as \"--\" */\n allSeries?: Array<{ slug: string; color: string }>;\n range?: ChartRangeType;\n}\n\nfunction CustomTooltip({\n active,\n payload,\n label,\n labelMap,\n allSeries,\n range,\n}: CustomTooltipProps) {\n if (!active || !allSeries?.length) return null;\n\n const payloadMap = new Map<string, CustomTooltipPayloadItem>();\n payload?.forEach((p) => payloadMap.set(p.dataKey, p));\n\n const items: CustomTooltipPayloadItem[] = allSeries.map((s) => {\n const existing = payloadMap.get(s.slug);\n return (\n existing ?? {\n dataKey: s.slug,\n value: undefined,\n stroke: s.color,\n color: s.color,\n }\n );\n });\n\n return (\n <div\n style={{\n background: \"rgba(10,10,10,0.92)\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n minWidth: 180,\n backdropFilter: \"blur(8px)\",\n fontSize: 12,\n }}\n >\n <div style={{ color: \"#9ca3af\", marginBottom: 6, fontWeight: 500 }}>\n {typeof label === \"number\"\n ? formatTooltipTimestamp(label, range)\n : label}\n </div>\n {items.map((p) => (\n <div\n key={p.dataKey}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 3,\n }}\n >\n <span\n style={{\n display: \"inline-block\",\n width: 3,\n height: 14,\n borderRadius: 2,\n background: p.stroke ?? p.color,\n flexShrink: 0,\n }}\n />\n <span\n style={{\n color: \"#9ca3af\",\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: 120,\n }}\n >\n {labelMap.get(p.dataKey) ?? p.dataKey}\n </span>\n <span\n style={{\n color: \"#f9fafb\",\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {p.value != null ? formatPercent(p.value) : \"--\"}\n </span>\n </div>\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// MarketSelector — dropdown multi-select, max MAX_SELECTED markets\n// ---------------------------------------------------------------------------\n\ninterface MarketSelectorProps {\n markets: PredictMarket[];\n selectedSlugs: string[];\n colorMap: Map<string, string>;\n onToggle: (slug: string) => void;\n}\n\nfunction MarketSelector({\n markets,\n selectedSlugs,\n colorMap,\n onToggle,\n}: MarketSelectorProps) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n function handleClick(e: MouseEvent) {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [open]);\n\n const atMax = selectedSlugs.length >= MAX_SELECTED;\n\n // Trigger label: show colored dots + count summary\n const triggerContent = (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n flex: 1,\n minWidth: 0,\n }}\n >\n {/* Color dots for selected markets */}\n <div style={{ display: \"flex\", gap: 3, flexShrink: 0 }}>\n {selectedSlugs.map((slug) => (\n <span\n key={slug}\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: colorMap.get(slug) ?? \"#6b7280\",\n display: \"inline-block\",\n }}\n />\n ))}\n </div>\n {/* Label */}\n <span\n style={{\n color: \"#e5e7eb\",\n fontSize: 12,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {selectedSlugs.length === 1\n ? (() => {\n const m = markets.find((mk) => mk.slug === selectedSlugs[0]);\n return m?.outcomes?.[0]?.label ?? m?.question ?? \"1 market\";\n })()\n : `${selectedSlugs.length} / ${markets.length} markets`}\n </span>\n </div>\n );\n\n return (\n <div\n ref={rootRef}\n style={{ position: \"relative\", display: \"inline-block\", width: 200 }}\n >\n {/* Trigger button */}\n <button\n onClick={() => setOpen((v) => !v)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"5px 10px\",\n borderRadius: 8,\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: \"rgba(255,255,255,0.05)\",\n cursor: \"pointer\",\n width: \"100%\",\n userSelect: \"none\",\n }}\n >\n {triggerContent}\n {/* Chevron */}\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n style={{\n flexShrink: 0,\n transform: open ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.15s\",\n color: \"#6b7280\",\n }}\n >\n <path\n d=\"M2 4l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {/* Dropdown panel */}\n {open && (\n <div\n style={{\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n left: 0,\n zIndex: 50,\n background: \"#111827\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 10,\n boxShadow: \"0 8px 24px rgba(0,0,0,0.5)\",\n minWidth: 260,\n maxWidth: 360,\n maxHeight: 320,\n overflowY: \"auto\",\n padding: \"6px 0\",\n }}\n >\n {/* Header hint */}\n <div\n style={{\n padding: \"4px 12px 8px\",\n fontSize: 11,\n color: \"#6b7280\",\n borderBottom: \"1px solid rgba(255,255,255,0.06)\",\n marginBottom: 4,\n }}\n >\n Select up to {MAX_SELECTED} markets\n </div>\n\n {markets.map((market, idx) => {\n const isSelected = selectedSlugs.includes(market.slug);\n const isDisabled = !isSelected && atMax;\n const isOnlyOne = isSelected && selectedSlugs.length === 1;\n const color = colorMap.get(market.slug) ?? \"#6b7280\";\n const yesOutcome =\n market.outcomes.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes[0];\n const pct =\n yesOutcome?.price != null\n ? `${Math.round(yesOutcome.price * 100)}%`\n : null;\n\n return (\n <button\n key={market.id ?? `${idx}-${market.slug}`}\n onClick={() => {\n if (isOnlyOne || isDisabled) return;\n onToggle(market.slug);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n width: \"100%\",\n padding: \"7px 12px\",\n border: \"none\",\n background: isSelected\n ? \"rgba(255,255,255,0.05)\"\n : \"transparent\",\n cursor: isDisabled || isOnlyOne ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.35 : 1,\n textAlign: \"left\",\n transition: \"background 0.1s\",\n }}\n onMouseEnter={(e) => {\n if (!isDisabled && !isOnlyOne)\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(255,255,255,0.07)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.background =\n isSelected ? \"rgba(255,255,255,0.05)\" : \"transparent\";\n }}\n >\n {/* Checkbox */}\n <span\n style={{\n width: 16,\n height: 16,\n borderRadius: 4,\n border: isSelected\n ? `2px solid ${color}`\n : \"2px solid rgba(255,255,255,0.2)\",\n background: isSelected ? `${color}30` : \"transparent\",\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {isSelected && (\n <svg width=\"9\" height=\"7\" viewBox=\"0 0 9 7\" fill=\"none\">\n <path\n d=\"M1 3.5L3.5 6L8 1\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n\n {/* Color dot */}\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: color,\n flexShrink: 0,\n }}\n />\n\n {/* Question text */}\n <span\n style={{\n color: isSelected ? \"#f9fafb\" : \"#9ca3af\",\n fontSize: 12,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n\n {/* Odds */}\n {pct && (\n <span\n style={{\n color,\n fontWeight: 700,\n fontSize: 12,\n flexShrink: 0,\n }}\n >\n {pct}\n </span>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Legend\n// ---------------------------------------------------------------------------\n\ninterface LegendBarProps {\n series: MarketHistorySeries[];\n colorMap: Map<string, string>;\n /** Values to display — hovered values when scrubbing, else latest values */\n displayValues: Map<string, number>;\n}\n\nfunction LegendBar({ series, colorMap, displayValues }: LegendBarProps) {\n return (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"6px 24px\",\n padding: \"0 2px\",\n }}\n >\n {series.map((s) => {\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n const value = displayValues.get(s.marketSlug);\n return (\n <div\n key={s.marketSlug}\n style={{\n display: \"inline-flex\",\n alignItems: \"flex-start\",\n gap: 6,\n }}\n >\n {/* Dot — aligned to the name row */}\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: color,\n flexShrink: 0,\n marginTop: 3,\n }}\n />\n {/* Name + percentage stacked vertically */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 1 }}>\n <span\n style={{\n color: \"#9ca3af\",\n fontSize: 12,\n lineHeight: \"17px\",\n whiteSpace: \"nowrap\",\n }}\n >\n {s.label}\n </span>\n <span\n style={{\n color: \"#f9fafb\",\n fontSize: 14,\n fontWeight: 700,\n lineHeight: \"20px\",\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {value != null ? formatPercent(value) : \"--\"}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Chart data transformation (timestamp union + forward fill)\n// ---------------------------------------------------------------------------\n\ntype ChartRow = Record<string, number>;\n\n/**\n * Compute the median of a sorted numeric array.\n * The array must be sorted ascending before calling this function.\n */\nfunction medianOfSorted(sorted: number[]): number {\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 1\n ? sorted[mid]\n : (sorted[mid - 1] + sorted[mid]) / 2;\n}\n\n/**\n * Reduce a price series to at most `maxPoints` data points using bucket\n * median. Within each bucket the median price is taken (more robust to\n * short-lived outlier spikes than the mean), and the last timestamp of\n * the bucket is kept to preserve the breathing-dot position at the end.\n */\nfunction downsampleSeries(\n data: MarketHistorySeries[\"data\"],\n maxPoints: number,\n): MarketHistorySeries[\"data\"] {\n if (data.length <= maxPoints) return data;\n\n const result: MarketHistorySeries[\"data\"] = [];\n const step = data.length / maxPoints;\n\n for (let i = 0; i < maxPoints; i++) {\n const start = Math.floor(i * step);\n const end = Math.min(Math.floor((i + 1) * step), data.length);\n const bucket = data.slice(start, end);\n const sorted = bucket.map((p) => p.price).sort((a, b) => a - b);\n result.push({\n timestamp: bucket[bucket.length - 1].timestamp,\n price: medianOfSorted(sorted),\n });\n }\n\n return result;\n}\n\nfunction buildChartData(\n series: MarketHistorySeries[],\n maxPointsPerSeries = 200,\n): ChartRow[] {\n if (series.length === 0) return [];\n\n // Downsample each series before merging to reduce visual noise\n const sampledSeries = series.map((s) => ({\n ...s,\n data: downsampleSeries(s.data, maxPointsPerSeries),\n }));\n\n const allTimestamps = new Set<number>();\n sampledSeries.forEach((s) =>\n s.data.forEach((p) => allTimestamps.add(p.timestamp)),\n );\n\n const sorted = Array.from(allTimestamps).sort((a, b) => a - b);\n\n // Build per-series lookup map\n const lookups = sampledSeries.map((s) => {\n const m = new Map<number, number>();\n s.data.forEach((p) => m.set(p.timestamp, p.price));\n return { slug: s.marketSlug, map: m };\n });\n\n const lastValues = new Map<string, number>();\n\n return sorted.map((ts) => {\n const row: ChartRow = { timestamp: ts };\n lookups.forEach(({ slug, map }) => {\n const val = map.get(ts);\n if (val !== undefined) {\n lastValues.set(slug, val);\n row[slug] = val;\n } else {\n const last = lastValues.get(slug);\n if (last !== undefined) row[slug] = last;\n }\n });\n return row;\n });\n}\n\n// ---------------------------------------------------------------------------\n// EventPriceChart\n// ---------------------------------------------------------------------------\n\nexport interface EventPriceChartProps {\n event: PredictEvent;\n isLoading?: boolean;\n /** Optional CSS class for the outer container */\n className?: string;\n /** Event total volume (shown in chart footer bar alongside interval switcher) */\n volume?: number;\n}\n\nexport function EventPriceChart(props: EventPriceChartProps) {\n return (\n <ChartErrorBoundary>\n <EventPriceChartInner {...props} />\n </ChartErrorBoundary>\n );\n}\n\nfunction EventPriceChartInner({\n event,\n isLoading: externalLoading,\n className,\n volume,\n}: EventPriceChartProps) {\n const allMarkets = useMemo(() => {\n const seen = new Set<string>();\n return (event.markets ?? []).filter((m) => {\n if (m.status !== \"open\" || seen.has(m.slug)) return false;\n seen.add(m.slug);\n return true;\n });\n }, [event.markets]);\n\n // Sort markets by YES outcome price descending so the highest-probability\n // candidates appear first in both the default selection and the dropdown.\n const sortedMarkets = useMemo(\n () =>\n [...allMarkets].sort((a, b) => {\n const priceOf = (m: PredictMarket) =>\n (\n m.outcomes.find((o) => o.label.toLowerCase() === \"yes\") ??\n m.outcomes[0]\n )?.price ?? 0;\n return priceOf(b) - priceOf(a);\n }),\n [allMarkets],\n );\n\n // Default: first MAX_SELECTED markets by price (highest first)\n const [selectedSlugs, setSelectedSlugs] = useState<string[]>(() =>\n sortedMarkets.slice(0, MAX_SELECTED).map((m) => m.slug),\n );\n\n // Chart time range (interval selector)\n const [chartRange, setChartRange] =\n useState<ChartRangeType>(DEFAULT_CHART_RANGE);\n\n // Color mapping: only selected markets get chart colors.\n // Colors are assigned by selection order so they stay stable\n // as long as the selection doesn't change.\n const colorMap = useMemo(() => {\n const map = new Map<string, string>();\n selectedSlugs.forEach((slug, idx) => {\n map.set(slug, CHART_COLORS[idx % CHART_COLORS.length]);\n });\n return map;\n }, [selectedSlugs]);\n\n const selectedMarkets = useMemo(\n () => allMarkets.filter((m) => selectedSlugs.includes(m.slug)),\n [allMarkets, selectedSlugs],\n );\n\n const { series: hookSeries, isLoading: hookLoading } = useMarketHistory(\n selectedMarkets,\n chartRange,\n );\n const isLoading = externalLoading || hookLoading;\n\n // Belt-and-suspenders: if hook returns no renderable data, generate\n // synthetic flat lines from current outcome prices so the chart is never empty.\n const series = useMemo<MarketHistorySeries[]>(() => {\n if (hookSeries.length > 0 && hookSeries.some((s) => s.data.length > 0)) {\n return hookSeries;\n }\n const now = Date.now();\n const dayMs = 86_400_000;\n return selectedMarkets.map((market) => {\n const yesOutcome =\n market.outcomes?.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes?.[0];\n const price = yesOutcome?.price ?? 0.5;\n return {\n marketSlug: market.slug,\n label: market.outcomes?.[0]?.label ?? market.question,\n data: [\n { timestamp: now - 7 * dayMs, price },\n { timestamp: now, price },\n ],\n };\n });\n }, [hookSeries, selectedMarkets]);\n\n // Fewer points for short ranges (data is already sparse); more for ALL so\n // the long history still has enough resolution without being noisy.\n const maxPointsPerSeries = useMemo(() => {\n if (chartRange === ChartRange.ONE_DAY) return 96; // ~15-min buckets\n if (chartRange === ChartRange.ONE_WEEK) return 168; // ~1-hour buckets\n if (chartRange === ChartRange.ONE_MONTH) return 180; // ~4-hour buckets\n return 300; // ALL — daily-ish buckets\n }, [chartRange]);\n\n const chartData = useMemo(\n () => buildChartData(series, maxPointsPerSeries),\n [series, maxPointsPerSeries],\n );\n\n // Y-axis domain: padded range of all values\n const yDomain = useMemo((): [number, number] => {\n if (chartData.length === 0) return [0, 1];\n let min = Infinity;\n let max = -Infinity;\n selectedSlugs.forEach((slug) => {\n chartData.forEach((row) => {\n const v = row[slug];\n if (v != null) {\n if (v < min) min = v;\n if (v > max) max = v;\n }\n });\n });\n if (!isFinite(min)) return [0, 1];\n const pad = Math.max((max - min) * 0.15, 0.05);\n return [Math.max(0, min - pad), Math.min(1, max + pad)];\n }, [chartData, selectedSlugs]);\n\n // Current values for legend (latest point)\n const currentValues = useMemo(() => {\n const map = new Map<string, number>();\n series.forEach((s) => {\n if (s.data.length > 0) {\n map.set(s.marketSlug, s.data[s.data.length - 1].price);\n }\n });\n return map;\n }, [series]);\n\n // Tooltip label map\n const labelMap = useMemo(() => {\n const map = new Map<string, string>();\n series.forEach((s) => map.set(s.marketSlug, s.label));\n return map;\n }, [series]);\n\n // All series slugs + colors for tooltip (so missing entries show \"--\")\n const tooltipSeries = useMemo(\n () =>\n series.map((s) => ({\n slug: s.marketSlug,\n color: colorMap.get(s.marketSlug) ?? \"#6b7280\",\n })),\n [series, colorMap],\n );\n\n // Effect 5: cursor overlay (left transparent / right dimmed)\n const {\n wrapperRef: chartWrapperRef,\n overlayRef: overlayDivRef,\n onMouseMove: handleWrapperMouseMove,\n onMouseLeave: handleWrapperMouseLeave,\n } = useCursorOverlay();\n\n // Market selector toggle handler\n const handleToggle = useCallback((slug: string) => {\n setSelectedSlugs((prev) => {\n if (prev.includes(slug)) {\n if (prev.length <= 1) return prev;\n return prev.filter((s) => s !== slug);\n }\n if (prev.length >= MAX_SELECTED) return prev;\n return [...prev, slug];\n });\n }, []);\n\n // Hovered values for legend.\n // Tooltip writes to refs during render (safe, no state update).\n // Wrapper onMouseMove schedules a rAF to flush ref → state after Recharts\n // has finished rendering the tooltip, so the ref is up-to-date.\n const [hoveredValues, setHoveredValues] = useState<Map<\n string,\n number\n > | null>(null);\n const hoveredValuesRef = useRef<Map<string, number> | null>(null);\n const lastPayloadKeyRef = useRef(\"\");\n const rafIdRef = useRef(0);\n\n const showChart = !isLoading && chartData.length > 0;\n\n return (\n <div\n className={className}\n style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}\n >\n {/* Legend — values update dynamically when scrubbing the chart */}\n <LegendBar\n series={series}\n colorMap={colorMap}\n displayValues={hoveredValues ?? currentValues}\n />\n\n {/* Chart */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 0 }}>\n <div\n ref={chartWrapperRef}\n style={{\n height: 300,\n width: \"100%\",\n userSelect: \"none\",\n position: \"relative\",\n }}\n onMouseMove={\n showChart\n ? (e) => {\n handleWrapperMouseMove(e);\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = requestAnimationFrame(() => {\n setHoveredValues(hoveredValuesRef.current);\n });\n }\n : undefined\n }\n onMouseLeave={\n showChart\n ? () => {\n handleWrapperMouseLeave();\n cancelAnimationFrame(rafIdRef.current);\n lastPayloadKeyRef.current = \"\";\n hoveredValuesRef.current = null;\n setHoveredValues(null);\n }\n : undefined\n }\n >\n {isLoading ? (\n <div\n style={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <div\n style={{\n width: 28,\n height: 28,\n borderRadius: \"50%\",\n border: \"2.5px solid #22d3ee\",\n borderTopColor: \"transparent\",\n animation: \"spin 0.7s linear infinite\",\n }}\n />\n </div>\n ) : chartData.length === 0 ? (\n <div\n style={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n No price history data\n </div>\n ) : (\n <>\n {/* Effect 5: left transparent / right dimmed overlay div */}\n <div\n ref={overlayDivRef}\n style={{\n position: \"absolute\",\n inset: 0,\n opacity: 0,\n pointerEvents: \"none\",\n zIndex: 1,\n }}\n />\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart\n data={chartData}\n margin={{ top: 8, right: 16, left: 0, bottom: 0 }}\n >\n {/* Effect 7: horizontal dashed grid */}\n <CartesianGrid\n horizontal\n vertical={false}\n strokeDasharray=\"3 3\"\n stroke=\"#374151\"\n opacity={0.5}\n />\n\n {/* Effect 6: X axis */}\n <XAxis\n dataKey=\"timestamp\"\n type=\"number\"\n scale=\"time\"\n domain={[\"dataMin\", \"dataMax\"]}\n tickFormatter={(ms: number) =>\n formatTimestamp(ms, chartRange)\n }\n axisLine={false}\n tickLine={false}\n tick={{ fill: \"#6b7280\", fontSize: 11 }}\n minTickGap={70}\n />\n\n {/* Effect 6: Y axis */}\n <YAxis\n domain={yDomain}\n tickFormatter={(v: number) => `${Math.round(v * 100)}%`}\n axisLine={false}\n tickLine={false}\n tick={{ fill: \"#6b7280\", fontSize: 11 }}\n width={40}\n tickCount={6}\n />\n\n {/* Effect 2: real-time tooltip */}\n <Tooltip\n content={(props) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const p = props as any;\n if (p.active && p.payload?.length) {\n const key = p.payload\n .map(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (item: any) => `${item.dataKey}:${item.value}`,\n )\n .join(\",\");\n if (key !== lastPayloadKeyRef.current) {\n lastPayloadKeyRef.current = key;\n const map = new Map<string, number>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n p.payload.forEach((item: any) => {\n if (item.value != null)\n map.set(item.dataKey, item.value);\n });\n hoveredValuesRef.current = map;\n }\n }\n return (\n <CustomTooltip\n {...p}\n labelMap={labelMap}\n allSeries={tooltipSeries}\n range={chartRange}\n />\n );\n }}\n cursor={{\n stroke: \"#4b5563\",\n strokeWidth: 1,\n strokeDasharray: \"4 4\",\n }}\n wrapperStyle={{ zIndex: 2 }}\n isAnimationActive={false}\n />\n\n {/* Lines — dot={false} to skip per-point React calls.\n * type=\"linear\" (straight segments) avoids the cubic-spline\n * overshoot that \"monotone\" produces at sharp price jumps on\n * low-liquidity forward-filled data. strokeLinejoin=\"round\"\n * softens the angle at each vertex. */}\n {series.map((s) => {\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n return (\n <Line\n key={s.marketSlug}\n type=\"linear\"\n dataKey={s.marketSlug}\n stroke={color}\n strokeWidth={2}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n dot={false}\n activeDot={{\n r: 4.5,\n strokeWidth: 2,\n stroke: \"rgba(10,10,10,0.8)\",\n fill: color,\n }}\n connectNulls\n isAnimationActive={false}\n />\n );\n })}\n\n {/* Breathing dots at each series' last data point */}\n {hoveredValues == null &&\n chartData.length > 0 &&\n series.map((s) => {\n const lastRow = chartData[chartData.length - 1];\n const yVal = lastRow[s.marketSlug];\n if (yVal == null) return null;\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n return (\n <ReferenceDot\n key={`pulse-${s.marketSlug}`}\n x={lastRow.timestamp}\n y={yVal as number}\n ifOverflow=\"extendDomain\"\n shape={(props: { cx?: number; cy?: number }) => {\n const { cx: dx, cy: dy } = props;\n if (dx == null || dy == null) return <g />;\n return (\n <g>\n <circle\n cx={dx}\n cy={dy}\n r={6}\n fill={color}\n opacity={0.3}\n >\n <animate\n attributeName=\"r\"\n values=\"4;9;4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0.4;0.05;0.4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n <circle cx={dx} cy={dy} r={3.5} fill={color} />\n </g>\n );\n }}\n />\n );\n })}\n </LineChart>\n </ResponsiveContainer>\n </>\n )}\n </div>\n\n {/* Bottom bar: [volume] [IntervalSwitcher] on row 1, [MarketSelector] on row 2 (mobile) */}\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: \"6px 8px\",\n marginTop: 6,\n }}\n >\n {volume != null && volume > 0 && (\n <span\n style={{\n color: \"#6b7280\",\n fontSize: 12,\n }}\n >\n ${Math.round(volume).toLocaleString()} vol\n </span>\n )}\n <div style={{ flex: 1, minWidth: 0 }} />\n <IntervalSwitcher value={chartRange} onChange={setChartRange} />\n {sortedMarkets.length > 1 && (\n <div\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <MarketSelector\n markets={sortedMarkets}\n selectedSlugs={selectedSlugs}\n colorMap={colorMap}\n onToggle={handleToggle}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { Fragment, useState, useMemo, useEffect, type Key } from \"react\";\nimport { useScrollCollapse } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport {\n Avatar,\n Button,\n ChevronDownIcon,\n cn,\n Dropdown,\n DropdownItem,\n DropdownMenu,\n DropdownTrigger,\n KalshiIcon,\n PolymarketIcon,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventMarketDetailWidget } from \"./event-market-detail.widget\";\nimport { EventPriceChart } from \"./event-price-chart.ui\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(market: PredictMarket): number {\n return market.outcomes[0]?.best_ask ?? market.outcomes[0]?.price ?? 0;\n}\n\nfunction formatPercent(value: number): string {\n return `${parseFloat((value * 100).toFixed(2))}%`;\n}\n\nfunction formatCents(value: number): string {\n const cents = value * 100;\n if (cents < 1 && cents > 0) return `< 1`;\n return parseFloat(cents.toFixed(2)).toString();\n}\n\n/** Display label for a market row — prefer first outcome label, fall back to question. */\nfunction getMarketLabel(market: PredictMarket): string {\n return market.outcomes?.[0]?.label ?? market.question;\n}\n\nfunction getPlatformLabel(source: string): string {\n switch (source) {\n case \"polymarket\":\n return \"Polymarket\";\n case \"kalshi\":\n return \"Kalshi\";\n default:\n return source;\n }\n}\n\nfunction formatISOTimestamp(iso: string | undefined): string {\n if (!iso) return \"—\";\n const date = new Date(iso);\n if (isNaN(date.getTime())) return \"—\";\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\n// ---------------------------------------------------------------------------\n// Countdown hook\n// ---------------------------------------------------------------------------\n\nfunction useCountdown(targetIso: string | undefined): string | null {\n const [now, setNow] = useState(0);\n\n useEffect(() => {\n if (!targetIso) return;\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [targetIso]);\n\n if (!targetIso || now === 0) return null;\n const target = new Date(targetIso).getTime();\n if (isNaN(target)) return null;\n\n const diff = target - now;\n if (diff <= 0) return null;\n\n const days = Math.floor(diff / 86400000);\n const hours = Math.floor((diff % 86400000) / 3600000);\n const mins = Math.floor((diff % 3600000) / 60000);\n const secs = Math.floor((diff % 60000) / 1000);\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n parts.push(`${String(hours).padStart(2, \"0\")}h`);\n parts.push(`${String(mins).padStart(2, \"0\")}m`);\n parts.push(`${String(secs).padStart(2, \"0\")}s`);\n return parts.join(\" \");\n}\n\nfunction formatCountdownDate(iso: string | undefined): string | null {\n if (!iso) return null;\n const d = new Date(iso);\n if (isNaN(d.getTime())) return null;\n const hours = d.getHours().toString().padStart(2, \"0\");\n const mins = d.getMinutes().toString().padStart(2, \"0\");\n const month = (d.getMonth() + 1).toString().padStart(2, \"0\");\n const day = d.getDate().toString().padStart(2, \"0\");\n const year = d.getFullYear();\n const offset = -d.getTimezoneOffset();\n const sign = offset >= 0 ? \"+\" : \"-\";\n const tzHours = String(Math.abs(Math.floor(offset / 60))).padStart(2, \"0\");\n return `${hours}:${mins} ${month}/${day}/${year} (${sign}${tzHours})`;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailUIProps {\n event: PredictEvent;\n /** Callback when a trade action is triggered */\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailUI({ event, onTradeAction }: EventDetailUIProps) {\n const { t } = useTranslation();\n const { ref: collapseRef, isCollapsed } = useScrollCollapse();\n\n const markets = useMemo(() => {\n const all = [...(event.markets || [])];\n const open = all\n .filter((m) => m.status === \"open\")\n .sort((a, b) => getYesAsk(b) - getYesAsk(a));\n const rest = all\n .filter((m) => m.status !== \"open\")\n .sort((a, b) => getYesAsk(b) - getYesAsk(a));\n return [...open, ...rest];\n }, [event.markets]);\n\n const isEnded = event.status === \"closed\" || event.status === \"voided\";\n const startCountdown = useCountdown(isEnded ? undefined : event.start_at);\n const endCountdown = useCountdown(isEnded ? undefined : event.end_at);\n const startDateFormatted = formatCountdownDate(event.start_at);\n const endDateFormatted = formatCountdownDate(event.end_at);\n\n return (\n <div className=\"w-full flex flex-col gap-y-4 lg:gap-y-6\">\n {/* Header – sticky with compact transition */}\n <div\n ref={collapseRef}\n className={`sticky top-0 z-30 flex items-center backdrop-blur-md transition-all duration-300 ${\n isCollapsed\n ? \"h-14 lg:h-16 gap-x-2 py-2 px-1 lg:px-4 -mx-1 lg:-mx-4 shadow-sm\"\n : \"h-16 lg:h-20 gap-x-2 lg:gap-x-4\"\n }`}\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n classNames={{ base: \"bg-transparent\" }}\n className={`flex-shrink-0 transition-all duration-300 ${\n isCollapsed\n ? \"!h-10 !w-10 lg:!h-12 lg:!w-12\"\n : \"!h-16 !w-16 lg:!h-20 lg:!w-20\"\n }`}\n />\n <div className=\"flex flex-col gap-0.5 min-w-0 flex-1\">\n {!isCollapsed && (\n <div className=\"flex items-center gap-1.5\">\n {event.tags?.slice(0, 3).map((tag, i) => (\n <Fragment key={tag.slug}>\n {i > 0 && <span className=\"text-sm text-neutral/50\">·</span>}\n <span className=\"text-sm text-neutral truncate\">\n {tag.label}\n </span>\n </Fragment>\n ))}\n <SourceIcon source={event.source} />\n </div>\n )}\n <span\n className={`font-semibold truncate transition-all duration-300 ${\n isCollapsed ? \"text-sm lg:text-base\" : \"text-lg lg:text-xl\"\n }`}\n >\n {event.title}\n </span>\n </div>\n </div>\n\n {/* Countdown / ended timestamp */}\n {(startCountdown || endCountdown || isEnded) && (\n <div className=\"flex items-center gap-x-2 text-xs lg:text-sm font-mono\">\n {isEnded ? (\n endDateFormatted && (\n <span className=\"text-neutral\">\n {t(\"predict.event.endedAt\", { time: endDateFormatted })}\n </span>\n )\n ) : startCountdown ? (\n <>\n <span className=\"text-foreground\">\n {t(\"predict.event.beginsIn\", { time: startCountdown })}\n </span>\n {startDateFormatted && (\n <>\n <span className=\"text-neutral/50\">·</span>\n <span className=\"text-neutral\">{startDateFormatted}</span>\n </>\n )}\n </>\n ) : endCountdown ? (\n <>\n <span className=\"text-foreground\">\n {t(\"predict.event.endsIn\", { time: endCountdown })}\n </span>\n {endDateFormatted && (\n <>\n <span className=\"text-neutral/50\">·</span>\n <span className=\"text-neutral\">{endDateFormatted}</span>\n </>\n )}\n </>\n ) : null}\n </div>\n )}\n\n {/* Chart section — volume displayed in chart footer bar */}\n <EventPriceChart event={event} volume={event.volume ?? undefined} />\n\n {/* Markets list */}\n <EventMarketsUI markets={markets} onTradeAction={onTradeAction} />\n\n {/* Rules section */}\n <EventRulesUI markets={markets} event={event} />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Markets list (Jupiter-style table layout)\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_VISIBLE_COUNT = 5;\n\ninterface EventMarketsUIProps {\n markets: PredictMarket[];\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nfunction EventMarketsUI({\n markets: rawMarkets,\n onTradeAction,\n}: EventMarketsUIProps) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const [showAll, setShowAll] = useState(false);\n const [expandedSlug, setExpandedSlug] = useState<string | null>(null);\n\n const markets = useMemo(() => {\n const seen = new Set<string>();\n return rawMarkets.filter((m) => {\n if (seen.has(m.slug)) return false;\n seen.add(m.slug);\n return true;\n });\n }, [rawMarkets]);\n\n const firstOpenSlug = markets.find((m) => m.status === \"open\")?.slug;\n const [activeKey, setActiveKey] = useState<string | null>(\n firstOpenSlug ? `${firstOpenSlug}:yes` : null,\n );\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 = (slug: string) => {\n setExpandedSlug((prev) => (prev === slug ? null : slug));\n };\n\n const handleTradeAction = (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => {\n setActiveKey(`${market.slug}:${outcome}`);\n if (!isMobile) {\n setExpandedSlug(market.slug);\n }\n onTradeAction?.(market, outcome, side);\n };\n\n return (\n <div className=\"flex flex-col\">\n {/* Table */}\n <table className=\"w-full border-collapse\">\n {/* Column header */}\n <thead>\n <tr>\n <th />\n <th className=\"py-2 text-left text-xs text-neutral font-normal lg:text-center lg:text-sm\">\n {t(\"predict.market.table.chance\")}\n </th>\n <th />\n </tr>\n </thead>\n <tbody>\n {visibleMarkets.map((market, idx) => {\n const yesPrice = getYesAsk(market);\n const noPrice =\n market.outcomes[1]?.best_ask ?? market.outcomes[1]?.price;\n const isExpanded = expandedSlug === market.slug;\n\n return (\n <MarketRow\n key={market.id ?? `${idx}-${market.slug}`}\n market={market}\n yesPrice={yesPrice}\n noPrice={noPrice ?? undefined}\n activeYes={activeKey === `${market.slug}:yes`}\n activeNo={activeKey === `${market.slug}:no`}\n isExpanded={isExpanded}\n onToggleExpand={() => toggleExpand(market.slug)}\n onTradeAction={handleTradeAction}\n />\n );\n })}\n </tbody>\n </table>\n\n {/* More Markets button */}\n {hasMore && (\n <button\n type=\"button\"\n onClick={() => setShowAll((prev) => !prev)}\n className=\"flex w-full items-center justify-start gap-x-2 py-2 pl-1 text-xs text-neutral lg:pl-2 lg:text-sm cursor-pointer hover:text-foreground transition-colors\"\n >\n <span>\n {showAll\n ? t(\"predict.event.rules.collapse\")\n : t(\"predict.event.moreMarketsLabel\")}\n </span>\n <ChevronDownIcon\n className={cn(\n \"h-4 w-4 transition-transform\",\n showAll && \"rotate-180\",\n )}\n />\n </button>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Market Row (Jupiter-style <tr>)\n// ---------------------------------------------------------------------------\n\ninterface MarketRowProps {\n market: PredictMarket;\n yesPrice: number;\n noPrice?: number;\n activeYes: boolean;\n activeNo: boolean;\n isExpanded: boolean;\n onToggleExpand: () => void;\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nfunction MarketRow({\n market,\n yesPrice,\n noPrice,\n activeYes,\n activeNo,\n isExpanded,\n onToggleExpand,\n onTradeAction,\n}: MarketRowProps) {\n const { t } = useTranslation();\n const isOpen = market.status === \"open\";\n const volumeFormatted = market.volume\n ? `$${Math.round(market.volume).toLocaleString(\"en-US\")} vol`\n : undefined;\n\n return (\n <>\n <tr\n className=\"cursor-pointer border-b border-border text-xs hover:bg-content2 lg:text-base\"\n onClick={onToggleExpand}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onToggleExpand();\n }\n }}\n >\n {/* TD1: Avatar + Name + Volume */}\n <td className=\"py-2 pl-1 lg:pl-2\">\n <div className=\"flex items-center gap-x-1 lg:gap-x-2\">\n {market.image_url && (\n <Avatar\n src={market.image_url}\n name={getMarketLabel(market)?.[0] || \"?\"}\n radius=\"lg\"\n className=\"size-5 shrink-0 lg:size-8\"\n imgProps={{ className: \"object-cover\" }}\n />\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-foreground truncate max-w-[200px] lg:max-w-[300px]\">\n {getMarketLabel(market)}\n </span>\n {volumeFormatted && (\n <span className=\"text-[8px] text-neutral lg:text-xxs\">\n {volumeFormatted}\n </span>\n )}\n </div>\n </div>\n </td>\n\n {/* TD2: Chance % */}\n <td className=\"py-2 text-left text-foreground lg:text-center\">\n {formatPercent(yesPrice)}\n </td>\n\n {/* TD3: Yes / No buttons or status badge */}\n <td className=\"py-2 pr-1 lg:pr-2\">\n {isOpen ? (\n <div className=\"flex items-center justify-end gap-x-2\">\n <button\n type=\"button\"\n className={cn(\n \"flex min-w-16 items-center justify-center whitespace-nowrap rounded-lg p-2 lg:min-w-24 cursor-pointer hover:opacity-80 transition-all\",\n activeYes\n ? \"bg-primary text-primary-foreground\"\n : \"bg-primary/10 text-primary\",\n )}\n onClick={(e) => {\n e.stopPropagation();\n onTradeAction?.(market, \"yes\", \"buy\");\n }}\n >\n {t(\"predict.market.action.yes\", {\n price: formatCents(yesPrice),\n })}\n </button>\n <button\n type=\"button\"\n className={cn(\n \"flex min-w-16 items-center justify-center whitespace-nowrap rounded-lg p-2 lg:min-w-24 cursor-pointer hover:opacity-80 transition-all\",\n activeNo\n ? \"bg-secondary text-secondary-foreground\"\n : \"bg-secondary/10 text-secondary\",\n )}\n onClick={(e) => {\n e.stopPropagation();\n onTradeAction?.(market, \"no\", \"buy\");\n }}\n >\n {noPrice != null\n ? t(\"predict.market.action.no\", {\n price: formatCents(noPrice),\n })\n : t(\"predict.market.no\")}\n </button>\n </div>\n ) : (\n <div className=\"flex items-center justify-end\">\n <span\n className={cn(\n \"inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium\",\n market.status === \"closed\"\n ? \"bg-neutral/10 text-neutral\"\n : market.status === \"voided\"\n ? \"bg-warning/10 text-warning\"\n : \"bg-primary/10 text-primary\",\n )}\n >\n {market.status === \"closed\"\n ? t(\"predict.event.status.closed\")\n : market.status === \"voided\"\n ? t(\"predict.event.status.voided\")\n : t(\"predict.event.status.pending\")}\n </span>\n </div>\n )}\n </td>\n </tr>\n\n {/* Expanded detail row */}\n {isExpanded && (\n <tr>\n <td colSpan={3} className=\"pb-3\">\n <div className=\"max-h-100 overflow-y-auto\">\n <EventMarketDetailWidget\n market={market}\n outcome={activeNo ? \"no\" : \"yes\"}\n onTradeAction={onTradeAction}\n />\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Rules\n// ---------------------------------------------------------------------------\n\ninterface EventRulesUIProps {\n markets: PredictMarket[];\n event: PredictEvent;\n}\n\nfunction EventRulesUI({ markets, event }: EventRulesUIProps) {\n const { t } = useTranslation();\n const [showFullRules, setShowFullRules] = useState(false);\n const [showTimeline, setShowTimeline] = useState(false);\n const [selectedIdx, setSelectedIdx] = useState(0);\n\n const marketsWithContent = markets.filter(\n (m) => (m.rules && m.rules.length > 0) || m.description,\n );\n if (marketsWithContent.length === 0) return null;\n\n const selectedMarket =\n marketsWithContent[selectedIdx] ?? marketsWithContent[0];\n const rulesText =\n selectedMarket.rules && selectedMarket.rules.length > 0\n ? selectedMarket.rules.join(\"\\n\\n\")\n : (selectedMarket.description ?? \"\");\n if (!rulesText) return null;\n const truncatedRules =\n rulesText.length > 200 && !showFullRules\n ? rulesText.slice(0, 200) + \"...\"\n : rulesText;\n\n return (\n <div className=\"flex flex-col gap-y-3\">\n {/* Header: title + market selector */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold text-foreground lg:text-base\">\n {t(\"predict.event.rules\")}\n </span>\n\n {marketsWithContent.length > 1 && (\n <Dropdown\n placement=\"bottom-end\"\n classNames={{\n content: \"min-w-36 bg-content1 border border-border\",\n }}\n >\n <DropdownTrigger>\n <Button\n size=\"sm\"\n variant=\"bordered\"\n radius=\"lg\"\n endContent={<ChevronDownIcon className=\"h-3.5 w-3.5\" />}\n className=\"text-xs text-foreground\"\n >\n {getMarketLabel(selectedMarket)}\n </Button>\n </DropdownTrigger>\n <DropdownMenu\n aria-label=\"Select market rules\"\n selectionMode=\"single\"\n selectedKeys={[String(selectedIdx)]}\n onAction={(key: Key) => {\n setSelectedIdx(Number(key));\n setShowFullRules(false);\n }}\n classNames={{ list: \"gap-1\" }}\n itemClasses={{ base: \"rounded-md px-3 h-8\" }}\n >\n {marketsWithContent.map((m, idx) => (\n <DropdownItem\n key={String(idx)}\n className={cn(\n idx === selectedIdx\n ? \"bg-content2 text-foreground\"\n : \"text-neutral\",\n \"data-[hover=true]:bg-content2 data-[hover=true]:text-foreground\",\n )}\n >\n {getMarketLabel(m)}\n </DropdownItem>\n ))}\n </DropdownMenu>\n </Dropdown>\n )}\n </div>\n\n {/* Rules text */}\n <div className=\"text-xs text-foreground/80 lg:text-sm whitespace-pre-wrap\">\n {truncatedRules}\n </div>\n\n {rulesText.length > 200 && (\n <button\n type=\"button\"\n onClick={() => setShowFullRules((v) => !v)}\n className=\"text-xs text-neutral hover:text-foreground cursor-pointer transition-colors self-start\"\n >\n {showFullRules\n ? t(\"predict.event.rules.collapse\")\n : t(\"predict.event.showMore\")}\n </button>\n )}\n\n {/* Timeline and payout — collapsible */}\n <button\n type=\"button\"\n onClick={() => setShowTimeline((v) => !v)}\n className=\"flex items-center justify-between w-full mt-2 text-xs font-medium text-neutral lg:text-sm cursor-pointer hover:text-foreground transition-colors\"\n >\n <span>{t(\"predict.event.timelineAndPayout\")}</span>\n <ChevronDownIcon\n className={cn(\n \"h-4 w-4 transition-transform\",\n showTimeline && \"rotate-180\",\n )}\n />\n </button>\n\n {showTimeline && (\n <>\n <div className=\"flex flex-col\">\n {(() => {\n const status = selectedMarket.status;\n const items: {\n label: string;\n value: string | null;\n isActive: boolean;\n }[] = [];\n\n if (selectedMarket.created_at) {\n items.push({\n label: t(\"predict.event.timeline.created\"),\n value: formatISOTimestamp(selectedMarket.created_at),\n isActive: true,\n });\n }\n\n items.push({\n label: t(\"predict.event.timeline.open\"),\n value: formatISOTimestamp(selectedMarket.start_at),\n isActive: status !== \"pending\",\n });\n\n if (status === \"voided\") {\n items.push({\n label: t(\"predict.event.timeline.voided\"),\n value: formatISOTimestamp(\n selectedMarket.closed_at ?? selectedMarket.end_at,\n ),\n isActive: true,\n });\n } else if (status === \"closed\") {\n items.push({\n label: t(\"predict.event.timeline.closed\"),\n value: formatISOTimestamp(\n selectedMarket.closed_at ?? selectedMarket.end_at,\n ),\n isActive: true,\n });\n } else {\n items.push({\n label: t(\"predict.event.timeline.close\"),\n value: formatISOTimestamp(selectedMarket.end_at),\n isActive: false,\n });\n }\n\n return items;\n })().map((item, index, arr) => (\n <div key={item.label} className=\"flex items-stretch gap-x-3\">\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-border bg-transparent\"\n }`}\n />\n {index < arr.length - 1 && (\n <div className=\"w-px flex-1 bg-border\" />\n )}\n </div>\n <div\n className={`flex flex-col ${index < arr.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-neutral lg:text-sm\">\n {item.value}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {/* Identifiers */}\n <div className=\"flex flex-wrap items-center gap-x-3 text-xxs text-neutral mt-2 lg:text-xs\">\n <span>\n <span className=\"text-neutral\">\n {t(\"predict.event.id.event\")}:\n </span>{\" \"}\n <span className=\"text-foreground\">{event.slug}</span>\n </span>\n <span>\n <span className=\"text-neutral\">\n {t(\"predict.event.id.market\")}:\n </span>{\" \"}\n <span className=\"text-foreground\">{selectedMarket.slug}</span>\n </span>\n <span>\n <span className=\"text-neutral\">\n {t(\"predict.event.id.source\")}:\n </span>{\" \"}\n <span className=\"text-foreground\">\n {getPlatformLabel(selectedMarket.source)}\n </span>\n </span>\n </div>\n </>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Source (platform) icon\n// ---------------------------------------------------------------------------\n\nfunction SourceIcon({ source }: { source: string }) {\n const title = source === \"polymarket\" ? \"Polymarket\" : \"Kalshi\";\n return (\n <span\n className=\"inline-flex items-center gap-x-1 text-neutral-400\"\n title={title}\n >\n <span className=\"text-neutral-600\">·</span>\n {source === \"polymarket\" ? (\n <PolymarketIcon className=\"h-5 w-auto shrink-0\" />\n ) : (\n <KalshiIcon className=\"h-3 w-auto shrink-0\" />\n )}\n </span>\n );\n}\n","import type { PredictMarket, ProviderSource } from \"@liberfi.io/react-predict\";\nimport { useEvent } from \"@liberfi.io/react-predict\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventDetailSkeleton } from \"./event-detail-skeleton\";\nimport { EventDetailUI } from \"./event-detail.ui\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailWidgetProps {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"kalshi\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: ProviderSource;\n /** Callback when a trade action is triggered (market button / orderbook click). */\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailWidget({\n eventSlug,\n source,\n onTradeAction,\n}: EventDetailWidgetProps) {\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEvent({ slug: eventSlug, source });\n\n if (isEventLoading) {\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 <EventDetailUI event={event} onTradeAction={onTradeAction} />;\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, ProviderSource } from \"@liberfi.io/react-predict\";\nimport { useSimilarEvents } from \"@liberfi.io/react-predict\";\nimport { Avatar, ChevronRightIcon } from \"@liberfi.io/ui\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SimilarEventsSectionProps {\n eventSlug: string;\n source: ProviderSource;\n /** Number of similar events to fetch (default: 4). */\n limit?: number;\n onEventClick?: (event: PredictEvent) => void;\n}\n\nexport interface SimilarEventCardProps {\n event: PredictEvent;\n onClick?: (event: PredictEvent) => void;\n}\n\n// ---------------------------------------------------------------------------\n// SimilarEventsSection\n// ---------------------------------------------------------------------------\n\nexport function SimilarEventsSection({\n eventSlug,\n source,\n limit = 4,\n onEventClick,\n}: SimilarEventsSectionProps) {\n const { t } = useTranslation();\n const { data: similarEvents, isLoading } = useSimilarEvents({\n slug: eventSlug,\n source,\n limit,\n });\n\n if (isLoading || !similarEvents || similarEvents.length === 0) return null;\n\n return (\n <div className=\"flex flex-col gap-y-3 mt-6 px-1 lg:px-0\">\n <span className=\"text-sm font-semibold text-foreground lg:text-base\">\n {t(\"predict.similar.title\")}\n </span>\n <div className=\"grid grid-cols-1 gap-3\">\n {similarEvents.map((ev) => (\n <SimilarEventCard\n key={`${ev.source}-${ev.slug}`}\n event={ev}\n onClick={onEventClick}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SimilarEventCard\n// ---------------------------------------------------------------------------\n\nexport function SimilarEventCard({ event, onClick }: SimilarEventCardProps) {\n const volume = event.volume;\n return (\n <button\n type=\"button\"\n onClick={() => onClick?.(event)}\n className=\"flex items-center gap-x-3 rounded-xl border border-border p-3 hover:bg-content2 transition-colors cursor-pointer text-left w-full\"\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title?.[0] || \"?\"}\n radius=\"lg\"\n className=\"size-8 shrink-0 bg-transparent\"\n imgProps={{ className: \"object-cover\" }}\n />\n <div className=\"flex flex-col min-w-0 flex-1\">\n <span className=\"text-sm font-medium text-foreground truncate\">\n {event.title}\n </span>\n {volume != null && volume > 0 && (\n <span className=\"text-xs text-neutral\">\n ${Math.round(volume).toLocaleString()} vol\n </span>\n )}\n </div>\n <ChevronRightIcon className=\"h-4 w-4 text-neutral shrink-0\" />\n </button>\n );\n}\n","import { useMemo, useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n PredictEvent,\n PredictMarket,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport { useEvent } from \"@liberfi.io/react-predict\";\nimport { Button, ChevronLeftIcon, useScreen } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport {\n PredictTradeModal,\n PREDICT_TRADE_MODAL_ID,\n type PredictTradeModalParams,\n} from \"../trade-form/trade-form.modal\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { TradeFormWidget } from \"../trade-form/trade-form.widget\";\nimport { UserActivitySection } from \"./event-detail-activity.ui\";\nimport {\n EventDetailSkeleton,\n TradeFormSkeleton,\n} from \"./event-detail-skeleton\";\nimport { EventDetailWidget } from \"./event-detail.widget\";\nimport { SimilarEventsSection } from \"./event-similar-events.ui\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(m: PredictMarket): number {\n return m.outcomes[0]?.best_ask ?? m.outcomes[0]?.price ?? 0;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailPageProps {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"kalshi\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: ProviderSource;\n /** Chain network for trading (default: 'solana'). */\n chain?: string;\n /** Connected wallet address for user activity (positions/orders/trades). */\n walletAddress?: string;\n /** Callback when a similar event card is clicked. Receives the clicked event. */\n onSimilarEventClick?: (event: PredictEvent) => void;\n /** Navigation callback — if provided, a \"Back\" button is shown at the top. */\n onBack?: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailPage({\n eventSlug,\n source,\n chain,\n walletAddress,\n onSimilarEventClick,\n onBack,\n}: EventDetailPageProps) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const { onOpen: openTradeModal } = useAsyncModal<PredictTradeModalParams>(\n PREDICT_TRADE_MODAL_ID,\n );\n\n const { data: event, isLoading: isEventLoading } = useEvent({\n slug: eventSlug,\n source,\n });\n\n const markets = useMemo(\n () =>\n [...(event?.markets || [])].sort((a, b) => getYesAsk(b) - getYesAsk(a)),\n [event?.markets],\n );\n\n const [tradeSelection, setTradeSelection] = useState<{\n market: PredictMarket;\n outcome: TradeOutcome;\n side: TradeSide;\n version: number;\n } | null>(null);\n\n const handleTradeAction = useCallback(\n (market: PredictMarket, outcome: TradeOutcome, side: TradeSide) => {\n setTradeSelection((prev) => ({\n market,\n outcome,\n side,\n version: (prev?.version ?? 0) + 1,\n }));\n if (isMobile && event) {\n openTradeModal({\n params: { event, market, initialOutcome: outcome, chain },\n });\n }\n },\n [isMobile, event, chain, openTradeModal],\n );\n\n const selectedMarket = tradeSelection?.market ?? markets[0];\n\n // -----------------------------------------------------------------------\n // Loading skeleton\n // -----------------------------------------------------------------------\n if (isEventLoading) {\n const hasBack = !!onBack;\n if (isMobile) {\n return <EventDetailSkeleton showBack={hasBack} />;\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 showBack={hasBack} />\n </div>\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4 max-h-[calc(100dvh-2rem)] overflow-y-auto scrollbar-thin\">\n <TradeFormSkeleton />\n </div>\n </aside>\n </div>\n );\n }\n\n const tradeFormKey = tradeSelection\n ? `${tradeSelection.market.slug}-${tradeSelection.version}`\n : (selectedMarket?.slug ?? \"default\");\n\n return (\n <div className=\"flex w-full flex-col gap-y-4 pb-12 lg:max-w-7xl lg:gap-y-8 lg:pb-16 mx-auto\">\n <div className=\"flex w-full justify-center gap-4 pt-4 lg:gap-6\">\n <div className=\"flex-auto min-w-0 flex flex-col gap-y-4 px-4 lg:gap-y-6 lg:px-0\">\n {/* back button */}\n {onBack && (\n <div className=\"flex items-center justify-between\">\n <Button\n as=\"a\"\n onPress={onBack}\n startContent={<ChevronLeftIcon className=\"h-4 w-4\" />}\n className=\"text-neutral bg-transparent h-5 min-h-5 gap-x-2 p-0 text-base w-auto min-w-auto\"\n >\n {t(\"common.back\")}\n </Button>\n </div>\n )}\n <EventDetailWidget\n eventSlug={eventSlug}\n source={source}\n onTradeAction={handleTradeAction}\n />\n </div>\n <div className=\"hidden flex-none w-md flex-col gap-y-4 lg:sticky lg:top-4 lg:flex lg:self-start\">\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\n {event && (\n <SimilarEventsSection\n eventSlug={eventSlug}\n source={event.source}\n onEventClick={onSimilarEventClick}\n />\n )}\n </div>\n </div>\n {event && (\n <div className=\"flex w-full flex-col\">\n <UserActivitySection event={event} walletAddress={walletAddress} />\n </div>\n )}\n\n <PredictTradeModal />\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport {\n candlesticksQueryKey,\n ChartRange,\n type Candlestick,\n type ChartRangeType,\n type ListCandlesticksParams,\n type PredictEvent,\n type PredictMarket,\n type ProviderSource,\n useEvent,\n usePredictClient,\n} from \"@liberfi.io/react-predict\";\nimport { DEFAULT_CHART_RANGE, MAX_PRICE_HISTORY_MARKETS } from \"../../consts\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(m: PredictMarket): number {\n return m.outcomes[0]?.best_ask ?? m.outcomes[0]?.price ?? 0;\n}\n\nfunction listCandlesticksParamsForRange(\n chartRange: ChartRangeType,\n): ListCandlesticksParams {\n switch (chartRange) {\n case ChartRange.ONE_DAY:\n return { interval: \"15m\", limit: 96 };\n case ChartRange.ONE_WEEK:\n return { interval: \"1h\", limit: 168 };\n case ChartRange.ONE_MONTH:\n return { interval: \"4h\", limit: 180 };\n case ChartRange.ALL:\n return { interval: \"1d\", limit: 300 };\n default:\n return { interval: \"1h\", limit: 100 };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport interface UseEventDetailParams {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"kalshi\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: ProviderSource;\n /** Market slugs to query candlesticks for. Default: top 4 by yesAsk. */\n candlestickMarketSlugs?: string[];\n /** Chart time range (1d / 1w / 1m / all). */\n chartRange?: ChartRangeType;\n}\n\nexport const useEventDetail = (params: UseEventDetailParams) => {\n const {\n candlestickMarketSlugs,\n chartRange = DEFAULT_CHART_RANGE,\n source,\n } = params;\n\n const client = usePredictClient();\n const candlestickParams = useMemo(\n () => listCandlesticksParamsForRange(chartRange),\n [chartRange],\n );\n\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEvent({ slug: params.eventSlug, source });\n\n const marketsToQuery = useMemo(() => {\n if (!event?.markets) return [];\n\n // Deduplicate markets by slug (backend may return duplicates)\n const seen = new Set<string>();\n const dedupedMarkets = event.markets.filter((m) => {\n if (seen.has(m.slug)) return false;\n seen.add(m.slug);\n return true;\n });\n\n const markets =\n candlestickMarketSlugs && candlestickMarketSlugs.length > 0\n ? candlestickMarketSlugs\n .slice(0, MAX_PRICE_HISTORY_MARKETS)\n .map((slug) =>\n dedupedMarkets.find((m: PredictMarket) => m.slug === slug),\n )\n .filter((m): m is PredictMarket => m !== undefined)\n : [...dedupedMarkets]\n .sort((a, b) => getYesAsk(b) - getYesAsk(a))\n .slice(0, MAX_PRICE_HISTORY_MARKETS);\n\n return markets.map((m) => m.slug);\n }, [candlestickMarketSlugs, event?.markets]);\n\n const candlestickQueries = useQueries({\n queries: marketsToQuery.map((slug) => ({\n queryKey: candlesticksQueryKey(slug, candlestickParams),\n queryFn: () => client.listCandlesticks(slug, candlestickParams),\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((slug, index) => {\n const error = candlestickQueries[index]?.error;\n if (error) errors.set(slug, error);\n });\n return errors;\n }, [marketsToQuery, candlestickQueries]);\n\n const candlesticks = useMemo(() => {\n const map = new Map<string, Candlestick[]>();\n marketsToQuery.forEach((slug, index) => {\n const data = candlestickQueries[index]?.data;\n if (data) map.set(slug, data);\n });\n return map;\n }, [marketsToQuery, candlestickQueries]);\n\n return {\n event,\n isEventLoading,\n eventError,\n candlestickParams,\n candlesticks,\n isCandlesticksLoading,\n candlestickErrors,\n };\n};\n\nexport type { PredictEvent, PredictMarket };\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAtom } from \"jotai\";\nimport { atomWithStorage } from \"jotai/utils\";\n\nconst MAX_HISTORY_SIZE = 10;\n\nconst searchHistoriesAtom = atomWithStorage<string[]>(\n \"liberfi:predict_search_histories\",\n [],\n undefined,\n { getOnInit: true },\n);\n\nexport function usePredictSearchHistory() {\n const [histories, setHistories] = useAtom(searchHistoriesAtom);\n\n const addHistory = useCallback(\n (keyword: string) => {\n const trimmed = keyword.trim();\n if (!trimmed) return;\n\n setHistories((prev) => {\n const filtered = prev.filter((h) => h !== trimmed);\n return [trimmed, ...filtered].slice(0, MAX_HISTORY_SIZE);\n });\n },\n [setHistories],\n );\n\n const clearHistories = useCallback(() => {\n setHistories([]);\n }, [setHistories]);\n\n return { histories, addHistory, clearHistories };\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Chip, TrashIcon, Button } from \"@liberfi.io/ui\";\n\nexport type SearchHistoryUIProps = {\n histories: string[];\n onSelect?: (keyword: string) => void;\n onClear?: () => void;\n className?: string;\n};\n\nexport function SearchHistoryUI({\n histories,\n onSelect,\n onClear,\n className,\n}: SearchHistoryUIProps) {\n const { t } = useTranslation();\n\n if (histories.length === 0) return null;\n\n return (\n <div className={cn(\"px-4 pb-4\", className)}>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">\n {t(\"predict.search.history\")}\n </span>\n <Button\n isIconOnly\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <TrashIcon width={20} height={20} />\n </Button>\n </div>\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {histories.map((keyword) => (\n <Chip\n key={keyword}\n size=\"sm\"\n variant=\"bordered\"\n className={cn(\n \"text-neutral\",\n \"border-border border-1\",\n \"cursor-pointer\",\n \"hover:opacity-hover\",\n )}\n onClick={() => onSelect?.(keyword)}\n >\n {keyword}\n </Chip>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { cn } from \"@liberfi.io/ui\";\nimport { usePredictSearchHistory } from \"./search-history.script\";\nimport { SearchHistoryUI } from \"./search-history.ui\";\n\nexport type SearchHistoryWidgetProps = {\n /** Callback when a history keyword is selected */\n onSelect?: (keyword: string) => void;\n className?: string;\n};\n\nexport function SearchHistoryWidget({\n onSelect,\n className,\n}: SearchHistoryWidgetProps) {\n const { histories, clearHistories } = usePredictSearchHistory();\n\n return (\n <SearchHistoryUI\n className={cn(className)}\n histories={histories}\n onSelect={onSelect}\n onClear={clearHistories}\n />\n );\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n Kbd,\n SearchIcon,\n StyledInput,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\n\nexport type SearchInputUIProps = {\n /** Controlled input value */\n value: string;\n /** Called on every keystroke */\n onValueChange: (value: string) => void;\n /** Called when clear button is pressed */\n onClear?: () => void;\n /** Called when Esc button is pressed */\n onEscape?: () => void;\n className?: string;\n};\n\nexport function SearchInputUI({\n value,\n onValueChange,\n onClear,\n onEscape,\n className,\n}: SearchInputUIProps) {\n const { t } = useTranslation();\n\n return (\n <div className={className}>\n <StyledInput\n autoFocus\n variant=\"bordered\"\n radius=\"lg\"\n value={value}\n onValueChange={onValueChange}\n placeholder={t(\"predict.search.placeholder\")}\n classNames={{\n inputWrapper: [\n \"!bg-[rgba(39,39,42,0.6)]\",\n \"!border-[rgba(63,63,70,0.5)]\",\n \"data-[hover=true]:!bg-[rgba(39,39,42,1)]\",\n \"group-data-[focus=true]:!bg-[rgba(39,39,42,1)]\",\n \"group-data-[focus=true]:!border-[rgba(63,63,70,0.8)]\",\n ].join(\" \"),\n }}\n startContent={\n <SearchIcon width={20} height={20} className=\"text-neutral\" />\n }\n endContent={\n value ? (\n <Button\n isIconOnly\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n ) : (\n <Kbd\n className=\"min-w-8 justify-center text-xs text-neutral bg-transparent border border-[rgba(63,63,70,0.5)] rounded-lg cursor-pointer select-none\"\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n onEscape?.();\n }}\n >\n Esc\n </Kbd>\n )\n }\n />\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { ProviderSource } from \"@liberfi.io/react-predict\";\nimport { KalshiIcon, PolymarketIcon, cn } from \"@liberfi.io/ui\";\n\ninterface SourceMeta {\n label: string;\n color: string;\n bgColor: string;\n icon: ReactNode;\n}\n\nconst SOURCE_META: Record<string, SourceMeta> = {\n kalshi: {\n label: \"KALSHI\",\n color: \"#00d492\",\n bgColor: \"rgba(0, 212, 146, 0.12)\",\n icon: <KalshiIcon className=\"w-3.5 h-3.5 shrink-0\" />,\n },\n polymarket: {\n label: \"POLYMARKET\",\n color: \"#50a2ff\",\n bgColor: \"rgba(43, 127, 255, 0.12)\",\n icon: <PolymarketIcon className=\"w-3.5 h-3.5 shrink-0\" />,\n },\n dflow: {\n label: \"DFLOW\",\n color: \"rgb(16, 185, 129)\",\n bgColor: \"rgba(16, 185, 129, 0.12)\",\n icon: null,\n },\n};\n\nconst DEFAULT_META: SourceMeta = {\n label: \"Unknown\",\n color: \"rgb(156, 163, 175)\",\n bgColor: \"rgba(156, 163, 175, 0.12)\",\n icon: null,\n};\n\nexport function getSourceMeta(source: ProviderSource | string): SourceMeta {\n return SOURCE_META[source] ?? DEFAULT_META;\n}\n\nexport interface SourceBadgeProps {\n source: ProviderSource | string;\n className?: string;\n}\n\nexport function SourceBadge({ source, className }: SourceBadgeProps) {\n const meta = getSourceMeta(source);\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-x-1 rounded-md px-1.5 py-0.5 text-xs font-medium\",\n className,\n )}\n style={{ backgroundColor: meta.bgColor, color: meta.color }}\n >\n {meta.icon}\n {meta.label}\n </span>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent } from \"@liberfi.io/react-predict\";\nimport { Avatar, cn, ChevronRightIcon, Linkable } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { getSourceMeta } from \"../matches/source-badge.ui\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type SearchResultItemUIProps = {\n event: PredictEvent;\n /** URL for the detail page. When set, the row renders as a link via Linkable. */\n href?: string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n onSelect?: (event: PredictEvent) => void;\n /** Called when the row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n className?: string;\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatVolume(vol: number | null | undefined): string {\n if (vol == null) return \"-\";\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${Math.round(vol / 1_000)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SearchResultItemUI({\n event,\n href,\n LinkComponent,\n onSelect,\n onHover,\n className,\n}: SearchResultItemUIProps) {\n const { t } = useTranslation();\n const firstTag = event.tags?.[0];\n const sourceMeta = getSourceMeta(event.source);\n\n const formattedVolume = useMemo(\n () => formatVolume(event.volume),\n [event.volume],\n );\n\n return (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n className={cn(\n \"group w-full h-full px-3 flex items-center gap-3\",\n \"hover:cursor-pointer hover:bg-content2 rounded-lg\",\n \"transition-colors duration-150\",\n className,\n )}\n onClick={(e) => {\n if (href && onSelect) e.preventDefault();\n onSelect?.(event);\n }}\n onMouseEnter={() => onHover?.(event)}\n >\n {/* Avatar */}\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"full\"\n className=\"h-10 w-10 flex-shrink-0\"\n />\n\n {/* Title + meta */}\n <div className=\"flex-1 min-w-0 flex flex-col justify-center gap-y-0.5\">\n <span className=\"min-w-0 text-sm font-medium line-clamp-2 group-hover:text-primary transition-colors\">\n {event.title}\n </span>\n\n <div className=\"flex items-center gap-x-2 text-[10px] font-normal text-neutral-500 lg:text-xs\">\n {/* Source icon + label */}\n <span\n className=\"inline-flex items-center gap-x-1 shrink-0\"\n style={{ color: sourceMeta.color }}\n >\n {sourceMeta.icon}\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.04em\",\n textTransform: \"uppercase\",\n }}\n >\n {sourceMeta.label}\n </span>\n </span>\n\n <span className=\"text-neutral-600\">·</span>\n\n {/* Volume */}\n <span className=\"text-neutral-400\">\n {formattedVolume} {t(\"predict.event.volume\")}\n </span>\n\n {/* Tag */}\n {firstTag && (\n <>\n <span className=\"text-neutral-600\">·</span>\n <span className=\"text-neutral-500\">{firstTag.label}</span>\n </>\n )}\n </div>\n </div>\n\n {/* Hover arrow */}\n <ChevronRightIcon\n width={16}\n height={16}\n className=\"shrink-0 text-neutral-500 opacity-0 group-hover:opacity-100 transition-opacity\"\n />\n </Linkable>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n useSearchEvents,\n type PredictEvent,\n type PredictPage,\n type ProviderSource,\n} from \"@liberfi.io/react-predict\";\n\nexport interface UseSearchResultListScriptParams {\n keyword?: string;\n limit?: number;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: ProviderSource;\n}\n\nexport function useSearchResultListScript({\n keyword = \"\",\n limit,\n source,\n}: UseSearchResultListScriptParams) {\n const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchEvents(\n {\n keyword,\n limit,\n source,\n sort_by: keyword ? undefined : \"volume\",\n sort_asc: keyword ? undefined : false,\n },\n { enabled: true },\n );\n\n const events = useMemo<PredictEvent[]>(\n () =>\n data?.pages\n .flatMap((p: PredictPage<PredictEvent>) => p.items)\n .filter((item): item is PredictEvent => item != null) ?? [],\n [data],\n );\n\n return {\n events,\n isLoading,\n isFetchingNextPage,\n hasNextPage: hasNextPage ?? false,\n fetchNextPage,\n };\n}\n","\"use client\";\n\nimport { ReactElement, useCallback, useMemo, useRef } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent } from \"@liberfi.io/react-predict\";\nimport { cn, EmptyIcon, Spinner } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { SearchResultItemUI } from \"./search-result-item.ui\";\nimport {\n useSearchResultListScript,\n type UseSearchResultListScriptParams,\n} from \"./search-result-list.script\";\n\nconst ROW_HEIGHT = 64;\n\nexport type SearchResultListWidgetProps = {\n onSelect?: (event: PredictEvent) => void;\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n className?: string;\n} & UseSearchResultListScriptParams;\n\nexport function SearchResultListWidget({\n onSelect,\n getEventHref,\n LinkComponent,\n onHover,\n className,\n ...scriptParams\n}: SearchResultListWidgetProps) {\n const { events, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchResultListScript(scriptParams);\n\n const ref = useRef<HTMLDivElement>(null);\n const { height } = useResizeObserver<HTMLDivElement>({ ref });\n\n const isItemLoaded = useCallback(\n (index: number) => index < events.length,\n [events],\n );\n\n const loadMoreItems = useCallback(async () => {\n if (hasNextPage && !isFetchingNextPage) {\n await fetchNextPage();\n }\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n const itemCount = useMemo(\n () => (hasNextPage ? events.length + 1 : events.length),\n [events, hasNextPage],\n );\n\n const onRowsLoaded = useInfiniteLoader({\n isRowLoaded: isItemLoaded,\n loadMoreRows: loadMoreItems,\n rowCount: itemCount,\n threshold: 5,\n });\n\n if (isLoading) {\n return <LoadingState className={className} />;\n }\n\n if (events.length === 0) {\n return <EmptyState className={className} />;\n }\n\n return (\n <div className={cn(\"w-full h-full flex flex-col\", className)}>\n <div className=\"flex-auto min-h-0\" ref={ref}>\n <List\n className=\"no-scrollbar\"\n style={{ height }}\n onRowsRendered={onRowsLoaded}\n rowComponent={SearchResultRow}\n rowCount={itemCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{ events, onSelect, getEventHref, LinkComponent, onHover }}\n overscanCount={5}\n />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Row renderer\n// ---------------------------------------------------------------------------\n\ninterface SearchResultRowData {\n events: PredictEvent[];\n onSelect?: (event: PredictEvent) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n onHover?: (event: PredictEvent) => void;\n}\n\nfunction SearchResultRow({\n index,\n style,\n events,\n onSelect,\n getEventHref,\n LinkComponent,\n onHover,\n}: RowComponentProps<SearchResultRowData>): ReactElement {\n const event = events[index];\n\n if (!event) {\n return (\n <div style={style} className=\"flex items-center justify-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n return (\n <div style={style}>\n <SearchResultItemUI\n event={event}\n href={getEventHref?.(event)}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onHover={onHover}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// States\n// ---------------------------------------------------------------------------\n\nfunction LoadingState({ className }: { className?: string }) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\"flex items-center justify-center gap-2 py-16\", className)}\n >\n <Spinner size=\"sm\" />\n <span className=\"text-sm text-neutral\">\n {t(\"predict.search.loading\")}\n </span>\n </div>\n );\n}\n\nfunction EmptyState({ className }: { className?: string }) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center py-16\",\n className,\n )}\n >\n <EmptyIcon width={28} height={28} className=\"text-neutral\" />\n <p className=\"mt-2 text-sm text-neutral\">\n {t(\"predict.search.noResults\")}\n </p>\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { debounce } from \"@liberfi.io/utils\";\nimport { usePredictSearchHistory } from \"./search-history.script\";\n\nexport interface UseSearchScriptParams {\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n}\n\nexport function useSearchScript({ onKeywordChange }: UseSearchScriptParams) {\n const [text, setText] = useState(\"\");\n const [keyword, setKeyword] = useState(\"\");\n const { addHistory } = usePredictSearchHistory();\n\n const onKeywordChangeStable = useCallbackRef(onKeywordChange);\n const addHistoryStable = useCallbackRef(addHistory);\n\n const debouncedSearch = useMemo(\n () =>\n debounce((v: string) => {\n setKeyword(v);\n onKeywordChangeStable(v);\n if (v) addHistoryStable(v);\n }, 500),\n [onKeywordChangeStable, addHistoryStable],\n );\n\n const setText_ = useCallback(\n (v: string) => {\n setText(v);\n debouncedSearch(v);\n },\n [debouncedSearch],\n );\n\n const setKeyword_ = useCallback(\n (value: string) => {\n debouncedSearch.cancel();\n setText(value);\n setKeyword(value);\n onKeywordChangeStable(value);\n if (value) addHistoryStable(value);\n },\n [debouncedSearch, onKeywordChangeStable, addHistoryStable],\n );\n\n const clearKeyword = useCallback(() => setKeyword_(\"\"), [setKeyword_]);\n\n return {\n text,\n keyword,\n setText: setText_,\n setKeyword: setKeyword_,\n clearKeyword,\n };\n}\n","\"use client\";\n\nimport type { PredictEvent, ProviderSource } from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { SearchHistoryWidget } from \"./search-history.widget\";\nimport { SearchInputUI } from \"./search-input.ui\";\nimport { SearchResultListWidget } from \"./search-result-list.widget\";\nimport { useSearchScript } from \"./search.script\";\n\nexport type SearchWidgetProps = {\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n /** Callback when an event is selected */\n onSelectEvent?: (event: PredictEvent) => void;\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n /** Called when the Esc button / key is pressed. */\n onEscape?: () => void;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: ProviderSource;\n};\n\nexport function SearchWidget({\n onKeywordChange,\n onSelectEvent,\n getEventHref,\n LinkComponent,\n onHover,\n onEscape,\n source,\n}: SearchWidgetProps) {\n const { text, keyword, setText, setKeyword, clearKeyword } = useSearchScript({\n onKeywordChange,\n });\n\n return (\n <div className=\"w-full h-full flex flex-col gap-3\">\n <SearchInputUI\n value={text}\n onValueChange={setText}\n onClear={clearKeyword}\n onEscape={onEscape}\n />\n {!keyword && <SearchHistoryWidget onSelect={setKeyword} />}\n <SearchResultListWidget\n className=\"flex-auto min-h-0\"\n keyword={keyword}\n onSelect={onSelectEvent}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n source={source}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, ProviderSource } from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport {\n Button,\n ModalBody,\n ModalContent,\n ModalHeader,\n StyledModal,\n useScreen,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\nimport {\n AsyncModal,\n type RenderAsyncModalProps,\n} from \"@liberfi.io/ui-scaffold\";\nimport { SearchWidget } from \"./search.widget\";\n\nexport type PredictSearchModalParams = {\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: ProviderSource;\n};\n\nexport type PredictSearchModalResult = PredictEvent;\n\nexport const PREDICT_SEARCH_MODAL_ID = \"predict-search\";\n\nexport function PredictSearchModal({\n id = PREDICT_SEARCH_MODAL_ID,\n}: {\n id?: string;\n}) {\n return (\n <AsyncModal<PredictSearchModalParams, PredictSearchModalResult> id={id}>\n {(modalProps) => <PredictSearchModalContent {...modalProps} />}\n </AsyncModal>\n );\n}\n\nfunction PredictSearchModalContent({\n params,\n isOpen,\n onOpenChange,\n onResult,\n}: RenderAsyncModalProps<PredictSearchModalParams, PredictSearchModalResult>) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const handleSelectEvent = useCallback(\n (event: PredictEvent) => {\n onResult(event);\n },\n [onResult],\n );\n\n const handleEscape = useCallback(() => {\n onOpenChange(false);\n }, [onOpenChange]);\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size={isMobile ? \"full\" : \"lg\"}\n hideCloseButton\n backdrop=\"blur\"\n radius=\"lg\"\n >\n <ModalContent\n className=\"w-full h-full\"\n style={{\n borderRadius: isMobile ? undefined : 14,\n border: isMobile ? undefined : \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: isMobile ? undefined : \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n }}\n >\n <ModalHeader className=\"sm:hidden flex items-center justify-between pt-4 pb-2\">\n <span className=\"text-base font-semibold\">\n {t(\"predict.search.title\")}\n </span>\n <Button\n isIconOnly\n onPress={() => onOpenChange(false)}\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6\"\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n </ModalHeader>\n <ModalBody className=\"p-4\">\n <SearchWidget\n getEventHref={params?.getEventHref}\n LinkComponent={params?.LinkComponent}\n onHover={params?.onHover}\n source={params?.source}\n onSelectEvent={handleSelectEvent}\n onEscape={handleEscape}\n />\n </ModalBody>\n </ModalContent>\n </StyledModal>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent } from \"@liberfi.io/react-predict\";\nimport { Button, cn, Kbd, SearchIcon, useScreen } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport {\n PREDICT_SEARCH_MODAL_ID,\n type PredictSearchModalParams,\n type PredictSearchModalResult,\n} from \"./search.modal\";\n\nexport type SearchEventsButtonProps = {\n /** Callback when an event is selected from the search modal */\n onSelectEvent?: (event: PredictEvent) => void;\n /** Params forwarded to the search modal (getEventHref, LinkComponent, onHover) */\n modalParams?: Omit<PredictSearchModalParams, never>;\n className?: string;\n};\n\nexport function SearchEventsButton({\n onSelectEvent,\n modalParams,\n className,\n}: SearchEventsButtonProps) {\n const { t } = useTranslation();\n const { isDesktop, isMobile } = useScreen();\n\n const { onOpen, onClose } = useAsyncModal<\n PredictSearchModalParams,\n PredictSearchModalResult\n >(PREDICT_SEARCH_MODAL_ID);\n\n const onSelectEventStable = useCallbackRef(onSelectEvent);\n\n const handleOpen = useCallbackRef(async () => {\n const result = await onOpen({ params: modalParams });\n if (result) {\n onSelectEventStable(result);\n }\n });\n\n const handleClose = useCallbackRef(() => {\n onClose();\n });\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n const activeElement = document.activeElement as HTMLElement | null;\n\n const isInEditableElement =\n !!activeElement &&\n (activeElement.tagName === \"INPUT\" ||\n activeElement.tagName === \"TEXTAREA\" ||\n activeElement.getAttribute(\"contenteditable\") === \"true\");\n\n if (event.key === \"/\" && !isInEditableElement) {\n event.preventDefault();\n handleOpen();\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n handleClose();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleOpen, handleClose]);\n\n return (\n <Button\n size=\"sm\"\n radius=\"full\"\n isIconOnly={!isDesktop}\n onPress={handleOpen}\n variant={isMobile ? \"flat\" : \"bordered\"}\n startContent={\n isDesktop ? <SearchIcon className=\"text-neutral\" /> : undefined\n }\n endContent={\n isDesktop ? (\n <Kbd className=\"ml-auto min-w-6 justify-center text-xs bg-transparent border border-border rounded-full\">\n /\n </Kbd>\n ) : undefined\n }\n className={cn(\n isDesktop && \"min-w-56 justify-start pl-3 pr-1.5 text-neutral\",\n className,\n )}\n >\n {isDesktop ? (\n t(\"predict.search.placeholder\")\n ) : (\n <SearchIcon className=\"text-neutral\" />\n )}\n </Button>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { MatchSortField } from \"@liberfi.io/react-predict\";\n\nexport interface MatchesFilterBarProps {\n sortBy: MatchSortField;\n onSortChange: (sort: MatchSortField) => void;\n sortAsc: boolean;\n onSortAscChange: (asc: boolean) => void;\n minVolume?: number;\n onMinVolumeChange?: (vol: number | undefined) => void;\n onRefresh?: () => void;\n}\n\nconst SORT_OPTIONS: {\n value: MatchSortField;\n labelKey: string;\n descKey: string;\n icon: \"trending-up\" | \"chart-column\" | \"flame\";\n}[] = [\n {\n value: \"spread\",\n labelKey: \"predict.matches.sort.spread\",\n descKey: \"predict.matches.sort.spreadDesc\",\n icon: \"trending-up\",\n },\n {\n value: \"volume\",\n labelKey: \"predict.matches.sort.volume\",\n descKey: \"predict.matches.sort.volumeDesc\",\n icon: \"chart-column\",\n },\n {\n value: \"confidence\",\n labelKey: \"predict.matches.sort.confidence\",\n descKey: \"predict.matches.sort.confidenceDesc\",\n icon: \"flame\",\n },\n];\n\nconst VOLUME_PRESETS = [\n { labelKey: \"predict.matches.filter.noMinimum\", label: \"$0\", value: 0 },\n { labelKey: null, label: \"$100+\", value: 100 },\n { labelKey: null, label: \"$500+\", value: 500 },\n { labelKey: null, label: \"$1K+\", value: 1_000 },\n { labelKey: null, label: \"$5K+\", value: 5_000 },\n { labelKey: null, label: \"$10K+\", value: 10_000 },\n { labelKey: null, label: \"$50K+\", value: 50_000 },\n { labelKey: null, label: \"$100K+\", value: 100_000 },\n];\n\nconst btnBase: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"8px 12px\",\n fontSize: 14,\n color: \"#d4d4d8\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n};\n\nconst dropdownBase: React.CSSProperties = {\n position: \"absolute\",\n right: 0,\n top: \"100%\",\n zIndex: 20,\n marginTop: 8,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n};\n\nfunction getVolumeLabel(\n vol: number | undefined,\n t: (key: string) => string,\n): string {\n if (!vol) return \"$5K+\";\n const preset = VOLUME_PRESETS.find((p) => p.value === vol);\n if (!preset) return `$${vol}`;\n return preset.labelKey ? t(preset.labelKey) : preset.label;\n}\n\nexport function MatchesFilterBar({\n sortBy,\n onSortChange,\n sortAsc,\n onSortAscChange,\n minVolume,\n onMinVolumeChange,\n onRefresh,\n}: MatchesFilterBarProps) {\n const { t } = useTranslation();\n const [sortOpen, setSortOpen] = useState(false);\n const [volumeOpen, setVolumeOpen] = useState(false);\n const [tooltipVisible, setTooltipVisible] = useState(false);\n const [spinning, setSpinning] = useState(false);\n const sortRef = useRef<HTMLDivElement>(null);\n const volumeRef = useRef<HTMLDivElement>(null);\n\n const currentSort =\n SORT_OPTIONS.find((o) => o.value === sortBy) ?? SORT_OPTIONS[0];\n\n const handleClickOutside = useCallback((e: MouseEvent) => {\n if (sortRef.current && !sortRef.current.contains(e.target as Node)) {\n setSortOpen(false);\n }\n if (volumeRef.current && !volumeRef.current.contains(e.target as Node)) {\n setVolumeOpen(false);\n }\n }, []);\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [handleClickOutside]);\n\n const handleRefresh = useCallback(() => {\n onRefresh?.();\n setSpinning(true);\n setTimeout(() => setSpinning(false), 700);\n }, [onRefresh]);\n\n return (\n <>\n <style>{`\n @keyframes matchRefreshSpin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}\n .match-refresh-spin{animation:matchRefreshSpin .6s ease-in-out}\n .match-btn:focus-visible{outline:2px solid #c7ff2e;outline-offset:2px;z-index:10}\n `}</style>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n {/* Sort dropdown */}\n <div ref={sortRef} style={{ position: \"relative\" }}>\n <button\n type=\"button\"\n className=\"match-btn\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={() => {\n setSortOpen((v) => !v);\n setVolumeOpen(false);\n }}\n >\n <SortIcon />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {t(currentSort.labelKey as never)}\n </span>\n <ChevronDown open={sortOpen} />\n </button>\n\n {sortOpen && (\n <div style={{ ...dropdownBase, width: 224, padding: 4 }}>\n {SORT_OPTIONS.map((opt) => {\n const isActive = sortBy === opt.value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n gap: 12,\n padding: \"10px 12px\",\n textAlign: \"left\",\n fontSize: 14,\n border: \"none\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"transparent\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n borderRadius: 10,\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.5)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n onClick={() => {\n if (sortBy === opt.value) {\n onSortAscChange(!sortAsc);\n } else {\n onSortChange(opt.value);\n }\n setSortOpen(false);\n }}\n >\n <div\n style={{\n color: isActive ? \"#c7ff2e\" : \"#71717a\",\n }}\n >\n <SortOptionIcon type={opt.icon} />\n </div>\n <div style={{ flex: 1, textAlign: \"left\" as const }}>\n <div style={{ fontWeight: 500 }}>\n {t(opt.labelKey as never)}\n </div>\n <div\n style={{\n fontSize: 11,\n color: \"#71717a\",\n marginTop: 1,\n }}\n >\n {t(opt.descKey as never)}\n </div>\n </div>\n {isActive && (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 16,\n height: 16,\n color: \"#c7ff2e\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Volume filter */}\n {onMinVolumeChange && (\n <div ref={volumeRef} style={{ position: \"relative\" }}>\n <div style={{ position: \"relative\", display: \"inline-flex\" }}>\n <button\n type=\"button\"\n className=\"match-btn\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={() => {\n setVolumeOpen((v) => !v);\n setSortOpen(false);\n }}\n >\n <FilterIcon />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {getVolumeLabel(minVolume, t as (key: string) => string)}\n </span>\n <InfoIcon\n onMouseEnter={() => setTooltipVisible(true)}\n onMouseLeave={() => setTooltipVisible(false)}\n />\n <ChevronDown open={volumeOpen} />\n </button>\n\n {/* Tooltip */}\n {tooltipVisible && (\n <div\n style={{\n position: \"absolute\",\n zIndex: 100,\n top: \"100%\",\n marginTop: 8,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: 256,\n padding: 12,\n borderRadius: 14,\n background: \"rgba(24,24,27,1)\",\n border: \"1px solid rgba(63,63,70,0.5)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n pointerEvents: \"none\",\n }}\n >\n {/* Arrow */}\n <div\n style={{\n position: \"absolute\",\n top: -6,\n left: \"50%\",\n transform: \"translateX(-50%) rotate(45deg)\",\n width: 12,\n height: 12,\n background: \"rgba(24,24,27,1)\",\n borderLeft: \"1px solid rgba(63,63,70,0.5)\",\n borderTop: \"1px solid rgba(63,63,70,0.5)\",\n }}\n />\n <div\n style={{\n position: \"relative\",\n fontSize: 12,\n color: \"#d4d4d8\",\n lineHeight: 1.625,\n }}\n >\n <div\n style={{\n fontWeight: 600,\n color: \"#fff\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n marginBottom: 8,\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#c7ff2e\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\" />\n </svg>\n {t(\"predict.matches.filter.liquidityFilter\" as never)}\n </div>\n <p style={{ color: \"#a1a1aa\", margin: \"0 0 4px\" }}>\n {t(\"predict.matches.filter.tooltipDesc\" as never)}\n </p>\n <p style={{ color: \"#71717a\", fontSize: 11, margin: 0 }}>\n {t(\"predict.matches.filter.tooltipNote\" as never)}\n </p>\n </div>\n </div>\n )}\n </div>\n\n {/* Volume dropdown */}\n {volumeOpen && (\n <div style={{ ...dropdownBase, right: 0, width: 176 }}>\n <div\n style={{\n padding: \"8px 12px\",\n borderBottom: \"1px solid rgba(39,39,42,1)\",\n }}\n >\n <span\n style={{\n fontSize: 11,\n fontWeight: 500,\n color: \"#71717a\",\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.05em\",\n }}\n >\n {t(\"predict.matches.filter.minVolumeEach\" as never)}\n </span>\n </div>\n <div style={{ padding: 4 }}>\n {VOLUME_PRESETS.map((p) => {\n const isActive =\n p.value === 0 ? !minVolume : minVolume === p.value;\n return (\n <button\n key={p.value}\n type=\"button\"\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 12px\",\n textAlign: \"left\",\n fontSize: 14,\n border: \"none\",\n cursor: \"pointer\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"transparent\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n borderRadius: 10,\n transition: \"all 0.15s\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background =\n \"rgba(39,39,42,0.5)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n onClick={() => {\n onMinVolumeChange?.(\n p.value === 0 ? undefined : p.value,\n );\n setVolumeOpen(false);\n }}\n >\n <span>\n {p.labelKey ? t(p.labelKey as never) : p.label}\n </span>\n {isActive && (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 16,\n height: 16,\n color: \"#c7ff2e\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Refresh button */}\n {onRefresh && (\n <button\n type=\"button\"\n className=\"match-btn\"\n style={{\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n width: 36,\n height: 36,\n color: \"#a1a1aa\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n e.currentTarget.style.color = \"#fff\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }}\n onClick={handleRefresh}\n >\n <svg\n className={spinning ? \"match-refresh-spin\" : undefined}\n viewBox=\"0 0 24 24\"\n style={{ width: 16, height: 16 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n </svg>\n </button>\n )}\n </div>\n </>\n );\n}\n\nfunction SortIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m21 16-4 4-4-4\" />\n <path d=\"M17 20V4\" />\n <path d=\"m3 8 4-4 4 4\" />\n <path d=\"M7 4v16\" />\n </svg>\n );\n}\n\nfunction SortOptionIcon({\n type,\n}: {\n type: \"trending-up\" | \"chart-column\" | \"flame\";\n}) {\n const style: React.CSSProperties = { width: 16, height: 16 };\n const shared = {\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n };\n\n if (type === \"trending-up\") {\n return (\n <svg {...shared} style={style}>\n <path d=\"M16 7h6v6\" />\n <path d=\"m22 7-8.5 8.5-5-5L2 17\" />\n </svg>\n );\n }\n if (type === \"chart-column\") {\n return (\n <svg {...shared} style={style}>\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n );\n }\n return (\n <svg {...shared} style={style}>\n <path d=\"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\" />\n </svg>\n );\n}\n\nfunction FilterIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\" />\n </svg>\n );\n}\n\nfunction InfoIcon({\n onMouseEnter,\n onMouseLeave,\n}: {\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n className=\"hidden sm:block\"\n style={{ width: 12, height: 12, color: \"#52525b\", flexShrink: 0 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n );\n}\n\nfunction ChevronDown({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#71717a\",\n transition: \"transform 0.15s\",\n transform: open ? \"rotate(180deg)\" : undefined,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\n\nexport interface MatchesHeroStats {\n activePairs: number;\n maxSpread: number;\n highSpreadCount: number;\n totalVolume: number;\n}\n\nexport interface MatchesHeroProps {\n stats?: MatchesHeroStats;\n}\n\nfunction formatVolume(vol: number): string {\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${(vol / 1_000).toFixed(0)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\nconst STAT_CARDS: {\n key: keyof MatchesHeroStats;\n labelKey: string;\n format: (v: number) => string;\n valueColor: string;\n gradientFrom: string;\n gradientTo: string;\n borderColor: string;\n}[] = [\n {\n key: \"activePairs\",\n labelKey: \"predict.matches.stats.activePairs\",\n format: (v) => v.toLocaleString(),\n valueColor: \"#c7ff2e\",\n gradientFrom: \"rgba(199,255,46,0.18)\",\n gradientTo: \"rgba(199,255,46,0.04)\",\n borderColor: \"rgba(199,255,46,0.18)\",\n },\n {\n key: \"maxSpread\",\n labelKey: \"predict.matches.stats.maxSpread\",\n format: (v) => `${(v * 100).toFixed(1)}%`,\n valueColor: \"#f76816\",\n gradientFrom: \"rgba(247,104,22,0.18)\",\n gradientTo: \"rgba(247,104,22,0.04)\",\n borderColor: \"rgba(247,104,22,0.18)\",\n },\n {\n key: \"highSpreadCount\",\n labelKey: \"predict.matches.stats.highSpreadCount\",\n format: (v) => v.toLocaleString(),\n valueColor: \"#17c964\",\n gradientFrom: \"rgba(23,201,100,0.18)\",\n gradientTo: \"rgba(23,201,100,0.04)\",\n borderColor: \"rgba(23,201,100,0.18)\",\n },\n {\n key: \"totalVolume\",\n labelKey: \"predict.matches.stats.totalVolume\",\n format: formatVolume,\n valueColor: \"#f5a524\",\n gradientFrom: \"rgba(245,165,36,0.18)\",\n gradientTo: \"rgba(245,165,36,0.04)\",\n borderColor: \"rgba(245,165,36,0.18)\",\n },\n];\n\nexport function MatchesHero({ stats }: MatchesHeroProps) {\n const { t } = useTranslation();\n\n return (\n <>\n <style>{`\n @keyframes match-live-ping{75%,100%{transform:scale(2.2);opacity:0}}\n @keyframes match-live-breathe{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(.85)}}\n @keyframes matchStatsEnter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}\n @keyframes matchStatCardEnter{from{opacity:0;transform:translateY(8px) scale(0.97)}to{opacity:1;transform:translateY(0) scale(1)}}\n @keyframes matchHeroTitleEnter{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n\n .matches-hero-title{font-size:32px!important;line-height:1.2!important}\n @media(min-width:640px){.matches-hero-title{font-size:38px!important}}\n @media(min-width:1024px){.matches-hero-title{font-size:46px!important}}\n\n .matches-hero-subtitle{font-size:14px}\n @media(min-width:640px){.matches-hero-subtitle{font-size:15px}}\n\n .matches-hero-outer{flex-direction:column;align-items:center;text-align:center;gap:28px}\n @media(min-width:640px){.matches-hero-outer{flex-direction:row;align-items:center;text-align:left;gap:40px}}\n @media(min-width:1024px){.matches-hero-outer{gap:56px}}\n\n .matches-hero-left{align-items:center}\n @media(min-width:640px){.matches-hero-left{align-items:flex-start}}\n\n .matches-hero-live{justify-content:center}\n @media(min-width:640px){.matches-hero-live{justify-content:flex-start}}\n\n .matches-hero-subtitle-text{text-align:center;margin:0 auto}\n @media(min-width:640px){.matches-hero-subtitle-text{text-align:left;margin:0}}\n\n .matches-stat-grid{grid-template-columns:repeat(2,1fr);width:100%;max-width:360px}\n @media(min-width:640px){.matches-stat-grid{width:340px;max-width:none}}\n @media(min-width:1024px){.matches-stat-grid{width:380px}}\n\n .matches-stat-val{font-size:20px;line-height:28px;min-height:28px}\n @media(min-width:640px){.matches-stat-val{font-size:22px;line-height:30px;min-height:30px}}\n @media(min-width:1024px){.matches-stat-val{font-size:24px;line-height:32px;min-height:32px}}\n\n .matches-stat-label{font-size:11px;line-height:16px;min-height:16px}\n @media(min-width:640px){.matches-stat-label{font-size:12px;line-height:18px;min-height:18px}}\n `}</style>\n\n <div\n className=\"matches-hero-outer\"\n style={{\n display: \"flex\",\n marginBottom: 0,\n }}\n >\n {/* Left: title group */}\n <div\n className=\"matches-hero-left\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minWidth: 0,\n flex: 1,\n animation:\n \"matchHeroTitleEnter 0.5s cubic-bezier(0.34,1.56,0.64,1) both\",\n }}\n >\n {/* Live badge */}\n <div\n className=\"matches-hero-live\"\n style={{ display: \"flex\", marginBottom: 16 }}\n >\n <div\n className=\"inline-flex items-center\"\n style={{\n gap: 8,\n borderRadius: 9999,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"6px 12px\",\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n }}\n >\n <span\n style={{\n position: \"relative\",\n display: \"flex\",\n width: 8,\n height: 8,\n }}\n >\n <span\n style={{\n position: \"absolute\",\n display: \"inline-flex\",\n width: \"100%\",\n height: \"100%\",\n borderRadius: 9999,\n background: \"#00d492\",\n opacity: 0.75,\n animation:\n \"match-live-ping 1.2s cubic-bezier(0,0,0.2,1) infinite\",\n }}\n />\n <span\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n width: 8,\n height: 8,\n borderRadius: 9999,\n background: \"#00bc7d\",\n animation: \"match-live-breathe 2.4s ease-in-out infinite\",\n }}\n />\n </span>\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: \"#d4d4d8\",\n letterSpacing: \"0.025em\",\n }}\n >\n {t(\"predict.matches.liveBadge\" as const)}\n </span>\n <span\n style={{\n borderRadius: 4,\n background: \"rgba(199,255,46,0.12)\",\n padding: \"2px 6px\",\n fontSize: 10,\n fontWeight: 600,\n color: \"#c7ff2e\",\n textTransform: \"uppercase\" as const,\n border: \"1px solid rgba(199,255,46,0.22)\",\n }}\n >\n {t(\"predict.matches.betaTag\" as const)}\n </span>\n </div>\n </div>\n\n {/* Title */}\n <h1\n className=\"matches-hero-title\"\n style={{\n fontFamily: \"var(--font-dm-sans, 'DM Sans', sans-serif)\",\n fontSize: 46,\n fontWeight: 700,\n letterSpacing: \"-1.2px\",\n lineHeight: 1.2,\n color: \"#fff\",\n margin: \"0 0 14px\",\n }}\n >\n <span style={{ color: \"#fff\" }}>\n {t(\"predict.matches.titlePrefix\" as never)}{\" \"}\n </span>\n <span\n style={{\n backgroundImage:\n \"linear-gradient(to right, #c7ff2e, #a0e515, #17c964)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\",\n }}\n >\n {t(\"predict.matches.titleHighlight\" as never)}\n </span>\n </h1>\n\n {/* Subtitle */}\n <p\n className=\"matches-hero-subtitle matches-hero-subtitle-text\"\n style={{\n lineHeight: 1.6,\n color: \"#71717a\",\n maxWidth: 460,\n }}\n >\n {String(t(\"predict.matches.heroSubtitle\" as never))\n .split(\"\\n\")\n .map((line: string, i: number) => (\n <span key={i}>\n {i > 0 && <br className=\"hidden sm:block\" />}\n {line}\n {i === 0 ? \" \" : \"\"}\n </span>\n ))}\n </p>\n </div>\n\n {/* Right: 2x2 stat grid */}\n <div\n className=\"matches-stat-grid\"\n style={{\n display: \"grid\",\n borderRadius: 16,\n border: \"1px solid rgba(39,39,42,0.5)\",\n overflow: \"hidden\",\n flexShrink: 0,\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n ...(stats\n ? {\n animation:\n \"matchStatsEnter 0.5s cubic-bezier(0.34,1.56,0.64,1) both\",\n animationDelay: \"0.1s\",\n }\n : {}),\n }}\n >\n {STAT_CARDS.map((card, idx) => (\n <div\n key={card.key}\n style={{\n padding: \"16px 20px\",\n background: stats\n ? `linear-gradient(to bottom, ${card.gradientFrom}, ${card.gradientTo})`\n : \"rgba(255,255,255,0.02)\",\n borderRight:\n idx % 2 === 0 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n borderBottom: idx < 2 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n ...(stats\n ? {\n animation:\n \"matchStatCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) both\",\n animationDelay: `${150 + idx * 60}ms`,\n }\n : {}),\n }}\n >\n <div\n className=\"matches-stat-val\"\n style={{\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: stats ? card.valueColor : \"transparent\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {stats ? (\n card.format(stats[card.key])\n ) : (\n <div\n style={{\n height: 16,\n width: 56,\n borderRadius: 4,\n background: \"rgba(255,255,255,0.06)\",\n animation: \"matchStatCardEnter 0.6s ease-out both\",\n animationDelay: `${idx * 80}ms`,\n }}\n />\n )}\n </div>\n <div\n className=\"matches-stat-label\"\n style={{\n fontWeight: 500,\n color: stats ? \"#71717a\" : \"transparent\",\n marginTop: 2,\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {stats ? (\n t(card.labelKey as never)\n ) : (\n <div\n style={{\n height: 10,\n width: 64,\n borderRadius: 4,\n background: \"rgba(255,255,255,0.04)\",\n animation: \"matchStatCardEnter 0.6s ease-out both\",\n animationDelay: `${50 + idx * 80}ms`,\n }}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n </>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchConfidenceTier,\n MatchMarketFlat,\n PredictMarket,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { getSourceMeta } from \"./source-badge.ui\";\n\nexport interface MatchMarketCardProps {\n match: MatchMarketFlat;\n onSelect?: (match: MatchMarketFlat, source: ProviderSource) => void;\n onHover?: (match: MatchMarketFlat) => void;\n getMarketHref?: (\n match: MatchMarketFlat,\n source: ProviderSource,\n ) => string | undefined;\n LinkComponent?: LinkComponentType;\n}\n\nfunction formatVolume(vol: number | null | undefined): string {\n if (vol == null) return \"-\";\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${Math.round(vol / 1_000)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\nfunction getYesPrice(market: PredictMarket): number | null {\n const yes = market.outcomes?.[0];\n return yes?.best_ask ?? yes?.price ?? null;\n}\n\nfunction getOutcomeName(market: PredictMarket): string | null {\n return market.outcomes?.[0]?.label || null;\n}\n\ntype SpreadTier = \"high\" | \"medium\" | \"low\";\n\nfunction getSpreadTier(spreadPercent: number | null): SpreadTier {\n if (spreadPercent == null) return \"low\";\n if (spreadPercent >= 3) return \"high\";\n if (spreadPercent >= 2) return \"medium\";\n return \"low\";\n}\n\nconst SPREAD_THEME: Record<\n SpreadTier,\n {\n color: string;\n bandFrom: string;\n bandTo: string;\n gaugeActive: string;\n gaugeInactive: string;\n }\n> = {\n high: {\n color: \"#f76816\",\n bandFrom: \"rgba(247,104,22,0.14)\",\n bandTo: \"rgba(247,104,22,0.03)\",\n gaugeActive: \"#f76816\",\n gaugeInactive: \"rgba(247,104,22,0.15)\",\n },\n medium: {\n color: \"#c7ff2e\",\n bandFrom: \"rgba(199,255,46,0.12)\",\n bandTo: \"rgba(199,255,46,0.02)\",\n gaugeActive: \"#c7ff2e\",\n gaugeInactive: \"rgba(199,255,46,0.15)\",\n },\n low: {\n color: \"#71717a\",\n bandFrom: \"rgba(113,113,122,0.08)\",\n bandTo: \"transparent\",\n gaugeActive: \"#71717a\",\n gaugeInactive: \"rgba(113,113,122,0.12)\",\n },\n};\n\nconst SPREAD_GLOW: Record<SpreadTier, { border: string; shadow: string }> = {\n high: {\n border: \"rgba(247,104,22,0.4)\",\n shadow: \"0 2px 18px rgba(247,104,22,0.35)\",\n },\n medium: {\n border: \"rgba(199,255,46,0.5)\",\n shadow: \"0 2px 20px rgba(199,255,46,0.45)\",\n },\n low: {\n border: \"rgba(113,113,122,0.5)\",\n shadow: \"0 2px 20px rgba(113,113,122,0.35)\",\n },\n};\n\nconst CONFIDENCE_THEME: Record<string, { dot: string; label: string }> = {\n high: { dot: \"#17c964\", label: \"predict.matches.confidenceHigh\" },\n medium: { dot: \"#f5a524\", label: \"predict.matches.confidenceMed\" },\n low: { dot: \"#71717a\", label: \"predict.matches.confidenceLow\" },\n};\n\nfunction getConfidenceTierKey(\n tier: MatchConfidenceTier | undefined,\n score: number | undefined,\n): string {\n if (tier) return tier;\n if (score == null) return \"low\";\n if (score >= 0.9) return \"high\";\n if (score >= 0.7) return \"medium\";\n return \"low\";\n}\n\nfunction SpreadGauge({ tier }: { tier: SpreadTier }) {\n const theme = SPREAD_THEME[tier];\n const filled = tier === \"high\" ? 5 : tier === \"medium\" ? 3 : 1;\n return (\n <div style={{ display: \"flex\", gap: 2, alignItems: \"center\" }}>\n {Array.from({ length: 5 }, (_, i) => (\n <div\n key={i}\n style={{\n width: 6,\n height: 10,\n borderRadius: 1.5,\n background: i < filled ? theme.gaugeActive : theme.gaugeInactive,\n transition: \"background 0.2s\",\n }}\n />\n ))}\n </div>\n );\n}\n\nconst PLATFORM_COLORS: Record<string, { text: string; icon: string }> = {\n polymarket: { text: \"#50a2ff\", icon: \"#50a2ff\" },\n kalshi: { text: \"#00d492\", icon: \"#00d492\" },\n};\n\nconst DEFAULT_PLATFORM = { text: \"#9ca3af\", icon: \"#9ca3af\" };\n\nfunction getPlatformColor(source: string) {\n return PLATFORM_COLORS[source] ?? DEFAULT_PLATFORM;\n}\n\nexport function MatchMarketCard({\n match,\n onSelect,\n onHover,\n getMarketHref,\n LinkComponent,\n}: MatchMarketCardProps) {\n const { t } = useTranslation();\n\n const priceA = getYesPrice(match.market_a);\n const priceB = getYesPrice(match.market_b);\n const spreadPercent =\n match.spread_percent != null\n ? match.spread_percent\n : match.spread != null\n ? match.spread * 100\n : null;\n\n const tier = getSpreadTier(spreadPercent);\n const theme = SPREAD_THEME[tier];\n\n const cheaperSource: ProviderSource | null =\n priceA != null && priceB != null\n ? priceA <= priceB\n ? match.source_a\n : match.source_b\n : null;\n\n const title = match.event_a_title || match.event_b_title;\n\n const confKey = getConfidenceTierKey(\n match.confidence_tier,\n match.similarity_score,\n );\n const confTheme = CONFIDENCE_THEME[confKey] ?? CONFIDENCE_THEME.low;\n\n const ctaAccent = tier === \"high\" ? \"orange\" : \"lime\";\n\n return (\n <div\n className=\"group\"\n style={{\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n transition: \"all 0.2s\",\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n const glow = SPREAD_GLOW[tier];\n el.style.borderColor = glow.border;\n el.style.boxShadow = glow.shadow;\n onHover?.(match);\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(39,39,42,0.6)\";\n el.style.boxShadow = \"none\";\n }}\n >\n {/* Spread hero band */}\n {spreadPercent != null && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 14px\",\n background: `linear-gradient(90deg, ${theme.bandFrom}, ${theme.bandTo})`,\n borderBottom: \"1px solid rgba(39,39,42,0.3)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n flexShrink: 0,\n color: theme.color,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n <span\n style={{\n fontSize: 15,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: theme.color,\n }}\n >\n {spreadPercent.toFixed(1)}%\n </span>\n <span\n style={{\n fontSize: 10,\n fontWeight: 500,\n color: \"rgba(161,161,170,0.7)\",\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.06em\",\n }}\n >\n SPREAD\n </span>\n </div>\n <SpreadGauge tier={tier} />\n </div>\n )}\n\n <div style={{ padding: \"14px 14px 12px\" }}>\n {/* Title */}\n <h3\n style={{\n fontSize: 13,\n fontWeight: 600,\n lineHeight: 1.4,\n letterSpacing: \"-0.2px\",\n color: \"#f4f4f5\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\" as const,\n margin: \"0 0 12px\",\n }}\n >\n {title}\n </h3>\n\n {/* Platform comparison rows */}\n <div\n style={{\n borderRadius: 10,\n border: \"1px solid rgba(39,39,42,0.4)\",\n overflow: \"hidden\",\n }}\n >\n <PlatformRow\n source={match.source_a}\n market={match.market_a}\n isCheaper={cheaperSource === match.source_a}\n onClick={() => onSelect?.(match, match.source_a)}\n href={getMarketHref?.(match, match.source_a)}\n LinkComponent={LinkComponent}\n />\n <div style={{ height: 1, background: \"rgba(39,39,42,0.3)\" }} />\n <PlatformRow\n source={match.source_b}\n market={match.market_b}\n isCheaper={cheaperSource === match.source_b}\n onClick={() => onSelect?.(match, match.source_b)}\n href={getMarketHref?.(match, match.source_b)}\n LinkComponent={LinkComponent}\n />\n </div>\n\n {/* CTA button */}\n {cheaperSource && spreadPercent != null && (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"flex-end\",\n marginTop: 10,\n }}\n >\n <button\n type=\"button\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"5px 12px\",\n borderRadius: 8,\n border: `1px solid ${ctaAccent === \"orange\" ? \"rgba(247,104,22,0.2)\" : \"rgba(199,255,46,0.15)\"}`,\n background:\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.08)\"\n : \"rgba(199,255,46,0.06)\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n fontSize: 11,\n fontWeight: 500,\n color:\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.9)\"\n : \"rgba(199,255,46,0.85)\",\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget;\n el.style.background =\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.14)\"\n : \"rgba(199,255,46,0.10)\";\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget;\n el.style.background =\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.08)\"\n : \"rgba(199,255,46,0.06)\";\n }}\n onClick={() => onSelect?.(match, cheaperSource)}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 12,\n height: 12,\n flexShrink: 0,\n color: ctaAccent === \"orange\" ? \"#f76816\" : \"#c7ff2e\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n {t(\"predict.matches.buyEdge\" as never, {\n platform:\n cheaperSource.charAt(0).toUpperCase() +\n cheaperSource.slice(1),\n spread: spreadPercent.toFixed(1),\n })}\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 10,\n height: 10,\n color:\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.5)\"\n : \"rgba(199,255,46,0.4)\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 12h14\" />\n <path d=\"m12 5 7 7-7 7\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.15)\",\n padding: \"8px 14px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 11, height: 11 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n {formatVolume(match.combined_volume)}\n </span>\n {match.combined_volume_24h != null &&\n match.combined_volume_24h > 0 && (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 11, height: 11 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\" />\n </svg>\n {formatVolume(match.combined_volume_24h)}{\" \"}\n {t(\"predict.matches.vol24h\" as never)}\n </span>\n )}\n </div>\n {/* Confidence tier badge */}\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 10,\n color: \"#52525b\",\n }}\n >\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: confTheme.dot,\n flexShrink: 0,\n }}\n />\n {t(confTheme.label as never)}\n </span>\n </div>\n </div>\n );\n}\n\nfunction PlatformRow({\n source,\n market,\n isCheaper,\n onClick,\n href,\n LinkComponent,\n}: {\n source: ProviderSource | string;\n market: PredictMarket;\n isCheaper: boolean;\n onClick?: () => void;\n href?: string;\n LinkComponent?: LinkComponentType;\n}) {\n const { t } = useTranslation();\n const meta = getSourceMeta(source);\n const platColor = getPlatformColor(source);\n const yesPrice = getYesPrice(market);\n const outcomeName = getOutcomeName(market);\n const volume = market.volume;\n\n const content = (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"10px 12px\",\n cursor: href || onClick ? \"pointer\" : undefined,\n transition: \"background 0.15s\",\n background: isCheaper ? \"rgba(199,255,46,0.03)\" : \"transparent\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.background = isCheaper\n ? \"rgba(199,255,46,0.06)\"\n : \"rgba(255,255,255,0.02)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.background = isCheaper\n ? \"rgba(199,255,46,0.03)\"\n : \"transparent\";\n }}\n onClick={onClick}\n >\n {/* Cheaper indicator */}\n {isCheaper ? (\n <span style={{ fontSize: 10, color: \"#c7ff2e\", flexShrink: 0 }}>★</span>\n ) : (\n <span style={{ width: 10, flexShrink: 0 }} />\n )}\n\n {/* Platform icon + name */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n width: 90,\n flexShrink: 0,\n }}\n >\n {meta.icon}\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.04em\",\n color: platColor.text,\n textTransform: \"uppercase\" as const,\n }}\n >\n {meta.label}\n </span>\n </div>\n\n {/* Outcome name + volume */}\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 1,\n }}\n >\n {outcomeName && (\n <span\n style={{\n fontSize: 10,\n color: \"#71717a\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\" as const,\n }}\n >\n {outcomeName}\n </span>\n )}\n <span style={{ fontSize: 9, color: \"#52525b\" }}>\n {formatVolume(volume)} {t(\"predict.matches.volume\" as never)}\n </span>\n </div>\n\n {/* Price */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"baseline\",\n gap: 3,\n flexShrink: 0,\n }}\n >\n <span\n style={{\n fontSize: 18,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: isCheaper ? \"#c7ff2e\" : \"#f4f4f5\",\n }}\n >\n {yesPrice != null ? (yesPrice * 100).toFixed(1) : \"-\"}\n </span>\n <span style={{ fontSize: 9, color: \"#71717a\" }}>\n {t(\"predict.matches.centsYes\" as never)}\n </span>\n </div>\n\n {/* External link icon */}\n <svg\n viewBox=\"0 0 24 24\"\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n style={{\n width: 10,\n height: 10,\n color: \"#52525b\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M7 7h10v10\" />\n <path d=\"M7 17 17 7\" />\n </svg>\n </div>\n );\n\n if (href && LinkComponent) {\n return (\n <LinkComponent href={href} className=\"block\">\n {content}\n </LinkComponent>\n );\n }\n\n return content;\n}\n","import {\n useState,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n forwardRef,\n} from \"react\";\nimport { keepPreviousData } from \"@tanstack/react-query\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchSortField,\n MatchMarketFlat,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport { useInfiniteMatchMarkets } from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { MatchMarketCard } from \"./match-market-card.ui\";\nimport type { MatchesHeroStats } from \"./matches-hero.ui\";\n\nexport interface MatchesWidgetRef {\n refetch: () => void;\n}\n\nexport interface MatchesWidgetProps {\n sortBy: MatchSortField;\n sortAsc: boolean;\n minVolume?: number;\n onSelect?: (match: MatchMarketFlat, source: ProviderSource) => void;\n onHover?: (match: MatchMarketFlat) => void;\n getMarketHref?: (\n match: MatchMarketFlat,\n source: ProviderSource,\n ) => string | undefined;\n LinkComponent?: LinkComponentType;\n onStatsChange?: (stats: MatchesHeroStats) => void;\n /** @deprecated Use onSelect instead */\n onSelectEntry?: (event: never) => void;\n /** @deprecated Use getMarketHref instead */\n getEventHref?: (event: never) => string;\n}\n\nexport const MatchesWidget = forwardRef<MatchesWidgetRef, MatchesWidgetProps>(\n function MatchesWidget(\n {\n sortBy,\n sortAsc,\n minVolume,\n onSelect,\n onHover,\n getMarketHref,\n LinkComponent,\n onStatsChange,\n },\n ref,\n ) {\n const { t } = useTranslation();\n\n const {\n data,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n isLoading,\n isPlaceholderData,\n refetch,\n } = useInfiniteMatchMarkets(\n {\n sort_by: sortBy,\n sort_asc: sortAsc,\n min_volume: minVolume,\n status: \"active\",\n limit: 20,\n },\n { placeholderData: keepPreviousData },\n );\n\n const [animKey, setAnimKey] = useState(0);\n const [prevIsPlaceholder, setPrevIsPlaceholder] = useState(false);\n\n if (prevIsPlaceholder && !isPlaceholderData) {\n setPrevIsPlaceholder(false);\n setAnimKey((k) => k + 1);\n } else if (isPlaceholderData && !prevIsPlaceholder) {\n setPrevIsPlaceholder(true);\n }\n\n // staggerBase removed: rendering iterates pages directly so each card's\n // animation delay is stable across page loads (no mass DOM reflow).\n\n useImperativeHandle(\n ref,\n () => ({\n refetch: () => {\n refetch();\n },\n }),\n [refetch],\n );\n\n const allMatches = useMemo(\n () => data?.pages.flatMap((p) => p.items ?? []) ?? [],\n [data],\n );\n\n const total = data?.pages[0]?.total;\n\n const stats = useMemo<MatchesHeroStats>(() => {\n let maxSpread = 0;\n let totalVolume = 0;\n let highSpreadCount = 0;\n\n for (const m of allMatches) {\n const spread = m.spread ?? 0;\n if (spread > maxSpread) maxSpread = spread;\n if (spread >= 0.03) highSpreadCount++;\n if (m.combined_volume != null) {\n totalVolume += m.combined_volume;\n }\n }\n\n return {\n activePairs: total ?? allMatches.length,\n maxSpread,\n highSpreadCount,\n totalVolume,\n };\n }, [allMatches, total]);\n\n useEffect(() => {\n if (stats.activePairs > 0) {\n onStatsChange?.(stats);\n }\n }, [stats, onStatsChange]);\n\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const el = sentinelRef.current;\n if (!el) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (\n entries[0]?.isIntersecting &&\n hasNextPage &&\n !isFetchingNextPage\n ) {\n fetchNextPage();\n }\n },\n { rootMargin: \"200px\" },\n );\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n // Disable elastic overscroll while more pages can load.\n // Prevents the bounce → scrollHeight change → sticky jump sequence.\n useEffect(() => {\n if (!hasNextPage) return;\n document.documentElement.style.overscrollBehaviorY = \"none\";\n return () => {\n document.documentElement.style.overscrollBehaviorY = \"\";\n };\n }, [hasNextPage]);\n\n if (isLoading) {\n return <MatchesSkeletonList />;\n }\n\n if (allMatches.length === 0) {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"80px 0\",\n color: \"rgba(255,255,255,0.35)\",\n }}\n >\n <p style={{ fontSize: 18 }}>{t(\"predict.matches.empty\")}</p>\n </div>\n );\n }\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <style>{`\n@media(max-width:1023px){.matches-card-grid{grid-template-columns:1fr!important}}\n@keyframes matchCardEnter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}\n`}</style>\n <div\n className=\"matches-card-grid\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(2, 1fr)\",\n gap: 16,\n }}\n >\n {data?.pages.map((page) =>\n page.items?.map((match, itemIndex) => (\n <div\n key={`${animKey}-${match.match_id}-${match.source_a}-${match.market_a?.slug ?? itemIndex}`}\n style={{\n animation: `matchCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) ${itemIndex * 35}ms both`,\n }}\n >\n <MatchMarketCard\n match={match}\n onSelect={onSelect}\n onHover={onHover}\n getMarketHref={getMarketHref}\n LinkComponent={LinkComponent}\n />\n </div>\n )),\n )}\n </div>\n\n {/* Infinite scroll sentinel */}\n <div\n ref={sentinelRef}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 8,\n padding: \"16px 0\",\n minHeight: 1,\n }}\n >\n <style>{`@keyframes match-load-spin{to{transform:rotate(360deg)}}`}</style>\n {isFetchingNextPage && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: \"#71717a\",\n fontSize: 13,\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ animation: \"match-load-spin 1s linear infinite\" }}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n {t(\"predict.matches.loadMore\")}\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nfunction MatchesSkeletonList() {\n return (\n <>\n <style>{`@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}@media(max-width:1023px){.matches-skeleton-grid{grid-template-columns:1fr!important}}`}</style>\n <div\n className=\"matches-skeleton-grid\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(2, 1fr)\",\n gap: 16,\n }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <SkeletonCard key={i} index={i} />\n ))}\n </div>\n </>\n );\n}\n\nfunction SkeletonCard({ index }: { index: number }) {\n const delay = index * 150;\n const shimmer: React.CSSProperties = {\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.03) 25%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0.03) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: `shimmer 1.8s ease-in-out infinite ${delay}ms`,\n borderRadius: 6,\n };\n\n return (\n <div\n style={{\n borderRadius: 16,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n justifyContent: \"space-between\",\n padding: \"16px 16px 12px\",\n }}\n >\n <div\n style={{\n ...shimmer,\n height: 14,\n width: index % 2 === 0 ? \"75%\" : \"60%\",\n }}\n />\n <div\n style={{\n ...shimmer,\n height: 24,\n width: 64,\n borderRadius: 10,\n flexShrink: 0,\n marginLeft: 12,\n }}\n />\n </div>\n\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: 16,\n padding: \"0 16px\",\n }}\n >\n {[0, 1].map((j) => (\n <div\n key={j}\n style={{\n borderRadius: 12,\n border: \"1px solid rgba(255,255,255,0.04)\",\n background: \"rgba(255,255,255,0.02)\",\n padding: 12,\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 8,\n }}\n >\n <div style={{ ...shimmer, height: 10, width: 72 }} />\n <div style={{ ...shimmer, height: 10, width: 48 }} />\n <div style={{ ...shimmer, height: 20, width: 56 }} />\n <div style={{ ...shimmer, height: 10, width: 60, marginTop: 4 }} />\n </div>\n ))}\n </div>\n\n <div style={{ padding: \"12px 16px\" }}>\n <div\n style={{\n ...shimmer,\n height: 36,\n borderRadius: 10,\n width: \"100%\",\n }}\n />\n </div>\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n padding: \"10px 16px\",\n }}\n >\n <div style={{ display: \"flex\", gap: 12 }}>\n <div style={{ ...shimmer, height: 10, width: 40 }} />\n <div style={{ ...shimmer, height: 10, width: 50 }} />\n </div>\n <div style={{ ...shimmer, height: 10, width: 56 }} />\n </div>\n </div>\n );\n}\n","import {\n useState,\n useCallback,\n useRef,\n useEffect,\n startTransition,\n} from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchSortField,\n MatchMarketFlat,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { MatchesFilterBar } from \"./matches-filter-bar.ui\";\nimport { MatchesHero, type MatchesHeroStats } from \"./matches-hero.ui\";\nimport { MatchesWidget, type MatchesWidgetRef } from \"./matches.widget\";\n\nconst SORT_TITLE_KEY: Record<MatchSortField, string> = {\n spread: \"predict.matches.topOpportunities\",\n volume: \"predict.matches.highestVolume\",\n confidence: \"predict.matches.trendingToday\",\n};\n\nexport interface MatchesPageProps {\n onSelect?: (match: MatchMarketFlat, source: ProviderSource) => void;\n onHover?: (match: MatchMarketFlat) => void;\n getMarketHref?: (\n match: MatchMarketFlat,\n source: ProviderSource,\n ) => string | undefined;\n LinkComponent?: LinkComponentType;\n /** Path to the hero background image (e.g. \"/matches-bg.webp\") */\n bgImageSrc?: string;\n /** @deprecated Use onSelect instead */\n onSelectEntry?: (event: never) => void;\n /** @deprecated Use getMarketHref instead */\n getEventHref?: (event: never) => string;\n}\n\nfunction StatusClock() {\n const [time, setTime] = useState(\"\");\n\n useEffect(() => {\n const fmt = () => {\n const d = new Date();\n return `${String(d.getHours()).padStart(2, \"0\")}:${String(d.getMinutes()).padStart(2, \"0\")}`;\n };\n setTime(fmt());\n const id = setInterval(() => setTime(fmt()), 10_000);\n return () => clearInterval(id);\n }, []);\n\n return <span>{time}</span>;\n}\n\nfunction MatchesStatusBar({ stats }: { stats?: MatchesHeroStats }) {\n const { t } = useTranslation();\n return (\n <>\n <style>{`@media(max-width:768px){.matches-status-bar{display:none!important}}`}</style>\n <div\n className=\"matches-status-bar\"\n style={{\n position: \"fixed\",\n bottom: 0,\n left: 0,\n right: 0,\n height: 28,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"0 12px\",\n background: \"rgba(12,12,13,0.8)\",\n borderTop: \"1px solid rgba(39,39,42,0.6)\",\n fontSize: 11,\n color: \"rgba(255,255,255,0.4)\",\n zIndex: 50,\n backdropFilter: \"blur(12px)\",\n WebkitBackdropFilter: \"blur(12px)\",\n flexShrink: 0,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12, color: \"#00bc7d\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 20h.01\" />\n <path d=\"M2 8.82a15 15 0 0 1 20 0\" />\n <path d=\"M5 12.859a10 10 0 0 1 14 0\" />\n <path d=\"M8.5 16.429a5 5 0 0 1 7 0\" />\n </svg>\n <span style={{ color: \"#00bc7d\", fontWeight: 500 }}>\n {t(\"predict.matches.status.live\" as never)}\n </span>\n </div>\n {/* Vertical divider */}\n <div\n style={{ width: 1, height: 14, background: \"rgba(39,39,42,0.8)\" }}\n />\n {stats && (\n <div\n className=\"hidden sm:flex\"\n style={{ alignItems: \"center\", gap: 12 }}\n >\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"#71717a\",\n }}\n >\n {/* lucide activity */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\" />\n </svg>\n <span style={{ color: \"#52525b\" }}>\n {t(\"predict.matches.status.markets\" as never)}\n </span>\n <span\n style={{\n color: \"#d4d4d8\",\n fontWeight: 500,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {stats.activePairs.toLocaleString()}\n </span>\n </span>\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"#71717a\",\n }}\n >\n {/* lucide chart-column */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n <span style={{ color: \"#52525b\" }}>\n {t(\"predict.matches.status.vol24h\" as never)}\n </span>\n <span\n style={{\n color: \"#d4d4d8\",\n fontWeight: 500,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {stats.totalVolume >= 1_000_000\n ? `$${(stats.totalVolume / 1_000_000).toFixed(1)}M`\n : stats.totalVolume >= 1_000\n ? `$${Math.round(stats.totalVolume / 1_000)}K`\n : `$${stats.totalVolume}`}\n </span>\n </span>\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {/* Docs link with lucide-file-text icon */}\n <a\n href=\"#\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n textDecoration: \"none\",\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n <path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n <path d=\"M10 9H8\" />\n <path d=\"M16 13H8\" />\n <path d=\"M16 17H8\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.docs\" as never)}\n </span>\n </a>\n {/* X link with X icon */}\n <a\n href=\"#\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n textDecoration: \"none\",\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"currentColor\"\n >\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n <span className=\"hidden lg:inline\">X</span>\n </a>\n {/* Divider */}\n <div\n style={{\n width: 1,\n height: 14,\n background: \"rgba(39,39,42,0.8)\",\n margin: \"0 4px\",\n }}\n />\n {/* Watchlist */}\n <button\n type=\"button\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 11,\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.watchlist\" as never)}\n </span>\n </button>\n <button\n type=\"button\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 11,\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.portfolio\" as never)}\n </span>\n </button>\n <button\n type=\"button\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 11,\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <path d=\"M12 17h.01\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.help\" as never)}\n </span>\n </button>\n {/* Divider */}\n <div\n style={{\n width: 1,\n height: 14,\n background: \"rgba(39,39,42,0.8)\",\n margin: \"0 4px\",\n }}\n />\n {/* Clock */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"#71717a\",\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n <StatusClock />\n </div>\n </div>\n </div>\n </>\n );\n}\n\nexport function MatchesPage({\n onSelect,\n onHover,\n getMarketHref,\n LinkComponent,\n bgImageSrc,\n}: MatchesPageProps) {\n const { t } = useTranslation();\n\n const [sortBy, setSortBy] = useState<MatchSortField>(\"spread\");\n const [sortAsc, setSortAsc] = useState(false);\n const [minVolume, setMinVolume] = useState<number | undefined>(5_000);\n const [heroStats, setHeroStats] = useState<MatchesHeroStats | undefined>();\n const widgetRef = useRef<MatchesWidgetRef>(null);\n\n const handleSortChange = useCallback((sort: MatchSortField) => {\n setSortBy(sort);\n }, []);\n\n const handleSortAscChange = useCallback((asc: boolean) => {\n setSortAsc(asc);\n }, []);\n\n const handleStatsChange = useCallback((stats: MatchesHeroStats) => {\n startTransition(() => {\n setHeroStats(stats);\n });\n }, []);\n\n const handleRefresh = useCallback(() => {\n widgetRef.current?.refetch();\n }, []);\n\n return (\n <div\n style={{\n minHeight: \"100vh\",\n position: \"relative\",\n }}\n >\n {/* Entrance animation keyframes + dot grid */}\n <style>{`\n @keyframes matchFadeIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}\n .match-fade-in{animation:matchFadeIn .5s ease-out both}\n .match-fade-in-d1{animation:matchFadeIn .5s ease-out .1s both}\n .match-fade-in-d2{animation:matchFadeIn .5s ease-out .2s both}\n `}</style>\n {/* Hero section — relative overflow-hidden with border-b like matchr */}\n <div\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n }}\n >\n {/* Background — single wide image with full-width light arcs */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 0,\n overflow: \"hidden\",\n }}\n >\n {bgImageSrc && (\n <img\n src={bgImageSrc}\n alt=\"\"\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"center center\",\n opacity: 0.3,\n mixBlendMode: \"lighten\" as const,\n maskImage:\n \"linear-gradient(to bottom, black 50%, transparent 100%)\",\n WebkitMaskImage:\n \"linear-gradient(to bottom, black 50%, transparent 100%)\",\n }}\n />\n )}\n {/* Dot grid texture */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n opacity: 0.025,\n backgroundImage:\n \"radial-gradient(circle at 1px 1px, rgb(255 255 255) 1px, transparent 0)\",\n backgroundSize: \"20px 20px\",\n }}\n />\n </div>\n <style>{`.matches-hero-wrap{padding:40px 16px 32px}@media(min-width:640px){.matches-hero-wrap{padding:48px 24px 40px}}@media(min-width:1024px){.matches-hero-wrap{padding:52px 32px 44px}}`}</style>\n <div\n className=\"match-fade-in matches-hero-wrap\"\n style={{\n position: \"relative\",\n zIndex: 2,\n maxWidth: 1152,\n margin: \"0 auto\",\n }}\n >\n <MatchesHero stats={heroStats} />\n </div>\n </div>\n\n {/* Sticky toolbar — full-width background, inner max-w-6xl */}\n <div\n style={{\n position: \"sticky\",\n top: 0,\n zIndex: 40,\n background: \"rgba(10,10,11,0.8)\",\n backdropFilter: \"blur(24px)\",\n WebkitBackdropFilter: \"blur(24px)\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n }}\n >\n <style>{`.matches-toolbar-inner{padding:12px 16px}@media(min-width:640px){.matches-toolbar-inner{padding:12px 24px}}@media(min-width:1024px){.matches-toolbar-inner{padding:12px 32px}}`}</style>\n <div\n className=\"matches-toolbar-inner\"\n style={{\n maxWidth: 1152,\n margin: \"0 auto\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n minWidth: 0,\n }}\n >\n <div\n className=\"hidden sm:flex\"\n style={{\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 32,\n height: 32,\n borderRadius: 10,\n background:\n \"linear-gradient(to bottom right, rgba(199,255,46,0.15), rgba(23,201,100,0.15))\",\n border: \"1px solid rgba(199,255,46,0.15)\",\n flexShrink: 0,\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 16, height: 16, color: \"#c7ff2e\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z\" />\n <path d=\"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12\" />\n <path d=\"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17\" />\n </svg>\n </div>\n <div style={{ minWidth: 0 }}>\n <h2\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: \"#fff\",\n margin: 0,\n letterSpacing: \"-0.28px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\" as const,\n }}\n >\n {t(SORT_TITLE_KEY[sortBy] as never)}\n </h2>\n {heroStats && heroStats.activePairs > 0 && (\n <p\n className=\"hidden sm:block\"\n style={{ fontSize: 11, color: \"#71717a\", margin: 0 }}\n >\n {t(\"predict.matches.pairsFound\" as never, {\n count: heroStats.activePairs,\n })}\n </p>\n )}\n </div>\n </div>\n <MatchesFilterBar\n sortBy={sortBy}\n onSortChange={handleSortChange}\n sortAsc={sortAsc}\n onSortAscChange={handleSortAscChange}\n minVolume={minVolume}\n onMinVolumeChange={setMinVolume}\n onRefresh={handleRefresh}\n />\n </div>\n </div>\n\n {/* Content — card grid + disclaimer, responsive padding + pb-20 */}\n <style>{`.matches-content-wrap{padding:24px 16px 80px}@media(min-width:640px){.matches-content-wrap{padding:32px 24px 80px}}@media(min-width:1024px){.matches-content-wrap{padding:24px 32px 80px}}`}</style>\n <div\n className=\"match-fade-in-d2 matches-content-wrap\"\n style={{\n position: \"relative\",\n maxWidth: 1152,\n margin: \"0 auto\",\n }}\n >\n {/* Disclaimer — shown above list so infinite scroll doesn't push it out of view */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 16,\n padding: \"8px 12px\",\n borderRadius: 8,\n border: \"1px solid rgba(39,39,42,0.4)\",\n background: \"rgba(24,24,27,0.25)\",\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#52525b\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n </svg>\n <p\n style={{\n fontSize: 11,\n color: \"#52525b\",\n lineHeight: 1.5,\n margin: 0,\n }}\n >\n <span style={{ color: \"#71717a\", fontWeight: 500 }}>\n {t(\"predict.matches.experimentalFeature\" as const)}\n </span>\n {\" — \"}\n {t(\"predict.matches.disclaimer\" as const)}\n </p>\n </div>\n\n <MatchesWidget\n ref={widgetRef}\n sortBy={sortBy}\n sortAsc={sortAsc}\n minVolume={minVolume}\n onSelect={onSelect}\n onHover={onHover}\n getMarketHref={getMarketHref}\n LinkComponent={LinkComponent}\n onStatsChange={handleStatsChange}\n />\n </div>\n <MatchesStatusBar stats={heroStats} />\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchGroup,\n MatchGroupMarket,\n PredictEvent,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { getSourceMeta } from \"./source-badge.ui\";\n\nexport interface MatchGroupCardProps {\n group: MatchGroup;\n onSelectEntry?: (event: PredictEvent) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n}\n\nfunction formatVolume(vol: number | null | undefined): string {\n if (vol == null) return \"-\";\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${Math.round(vol / 1_000)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\ninterface PlatformData {\n source: string;\n outcomeName: string | null;\n yesPrice: number | null;\n volume: number | null;\n event?: PredictEvent;\n}\n\nconst PLATFORM_COLORS: Record<\n string,\n {\n text: string;\n border: string;\n hoverBorder: string;\n bg: string;\n priceColor: string;\n priceActiveColor: string;\n }\n> = {\n polymarket: {\n text: \"#50a2ff\",\n border: \"rgba(43,127,255,0.15)\",\n hoverBorder: \"rgba(43,127,255,0.3)\",\n bg: \"rgba(43,127,255,0.05)\",\n priceColor: \"rgba(244,244,245,1)\",\n priceActiveColor: \"rgba(244,244,245,1)\",\n },\n kalshi: {\n text: \"#00d492\",\n border: \"rgba(0,212,146,0.15)\",\n hoverBorder: \"rgba(0,212,146,0.3)\",\n bg: \"rgba(0,212,146,0.05)\",\n priceColor: \"#00d492\",\n priceActiveColor: \"#00d492\",\n },\n};\n\nconst DEFAULT_PLATFORM_COLORS = {\n text: \"#9ca3af\",\n border: \"rgba(156,163,175,0.15)\",\n hoverBorder: \"rgba(156,163,175,0.3)\",\n bg: \"rgba(156,163,175,0.05)\",\n priceColor: \"rgba(244,244,245,1)\",\n priceActiveColor: \"rgba(244,244,245,1)\",\n};\n\nfunction getPlatformColors(source: string) {\n return PLATFORM_COLORS[source] ?? DEFAULT_PLATFORM_COLORS;\n}\n\nfunction getBestMarketPair(group: MatchGroup): MatchGroupMarket | null {\n if (!group.matched_markets?.length) return null;\n let best: MatchGroupMarket | null = null;\n let bestSpread = -1;\n for (const m of group.matched_markets) {\n const spread = m.spread ?? 0;\n if (spread > bestSpread) {\n bestSpread = spread;\n best = m;\n }\n }\n return best;\n}\n\nfunction extractPlatformData(\n group: MatchGroup,\n pair: MatchGroupMarket | null,\n): [PlatformData, PlatformData] {\n const entryA = group.entries.find(\n (e) => e.source === (pair?.source_a ?? group.entries[0]?.source),\n );\n const entryB = group.entries.find(\n (e) => e.source === (pair?.source_b ?? group.entries[1]?.source),\n );\n\n const getOutcome = (market: MatchGroupMarket[\"market_a\"] | undefined) => {\n if (!market?.outcomes?.[0]) return { name: null, price: null };\n const o = market.outcomes[0];\n return {\n name: o.label || null,\n price: o.best_ask ?? o.price ?? null,\n };\n };\n\n const oA = getOutcome(pair?.market_a);\n const oB = getOutcome(pair?.market_b);\n\n return [\n {\n source: pair?.source_a ?? entryA?.source ?? \"unknown\",\n outcomeName: oA.name,\n yesPrice: oA.price,\n volume: entryA?.event?.volume ?? null,\n event: entryA?.event,\n },\n {\n source: pair?.source_b ?? entryB?.source ?? \"unknown\",\n outcomeName: oB.name,\n yesPrice: oB.price,\n volume: entryB?.event?.volume ?? null,\n event: entryB?.event,\n },\n ];\n}\n\nexport function MatchGroupCard({\n group,\n onSelectEntry,\n getEventHref,\n LinkComponent,\n}: MatchGroupCardProps) {\n const { t } = useTranslation();\n const bestPair = useMemo(() => getBestMarketPair(group), [group]);\n const spreadPercent =\n group.max_spread != null ? group.max_spread * 100 : null;\n\n const [platA, platB] = useMemo(\n () => extractPlatformData(group, bestPair),\n [group, bestPair],\n );\n\n const isHighSpread = spreadPercent != null && spreadPercent >= 3;\n const cheaperIsKalshi =\n platA.yesPrice != null && platB.yesPrice != null\n ? platA.source === \"kalshi\"\n ? platA.yesPrice > platB.yesPrice\n : platB.yesPrice > platA.yesPrice\n : false;\n\n const cheapest =\n platA.yesPrice != null && platB.yesPrice != null\n ? platA.yesPrice <= platB.yesPrice\n ? platA\n : platB\n : null;\n const cheapestMeta = cheapest ? getSourceMeta(cheapest.source) : null;\n\n const ctaAccent = isHighSpread ? \"amber\" : \"violet\";\n\n return (\n <div\n className=\"group\"\n style={{\n borderRadius: 16,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n transition: \"all 0.2s\",\n position: \"relative\",\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(63,63,70,0.6)\";\n el.style.boxShadow = \"0 10px 15px -3px rgba(0,0,0,0.2)\";\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(39,39,42,0.6)\";\n el.style.boxShadow = \"none\";\n }}\n >\n {/* Spread badge — absolute top-3 right-3 */}\n {spreadPercent != null && (\n <span\n style={{\n position: \"absolute\",\n top: 12,\n right: 12,\n zIndex: 10,\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n borderRadius: 10,\n padding: \"4px 10px\",\n fontSize: 12,\n fontWeight: 600,\n border: `1px solid ${\n isHighSpread\n ? \"rgba(255,185,0,0.3)\"\n : spreadPercent >= 2\n ? \"rgba(166,132,255,0.3)\"\n : \"rgba(156,163,175,0.3)\"\n }`,\n background: isHighSpread\n ? \"rgba(255,185,0,0.15)\"\n : spreadPercent >= 2\n ? \"rgba(166,132,255,0.15)\"\n : \"rgba(156,163,175,0.12)\",\n color: isHighSpread\n ? \"#ffb900\"\n : spreadPercent >= 2\n ? \"#a684ff\"\n : \"#9ca3af\",\n }}\n >\n {/* lucide zap */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n {spreadPercent.toFixed(1)}%\n </span>\n )}\n\n {/* Card body — p-4 */}\n <div style={{ padding: 16 }}>\n {/* Title */}\n <h3\n style={{\n fontSize: 14,\n fontWeight: 600,\n lineHeight: 1.375,\n letterSpacing: \"-0.28px\",\n color: \"#f4f4f5\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\" as const,\n paddingRight: 80,\n margin: \"0 0 16px\",\n }}\n >\n {group.title}\n </h3>\n\n {/* Platform entries — grid-cols-2 gap-3 */}\n <div\n style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 12 }}\n >\n <PlatformBlock\n data={platA}\n isCheaper={cheapest === platA}\n onSelect={onSelectEntry}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n />\n <PlatformBlock\n data={platB}\n isCheaper={cheapest === platB}\n onSelect={onSelectEntry}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n />\n </div>\n\n {/* CTA bar — amber (high spread) or violet (low) */}\n {cheapest && cheapestMeta && spreadPercent != null && (\n <div\n style={{\n marginTop: 12,\n padding: \"8px 12px\",\n borderRadius: 10,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n border: `1px solid ${ctaAccent === \"amber\" ? \"rgba(255,185,0,0.15)\" : \"rgba(166,132,255,0.15)\"}`,\n background:\n ctaAccent === \"amber\"\n ? \"rgba(255,185,0,0.05)\"\n : \"rgba(166,132,255,0.05)\",\n }}\n onClick={() => cheapest.event && onSelectEntry?.(cheapest.event)}\n >\n {/* lucide zap */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n flexShrink: 0,\n color: ctaAccent === \"amber\" ? \"#ffb900\" : \"#a684ff\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n <span\n style={{\n fontSize: 11,\n fontWeight: 500,\n color:\n ctaAccent === \"amber\"\n ? \"rgba(255,185,0,0.9)\"\n : \"rgba(166,132,255,0.9)\",\n }}\n >\n {t(\"predict.matches.buyEdge\" as never, {\n platform:\n cheapest.source.charAt(0).toUpperCase() +\n cheapest.source.slice(1),\n spread: spreadPercent.toFixed(1),\n })}\n </span>\n {/* lucide arrow-right */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 12,\n height: 12,\n marginLeft: \"auto\",\n color:\n ctaAccent === \"amber\"\n ? \"rgba(255,185,0,0.5)\"\n : \"rgba(166,132,255,0.5)\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 12h14\" />\n <path d=\"m12 5 7 7-7 7\" />\n </svg>\n </div>\n )}\n </div>\n\n {/* Footer meta — px-4 py-2.5 bg-zinc-800/20 border-t */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.2)\",\n padding: \"10px 16px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {/* lucide bar-chart-3 */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n {formatVolume(group.combined_volume)}\n </span>\n {group.combined_volume_24h != null &&\n group.combined_volume_24h > 0 && (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {/* lucide flame */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\" />\n </svg>\n {formatVolume(group.combined_volume_24h)}{\" \"}\n {t(\"predict.matches.vol24h\" as never)}\n </span>\n )}\n </div>\n {group.confidence != null && (\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 10,\n color: \"#52525b\",\n }}\n >\n {/* lucide activity */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\" />\n </svg>\n {Math.round(group.confidence * 100)}%{\" \"}\n {t(\"predict.matches.match\" as never)}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction PlatformBlock({\n data,\n isCheaper,\n onSelect,\n getEventHref,\n LinkComponent,\n}: {\n data: PlatformData;\n isCheaper: boolean;\n onSelect?: (event: PredictEvent) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n}) {\n const { t } = useTranslation();\n const meta = getSourceMeta(data.source);\n const colors = getPlatformColors(data.source);\n const href = data.event ? getEventHref?.(data.event) : undefined;\n\n const content = (\n <div\n style={{\n borderRadius: 14,\n border: `1px solid ${colors.border}`,\n background: colors.bg,\n padding: 12,\n cursor: href || onSelect ? \"pointer\" : undefined,\n transition: \"border-color 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.borderColor =\n colors.hoverBorder;\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.borderColor = colors.border;\n }}\n onClick={() => data.event && onSelect?.(data.event)}\n >\n {/* Platform name row */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n marginBottom: 8,\n }}\n >\n {meta.icon}\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.05em\",\n color: colors.text,\n textTransform: \"uppercase\" as const,\n }}\n >\n {meta.label}\n </span>\n {/* External link icon — group-hover:opacity-100 */}\n <svg\n viewBox=\"0 0 24 24\"\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n style={{\n width: 10,\n height: 10,\n color: \"#52525b\",\n marginLeft: \"auto\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M7 7h10v10\" />\n <path d=\"M7 17 17 7\" />\n </svg>\n </div>\n\n {/* Outcome name — text-[10px] */}\n {data.outcomeName && (\n <div\n style={{\n fontSize: 10,\n color: \"#71717a\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\" as const,\n marginBottom: 8,\n }}\n >\n {data.outcomeName}\n </div>\n )}\n\n {/* Price — text-xl font-bold tabular-nums */}\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: 6 }}>\n <span\n style={{\n fontSize: 20,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: isCheaper ? colors.priceActiveColor : colors.priceColor,\n }}\n >\n {data.yesPrice != null ? (data.yesPrice * 100).toFixed(1) : \"-\"}\n </span>\n <span style={{ fontSize: 10, color: \"#71717a\" }}>\n {t(\"predict.matches.centsYes\" as never)}\n </span>\n </div>\n\n {/* Volume — text-[10px] text-zinc-600 mt-1.5 */}\n <div style={{ fontSize: 10, color: \"#52525b\", marginTop: 6 }}>\n {formatVolume(data.volume)} {t(\"predict.matches.volume\" as never)}\n </div>\n </div>\n );\n\n if (href && LinkComponent) {\n return (\n <LinkComponent href={href} className=\"block\">\n {content}\n </LinkComponent>\n );\n }\n\n return content;\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { MatchGroup } from \"@liberfi.io/react-predict\";\n\nexport interface MatchesStatsBarProps {\n matches: MatchGroup[];\n total?: number;\n}\n\nfunction formatVolume(vol: number): string {\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${(vol / 1_000).toFixed(1)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\nexport function MatchesStatsBar({ matches, total }: MatchesStatsBarProps) {\n const { t } = useTranslation();\n\n const stats = useMemo(() => {\n let maxSpread = 0;\n let totalVolume = 0;\n const sources = new Set<string>();\n\n for (const group of matches) {\n if (group.max_spread != null && group.max_spread > maxSpread) {\n maxSpread = group.max_spread;\n }\n if (group.combined_volume != null) {\n totalVolume += group.combined_volume;\n }\n for (const entry of group.entries) {\n sources.add(typeof entry.source === \"string\" ? entry.source : \"\");\n }\n }\n\n return {\n count: total ?? matches.length,\n maxSpread,\n totalVolume,\n platformCount: sources.size,\n };\n }, [matches, total]);\n\n return (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2 rounded-xl border border-border/60 bg-background/50 px-4 py-3 text-sm\">\n <StatItem\n label={t(\"predict.matches.stats.matchedMarkets\")}\n value={stats.count.toLocaleString()}\n />\n <Separator />\n <StatItem\n label={t(\"predict.matches.stats.totalVolume\")}\n value={formatVolume(stats.totalVolume)}\n />\n <Separator />\n <StatItem\n label={t(\"predict.matches.stats.highestSpread\")}\n value={`${(stats.maxSpread * 100).toFixed(1)}¢`}\n valueClassName=\"text-green-400\"\n />\n <Separator />\n <StatItem\n label={t(\"predict.matches.stats.platforms\")}\n value={String(stats.platformCount)}\n />\n </div>\n );\n}\n\nfunction StatItem({\n label,\n value,\n valueClassName = \"text-slate-200\",\n}: {\n label: string;\n value: string;\n valueClassName?: string;\n}) {\n return (\n <div className=\"flex items-center gap-x-1.5\">\n <span className=\"text-neutral-500\">{label}:</span>\n <span className={`font-semibold ${valueClassName}`}>{value}</span>\n </div>\n );\n}\n\nfunction Separator() {\n return <span className=\"hidden text-neutral-700 sm:inline\">|</span>;\n}\n","import { cn } from \"@liberfi.io/ui\";\n\nexport interface SpreadIndicatorProps {\n spread: number | null | undefined;\n spreadPercent?: number | null;\n arbProfit?: number | null;\n className?: string;\n}\n\nfunction formatCents(value: number): string {\n return `${(value * 100).toFixed(1)}¢`;\n}\n\nfunction getSpreadColor(spread: number): string {\n if (spread >= 0.05) return \"text-green-400\";\n if (spread >= 0.02) return \"text-yellow-400\";\n return \"text-neutral-400\";\n}\n\nexport function SpreadIndicator({\n spread,\n arbProfit,\n className,\n}: SpreadIndicatorProps) {\n if (spread == null) return null;\n\n const hasArb = arbProfit != null && arbProfit > 0;\n\n return (\n <div className={cn(\"flex items-center gap-x-2\", className)}>\n <span className={cn(\"text-sm font-semibold\", getSpreadColor(spread))}>\n {formatCents(spread)}\n </span>\n {hasArb && (\n <span className=\"text-xs text-green-500/80\">\n +{formatCents(arbProfit!)}\n </span>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type PredictTrade,\n type TradeType,\n useInfiniteTrades,\n} from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton, Spinner } from \"@liberfi.io/ui\";\n\nconst PAGE_SIZE = 10;\nconst ROW_HEIGHT = 64;\nconst HEADER_HEIGHT = 40;\nconst PAGINATION_HEIGHT = 48;\n\nexport interface ProfileHistoryProps {\n solanaAddress?: string;\n evmAddress?: string;\n listHeight: number;\n}\n\nexport function ProfileHistory({\n solanaAddress,\n evmAddress,\n listHeight,\n}: ProfileHistoryProps) {\n const { t } = useTranslation();\n const [currentPage, setCurrentPage] = useState(1);\n\n const {\n data: kalshiData,\n isLoading: kalshiLoading,\n fetchNextPage: fetchNextKalshi,\n hasNextPage: hasMoreKalshi,\n isFetchingNextPage: isFetchingKalshi,\n } = useInfiniteTrades({\n source: \"kalshi\",\n wallet: solanaAddress ?? \"\",\n limit: 50,\n });\n\n const {\n data: polyData,\n isLoading: polyLoading,\n fetchNextPage: fetchNextPoly,\n hasNextPage: hasMorePoly,\n isFetchingNextPage: isFetchingPoly,\n } = useInfiniteTrades({\n source: \"polymarket\",\n wallet: evmAddress ?? \"\",\n limit: 50,\n });\n\n const isLoading = kalshiLoading || polyLoading;\n const isFetchingMore = isFetchingKalshi || isFetchingPoly;\n const hasNextPage = hasMoreKalshi || hasMorePoly;\n\n const allTrades = useMemo(() => {\n const all: PredictTrade[] = [];\n if (kalshiData?.pages)\n all.push(...kalshiData.pages.flatMap((p) => p.items));\n if (polyData?.pages) all.push(...polyData.pages.flatMap((p) => p.items));\n all.sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0));\n return all;\n }, [kalshiData, polyData]);\n\n const totalPages = Math.max(\n 1,\n Math.ceil(allTrades.length / PAGE_SIZE) + (hasNextPage ? 1 : 0),\n );\n const pageStart = (currentPage - 1) * PAGE_SIZE;\n const pageTrades = allTrades.slice(pageStart, pageStart + PAGE_SIZE);\n\n const handlePrev = useCallback(() => {\n setCurrentPage((p) => Math.max(1, p - 1));\n }, []);\n\n const handleNext = useCallback(async () => {\n const nextPageStart = currentPage * PAGE_SIZE;\n if (nextPageStart >= allTrades.length && hasNextPage) {\n if (hasMoreKalshi) await fetchNextKalshi();\n if (hasMorePoly) await fetchNextPoly();\n }\n setCurrentPage((p) => p + 1);\n }, [\n currentPage,\n allTrades.length,\n hasNextPage,\n hasMoreKalshi,\n hasMorePoly,\n fetchNextKalshi,\n fetchNextPoly,\n ]);\n\n const canGoPrev = currentPage > 1;\n const canGoNext = currentPage * PAGE_SIZE < allTrades.length || hasNextPage;\n\n if (isLoading) return <TabSkeleton height={listHeight} />;\n\n if (allTrades.length === 0 && !hasNextPage) {\n return (\n <EmptyState\n message={t(\"predict.profile.noHistory\")}\n height={listHeight}\n />\n );\n }\n\n const contentHeight = listHeight - HEADER_HEIGHT - PAGINATION_HEIGHT;\n\n return (\n <div className=\"flex flex-col\" style={{ height: listHeight }}>\n {/* Desktop header */}\n <div\n className=\"hidden lg:flex items-center text-neutral text-xs font-normal shrink-0 border-b border-border/50\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n {t(\"predict.profile.event\")}\n </div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.action\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.status\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.price\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n {t(\"predict.profile.depositWithdraw\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">{t(\"predict.profile.pnl\")}</div>\n <div className=\"flex-1 pr-2 text-right\">{t(\"predict.profile.fee\")}</div>\n <div className=\"w-10 shrink-0\" />\n </div>\n\n {/* Desktop rows */}\n <div\n className=\"hidden lg:block overflow-y-auto\"\n style={{ height: contentHeight }}\n >\n {pageTrades.map((trade, i) => (\n <HistoryRowStatic\n key={trade.id ?? `${pageStart + i}`}\n trade={trade}\n />\n ))}\n {isFetchingMore && (\n <div className=\"flex justify-center items-center py-4\">\n <Spinner size=\"sm\" />\n </div>\n )}\n </div>\n\n {/* Desktop pagination */}\n <div\n className=\"hidden lg:flex items-center justify-center gap-2 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={handlePrev}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ← {t(\"predict.profile.previous\")}\n </button>\n\n {Array.from({ length: Math.min(totalPages, 5) }, (_, i) => {\n const page = i + 1;\n return (\n <button\n key={page}\n type=\"button\"\n onClick={() => setCurrentPage(page)}\n className={cn(\n \"w-8 h-8 rounded text-sm transition-colors cursor-pointer\",\n page === currentPage\n ? \"bg-foreground/10 text-foreground font-medium\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {page}\n </button>\n );\n })}\n\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={handleNext}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n {t(\"predict.profile.next\")} →\n </button>\n </div>\n\n {/* Mobile cards */}\n <div\n className=\"lg:hidden flex flex-col gap-2 overflow-y-auto py-2\"\n style={{ height: listHeight - PAGINATION_HEIGHT }}\n >\n {pageTrades.map((trade, i) => (\n <HistoryCard key={trade.id ?? `m-${pageStart + i}`} trade={trade} />\n ))}\n </div>\n\n {/* Mobile pagination */}\n <div\n className=\"lg:hidden flex items-center justify-center gap-3 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={handlePrev}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ←\n </button>\n <span className=\"text-sm text-foreground tabular-nums\">\n {currentPage}\n </span>\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={handleNext}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n →\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Desktop row (non-virtualized, paginated)\n// ---------------------------------------------------------------------------\n\nfunction HistoryRowStatic({ trade }: { trade: PredictTrade }) {\n const { t } = useTranslation();\n const isBuy = trade.side?.toUpperCase() === \"BUY\";\n const price = trade.price ?? 0;\n const usdSize = trade.usd_size ?? 0;\n const statusLabel = mapTradeStatus(trade.type, t);\n\n const isDeposit = isBuy;\n const depositSign = isDeposit ? \"+\" : \"-\";\n const depositColor = isDeposit ? \"text-success\" : \"text-foreground\";\n\n const eventTitle = trade.event?.title ?? trade.market?.question ?? \"—\";\n const eventImage = trade.event?.image_url;\n const outcomeLabel = trade.outcome ?? \"\";\n const timeStr = formatTimestamp(trade.timestamp);\n\n const txUrl = getTxUrl(trade);\n\n const pnlValue = extractPnl(trade);\n const feeValue = extractFee(trade);\n\n return (\n <div\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-sm\"\n style={{ height: ROW_HEIGHT }}\n >\n {/* Event */}\n <div className=\"flex-[3] min-w-0 pr-2\">\n <div className=\"flex items-center gap-2.5 min-w-0\">\n {eventImage && (\n <img\n src={eventImage}\n alt=\"\"\n className=\"w-8 h-8 rounded-full object-cover shrink-0\"\n />\n )}\n <div className=\"flex flex-col gap-y-0.5 min-w-0\">\n <span className=\"text-foreground truncate font-medium text-sm\">\n {eventTitle}\n </span>\n <span className=\"text-[11px] text-neutral\">\n {outcomeLabel && <span className=\"mr-1\">{outcomeLabel}</span>}\n <span>{timeStr}</span>\n </span>\n </div>\n </div>\n </div>\n\n {/* Action */}\n <div className=\"flex-1 pr-2\">\n <span\n className={cn(\n \"text-sm font-medium\",\n isBuy ? \"text-success\" : \"text-danger\",\n )}\n >\n {isBuy ? t(\"predict.profile.buy\") : t(\"predict.profile.sell\")}\n </span>\n </div>\n\n {/* Status */}\n <div className=\"flex-1 pr-2 text-sm text-foreground\">{statusLabel}</div>\n\n {/* Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatCents(price)}\n </div>\n\n {/* Deposit / Withdraw */}\n <div className={cn(\"flex-[1.5] pr-2 text-right font-mono\", depositColor)}>\n {usdSize > 0 ? (\n <>\n {depositSign}${usdSize.toFixed(2)}\n </>\n ) : (\n \"—\"\n )}\n </div>\n\n {/* PNL */}\n <div\n className={cn(\n \"flex-1 pr-2 text-right font-mono\",\n pnlValue !== null\n ? pnlValue >= 0\n ? \"text-success\"\n : \"text-danger\"\n : \"text-neutral\",\n )}\n >\n {pnlValue !== null\n ? `${pnlValue >= 0 ? \"+\" : \"-\"}$${Math.abs(pnlValue).toFixed(2)}`\n : \"—\"}\n </div>\n\n {/* Fee */}\n <div className=\"flex-1 pr-2 text-right font-mono text-neutral\">\n {feeValue !== null ? `$${feeValue.toFixed(2)}` : \"—\"}\n </div>\n\n {/* Tx link */}\n <div className=\"w-10 shrink-0 text-right\">\n {txUrl && (\n <a\n href={txUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-neutral hover:text-foreground transition-colors\"\n aria-label=\"View transaction\"\n >\n <ExternalLinkIcon />\n </a>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Mobile card\n// ---------------------------------------------------------------------------\n\nfunction HistoryCard({ trade }: { trade: PredictTrade }) {\n const { t } = useTranslation();\n const isBuy = trade.side?.toUpperCase() === \"BUY\";\n const price = trade.price ?? 0;\n const usdSize = trade.usd_size ?? 0;\n const statusLabel = mapTradeStatus(trade.type, t);\n const eventTitle = trade.event?.title ?? trade.market?.question ?? \"—\";\n const timeStr = formatTimestamp(trade.timestamp);\n const txUrl = getTxUrl(trade);\n\n return (\n <div className=\"rounded-lg border border-border bg-content1 p-3 flex flex-col gap-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {trade.event?.image_url && (\n <img\n src={trade.event.image_url}\n alt=\"\"\n className=\"w-6 h-6 rounded-full object-cover shrink-0\"\n />\n )}\n <span className=\"text-sm font-medium text-foreground line-clamp-2\">\n {eventTitle}\n </span>\n </div>\n <span className=\"text-[11px] text-neutral whitespace-nowrap\">\n {timeStr}\n </span>\n </div>\n <div className=\"flex items-center gap-4 text-xs flex-wrap\">\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.action\")}</span>\n <span\n className={cn(\n \"font-medium\",\n isBuy ? \"text-success\" : \"text-danger\",\n )}\n >\n {isBuy ? t(\"predict.profile.buy\") : t(\"predict.profile.sell\")}\n </span>\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.status\")}</span>\n <span className=\"text-foreground\">{statusLabel}</span>\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.price\")}</span>\n <span className=\"font-mono text-foreground\">\n {formatCents(price)}\n </span>\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">\n {t(\"predict.profile.depositWithdraw\")}\n </span>\n <span className=\"font-mono text-foreground\">\n {usdSize > 0 ? `$${usdSize.toFixed(2)}` : \"—\"}\n </span>\n </div>\n {txUrl && (\n <a\n href={txUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ml-auto text-neutral hover:text-foreground transition-colors\"\n >\n <ExternalLinkIcon />\n </a>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nfunction mapTradeStatus(type: TradeType, t: (key: string) => string): string {\n switch (type) {\n case \"TRADE\":\n return t(\"predict.profile.filled\");\n case \"REDEEM\":\n return t(\"predict.profile.claimed\");\n case \"SPLIT\":\n case \"MERGE\":\n case \"CONVERSION\":\n return t(\"predict.profile.created\");\n default:\n return type;\n }\n}\n\nfunction getTxUrl(trade: PredictTrade): string | undefined {\n if (!trade.tx_hash) return undefined;\n if (trade.source === \"polymarket\") {\n return `https://polygonscan.com/tx/${trade.tx_hash}`;\n }\n return `https://solscan.io/tx/${trade.tx_hash}`;\n}\n\nfunction extractPnl(trade: PredictTrade): number | null {\n const meta = trade.provider_meta;\n if (meta) {\n const pnl =\n meta[\"pnl\"] ??\n meta[\"profit\"] ??\n meta[\"realized_pnl\"] ??\n meta[\"dflow.pnl\"];\n if (typeof pnl === \"number\") return pnl;\n if (typeof pnl === \"string\" && pnl !== \"\") {\n const parsed = parseFloat(pnl);\n if (!Number.isNaN(parsed)) return parsed;\n }\n }\n if (trade.type === \"REDEEM\" && trade.usd_size != null) {\n return trade.usd_size;\n }\n return null;\n}\n\nfunction extractFee(trade: PredictTrade): number | null {\n const meta = trade.provider_meta;\n if (meta) {\n const fee =\n meta[\"fee\"] ?? meta[\"fees\"] ?? meta[\"trading_fee\"] ?? meta[\"dflow.fee\"];\n if (typeof fee === \"number\") return fee;\n if (typeof fee === \"string\" && fee !== \"\") {\n const parsed = parseFloat(fee);\n if (!Number.isNaN(parsed)) return parsed;\n }\n }\n return null;\n}\n\nfunction ExternalLinkIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n );\n}\n\nfunction EmptyState({ message, height }: { message: string; height: number }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton({ height }: { height: number }) {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatCents(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(cents % 1 === 0 ? 0 : 1)}¢`;\n}\n\nfunction formatTimestamp(unixSeconds: number): string {\n const date = new Date(unixSeconds * 1000);\n const hours = date.getHours().toString().padStart(2, \"0\");\n const mins = date.getMinutes().toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const year = date.getFullYear();\n const tz = date.getTimezoneOffset();\n const tzSign = tz <= 0 ? \"+\" : \"-\";\n const tzHours = String(Math.abs(Math.floor(tz / 60))).padStart(2, \"0\");\n return `${hours}:${mins} ${day}/${month}/${year} (${tzSign}${tzHours})`;\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type PredictOrder,\n useInfiniteOrders,\n useCancelOrder,\n} from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton, Spinner } from \"@liberfi.io/ui\";\n\nconst PAGE_SIZE = 10;\nconst ROW_HEIGHT = 64;\nconst HEADER_HEIGHT = 40;\nconst PAGINATION_HEIGHT = 48;\n\nexport interface ProfileOrdersProps {\n solanaAddress?: string;\n evmAddress?: string;\n listHeight: number;\n}\n\nexport function ProfileOrders({\n solanaAddress,\n evmAddress,\n listHeight,\n}: ProfileOrdersProps) {\n const { t } = useTranslation();\n const cancelMutation = useCancelOrder();\n const [currentPage, setCurrentPage] = useState(1);\n\n const {\n data: kalshiData,\n isLoading: kalshiLoading,\n fetchNextPage: fetchNextKalshi,\n hasNextPage: hasMoreKalshi,\n isFetchingNextPage: isFetchingKalshi,\n } = useInfiniteOrders({\n source: \"kalshi\",\n wallet_address: solanaAddress ?? \"\",\n });\n\n const {\n data: polyData,\n isLoading: polyLoading,\n fetchNextPage: fetchNextPoly,\n hasNextPage: hasMorePoly,\n isFetchingNextPage: isFetchingPoly,\n } = useInfiniteOrders({\n source: \"polymarket\",\n wallet_address: evmAddress ?? \"\",\n });\n\n const isLoading = kalshiLoading || polyLoading;\n const isFetchingMore = isFetchingKalshi || isFetchingPoly;\n const hasNextPage = hasMoreKalshi || hasMorePoly;\n\n const orders = useMemo(() => {\n const all: PredictOrder[] = [];\n const openStatuses = new Set([\"live\", \"open\", \"submitted\", \"pending\"]);\n if (kalshiData?.pages) {\n all.push(\n ...kalshiData.pages\n .flatMap((p) => p.items)\n .filter((o) => openStatuses.has(o.status)),\n );\n }\n if (polyData?.pages) {\n all.push(\n ...polyData.pages\n .flatMap((p) => p.items)\n .filter((o) => openStatuses.has(o.status)),\n );\n }\n return all;\n }, [kalshiData, polyData]);\n\n const handleCancel = useCallback(\n (order: PredictOrder) => {\n cancelMutation.mutate({ source: order.source, id: order.id });\n },\n [cancelMutation],\n );\n\n const totalPages = Math.max(\n 1,\n Math.ceil(orders.length / PAGE_SIZE) + (hasNextPage ? 1 : 0),\n );\n const pageStart = (currentPage - 1) * PAGE_SIZE;\n const pageOrders = orders.slice(pageStart, pageStart + PAGE_SIZE);\n\n const handlePrev = useCallback(() => {\n setCurrentPage((p) => Math.max(1, p - 1));\n }, []);\n\n const handleNext = useCallback(async () => {\n const nextPageStart = currentPage * PAGE_SIZE;\n if (nextPageStart >= orders.length && hasNextPage) {\n if (hasMoreKalshi) await fetchNextKalshi();\n if (hasMorePoly) await fetchNextPoly();\n }\n setCurrentPage((p) => p + 1);\n }, [\n currentPage,\n orders.length,\n hasNextPage,\n hasMoreKalshi,\n hasMorePoly,\n fetchNextKalshi,\n fetchNextPoly,\n ]);\n\n const canGoPrev = currentPage > 1;\n const canGoNext = currentPage * PAGE_SIZE < orders.length || hasNextPage;\n\n if (isLoading) return <TabSkeleton height={listHeight} />;\n\n if (orders.length === 0 && !hasNextPage) {\n return (\n <EmptyState message={t(\"predict.profile.noOrders\")} height={listHeight} />\n );\n }\n\n const contentHeight = listHeight - HEADER_HEIGHT - PAGINATION_HEIGHT;\n\n return (\n <div className=\"flex flex-col\" style={{ height: listHeight }}>\n {/* Desktop header */}\n <div\n className=\"hidden lg:flex items-center text-neutral text-xs font-normal shrink-0 border-b border-border/50\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n {t(\"predict.profile.event\")}\n </div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.action\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.type\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.fillPrice\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.cost\")}\n </div>\n </div>\n\n {/* Desktop rows */}\n <div\n className=\"hidden lg:block overflow-y-auto\"\n style={{ height: contentHeight }}\n >\n {pageOrders.map((order) => (\n <OrderRowStatic\n key={order.id}\n order={order}\n onCancel={handleCancel}\n />\n ))}\n {isFetchingMore && (\n <div className=\"flex justify-center items-center py-4\">\n <Spinner size=\"sm\" />\n </div>\n )}\n </div>\n\n {/* Desktop pagination */}\n <Pagination\n className=\"hidden lg:flex\"\n currentPage={currentPage}\n totalPages={totalPages}\n canGoPrev={canGoPrev}\n canGoNext={canGoNext}\n onPrev={handlePrev}\n onNext={handleNext}\n onPage={setCurrentPage}\n t={t}\n />\n\n {/* Mobile cards */}\n <div\n className=\"lg:hidden flex flex-col gap-2 overflow-y-auto py-2\"\n style={{ height: listHeight - PAGINATION_HEIGHT }}\n >\n {pageOrders.map((order) => (\n <OrderCard key={order.id} order={order} onCancel={handleCancel} />\n ))}\n </div>\n\n {/* Mobile pagination */}\n <Pagination\n className=\"lg:hidden\"\n currentPage={currentPage}\n totalPages={totalPages}\n canGoPrev={canGoPrev}\n canGoNext={canGoNext}\n onPrev={handlePrev}\n onNext={handleNext}\n onPage={setCurrentPage}\n t={t}\n compact\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Desktop row (non-virtualized, paginated)\n// ---------------------------------------------------------------------------\n\nfunction OrderRowStatic({\n order,\n onCancel,\n}: {\n order: PredictOrder;\n onCancel: (order: PredictOrder) => void;\n}) {\n const { t } = useTranslation();\n const isBuy = order.side === \"BUY\";\n const price = order.price ? parseFloat(order.price) : 0;\n const cost = order.in_amount\n ? parseFloat(order.in_amount)\n : price * parseFloat(order.original_size ?? \"0\");\n\n return (\n <div\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-sm\"\n style={{ height: ROW_HEIGHT }}\n >\n {/* Event */}\n <div className=\"flex-[3] min-w-0 pr-2\">\n <div className=\"flex flex-col gap-y-0.5 min-w-0\">\n <span className=\"text-foreground truncate font-medium\">\n {order.outcome ?? order.market_id ?? \"—\"}\n </span>\n </div>\n </div>\n\n {/* Action */}\n <div className=\"flex-1 pr-2\">\n <span\n className={cn(\n \"text-sm font-medium\",\n isBuy ? \"text-success\" : \"text-danger\",\n )}\n >\n {isBuy ? t(\"predict.profile.buy\") : t(\"predict.profile.sell\")}\n </span>\n </div>\n\n {/* Type */}\n <div className=\"flex-1 pr-2 text-neutral capitalize text-sm\">\n {order.order_type ?? \"limit\"}\n </div>\n\n {/* Fill Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {price > 0 ? formatCents(price) : \"—\"}\n </div>\n\n {/* Cost */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {cost > 0 ? `$${cost.toFixed(2)}` : \"—\"}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Mobile card\n// ---------------------------------------------------------------------------\n\nfunction OrderCard({\n order,\n onCancel,\n}: {\n order: PredictOrder;\n onCancel: (order: PredictOrder) => void;\n}) {\n const { t } = useTranslation();\n const isBuy = order.side === \"BUY\";\n const price = order.price ? parseFloat(order.price) : 0;\n\n return (\n <div className=\"rounded-lg border border-border bg-content1 p-3 flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n \"text-xs font-medium px-1.5 py-0.5 rounded\",\n isBuy ? \"bg-success/10 text-success\" : \"bg-danger/10 text-danger\",\n )}\n >\n {order.side}\n </span>\n <span className=\"text-sm text-foreground capitalize\">\n {order.outcome ?? \"—\"}\n </span>\n </div>\n <span className=\"text-xs text-neutral capitalize\">\n {order.order_type ?? \"limit\"}\n </span>\n </div>\n <div className=\"flex items-center gap-4 text-xs\">\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.fillPrice\")}</span>\n <span className=\"font-mono text-foreground\">\n {price > 0 ? formatCents(price) : \"—\"}\n </span>\n </div>\n <div className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={() => onCancel(order)}\n className=\"text-xs text-danger hover:text-danger/80 cursor-pointer border border-border rounded px-2 py-1\"\n >\n {t(\"predict.orders.cancel\")}\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nfunction Pagination({\n className,\n currentPage,\n totalPages,\n canGoPrev,\n canGoNext,\n onPrev,\n onNext,\n onPage,\n t,\n compact,\n}: {\n className?: string;\n currentPage: number;\n totalPages: number;\n canGoPrev: boolean;\n canGoNext: boolean;\n onPrev: () => void;\n onNext: () => void;\n onPage: (page: number) => void;\n t: (key: string) => string;\n compact?: boolean;\n}) {\n if (compact) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-3 shrink-0\",\n className,\n )}\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={onPrev}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ←\n </button>\n <span className=\"text-sm text-foreground tabular-nums\">\n {currentPage}\n </span>\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={onNext}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n →\n </button>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-2 shrink-0\",\n className,\n )}\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={onPrev}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ← {t(\"predict.profile.previous\")}\n </button>\n {Array.from({ length: Math.min(totalPages, 5) }, (_, i) => {\n const page = i + 1;\n return (\n <button\n key={page}\n type=\"button\"\n onClick={() => onPage(page)}\n className={cn(\n \"w-8 h-8 rounded text-sm transition-colors cursor-pointer\",\n page === currentPage\n ? \"bg-foreground/10 text-foreground font-medium\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {page}\n </button>\n );\n })}\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={onNext}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n {t(\"predict.profile.next\")} →\n </button>\n </div>\n );\n}\n\nfunction EmptyState({ message, height }: { message: string; height: number }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton({ height }: { height: number }) {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatCents(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(cents % 1 === 0 ? 0 : 1)}¢`;\n}\n","import { useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictPosition } from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton } from \"@liberfi.io/ui\";\n\nconst PAGE_SIZE = 10;\nconst ROW_HEIGHT = 64;\nconst HEADER_HEIGHT = 40;\nconst PAGINATION_HEIGHT = 48;\n\nexport interface ProfilePositionsProps {\n positions: PredictPosition[];\n isLoading: boolean;\n listHeight: number;\n onClosePosition?: (position: PredictPosition) => void;\n onEventClick?: (event: PredictEvent) => void;\n}\n\nexport function ProfilePositions({\n positions,\n isLoading,\n listHeight,\n onClosePosition,\n onEventClick,\n}: ProfilePositionsProps) {\n const { t } = useTranslation();\n const [currentPage, setCurrentPage] = useState(1);\n\n const handleCloseAll = useCallback(() => {\n for (const pos of positions) {\n onClosePosition?.(pos);\n }\n }, [positions, onClosePosition]);\n\n if (isLoading) return <TabSkeleton height={listHeight} />;\n\n if (positions.length === 0) {\n return (\n <EmptyState\n message={t(\"predict.profile.noPositions\")}\n height={listHeight}\n />\n );\n }\n\n const totalPages = Math.max(1, Math.ceil(positions.length / PAGE_SIZE));\n const pageStart = (currentPage - 1) * PAGE_SIZE;\n const pagePositions = positions.slice(pageStart, pageStart + PAGE_SIZE);\n const canGoPrev = currentPage > 1;\n const canGoNext = currentPage < totalPages;\n const contentHeight = listHeight - HEADER_HEIGHT - PAGINATION_HEIGHT;\n\n return (\n <div className=\"flex flex-col\" style={{ height: listHeight }}>\n {/* Desktop header */}\n <div\n className=\"hidden lg:flex items-center text-neutral text-xs font-normal shrink-0 border-b border-border/50\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n {t(\"predict.profile.event\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.totalSize\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.value\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.avgPrice\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.markPrice\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n <span>{t(\"predict.profile.pnl\")}</span>\n <span className=\"text-[10px] ml-1 opacity-60\">\n ({t(\"predict.profile.pnlExcludeFees\")})\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.payoutIfRight\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n {t(\"predict.profile.estSettlement\")}\n </div>\n <div className=\"w-20 shrink-0 text-right\">\n {onClosePosition && positions.length > 0 && (\n <button\n type=\"button\"\n onClick={handleCloseAll}\n className=\"text-xs text-primary hover:text-primary/80 cursor-pointer transition-colors\"\n >\n {t(\"predict.profile.closeAll\")}\n </button>\n )}\n </div>\n </div>\n\n {/* Desktop rows */}\n <div\n className=\"hidden lg:block overflow-y-auto\"\n style={{ height: contentHeight }}\n >\n {pagePositions.map((pos, i) => (\n <PositionRowStatic\n key={`${pos.source}-${pos.market?.slug ?? pageStart + i}`}\n position={pos}\n onClosePosition={onClosePosition}\n onEventClick={onEventClick}\n />\n ))}\n </div>\n\n {/* Desktop pagination */}\n <div\n className=\"hidden lg:flex items-center justify-center gap-2 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ← {t(\"predict.profile.previous\")}\n </button>\n {Array.from({ length: Math.min(totalPages, 5) }, (_, i) => {\n const page = i + 1;\n return (\n <button\n key={page}\n type=\"button\"\n onClick={() => setCurrentPage(page)}\n className={cn(\n \"w-8 h-8 rounded text-sm transition-colors cursor-pointer\",\n page === currentPage\n ? \"bg-foreground/10 text-foreground font-medium\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {page}\n </button>\n );\n })}\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={() => setCurrentPage((p) => p + 1)}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n {t(\"predict.profile.next\")} →\n </button>\n </div>\n\n {/* Mobile cards */}\n <div\n className=\"lg:hidden flex flex-col gap-2 overflow-y-auto py-2\"\n style={{ height: listHeight - PAGINATION_HEIGHT }}\n >\n {pagePositions.map((pos, i) => (\n <PositionCard\n key={`${pos.source}-${pos.market?.slug ?? `m-${pageStart + i}`}`}\n position={pos}\n onClose={onClosePosition}\n onEventClick={onEventClick}\n />\n ))}\n </div>\n\n {/* Mobile pagination */}\n <div\n className=\"lg:hidden flex items-center justify-center gap-3 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ←\n </button>\n <span className=\"text-sm text-foreground tabular-nums\">\n {currentPage}\n </span>\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={() => setCurrentPage((p) => p + 1)}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n →\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Desktop row (non-virtualized, paginated)\n// ---------------------------------------------------------------------------\n\nfunction PositionRowStatic({\n position: pos,\n onClosePosition,\n onEventClick,\n}: {\n position: PredictPosition;\n onClosePosition?: (position: PredictPosition) => void;\n onEventClick?: (event: PredictEvent) => void;\n}) {\n const { t } = useTranslation();\n\n const pnl = pos.pnl ?? 0;\n const pnlPercent = pos.pnl_percent ?? 0;\n const avgPrice = pos.avg_price ?? 0;\n const currentPrice = pos.current_price ?? 0;\n const value = pos.current_value ?? pos.size * currentPrice;\n const payoutIfRight = pos.size;\n\n const pnlColor =\n pnl > 0 ? \"text-success\" : pnl < 0 ? \"text-danger\" : \"text-foreground\";\n const pnlSign = pnl > 0 ? \"+\" : \"\";\n\n const eventTitle = pos.event?.title ?? pos.market?.question ?? \"—\";\n const eventImage = pos.event?.image_url;\n const outcomeSide = pos.side;\n const outcomeLabel = pos.market?.outcomes?.[0]?.label ?? \"\";\n\n const settlementStr = pos.market?.end_at\n ? formatSettlementTime(pos.market.end_at)\n : \"—\";\n\n return (\n <div\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-sm\"\n style={{ height: ROW_HEIGHT }}\n >\n {/* Event cell */}\n <div className=\"flex-[3] min-w-0 pr-2\">\n <button\n type=\"button\"\n className=\"flex items-center gap-2.5 min-w-0 cursor-pointer text-left\"\n onClick={() => pos.event && onEventClick?.(pos.event)}\n >\n {eventImage && (\n <img\n src={eventImage}\n alt=\"\"\n className=\"w-8 h-8 rounded-full object-cover shrink-0\"\n />\n )}\n <div className=\"flex flex-col gap-y-0.5 min-w-0\">\n <span className=\"text-foreground truncate font-medium text-sm\">\n {eventTitle}\n </span>\n <span className=\"text-[11px] text-neutral\">\n <span\n className={cn(\n \"font-medium\",\n outcomeSide.toLowerCase() === \"yes\"\n ? \"text-success\"\n : \"text-danger\",\n )}\n >\n {outcomeSide}\n </span>\n {outcomeLabel && (\n <>\n <span className=\"mx-1\">·</span>\n <span>{outcomeLabel}</span>\n </>\n )}\n </span>\n </div>\n </button>\n </div>\n\n {/* Total Size */}\n <div className=\"flex-1 pr-2 text-right\">\n <div className=\"flex flex-col items-end\">\n <span className=\"font-mono text-foreground\">${value.toFixed(2)}</span>\n <span className=\"text-[10px] text-neutral\">\n {t(\"predict.profile.contracts\", { count: pos.size })}\n </span>\n </div>\n </div>\n\n {/* Value */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n ${(pos.size * avgPrice).toFixed(2)}\n </div>\n\n {/* Avg Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatCents(avgPrice)}\n </div>\n\n {/* Mark Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatCents(currentPrice)}\n </div>\n\n {/* PNL */}\n <div className={cn(\"flex-[1.5] pr-2 text-right font-mono\", pnlColor)}>\n <span>\n {pnlSign}${Math.abs(pnl).toFixed(2)}\n </span>\n <span className=\"text-[10px] ml-0.5 opacity-70\">\n ({pnlSign}\n {pnlPercent.toFixed(2)}%)\n </span>\n </div>\n\n {/* Payout if right */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n ${payoutIfRight.toFixed(2)}\n </div>\n\n {/* Est. Settlement */}\n <div className=\"flex-[1.5] pr-2 text-right text-neutral whitespace-nowrap text-xs\">\n {settlementStr}\n </div>\n\n {/* Close */}\n <div className=\"w-20 shrink-0 text-right\">\n {onClosePosition && (\n <button\n type=\"button\"\n onClick={() => onClosePosition(pos)}\n className=\"inline-flex items-center gap-1 text-xs text-neutral hover:text-foreground cursor-pointer transition-colors\"\n >\n <span className=\"text-danger\">✕</span>\n {t(\"predict.profile.close\")}\n </button>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Mobile card\n// ---------------------------------------------------------------------------\n\nfunction PositionCard({\n position: pos,\n onClose,\n onEventClick,\n}: {\n position: PredictPosition;\n onClose?: (pos: PredictPosition) => void;\n onEventClick?: (event: PredictEvent) => void;\n}) {\n const { t } = useTranslation();\n const pnl = pos.pnl ?? 0;\n const pnlPercent = pos.pnl_percent ?? 0;\n const currentPrice = pos.current_price ?? 0;\n const pnlColor =\n pnl > 0 ? \"text-success\" : pnl < 0 ? \"text-danger\" : \"text-foreground\";\n const pnlSign = pnl > 0 ? \"+\" : \"\";\n const eventTitle = pos.event?.title ?? pos.market?.question ?? \"—\";\n\n return (\n <div className=\"rounded-lg border border-border bg-content1 p-3 flex flex-col gap-2\">\n <button\n type=\"button\"\n className=\"flex items-start justify-between gap-2 text-left cursor-pointer\"\n onClick={() => pos.event && onEventClick?.(pos.event)}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n {pos.event?.image_url && (\n <img\n src={pos.event.image_url}\n alt=\"\"\n className=\"w-7 h-7 rounded-full object-cover shrink-0\"\n />\n )}\n <span className=\"text-sm font-medium text-foreground line-clamp-2\">\n {eventTitle}\n </span>\n </div>\n <span\n className={cn(\n \"shrink-0 text-xs font-medium px-1.5 py-0.5 rounded\",\n pos.side.toLowerCase() === \"yes\"\n ? \"bg-success/10 text-success\"\n : \"bg-danger/10 text-danger\",\n )}\n >\n {pos.side}\n </span>\n </button>\n <div className=\"flex items-center gap-4 text-xs flex-wrap\">\n <MobileStat\n label={t(\"predict.profile.totalSize\")}\n value={`${pos.size}`}\n />\n <MobileStat\n label={t(\"predict.profile.markPrice\")}\n value={formatCents(currentPrice)}\n />\n <MobileStat\n label={t(\"predict.profile.pnl\")}\n value={`${pnlSign}$${Math.abs(pnl).toFixed(2)} (${pnlSign}${pnlPercent.toFixed(1)}%)`}\n className={pnlColor}\n />\n <MobileStat\n label={t(\"predict.profile.payoutIfRight\")}\n value={`$${pos.size.toFixed(2)}`}\n />\n </div>\n {onClose && (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={() => onClose(pos)}\n className=\"text-xs text-danger hover:text-danger/80 cursor-pointer transition-colors border border-border rounded px-2 py-1\"\n >\n {t(\"predict.profile.close\")}\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nfunction MobileStat({\n label,\n value,\n className,\n}: {\n label: string;\n value: string;\n className?: string;\n}) {\n return (\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{label}</span>\n <span className={cn(\"font-mono text-foreground\", className)}>\n {value}\n </span>\n </div>\n );\n}\n\nfunction EmptyState({ message, height }: { message: string; height: number }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton({ height }: { height: number }) {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatCents(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(cents % 1 === 0 ? 0 : 1)}¢`;\n}\n\nfunction formatSettlementTime(isoString: string): string {\n try {\n const date = new Date(isoString);\n const hours = date.getHours().toString().padStart(2, \"0\");\n const mins = date.getMinutes().toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const year = date.getFullYear();\n const tz = date.getTimezoneOffset();\n const tzSign = tz <= 0 ? \"+\" : \"-\";\n const tzHours = String(Math.abs(Math.floor(tz / 60))).padStart(2, \"0\");\n return `${hours}:${mins} ${day}/${month}/${year} (${tzSign}${tzHours})`;\n } catch {\n return \"—\";\n }\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictPosition, PredictTrade } from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton } from \"@liberfi.io/ui\";\n\nexport interface ProfileStatsProps {\n positions: PredictPosition[];\n trades: PredictTrade[];\n isLoading: boolean;\n}\n\nexport function ProfileStats({\n positions,\n trades,\n isLoading,\n}: ProfileStatsProps) {\n const { t } = useTranslation();\n\n const stats = useMemo(() => {\n let realizedPnl = 0;\n let positionsValue = 0;\n for (const p of positions) {\n realizedPnl += p.realized_pnl ?? 0;\n positionsValue += p.current_value ?? p.size * (p.current_price ?? 0);\n }\n\n let volume = 0;\n let wins = 0;\n let settled = 0;\n for (const tr of trades) {\n volume += tr.usd_size ?? 0;\n if (tr.type === \"REDEEM\") {\n settled++;\n if ((tr.usd_size ?? 0) > 0) wins++;\n }\n }\n\n const winRateStr = settled > 0 ? `${wins} / ${settled}` : \"0 / 0\";\n\n return { realizedPnl, positionsValue, volume, winRateStr };\n }, [positions, trades]);\n\n const pnlColor =\n stats.realizedPnl > 0\n ? \"text-success\"\n : stats.realizedPnl < 0\n ? \"text-danger\"\n : \"text-foreground\";\n const pnlSign = stats.realizedPnl > 0 ? \"+\" : \"\";\n\n return (\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 py-8\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-xl text-neutral\">\n {t(\"predict.profile.realizedPnl\")}\n </span>\n {isLoading ? (\n <Skeleton className=\"h-14 w-48 rounded-md\" />\n ) : (\n <span className={cn(\"text-5xl font-bold tabular-nums\", pnlColor)}>\n {pnlSign}${Math.abs(stats.realizedPnl).toFixed(2)}\n </span>\n )}\n </div>\n\n <div className=\"flex items-end gap-8 sm:gap-10\">\n <StatCard\n label={t(\"predict.profile.winRate\")}\n value={stats.winRateStr}\n isLoading={isLoading}\n />\n <StatCard\n label={t(\"predict.profile.positions\")}\n value={`$${stats.positionsValue.toFixed(2)}`}\n isLoading={isLoading}\n />\n <StatCard\n label={t(\"predict.profile.volume\")}\n value={`$${stats.volume.toFixed(2)}`}\n isLoading={isLoading}\n />\n </div>\n </div>\n );\n}\n\nfunction StatCard({\n label,\n value,\n isLoading,\n}: {\n label: string;\n value: string;\n isLoading: boolean;\n}) {\n return (\n <div className=\"flex flex-col items-end gap-0.5\">\n <span className=\"text-sm text-neutral whitespace-nowrap\">{label}</span>\n {isLoading ? (\n <Skeleton className=\"h-6 w-14 rounded-md\" />\n ) : (\n <span className=\"text-base font-semibold tabular-nums text-foreground\">\n {value}\n </span>\n )}\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type PredictEvent,\n type PredictPosition,\n usePositions,\n useInfiniteTrades,\n} from \"@liberfi.io/react-predict\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { ProfileHistory } from \"./profile-history.ui\";\nimport { ProfileOrders } from \"./profile-orders.ui\";\nimport { ProfilePositions } from \"./profile-positions.ui\";\nimport { ProfileStats } from \"./profile-stats.ui\";\n\ntype ProfileTab = \"positions\" | \"orders\" | \"history\";\n\nconst LIST_HEIGHT = 600;\n\nexport interface ProfilePageProps {\n /** Solana wallet address (for Kalshi/DFlow positions). */\n solanaAddress?: string;\n /** EVM wallet address (for Polymarket positions). */\n evmAddress?: string;\n /** Called when user clicks Close on a position. */\n onClosePosition?: (position: PredictPosition) => void;\n /** Called when user clicks an event name. */\n onEventClick?: (event: PredictEvent) => void;\n}\n\nexport function ProfilePage({\n solanaAddress,\n evmAddress,\n onClosePosition,\n onEventClick,\n}: ProfilePageProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<ProfileTab>(\"positions\");\n\n const hasWallet = Boolean(solanaAddress || evmAddress);\n\n // Positions data (used by stats + positions tab)\n const { data: kalshiPositions, isLoading: kalshiPosLoading } = usePositions({\n source: \"kalshi\",\n user: solanaAddress ?? \"\",\n });\n const { data: polyPositions, isLoading: polyPosLoading } = usePositions({\n source: \"polymarket\",\n user: evmAddress ?? \"\",\n });\n\n const allPositions = useMemo(() => {\n const all: PredictPosition[] = [];\n if (kalshiPositions?.positions) all.push(...kalshiPositions.positions);\n if (polyPositions?.positions) all.push(...polyPositions.positions);\n return all;\n }, [kalshiPositions, polyPositions]);\n\n const positionsLoading = kalshiPosLoading || polyPosLoading;\n\n // Trades data (used by stats — fetch first page for stats aggregation)\n const { data: kalshiTrades, isLoading: kalshiTradesLoading } =\n useInfiniteTrades({\n source: \"kalshi\",\n wallet: solanaAddress ?? \"\",\n limit: 100,\n });\n const { data: polyTrades, isLoading: polyTradesLoading } = useInfiniteTrades({\n source: \"polymarket\",\n wallet: evmAddress ?? \"\",\n limit: 100,\n });\n\n const allTrades = useMemo(() => {\n const all = [\n ...(kalshiTrades?.pages?.flatMap((p) => p.items) ?? []),\n ...(polyTrades?.pages?.flatMap((p) => p.items) ?? []),\n ];\n return all;\n }, [kalshiTrades, polyTrades]);\n\n const statsLoading =\n positionsLoading || kalshiTradesLoading || polyTradesLoading;\n\n const positionsCount = allPositions.length;\n const positionsTabLabel =\n positionsCount > 0\n ? `${t(\"predict.profile.positionsTab\")} (${positionsCount})`\n : t(\"predict.profile.positionsTab\");\n\n const tabs: { key: ProfileTab; label: string }[] = [\n { key: \"positions\", label: positionsTabLabel },\n { key: \"orders\", label: t(\"predict.profile.openOrdersTab\") },\n { key: \"history\", label: t(\"predict.profile.historyTab\") },\n ];\n\n if (!hasWallet) {\n return (\n <div className=\"flex items-center justify-center text-sm text-neutral py-24 px-4\">\n {t(\"predict.profile.connectWallet\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col max-w-[1280px] mx-auto w-full px-4 max-sm:px-2\">\n {/* Stats header */}\n <ProfileStats\n positions={allPositions}\n trades={allTrades}\n isLoading={statsLoading}\n />\n\n {/* Tab navigation */}\n <div className=\"flex items-center gap-1 border-b border-border\">\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n \"px-3 py-3 text-base font-normal transition-colors cursor-pointer whitespace-nowrap\",\n activeTab === tab.key\n ? \"text-foreground border-b-2 border-foreground\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"py-2\">\n {activeTab === \"positions\" && (\n <ProfilePositions\n positions={allPositions}\n isLoading={positionsLoading}\n listHeight={LIST_HEIGHT}\n onClosePosition={onClosePosition}\n onEventClick={onEventClick}\n />\n )}\n {activeTab === \"orders\" && (\n <ProfileOrders\n solanaAddress={solanaAddress}\n evmAddress={evmAddress}\n listHeight={LIST_HEIGHT}\n />\n )}\n {activeTab === \"history\" && (\n <ProfileHistory\n solanaAddress={solanaAddress}\n evmAddress={evmAddress}\n listHeight={LIST_HEIGHT}\n />\n )}\n </div>\n </div>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { StyledModal, ModalContent } from \"@liberfi.io/ui\";\n\nexport interface SetupModalProps {\n isOpen: boolean;\n onClose: () => void;\n evmAddress: string;\n safeDeployed: boolean;\n tokenApproved: boolean;\n onDeployAndApprove: () => Promise<void>;\n}\n\ntype StepStatus = \"pending\" | \"running\" | \"done\";\n\nexport function SetupModal({\n isOpen,\n onClose,\n safeDeployed,\n tokenApproved,\n onDeployAndApprove,\n}: SetupModalProps) {\n const { t } = useTranslation();\n\n const [setupRunning, setSetupRunning] = useState(false);\n const [setupError, setSetupError] = useState<string | null>(null);\n const [optimisticDone, setOptimisticDone] = useState(false);\n\n const effectiveSafeDeployed = safeDeployed || optimisticDone;\n const effectiveTokenApproved = tokenApproved || optimisticDone;\n\n const step1Status: StepStatus = effectiveSafeDeployed\n ? \"done\"\n : setupRunning\n ? \"running\"\n : \"pending\";\n const step2Status: StepStatus = effectiveTokenApproved\n ? \"done\"\n : effectiveSafeDeployed && setupRunning\n ? \"running\"\n : \"pending\";\n\n const allDone = effectiveSafeDeployed && effectiveTokenApproved;\n\n const handleSetup = useCallback(async () => {\n setSetupError(null);\n setOptimisticDone(false);\n setSetupRunning(true);\n try {\n await onDeployAndApprove();\n setOptimisticDone(true);\n } catch (err) {\n setSetupError(err instanceof Error ? err.message : String(err));\n } finally {\n setSetupRunning(false);\n }\n }, [onDeployAndApprove]);\n\n const steps: {\n key: string;\n label: string;\n desc: string;\n status: StepStatus;\n }[] = [\n {\n key: \"step1\",\n label: t(\"predict.setup.step1\"),\n desc: t(\"predict.setup.step1Desc\" as never),\n status: step1Status,\n },\n {\n key: \"step2\",\n label: t(\"predict.setup.step2\"),\n desc: t(\"predict.setup.step2Desc\" as never),\n status: step2Status,\n },\n ];\n\n const handleAction = () => {\n if (allDone) {\n onClose();\n } else {\n handleSetup();\n }\n };\n\n const actionLabel = allDone\n ? t(\"predict.setup.done\")\n : t(\"predict.setup.setupButton\");\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n size=\"md\"\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 pt-5 pb-4\">\n <h3 className=\"text-base font-semibold text-white\">\n {t(\"predict.setup.modalTitle\")}\n </h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1 rounded-[10px] hover:bg-[rgba(39,39,42,0.5)] text-zinc-400 hover:text-white transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n {/* Body */}\n <div className=\"px-5 pb-5 space-y-4\">\n <p className=\"text-[13px] text-zinc-400 text-left\">\n {t(\"predict.setup.modalDescription\")}\n </p>\n\n {/* Steps */}\n <div className=\"space-y-2.5\">\n {steps.map((step, idx) => (\n <div\n key={step.key}\n className=\"flex gap-3 rounded-[10px] border border-zinc-700/50 bg-zinc-800/50 px-3 py-3\"\n >\n <StepIndicator index={idx + 1} status={step.status} />\n <div className=\"flex-1 min-w-0 pt-0.5\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-zinc-200\">\n {step.label}\n </p>\n <span\n className={`text-[11px] leading-none ${\n step.status === \"done\"\n ? \"text-[#c7ff2e]\"\n : step.status === \"running\"\n ? \"text-[#c7ff2e]/70\"\n : \"text-zinc-500\"\n }`}\n >\n {step.status === \"done\"\n ? t(\"predict.setup.stepComplete\")\n : step.status === \"running\"\n ? t(\"predict.setup.stepRunning\")\n : t(\"predict.setup.stepPending\")}\n </span>\n </div>\n <p className=\"text-xs text-zinc-500 mt-1\">{step.desc}</p>\n </div>\n </div>\n ))}\n </div>\n\n {setupError && (\n <div className=\"rounded-[10px] bg-red-500/10 border border-red-500/20 px-3 py-2\">\n <p className=\"text-xs text-red-400\">{setupError}</p>\n </div>\n )}\n\n {/* Action button */}\n <button\n type=\"button\"\n onClick={handleAction}\n disabled={setupRunning}\n className={\n allDone\n ? \"w-full py-3 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n : \"w-full py-3 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n }\n >\n {setupRunning ? (\n <span className=\"inline-flex items-center gap-2\">\n <svg\n className=\"animate-spin h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n className=\"opacity-25\"\n />\n <path\n d=\"M4 12a8 8 0 018-8\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n className=\"opacity-75\"\n />\n </svg>\n {t(\"predict.setup.stepRunning\")}\n </span>\n ) : (\n actionLabel\n )}\n </button>\n\n {/* Cancel */}\n {!allDone && (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-full py-2.5 rounded-[10px] text-sm text-zinc-400 hover:text-white hover:bg-[rgba(39,39,42,0.5)] transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n {t(\"common.cancel\")}\n </button>\n )}\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n\nfunction StepIndicator({\n index,\n status,\n}: {\n index: number;\n status: StepStatus;\n}) {\n if (status === \"done\") {\n return (\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[#c7ff2e]/15 shrink-0\">\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-[#c7ff2e]\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </span>\n );\n }\n if (status === \"running\") {\n return (\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[#c7ff2e]/10 shrink-0\">\n <svg\n className=\"animate-spin h-4 w-4 text-[#c7ff2e]\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n className=\"opacity-25\"\n />\n <path\n d=\"M4 12a8 8 0 018-8\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n className=\"opacity-75\"\n />\n </svg>\n </span>\n );\n }\n return (\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-zinc-700/50 text-xs font-bold text-zinc-400 shrink-0\">\n {index}\n </span>\n );\n}\n"]}
|