@commerce-ai-tool/react 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +21 -0
  3. package/README.md +16 -0
  4. package/dist/components/CameraCaptureOverlay.d.ts +11 -0
  5. package/dist/components/CameraCaptureOverlay.d.ts.map +1 -0
  6. package/dist/components/CartPanel.d.ts +22 -0
  7. package/dist/components/CartPanel.d.ts.map +1 -0
  8. package/dist/components/CommerceAICheckout.d.ts +15 -0
  9. package/dist/components/CommerceAICheckout.d.ts.map +1 -0
  10. package/dist/components/CommerceAIOrderStatus.d.ts +15 -0
  11. package/dist/components/CommerceAIOrderStatus.d.ts.map +1 -0
  12. package/dist/components/CommerceAISearch.d.ts +43 -0
  13. package/dist/components/CommerceAISearch.d.ts.map +1 -0
  14. package/dist/components/MissionResults.d.ts +13 -0
  15. package/dist/components/MissionResults.d.ts.map +1 -0
  16. package/dist/components/SearchFacets.d.ts +12 -0
  17. package/dist/components/SearchFacets.d.ts.map +1 -0
  18. package/dist/components/VoiceStatusBanner.d.ts +12 -0
  19. package/dist/components/VoiceStatusBanner.d.ts.map +1 -0
  20. package/dist/hooks/useCameraCapture.d.ts +18 -0
  21. package/dist/hooks/useCameraCapture.d.ts.map +1 -0
  22. package/dist/hooks/useCart.d.ts +57 -0
  23. package/dist/hooks/useCart.d.ts.map +1 -0
  24. package/dist/hooks/useCommerceAISearch.d.ts +59 -0
  25. package/dist/hooks/useCommerceAISearch.d.ts.map +1 -0
  26. package/dist/hooks/useRecordingDuration.d.ts +3 -0
  27. package/dist/hooks/useRecordingDuration.d.ts.map +1 -0
  28. package/dist/hooks/useTheme.d.ts +4 -0
  29. package/dist/hooks/useTheme.d.ts.map +1 -0
  30. package/dist/hooks/useVoiceSearch.d.ts +24 -0
  31. package/dist/hooks/useVoiceSearch.d.ts.map +1 -0
  32. package/dist/icons.d.ts +2 -0
  33. package/dist/icons.d.ts.map +1 -0
  34. package/dist/index.cjs +3714 -0
  35. package/dist/index.cjs.map +1 -0
  36. package/dist/index.css +1783 -0
  37. package/dist/index.css.map +1 -0
  38. package/dist/index.d.cts +19 -0
  39. package/dist/index.d.ts +19 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +3702 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/utils/camera.d.ts +7 -0
  44. package/dist/utils/camera.d.ts.map +1 -0
  45. package/dist/vendor-core/client.d.cts +12 -0
  46. package/dist/vendor-core/client.d.ts +12 -0
  47. package/dist/vendor-core/commercetools/facet-color.d.ts +12 -0
  48. package/dist/vendor-core/commercetools/facets.d.ts +31 -0
  49. package/dist/vendor-core/messages/index.d.ts +110 -0
  50. package/dist/vendor-core/payments/types.d.ts +35 -0
  51. package/dist/vendor-core/search/compound-shopping-list.d.ts +6 -0
  52. package/dist/vendor-core/types/index.d.ts +510 -0
  53. package/package.json +84 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/CommerceAISearch.tsx","../../core/src/types/index.ts","../../core/src/messages/index.ts","../../core/src/search/compound-shopping-list.ts","../../core/src/commercetools/facet-color.ts","../../core/src/commercetools/facets.ts","../src/hooks/useCommerceAISearch.ts","../src/hooks/useCameraCapture.ts","../src/utils/camera.ts","../src/hooks/useCart.ts","../src/hooks/useRecordingDuration.ts","../src/hooks/useVoiceSearch.ts","../src/icons.ts","../src/components/CameraCaptureOverlay.tsx","../src/components/CartPanel.tsx","../src/components/MissionResults.tsx","../src/components/SearchFacets.tsx","../src/components/VoiceStatusBanner.tsx","../src/components/CommerceAICheckout.tsx","../src/components/CommerceAIOrderStatus.tsx","../src/hooks/useTheme.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n Camera,\n Check,\n ImageIcon,\n Mic,\n Package,\n Search,\n SearchX,\n ShoppingCart,\n Square,\n Volume2,\n} from \"lucide-react\";\nimport type {\n CartSnapshot,\n CommerceAISearchMessages,\n ProductCard,\n ThemeMode,\n} from \"@commerce-ai-tool/core/client\";\nimport { resolveCommerceAISearchMessages, looksLikeCompoundShoppingList } from \"@commerce-ai-tool/core/client\";\nimport { useCommerceAISearch } from \"../hooks/useCommerceAISearch.js\";\nimport { useCameraCapture } from \"../hooks/useCameraCapture.js\";\nimport { useCart } from \"../hooks/useCart.js\";\nimport { useRecordingDuration } from \"../hooks/useRecordingDuration.js\";\nimport { useVoiceSearch } from \"../hooks/useVoiceSearch.js\";\nimport { ICON_STROKE } from \"../icons.js\";\nimport { CameraCaptureOverlay } from \"./CameraCaptureOverlay.js\";\nimport { CartPanel } from \"./CartPanel.js\";\nimport { MissionResults } from \"./MissionResults.js\";\nimport { SearchFacets } from \"./SearchFacets.js\";\nimport { VoiceStatusBanner } from \"./VoiceStatusBanner.js\";\nimport type { CameraFacingMode } from \"../utils/camera.js\";\nimport \"../styles/commerce-ai-search.css\";\n\nexport type SearchMode = \"text\" | \"image\" | \"voice\" | null;\n\nexport interface CommerceAISearchProps {\n apiBaseUrl: string;\n theme?: ThemeMode;\n /** Language products are indexed in commercetools */\n catalogLocale?: string;\n /** Language of the user search input */\n queryLocale?: string;\n /** @deprecated Use queryLocale */\n locale?: string;\n placeholder?: string;\n messages?: Partial<CommerceAISearchMessages>;\n enableAutocomplete?: boolean;\n enableFacets?: boolean;\n persistSession?: boolean;\n /** Show microphone search controls. Default true. */\n enableVoice?: boolean;\n /** Show local image upload and drag-and-drop search controls. Default true. */\n enableImageSearch?: boolean;\n /** Show camera capture search controls independently of image upload. Default true. */\n enableCameraSearch?: boolean;\n cameraFacingMode?: CameraFacingMode;\n enableTts?: boolean;\n /** Enable built-in add-to-cart buttons and cart preview panel. Default false. */\n enableCart?: boolean;\n /** Enable multi-item shopping missions on text, voice, and image search. Default false. */\n enableMissions?: boolean;\n /** Currency for cart creation. Required when `enableCart` is true unless the server has a default. */\n currency?: string;\n /** Optional ISO country code used for commercetools price selection. */\n country?: string;\n className?: string;\n onProductSelect?: (product: ProductCard) => void;\n /** Fires after every cart fetch or mutation when `enableCart` is true. */\n onCartChange?: (cart: CartSnapshot | null) => void;\n /** Opens the host-owned checkout route for the current non-empty cart. */\n onCheckout?: (cart: CartSnapshot) => void;\n}\n\nexport function CommerceAISearch({\n apiBaseUrl,\n theme = \"auto\",\n catalogLocale,\n queryLocale,\n locale,\n placeholder,\n messages: messageOverrides,\n enableAutocomplete = false,\n enableFacets = false,\n persistSession = true,\n enableVoice = true,\n enableImageSearch = true,\n enableCameraSearch = true,\n cameraFacingMode = \"environment\",\n enableTts = true,\n enableCart = false,\n enableMissions = false,\n currency,\n country,\n className,\n onProductSelect,\n onCartChange,\n onCheckout,\n}: CommerceAISearchProps) {\n const messages = useMemo(\n () =>\n resolveCommerceAISearchMessages({\n ...messageOverrides,\n ...(placeholder ? { placeholder } : {}),\n }),\n [messageOverrides, placeholder],\n );\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const cameraInputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [lastSearchMode, setLastSearchMode] = useState<SearchMode>(null);\n const [activeSuggestionIndex, setActiveSuggestionIndex] = useState(-1);\n const [suggestionsDismissed, setSuggestionsDismissed] = useState(false);\n\n const camera = useCameraCapture({ facingMode: cameraFacingMode });\n\n const {\n query,\n setQuery,\n suggestions,\n isLoadingSuggestions,\n suggestionsError,\n suggestionsReady,\n selectSuggestion,\n results,\n mission,\n isLoading,\n hasSearched,\n setHasSearched,\n error,\n meta,\n search,\n searchByImage,\n setError,\n setIsLoading,\n facets = [],\n suggestedFacets = [],\n hasFacetSession = false,\n refineFilters = async () => undefined,\n refine = async () => undefined,\n startNewSearch = async () => undefined,\n applySearchResult = () => undefined,\n } = useCommerceAISearch({\n apiBaseUrl,\n catalogLocale,\n queryLocale,\n locale,\n enableAutocomplete,\n enableFacets,\n persistSession,\n enableMissions,\n });\n\n const voice = useVoiceSearch({\n apiBaseUrl,\n catalogLocale,\n queryLocale,\n locale,\n enableTts,\n enableMissions,\n onResults: (products, resultMeta, extras) => {\n setLastSearchMode(\"voice\");\n applySearchResult({\n products,\n meta: resultMeta,\n mission: extras?.mission,\n });\n setError(null);\n setIsLoading(false);\n setHasSearched(true);\n },\n onTranscript: (transcript) => setQuery(transcript, { search: false }),\n });\n\n const recordingDuration = useRecordingDuration(voice.isRecording);\n const showVoiceBanner =\n enableVoice &&\n (voice.isRecording || voice.isProcessing || voice.isLoadingTts || Boolean(voice.error));\n\n const cart = useCart({\n apiBaseUrl,\n currency,\n country,\n catalogLocale,\n enabled: enableCart,\n onCartChange,\n });\n const cartQuantity = cart.cart?.totalQuantity ?? 0;\n const cartBadgeLabel = cartQuantity > 99 ? \"99+\" : String(cartQuantity);\n const [addedProductIds, setAddedProductIds] = useState<Record<string, true>>({});\n\n const handleAddToCart = useCallback(\n async (product: ProductCard) => {\n if (!product.sku && !product.id) {\n return;\n }\n const next = await cart.addToCart(\n product.sku\n ? { sku: product.sku }\n : { productId: product.id, variantId: product.variantId },\n );\n if (!next) {\n return;\n }\n setAddedProductIds((current) => ({ ...current, [product.id]: true }));\n window.setTimeout(() => {\n setAddedProductIds((current) => {\n const nextAdded = { ...current };\n delete nextAdded[product.id];\n return nextAdded;\n });\n }, 1200);\n },\n [cart.addToCart],\n );\n\n const displayResults = results;\n const showMission = Boolean(mission);\n const missionLaneCount = mission?.intents.length ?? 0;\n const showEmptyResults =\n !isLoading &&\n !error &&\n hasSearched &&\n displayResults.length === 0 &&\n !showMission &&\n query.trim().length > 0;\n const showResults =\n query.trim().length > 0 &&\n (isLoading ||\n !!error ||\n displayResults.length > 0 ||\n showEmptyResults ||\n showMission);\n const showSuggestions =\n enableAutocomplete &&\n !suggestionsDismissed &&\n !showResults &&\n query.trim().length >= 2 &&\n (isLoadingSuggestions || suggestions.length > 0 || !!suggestionsError || suggestionsReady);\n\n const handleSubmit = useCallback(\n (event: React.FormEvent) => {\n event.preventDefault();\n setLastSearchMode(\"text\");\n voice.clearAudioSummary();\n setActiveSuggestionIndex(-1);\n\n if (enableAutocomplete && activeSuggestionIndex >= 0 && suggestions[activeSuggestionIndex]) {\n selectSuggestion(suggestions[activeSuggestionIndex]!);\n return;\n }\n\n if (\n enableFacets &&\n hasFacetSession &&\n !(enableMissions && looksLikeCompoundShoppingList(query))\n ) {\n void refine(query);\n } else {\n void search(query);\n }\n },\n [\n activeSuggestionIndex,\n enableAutocomplete,\n enableFacets,\n enableMissions,\n hasFacetSession,\n query,\n refine,\n search,\n selectSuggestion,\n suggestions,\n voice,\n ],\n );\n\n const handleQueryChange = useCallback(\n (value: string) => {\n setActiveSuggestionIndex(-1);\n setSuggestionsDismissed(false);\n const trimmed = value.trim();\n if (!trimmed) {\n setLastSearchMode(null);\n voice.clearAudioSummary();\n } else if (trimmed.length >= 2) {\n setLastSearchMode(\"text\");\n voice.clearAudioSummary();\n }\n setQuery(value);\n },\n [setQuery, voice],\n );\n\n const handleSuggestionSelect = useCallback(\n (suggestion: string) => {\n setActiveSuggestionIndex(-1);\n setLastSearchMode(\"text\");\n voice.clearAudioSummary();\n selectSuggestion(suggestion);\n },\n [selectSuggestion, voice],\n );\n\n const handleInputKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Escape\") {\n setActiveSuggestionIndex(-1);\n setSuggestionsDismissed(true);\n return;\n }\n\n if (!showSuggestions || suggestions.length === 0) {\n return;\n }\n\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setActiveSuggestionIndex((current) => (current < suggestions.length - 1 ? current + 1 : 0));\n return;\n }\n\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveSuggestionIndex((current) => (current > 0 ? current - 1 : suggestions.length - 1));\n return;\n }\n\n if (event.key === \"Enter\" && activeSuggestionIndex >= 0) {\n event.preventDefault();\n const suggestion = suggestions[activeSuggestionIndex];\n if (suggestion) {\n handleSuggestionSelect(suggestion);\n }\n }\n },\n [activeSuggestionIndex, handleSuggestionSelect, showSuggestions, suggestions],\n );\n\n const handleImageSelect = useCallback(\n (file: File) => {\n if (!file.type.startsWith(\"image/\")) return;\n setLastSearchMode(\"image\");\n voice.clearAudioSummary();\n void searchByImage(file);\n },\n [searchByImage, voice],\n );\n\n const handleCameraCapture = useCallback(\n async (video: HTMLVideoElement) => {\n try {\n const file = await camera.capturePhoto(video);\n handleImageSelect(file);\n } catch (err) {\n camera.close();\n setError(err instanceof Error ? err.message : messages.couldNotCapturePhoto);\n }\n },\n [camera, handleImageSelect, messages.couldNotCapturePhoto, setError],\n );\n\n const handleDrop = useCallback(\n (event: React.DragEvent) => {\n event.preventDefault();\n setIsDragging(false);\n if (!enableImageSearch) {\n return;\n }\n const file = event.dataTransfer.files[0];\n if (file) handleImageSelect(file);\n },\n [enableImageSearch, handleImageSelect],\n );\n\n const showVoiceReplay =\n enableVoice && enableTts && lastSearchMode === \"voice\" && Boolean(voice.audioSummary);\n\n return (\n <div\n className={[\n \"cat-root\",\n \"cat-wrapper\",\n showMission && !isLoading && !error\n ? `cat-root--mission cat-root--mission-lanes-${Math.min(Math.max(missionLaneCount, 1), 5)}`\n : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n data-theme={theme}\n onDragOver={(e) => {\n if (!enableImageSearch) {\n return;\n }\n e.preventDefault();\n setIsDragging(true);\n }}\n onDragLeave={() => setIsDragging(false)}\n onDrop={handleDrop}\n role=\"search\"\n aria-label={messages.productSearchAriaLabel}\n >\n {isDragging && enableImageSearch && (\n <div className=\"cat-drag-overlay\" aria-hidden=\"true\">\n {messages.dropImageToSearch}\n </div>\n )}\n\n <div className=\"cat-search-shell\">\n <form\n className={`cat-search-bar ${voice.isRecording ? \"cat-search-bar--voice-active\" : \"\"}`}\n onSubmit={handleSubmit}\n >\n <Search size={18} strokeWidth={ICON_STROKE} aria-hidden=\"true\" color=\"var(--cat-text-muted)\" />\n <div className=\"cat-search-input-wrap\">\n <input\n type=\"search\"\n className=\"cat-search-input\"\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n onKeyDown={handleInputKeyDown}\n placeholder={messages.placeholder}\n aria-label={messages.searchAriaLabel}\n aria-haspopup={enableAutocomplete ? \"listbox\" : undefined}\n aria-autocomplete={enableAutocomplete ? \"list\" : undefined}\n aria-expanded={showSuggestions}\n aria-controls={showSuggestions ? \"cat-suggestions-listbox\" : undefined}\n aria-activedescendant={\n activeSuggestionIndex >= 0 ? `cat-suggestion-${activeSuggestionIndex}` : undefined\n }\n autoComplete=\"off\"\n role={enableAutocomplete ? \"combobox\" : undefined}\n />\n </div>\n\n <div className=\"cat-search-actions\">\n {enableVoice && (\n <button\n type=\"button\"\n className={`cat-icon-btn ${voice.isRecording ? \"cat-icon-btn--active\" : \"\"}`}\n onClick={() => void voice.toggleRecording()}\n disabled={voice.isProcessing}\n aria-label={voice.isRecording ? messages.stopRecording : messages.voiceSearch}\n aria-pressed={voice.isRecording}\n >\n {voice.isRecording ? (\n <Square size={16} strokeWidth={ICON_STROKE} />\n ) : (\n <Mic size={16} strokeWidth={ICON_STROKE} />\n )}\n </button>\n )}\n\n {enableCameraSearch ? (\n <>\n <button\n type=\"button\"\n className=\"cat-icon-btn\"\n onClick={() => camera.open(cameraInputRef)}\n disabled={isLoading}\n aria-label={messages.searchByCamera}\n >\n <Camera size={16} strokeWidth={ICON_STROKE} />\n </button>\n <input\n ref={cameraInputRef}\n type=\"file\"\n accept=\"image/*\"\n capture={cameraFacingMode}\n className=\"cat-hidden-input\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n e.target.value = \"\";\n if (file) handleImageSelect(file);\n }}\n />\n </>\n ) : null}\n\n {enableImageSearch ? (\n <>\n <button\n type=\"button\"\n className=\"cat-icon-btn\"\n onClick={() => fileInputRef.current?.click()}\n disabled={isLoading}\n aria-label={messages.searchByImage}\n >\n <ImageIcon size={16} strokeWidth={ICON_STROKE} />\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"cat-hidden-input\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) handleImageSelect(file);\n }}\n />\n </>\n ) : null}\n\n {showVoiceReplay && (\n <button\n type=\"button\"\n className=\"cat-icon-btn\"\n onClick={() => voice.replayAudioSummary()}\n aria-label={messages.replayVoiceSummary}\n >\n <Volume2 size={16} strokeWidth={ICON_STROKE} />\n </button>\n )}\n </div>\n\n {enableCart && (\n <button\n type=\"button\"\n className={`cat-icon-btn cat-cart-toggle ${cart.isCartOpen ? \"cat-cart-toggle--open\" : \"\"}`}\n onClick={cart.toggleCart}\n aria-label={\n cartQuantity > 0\n ? `${messages.cartAriaLabel} (${cartBadgeLabel})`\n : messages.cartAriaLabel\n }\n aria-expanded={cart.isCartOpen}\n aria-pressed={cart.isCartOpen}\n >\n <ShoppingCart size={16} strokeWidth={ICON_STROKE} />\n {cartQuantity > 0 && (\n <span className=\"cat-cart-badge\" aria-hidden=\"true\">\n {cartBadgeLabel}\n </span>\n )}\n </button>\n )}\n\n {showSuggestions && (\n <div\n id=\"cat-suggestions-listbox\"\n className=\"cat-suggestions\"\n role=\"listbox\"\n aria-label={messages.suggestionsAriaLabel}\n >\n {isLoadingSuggestions && suggestions.length === 0 && !suggestionsError && (\n <div className=\"cat-suggestions__status\">{messages.loadingSuggestions}</div>\n )}\n\n {suggestionsError && (\n <div className=\"cat-suggestions__status cat-suggestions__status--error\" role=\"alert\">\n {suggestionsError}\n </div>\n )}\n\n {!isLoadingSuggestions &&\n !suggestionsError &&\n suggestionsReady &&\n suggestions.length === 0 && (\n <div className=\"cat-suggestions__status\">{messages.noSuggestions}</div>\n )}\n\n {suggestions.map((suggestion, index) => (\n <button\n key={`${index}-${suggestion}`}\n id={`cat-suggestion-${index}`}\n type=\"button\"\n className={`cat-suggestions__item ${\n index === activeSuggestionIndex ? \"cat-suggestions__item--active\" : \"\"\n }`}\n role=\"option\"\n aria-selected={index === activeSuggestionIndex}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => handleSuggestionSelect(suggestion)}\n >\n {suggestion}\n </button>\n ))}\n </div>\n )}\n </form>\n </div>\n\n {showVoiceBanner && (\n <VoiceStatusBanner\n isRecording={voice.isRecording}\n isProcessing={voice.isProcessing}\n isLoadingTts={voice.isLoadingTts}\n error={voice.error}\n durationSeconds={recordingDuration}\n messages={messages}\n onDismissError={voice.clearError}\n />\n )}\n\n {enableFacets && lastSearchMode === \"text\" && hasSearched && !showMission && (\n <SearchFacets\n facets={facets}\n suggestedFacets={suggestedFacets}\n filters={meta?.appliedFilters ?? {}}\n messages={messages}\n onChange={(filters) => void refineFilters(filters)}\n onNewSearch={() => void startNewSearch()}\n />\n )}\n\n {enableCameraSearch && (camera.isOpen || camera.error) && (\n <CameraCaptureOverlay\n stream={camera.stream}\n error={camera.error}\n messages={messages}\n onCapture={(video) => void handleCameraCapture(video)}\n onClose={camera.close}\n onDismissError={camera.clearError}\n />\n )}\n\n {showResults && isLoading && <div className=\"cat-status\">{messages.searching}</div>}\n {showResults && error && <div className=\"cat-status cat-status--error\">{error}</div>}\n\n {!isLoading && !error && showResults && showMission && mission ? (\n <MissionResults\n mission={mission}\n messages={messages}\n enableCart={enableCart}\n isMutating={cart.isMutating}\n addedProductIds={addedProductIds}\n onProductSelect={onProductSelect}\n onAddItem={(product) => void handleAddToCart(product)}\n onAddAll={(items) => cart.addItems(items)}\n />\n ) : null}\n\n {showResults && !showMission && !isLoading && !error && (\n <div\n className=\"cat-results\"\n role={!isLoading && displayResults.length > 0 ? \"list\" : undefined}\n aria-label={\n !isLoading && displayResults.length > 0\n ? messages.searchResultsAriaLabel\n : undefined\n }\n >\n {!isLoading &&\n displayResults.map((product, index) => {\n const canAdd = Boolean(product.sku || product.id);\n const justAdded = Boolean(addedProductIds[product.id]);\n const productBody = (\n <>\n {product.imageUrl ? (\n <img\n src={product.imageUrl}\n alt=\"\"\n className=\"cat-result-image\"\n loading=\"lazy\"\n />\n ) : (\n <div className=\"cat-result-image cat-result-image--placeholder\">\n <Package size={20} strokeWidth={ICON_STROKE} color=\"var(--cat-text-muted)\" />\n </div>\n )}\n <div className=\"cat-result-info\">\n <div className=\"cat-result-name\">{product.name}</div>\n {product.price && (\n <div className=\"cat-result-price\">{product.price.formatted}</div>\n )}\n </div>\n </>\n );\n\n return (\n <article\n key={product.id}\n className={`cat-result-card${index === 0 ? \" cat-result-card--featured\" : \"\"}`}\n role=\"listitem\"\n >\n <div className=\"cat-result-card__core\">\n <button\n type=\"button\"\n className=\"cat-result-card__select\"\n onClick={() => onProductSelect?.(product)}\n >\n {productBody}\n </button>\n {enableCart ? (\n <button\n type=\"button\"\n className={`cat-icon-btn cat-result-card__add ${justAdded ? \"cat-result-card__add--added\" : \"\"}`}\n aria-label={\n justAdded\n ? messages.itemAdded\n : canAdd\n ? messages.addToCart\n : messages.unableToAddToCart\n }\n disabled={!canAdd || cart.isMutating}\n onClick={() => handleAddToCart(product)}\n >\n {justAdded ? (\n <Check size={16} strokeWidth={ICON_STROKE} />\n ) : (\n <ShoppingCart size={16} strokeWidth={ICON_STROKE} />\n )}\n </button>\n ) : null}\n </div>\n </article>\n );\n })}\n\n {!isLoading && !error && displayResults.length === 0 && showEmptyResults && (\n <div className=\"cat-status cat-status--empty\" role=\"status\" aria-live=\"polite\">\n <SearchX size={18} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n <div className=\"cat-status__content\">\n <div className=\"cat-status__title\">{messages.noProductsFound}</div>\n {meta?.queryInterpretation && (\n <div className=\"cat-status__hint\">\n {messages.searchedFor} {meta.queryInterpretation}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )}\n\n {enableCart && cart.isCartOpen && (\n <CartPanel\n cart={cart.cart}\n customer={cart.customer}\n isLoading={cart.isLoading || cart.isMutating}\n isLoggingIn={cart.isLoggingIn}\n error={cart.error}\n messages={messages}\n catalogLocale={catalogLocale}\n onClose={cart.closeCart}\n onRemove={(lineItemId) => void cart.removeFromCart(lineItemId)}\n onQuantityChange={(lineItemId, quantity) =>\n void cart.updateQuantity(lineItemId, quantity)\n }\n onLogin={(input) => void cart.login(input)}\n onLogout={() => void cart.logout()}\n onCheckout={onCheckout}\n />\n )}\n </div>\n );\n}\n","import type { PaymentProvider } from \"../payments/types.js\";\n\nexport type { PaymentMethodOption } from \"../payments/types.js\";\n\nexport type ThemeMode = \"auto\" | \"light\" | \"dark\";\n\nexport type AIProviderName = \"openrouter\" | \"bedrock\";\n\nexport type VoiceMode = \"openrouter-audio\" | \"elevenlabs-stt\";\n\nexport interface SearchCacheConfig {\n ttlMs?: number;\n maxEntries?: number;\n}\n\nexport interface FacetConfig {\n enabled?: boolean;\n schemaTtlMs?: number;\n include?: string[];\n exclude?: string[];\n maxAttributes?: number;\n}\n\nexport interface SearchTimeoutsConfig {\n aiTextMs?: number;\n aiVoiceAudioMs?: number;\n aiImageMs?: number;\n commercetoolsMs?: number;\n commercetoolsSuggestMs?: number;\n elevenLabsTtsMs?: number;\n}\n\nexport const SUGGESTIONS_MIN_PREFIX_LENGTH = 2;\nexport const SUGGESTIONS_DEFAULT_LIMIT = 8;\nexport const SUGGESTIONS_MAX_LIMIT = 20;\n\nexport interface CommercetoolsConfig {\n projectKey: string;\n clientId: string;\n clientSecret: string;\n region: string;\n scopes?: string[];\n}\n\nexport interface OpenRouterConfig {\n apiKey: string;\n model?: string;\n visionModel?: string;\n /** Audio-capable model for direct voice search (OpenRouter input_audio). */\n voiceModel?: string;\n /**\n * Use OpenRouter `json_schema` (strict) for structured interpretation.\n * Falls back to `json_object` when the model rejects json_schema.\n * Default: true.\n */\n jsonSchema?: boolean;\n}\n\nexport interface BedrockConfig {\n region: string;\n modelId?: string;\n visionModelId?: string;\n}\n\nexport interface AIConfig {\n provider: AIProviderName;\n openrouter?: OpenRouterConfig;\n bedrock?: BedrockConfig;\n}\n\nexport interface ElevenLabsConfig {\n apiKey: string;\n sttModel?: string;\n ttsVoiceId?: string;\n ttsModel?: string;\n}\n\nexport interface CommerceAIDefaults {\n /** Language products are indexed in within commercetools */\n catalogLocale?: string;\n /** @deprecated Use catalogLocale */\n locale?: string;\n storeKey?: string;\n limit?: number;\n currency?: string;\n /** ISO country code for cart and product-card price selection (optional). */\n country?: string;\n}\n\nexport interface PaymentConfig {\n provider?: PaymentProvider;\n /** Block order creation without a successful authorization. Defaults to true when a provider is set. */\n requiredForOrder?: boolean;\n}\n\nexport interface LangfuseConfig {\n /** Derived from LANGFUSE_PUBLIC_KEY + LANGFUSE_SECRET_KEY when loading from env. */\n enabled?: boolean;\n /**\n * Fetch system prompts from Langfuse at runtime.\n * Applied via `configureLangfusePrompts` when creating the search orchestrator\n * (or set `LANGFUSE_PROMPTS=true` when config omits this field).\n * Local catalog remains the fallback and the source of truth for evals.\n */\n promptsEnabled?: boolean;\n /** Langfuse prompt label (default `production`). From LANGFUSE_PROMPT_LABEL or this field. */\n promptLabel?: string;\n /** Client-side prompt cache TTL in seconds (default 60). From LANGFUSE_PROMPT_CACHE_TTL_SECONDS or this field. */\n promptCacheTtlSeconds?: number;\n}\n\nexport interface MissionsConfig {\n /** Opt-in. When true, every fresh text search also runs mission decomposition. */\n enabled?: boolean;\n /** Maximum product intents kept from a decomposed mission. Default 5. */\n maxIntents?: number;\n /** Product Search limit per intent. Default 4. */\n perIntentLimit?: number;\n /** Minimum AI confidence (0–1) required to keep a mission. Default 0.6. */\n minConfidence?: number;\n}\n\nexport interface CommerceAIConfig {\n commercetools: CommercetoolsConfig;\n ai: AIConfig;\n elevenlabs?: ElevenLabsConfig;\n defaults?: CommerceAIDefaults;\n voiceMode?: VoiceMode;\n cache?: SearchCacheConfig;\n timeouts?: SearchTimeoutsConfig;\n facets?: FacetConfig;\n langfuse?: LangfuseConfig;\n payments?: PaymentConfig;\n missions?: MissionsConfig;\n}\n\nexport interface ProductCard {\n id: string;\n key?: string;\n name: string;\n description?: string;\n imageUrl?: string;\n /** SKU of the master variant — used for add-to-cart. */\n sku?: string;\n /** Master variant id — fallback when `sku` is missing. */\n variantId?: number;\n price?: {\n amount: number;\n currency: string;\n formatted: string;\n };\n slug?: string;\n}\n\nexport interface MoneyAmount {\n amount: number;\n currency: string;\n formatted: string;\n}\n\nexport interface CartLineItemSnapshot {\n id: string;\n name: string;\n sku?: string;\n productId: string;\n quantity: number;\n imageUrl?: string;\n price?: MoneyAmount;\n totalPrice?: MoneyAmount;\n}\n\nexport interface CheckoutAddress {\n firstName: string;\n lastName: string;\n streetName: string;\n additionalStreetInfo?: string;\n postalCode: string;\n city: string;\n region?: string;\n country: string;\n email?: string;\n phone?: string;\n}\n\nexport interface ShippingMethodSnapshot {\n id: string;\n name: string;\n description?: string;\n price?: MoneyAmount;\n}\n\nexport interface PaymentSnapshot {\n id: string;\n key?: string;\n interfaceId?: string;\n paymentInterface: string;\n method: string;\n status: \"authorized\" | \"pending\" | \"failed\";\n amount: MoneyAmount;\n clientData?: Record<string, string>;\n}\n\nexport interface DeliverySnapshot {\n id: string;\n trackingId?: string;\n carrier?: string;\n provider?: string;\n}\n\n/** Client-safe cart shape — never the raw commercetools Cart object. */\nexport interface CartSnapshot {\n id: string;\n version: number;\n anonymousId?: string;\n customerId?: string;\n lineItems: CartLineItemSnapshot[];\n totalPrice: MoneyAmount;\n totalQuantity: number;\n shippingAddress?: CheckoutAddress;\n billingAddress?: CheckoutAddress;\n shippingMethod?: ShippingMethodSnapshot;\n payments?: PaymentSnapshot[];\n}\n\nexport interface OrderSnapshot {\n id: string;\n orderNumber?: string;\n orderState: string;\n createdAt?: string;\n paymentState?: string;\n shipmentState?: string;\n customerEmail?: string;\n totalPrice: MoneyAmount;\n lineItems: CartLineItemSnapshot[];\n shippingAddress?: CheckoutAddress;\n billingAddress?: CheckoutAddress;\n shippingMethod?: ShippingMethodSnapshot;\n payments?: PaymentSnapshot[];\n deliveries?: DeliverySnapshot[];\n}\n\n/** Public customer identity — never includes credentials. */\nexport interface CustomerSnapshot {\n id: string;\n email: string;\n}\n\n/** HMAC cart session header for GET /cart — never send the token in the query string. */\nexport const CART_SESSION_HEADER = \"x-commerce-ai-cart-session\";\n\n/** Upper bound for a single add-to-cart line quantity (mission add-all and batch add). */\nexport const MAX_LINE_ITEM_QUANTITY = 99;\n\nexport interface CartLoginRequest {\n email: string;\n password: string;\n anonymousId?: string;\n cartId?: string;\n catalogLocale?: string;\n}\n\nexport interface CartLoginResult {\n cart: CartSnapshot | null;\n customer: CustomerSnapshot;\n}\n\nexport interface AddToCartLineItem {\n sku?: string;\n productId?: string;\n variantId?: number;\n quantity?: number;\n}\n\nexport interface AddToCartRequest {\n anonymousId?: string;\n customerId?: string;\n sku?: string;\n productId?: string;\n variantId?: number;\n quantity?: number;\n currency?: string;\n country?: string;\n catalogLocale?: string;\n /** When set, add to this cart instead of looking up by anonymousId / customerId. */\n cartId?: string;\n sessionToken?: string;\n}\n\nexport interface AddItemsToCartRequest {\n anonymousId?: string;\n customerId?: string;\n items: AddToCartLineItem[];\n currency?: string;\n country?: string;\n catalogLocale?: string;\n cartId?: string;\n sessionToken?: string;\n}\n\nexport interface CartMutationRequest {\n anonymousId?: string;\n customerId?: string;\n lineItemId: string;\n cartId?: string;\n cartVersion?: number;\n catalogLocale?: string;\n sessionToken?: string;\n}\n\nexport interface UpdateCartQuantityRequest extends CartMutationRequest {\n quantity: number;\n}\n\nexport interface GetCartRequest {\n anonymousId?: string;\n customerId?: string;\n catalogLocale?: string;\n sessionToken?: string;\n}\n\nexport interface CheckoutRequest {\n anonymousId?: string;\n customerId?: string;\n cartId?: string;\n catalogLocale?: string;\n sessionToken?: string;\n}\n\nexport interface SetCartAddressesRequest extends CheckoutRequest {\n shippingAddress: CheckoutAddress;\n billingAddress?: CheckoutAddress;\n}\n\nexport interface SetShippingMethodRequest extends CheckoutRequest {\n shippingMethodId: string;\n}\n\nexport interface CreateOrderRequest extends CheckoutRequest {\n orderNumber?: string;\n}\n\nexport interface AuthorizePaymentRequest extends CheckoutRequest {\n method: string;\n orderNumber?: string;\n}\n\nexport interface GetOrderRequest {\n orderNumber?: string;\n anonymousId?: string;\n customerId?: string;\n catalogLocale?: string;\n sessionToken?: string;\n}\n\nexport interface ListOrdersRequest {\n anonymousId?: string;\n customerId?: string;\n catalogLocale?: string;\n sessionToken?: string;\n limit?: number;\n}\n\nexport type SearchRelaxationLevel = \"none\" | \"drop_soft_filters\" | \"primary_any_match\";\n\nexport interface SearchMeta {\n total: number;\n limit: number;\n offset: number;\n /** @deprecated Use catalogLocale */\n locale: string;\n catalogLocale: string;\n queryLocale: string;\n queryInterpretation?: string;\n searchTerms?: string[];\n /** Catalog-language phrase closest to the user's intent, when the model supplied one. */\n primaryTerm?: string;\n appliedFilters?: InterpretedSearchFilters;\n /**\n * How far Product Search was relaxed after an empty first result.\n * Omitted when no relaxation ran (`none`).\n */\n relaxation?: SearchRelaxationLevel;\n sort?: \"relevance\" | \"price_asc\" | \"price_desc\";\n schemaEtag?: string;\n /** Per-step durations in milliseconds (dev / CAT_DEBUG only) */\n timings?: Record<string, number>;\n /** Total pipeline duration in milliseconds (dev / CAT_DEBUG only) */\n totalMs?: number;\n /**\n * Active OpenTelemetry / Langfuse trace id when Langfuse is enabled or CAT_DEBUG=true.\n * Non-stable for client contracts — intended for local/dev linking.\n */\n traceId?: string;\n}\n\nexport interface SearchResult {\n products: ProductCard[];\n meta: SearchMeta;\n facets?: SearchFacetGroup[];\n suggestedFacets?: SuggestedFacet[];\n facetSchema?: FacetAttributeDefinition[];\n /** Present when a compound shopping mission was executed. */\n mission?: MissionSearchResult;\n}\n\nexport interface SuggestionsRequest extends SearchLocaleOptions {\n query: string;\n limit?: number;\n}\n\nexport interface SuggestionsResult {\n suggestions: string[];\n /**\n * True when this request invoked AI `suggestSearchTerms` (not a cache hit).\n * Used by the server to flush Langfuse on serverless hosts.\n */\n aiFallbackUsed?: boolean;\n}\n\nexport interface TextSearchRequest {\n query: string;\n /** Language of the user query (AI input) */\n queryLocale?: string;\n /** Language products are indexed in commercetools */\n catalogLocale?: string;\n /** @deprecated Use queryLocale */\n locale?: string;\n limit?: number;\n offset?: number;\n filters?: InterpretedSearchFilters;\n searchTerms?: string[];\n sort?: \"relevance\" | \"price_asc\" | \"price_desc\";\n refineQuery?: string;\n includeFacets?: boolean;\n /** AI-suggested facets from the active search session (chip refine). */\n suggestedFacets?: SuggestedFacet[];\n /** Per-request override of `CommerceAIConfig.missions.enabled`. */\n enableMissions?: boolean;\n}\n\nexport interface SearchLocaleOptions {\n queryLocale?: string;\n catalogLocale?: string;\n /** @deprecated Use queryLocale */\n locale?: string;\n}\n\nexport interface SearchLocaleContext {\n queryLocale: string;\n catalogLocale: string;\n}\n\nexport interface VoiceSearchResult extends SearchResult {\n transcript: string;\n enhancedQuery?: string;\n}\n\nexport interface ImageSearchResult extends SearchResult {\n interpretation: string;\n}\n\n/** Standard filter keys returned by AI interpretation (all optional). */\nexport interface InterpretedSearchFilters {\n color?: string;\n brand?: string;\n category?: string;\n priceMin?: string;\n priceMax?: string;\n [key: string]: string | undefined;\n}\n\nexport interface InterpretedSearchQuery {\n /**\n * Catalog-language phrase closest to the user's intent.\n * Product Search boosts this phrase above the other `searchTerms`.\n * Kept separate from `searchTerms[0]` because same-language query passthrough\n * prepends the typed query without changing intent priority.\n */\n primaryTerm?: string;\n /**\n * Catalog-language search phrases. Product Search matches any phrase (OR).\n * Each element is a complete phrase (e.g. `\"red shoes\"`), not a split word.\n * Broad intents may include 3–5 synonym or hyponym phrases.\n */\n searchTerms: string[];\n filters?: InterpretedSearchFilters;\n suggestedFacets?: SuggestedFacet[];\n sort?: \"relevance\" | \"price_asc\" | \"price_desc\";\n interpretation: string;\n}\n\nexport interface ShoppingIntent {\n /** Stable id for UI keys and selection (`intent-0`, `intent-1`, …). */\n id: string;\n /** Short catalog-language label, e.g. \"tennis racket\". */\n label: string;\n /** Requested quantity, always >= 1. */\n quantity: number;\n /** Catalog-language phrase closest to this intent, boosted above alternates. */\n primaryTerm?: string;\n searchTerms: string[];\n filters?: InterpretedSearchFilters;\n sort?: \"relevance\" | \"price_asc\" | \"price_desc\";\n}\n\nexport interface DecomposedShoppingMission {\n isMission: boolean;\n /** 0–1. Missions below the configured minConfidence fall back to standard search. */\n confidence: number;\n intents: ShoppingIntent[];\n interpretation: string;\n}\n\nexport interface MissionIntentGroup {\n intent: ShoppingIntent;\n products: ProductCard[];\n total: number;\n /** True when this intent's Product Search failed; other groups still render. */\n failed?: boolean;\n}\n\nexport interface MissionSearchResult {\n intents: MissionIntentGroup[];\n interpretation: string;\n}\n\nexport type FacetAttributeType = \"enum\" | \"lenum\" | \"boolean\" | \"text\" | \"number\";\n\nexport interface FacetAttributeDefinition {\n name: string;\n label: string;\n kind: \"distinct\" | \"range\";\n attributeType: FacetAttributeType;\n field: string;\n fieldType?: string;\n}\n\nexport interface ResolvedFacetSchema {\n attributes: FacetAttributeDefinition[];\n systemFacets: Array<\"categories\" | \"price\">;\n etag: string;\n resolvedAt: string;\n}\n\nexport interface SuggestedFacet {\n name: string;\n reason?: string;\n}\n\nexport interface SearchFacetBucket {\n key: string;\n label: string;\n count: number;\n}\n\nexport interface SearchFacetGroup {\n id: string;\n label: string;\n type: \"distinct\" | \"range\";\n buckets: SearchFacetBucket[];\n selectedKey?: string;\n}\n\nexport interface SearchSessionState {\n query: string;\n searchTerms: string[];\n appliedFilters: InterpretedSearchFilters;\n suggestedFacets: SuggestedFacet[];\n facetSchema?: FacetAttributeDefinition[];\n schemaEtag?: string;\n}\n\nexport interface VoiceAudioInterpretation extends InterpretedSearchQuery {\n transcript: string;\n enhancedQuery: string;\n}\n\n/** @deprecated Use ProductSearchRequest from query-builder / platform-sdk */\nexport type { ProductSearchRequest as ProductSearchQueryBody } from \"@commercetools/platform-sdk\";\n","export interface CommerceAISearchMessages {\n placeholder: string;\n searchAriaLabel: string;\n productSearchAriaLabel: string;\n searchResultsAriaLabel: string;\n searching: string;\n noProductsFound: string;\n searchedFor: string;\n dropImageToSearch: string;\n voiceSearch: string;\n stopRecording: string;\n searchByCamera: string;\n searchByImage: string;\n replayVoiceSummary: string;\n listening: string;\n tapMicToStop: string;\n understandingQuery: string;\n preparingAudioSummary: string;\n cameraCapture: string;\n cameraPreview: string;\n capturePhoto: string;\n cancel: string;\n dismiss: string;\n searchFailed: string;\n imageSearchFailed: string;\n couldNotCapturePhoto: string;\n suggestionsAriaLabel: string;\n loadingSuggestions: string;\n noSuggestions: string;\n filtersAriaLabel: string;\n clearFilters: string;\n narrowResults: string;\n newSearch: string;\n addToCart: string;\n cart: string;\n emptyCart: string;\n removeItem: string;\n total: string;\n each: string;\n cartAriaLabel: string;\n itemAdded: string;\n increaseQuantity: string;\n decreaseQuantity: string;\n closeCart: string;\n unableToAddToCart: string;\n missionTitle: string;\n missionQuantity: string;\n /** Adds the first (recommended) product from each filled lane. Use `{count}` for the number of picks. */\n missionAddAll: string;\n missionItemsAdded: string;\n missionSelectProduct: string;\n missionIntentEmpty: string;\n missionIntentFailed: string;\n signIn: string;\n signInToSyncCart: string;\n signOut: string;\n email: string;\n password: string;\n signedInAs: string;\n invalidCredentials: string;\n signInFailed: string;\n checkout: string;\n checkoutTitle: string;\n orderSummary: string;\n shippingAddress: string;\n billingAddress: string;\n billingSameAsShipping: string;\n continueToDelivery: string;\n shippingMethod: string;\n selectShippingMethod: string;\n noShippingMethods: string;\n completeAddressToContinue: string;\n selectDeliveryToContinue: string;\n selectPaymentToContinue: string;\n checkoutStepAddress: string;\n checkoutStepDelivery: string;\n checkoutStepPayment: string;\n paymentMethod: string;\n selectPaymentMethod: string;\n paymentAuthorized: string;\n paymentDeclined: string;\n continueToPayment: string;\n placeOrder: string;\n placingOrder: string;\n orderPlaced: string;\n viewOrderStatus: string;\n continueShopping: string;\n checkoutFailed: string;\n orderStatus: string;\n orderPlacedAt: string;\n paymentStateLabel: string;\n shipmentStateLabel: string;\n trackingNumber: string;\n carrier: string;\n noTrackingYet: string;\n orderNotFound: string;\n noOrdersYet: string;\n yourOrders: string;\n firstName: string;\n lastName: string;\n streetName: string;\n additionalAddress: string;\n postalCode: string;\n city: string;\n region: string;\n country: string;\n}\n\nexport const DEFAULT_COMMERCE_AI_SEARCH_MESSAGES: CommerceAISearchMessages = {\n placeholder: \"What are you looking for?\",\n searchAriaLabel: \"Search query\",\n productSearchAriaLabel: \"Product search\",\n searchResultsAriaLabel: \"Search results\",\n searching: \"Searching...\",\n noProductsFound: \"No products found\",\n searchedFor: \"Searched for:\",\n dropImageToSearch: \"Drop image to search\",\n voiceSearch: \"Voice search\",\n stopRecording: \"Stop recording\",\n searchByCamera: \"Search by camera\",\n searchByImage: \"Search by image\",\n replayVoiceSummary: \"Replay voice result summary\",\n listening: \"Listening…\",\n tapMicToStop: \"Tap mic to stop\",\n understandingQuery: \"Understanding your query…\",\n preparingAudioSummary: \"Preparing audio summary…\",\n cameraCapture: \"Camera capture\",\n cameraPreview: \"Camera preview\",\n capturePhoto: \"Capture\",\n cancel: \"Cancel\",\n dismiss: \"Dismiss\",\n searchFailed: \"Search failed\",\n imageSearchFailed: \"Image search failed\",\n couldNotCapturePhoto: \"Could not capture photo\",\n suggestionsAriaLabel: \"Search suggestions\",\n loadingSuggestions: \"Loading suggestions...\",\n noSuggestions: \"No suggestions\",\n filtersAriaLabel: \"Search filters\",\n clearFilters: \"Clear filters\",\n narrowResults: \"Narrow your results\",\n newSearch: \"New search\",\n addToCart: \"Add to cart\",\n cart: \"Cart\",\n emptyCart: \"Your cart is empty\",\n removeItem: \"Remove item\",\n total: \"Total\",\n each: \"each\",\n cartAriaLabel: \"Shopping cart\",\n itemAdded: \"Added to cart\",\n increaseQuantity: \"Increase quantity\",\n decreaseQuantity: \"Decrease quantity\",\n closeCart: \"Close cart\",\n unableToAddToCart: \"This product cannot be added to the cart\",\n missionTitle: \"Shopping list\",\n missionQuantity: \"Looking for\",\n missionAddAll: \"Add {count} top picks to cart\",\n missionItemsAdded: \"Added to cart\",\n missionSelectProduct: \"Select this product\",\n missionIntentEmpty: \"No matching products\",\n missionIntentFailed: \"Couldn't search this item\",\n signIn: \"Sign in\",\n signInToSyncCart: \"Sign in to sync your cart\",\n signOut: \"Sign out\",\n email: \"Email\",\n password: \"Password\",\n signedInAs: \"Signed in as\",\n invalidCredentials: \"Invalid email or password\",\n signInFailed: \"Sign in failed\",\n checkout: \"Checkout\",\n checkoutTitle: \"Complete your order\",\n orderSummary: \"Order summary\",\n shippingAddress: \"Shipping address\",\n billingAddress: \"Billing address\",\n billingSameAsShipping: \"Billing address is the same as shipping\",\n continueToDelivery: \"Continue to delivery\",\n shippingMethod: \"Delivery method\",\n selectShippingMethod: \"Select a delivery method\",\n noShippingMethods: \"No delivery methods are available for this address\",\n completeAddressToContinue: \"Add a shipping address to continue\",\n selectDeliveryToContinue: \"Select a delivery method to continue\",\n selectPaymentToContinue: \"Select a payment method to continue\",\n checkoutStepAddress: \"Address\",\n checkoutStepDelivery: \"Delivery\",\n checkoutStepPayment: \"Payment\",\n paymentMethod: \"Payment method\",\n selectPaymentMethod: \"Select a payment method\",\n paymentAuthorized: \"Payment authorized\",\n paymentDeclined: \"Payment was declined\",\n continueToPayment: \"Continue to payment\",\n placeOrder: \"Place order\",\n placingOrder: \"Placing order…\",\n orderPlaced: \"Order placed\",\n viewOrderStatus: \"View order status\",\n continueShopping: \"Continue shopping\",\n checkoutFailed: \"Checkout failed\",\n orderStatus: \"Order status\",\n orderPlacedAt: \"Placed\",\n paymentStateLabel: \"Payment\",\n shipmentStateLabel: \"Shipment\",\n trackingNumber: \"Tracking number\",\n carrier: \"Carrier\",\n noTrackingYet: \"Tracking details will appear when the order ships\",\n orderNotFound: \"Order not found\",\n noOrdersYet: \"No orders yet\",\n yourOrders: \"Your orders\",\n firstName: \"First name\",\n lastName: \"Last name\",\n streetName: \"Street address\",\n additionalAddress: \"Apartment, suite, etc. (optional)\",\n postalCode: \"Postal code\",\n city: \"City\",\n region: \"State or region (optional)\",\n country: \"Country\",\n};\n\nexport function resolveCommerceAISearchMessages(\n overrides?: Partial<CommerceAISearchMessages>,\n): CommerceAISearchMessages {\n return {\n ...DEFAULT_COMMERCE_AI_SEARCH_MESSAGES,\n ...overrides,\n };\n}\n","const COMPOUND_SHOPPING_LIST_PATTERN = /\\band\\b|,|\\bplus\\b|\\boraz\\b/i;\n\n/**\n * Heuristic for the search box: a new multi-item query should not be treated as\n * a facet NL refine of the previous session.\n */\nexport function looksLikeCompoundShoppingList(query: string): boolean {\n return COMPOUND_SHOPPING_LIST_PATTERN.test(query.trim());\n}\n","/** CSS Color Module named colors used to label hex facet values. */\nconst CSS_NAMED_COLOR_TABLE = `\nAlice Blue:f0f8ff\nAntique White:faebd7\nAqua:00ffff\nAquamarine:7fffd4\nAzure:f0ffff\nBeige:f5f5dc\nBisque:ffe4c4\nBlack:000000\nBlanched Almond:ffebcd\nBlue:0000ff\nBlue Violet:8a2be2\nBrown:a52a2a\nBurlywood:deb887\nCadet Blue:5f9ea0\nChartreuse:7fff00\nChocolate:d2691e\nCoral:ff7f50\nCornflower Blue:6495ed\nCornsilk:fff8dc\nCrimson:dc143c\nDark Blue:00008b\nDark Cyan:008b8b\nDark Goldenrod:b8860b\nDark Gray:a9a9a9\nDark Green:006400\nDark Khaki:bdb76b\nDark Magenta:8b008b\nDark Olive Green:556b2f\nDark Orange:ff8c00\nDark Orchid:9932cc\nDark Red:8b0000\nDark Salmon:e9967a\nDark Sea Green:8fbc8f\nDark Slate Blue:483d8b\nDark Slate Gray:2f4f4f\nDark Turquoise:00ced1\nDark Violet:9400d3\nDeep Pink:ff1493\nDeep Sky Blue:00bfff\nDim Gray:696969\nDodger Blue:1e90ff\nFirebrick:b22222\nFloral White:fffaf0\nForest Green:228b22\nGainsboro:dcdcdc\nGhost White:f8f8ff\nGold:ffd700\nGoldenrod:daa520\nGray:808080\nGreen:008000\nGreen Yellow:adff2f\nHoneydew:f0fff0\nHot Pink:ff69b4\nIndian Red:cd5c5c\nIndigo:4b0082\nIvory:fffff0\nKhaki:f0e68c\nLavender:e6e6fa\nLavender Blush:fff0f5\nLawn Green:7cfc00\nLemon Chiffon:fffacd\nLight Blue:add8e6\nLight Coral:f08080\nLight Cyan:e0ffff\nLight Goldenrod Yellow:fafad2\nLight Gray:d3d3d3\nLight Green:90ee90\nLight Pink:ffb6c1\nLight Salmon:ffa07a\nLight Sea Green:20b2aa\nLight Sky Blue:87cefa\nLight Slate Gray:778899\nLight Steel Blue:b0c4de\nLight Yellow:ffffe0\nLime:00ff00\nLime Green:32cd32\nLinen:faf0e6\nMagenta:ff00ff\nMaroon:800000\nMedium Aquamarine:66cdaa\nMedium Blue:0000cd\nMedium Orchid:ba55d3\nMedium Purple:9370db\nMedium Sea Green:3cb371\nMedium Slate Blue:7b68ee\nMedium Spring Green:00fa9a\nMedium Turquoise:48d1cc\nMedium Violet Red:c71585\nMidnight Blue:191970\nMint Cream:f5fffa\nMisty Rose:ffe4e1\nMoccasin:ffe4b5\nNavajo White:ffdead\nNavy:000080\nOld Lace:fdf5e6\nOlive:808000\nOlive Drab:6b8e23\nOrange:ffa500\nOrange Red:ff4500\nOrchid:da70d6\nPale Goldenrod:eee8aa\nPale Green:98fb98\nPale Turquoise:afeeee\nPale Violet Red:db7093\nPapaya Whip:ffefd5\nPeach Puff:ffdab9\nPeru:cd853f\nPink:ffc0cb\nPlum:dda0dd\nPowder Blue:b0e0e6\nPurple:800080\nRebecca Purple:663399\nRed:ff0000\nRosy Brown:bc8f8f\nRoyal Blue:4169e1\nSaddle Brown:8b4513\nSalmon:fa8072\nSandy Brown:f4a460\nSea Green:2e8b57\nSeashell:fff5ee\nSienna:a0522d\nSilver:c0c0c0\nSky Blue:87ceeb\nSlate Blue:6a5acd\nSlate Gray:708090\nSnow:fffafa\nSpring Green:00ff7f\nSteel Blue:4682b4\nTan:d2b48c\nTeal:008080\nThistle:d8bfd8\nTomato:ff6347\nTurquoise:40e0d0\nViolet:ee82ee\nWheat:f5deb3\nWhite:ffffff\nWhite Smoke:f5f5f5\nYellow:ffff00\nYellow Green:9acd32\n`;\n\nconst HEX_COLOR_RE = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\ntype NamedColor = { name: string; r: number; g: number; b: number };\n\nconst NAMED_COLORS: NamedColor[] = CSS_NAMED_COLOR_TABLE.trim()\n .split(\"\\n\")\n .flatMap((line) => {\n const separator = line.indexOf(\":\");\n if (separator <= 0) {\n return [];\n }\n const name = line.slice(0, separator);\n const hex = line.slice(separator + 1);\n const n = Number.parseInt(hex, 16);\n if (!name || !Number.isFinite(n)) {\n return [];\n }\n return [{ name, r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 }];\n });\n\nfunction parseHexRgb(value: string): [number, number, number] | null {\n const match = HEX_COLOR_RE.exec(value.trim());\n const captured = match?.[1];\n if (!captured) {\n return null;\n }\n const hex =\n captured.length === 3\n ? `${captured[0]}${captured[0]}${captured[1]}${captured[1]}${captured[2]}${captured[2]}`\n : captured;\n const n = Number.parseInt(hex, 16);\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n}\n\nfunction nearestCssColor(rgb: [number, number, number]): { name: string; dist: number } | null {\n const first = NAMED_COLORS[0];\n if (!first) {\n return null;\n }\n let bestName = first.name;\n let bestDist = Number.POSITIVE_INFINITY;\n for (const color of NAMED_COLORS) {\n const dist =\n (rgb[0] - color.r) ** 2 + (rgb[1] - color.g) ** 2 + (rgb[2] - color.b) ** 2;\n if (dist < bestDist) {\n bestDist = dist;\n bestName = color.name;\n if (dist === 0) {\n return { name: bestName, dist };\n }\n }\n }\n return { name: bestName, dist: bestDist };\n}\n\n/** Max squared RGB distance to accept a CSS name instead of the raw hex. */\nconst MAX_NAMED_COLOR_DISTANCE_SQ = 40 * 40;\n\nconst COLOR_LIKE_FACET_NAME = /(?:^|[-_])colou?r(?:[-_]|$)|(?:^|[-_])finish(?:[-_]|$)/i;\n\n/** True when a facet id looks like a color/finish attribute (`color-code`, `finish-code`). */\nexport function isColorLikeFacetName(name: string): boolean {\n return COLOR_LIKE_FACET_NAME.test(name.trim());\n}\n\n/** True when a facet bucket key is a CSS hex color (`#RGB` or `#RRGGBB`). */\nexport function isHexColorFacetKey(value: string): boolean {\n return HEX_COLOR_RE.test(value.trim());\n}\n\n/** Normalized `#rrggbb` for a hex facet key, or `undefined` when not a color. */\nexport function hexColorSwatchValue(value: string): string | undefined {\n const rgb = parseHexRgb(value);\n if (!rgb) {\n return undefined;\n }\n return `#${rgb.map((channel) => channel.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\n/**\n * Human-readable facet chip label. Hex keys on color/finish facets become the\n * nearest CSS color name when close enough; other keys are unchanged.\n */\nexport function formatFacetBucketLabel(key: string, facetName?: string): string {\n if (facetName !== undefined && !isColorLikeFacetName(facetName)) {\n return key;\n }\n\n const rgb = parseHexRgb(key);\n if (!rgb) {\n return key;\n }\n\n const nearest = nearestCssColor(rgb);\n if (!nearest || nearest.dist > MAX_NAMED_COLOR_DISTANCE_SQ) {\n return key;\n }\n\n return nearest.name;\n}\n","import type {\n FacetAttributeDefinition,\n InterpretedSearchFilters,\n ResolvedFacetSchema,\n SearchFacetGroup,\n SuggestedFacet,\n} from \"../types/index.js\";\nimport { formatFacetBucketLabel } from \"./facet-color.js\";\n\nexport const PRICE_FACET_ID = \"price\";\nexport const CATEGORIES_FACET_ID = \"categories\";\n\nexport const DEFAULT_PRICE_RANGES = [\n { key: \"under-50\", to: 5_000 },\n { key: \"50-to-100\", from: 5_000, to: 10_000 },\n { key: \"100-plus\", from: 10_000 },\n] as const;\n\nexport type PriceRangeDefinition = (typeof DEFAULT_PRICE_RANGES)[number];\n\n/** Major currency units (e.g. EUR) corresponding to a price range bucket. */\nexport function priceRangeToFilterValues(\n range: PriceRangeDefinition,\n): Pick<InterpretedSearchFilters, \"priceMin\" | \"priceMax\"> {\n const filters: Pick<InterpretedSearchFilters, \"priceMin\" | \"priceMax\"> = {};\n if (\"from\" in range && range.from !== undefined) {\n filters.priceMin = String(range.from / 100);\n }\n if (\"to\" in range && range.to !== undefined) {\n filters.priceMax = String(range.to / 100);\n }\n return filters;\n}\n\nexport function priceBucketKeyFromFilters(\n filters: InterpretedSearchFilters,\n): string | undefined {\n const minCents = parseMajorToCents(filters.priceMin);\n const maxCents = parseMajorToCents(filters.priceMax);\n\n for (const range of DEFAULT_PRICE_RANGES) {\n const from = \"from\" in range ? range.from : undefined;\n const to = \"to\" in range ? range.to : undefined;\n if (minCents === from && maxCents === to) {\n return range.key;\n }\n }\n return undefined;\n}\n\nexport function isFacetFilterSelected(\n filters: InterpretedSearchFilters,\n facetId: string,\n bucketKey: string,\n): boolean {\n if (facetId === CATEGORIES_FACET_ID) {\n return filters.category === bucketKey;\n }\n if (facetId === PRICE_FACET_ID) {\n return priceBucketKeyFromFilters(filters) === bucketKey;\n }\n return filters[facetId] === bucketKey;\n}\n\n/**\n * Toggle a facet chip into filter state. Price buckets map to priceMin/priceMax;\n * categories map to `category`.\n */\nexport function toggleFacetFilter(\n filters: InterpretedSearchFilters,\n facetId: string,\n bucketKey: string,\n): InterpretedSearchFilters {\n const next = { ...filters };\n\n if (facetId === PRICE_FACET_ID) {\n if (priceBucketKeyFromFilters(next) === bucketKey) {\n delete next.priceMin;\n delete next.priceMax;\n return next;\n }\n delete next.priceMin;\n delete next.priceMax;\n const range = DEFAULT_PRICE_RANGES.find((candidate) => candidate.key === bucketKey);\n if (!range) {\n return next;\n }\n return { ...next, ...priceRangeToFilterValues(range) };\n }\n\n const filterKey = facetId === CATEGORIES_FACET_ID ? \"category\" : facetId;\n if (next[filterKey] === bucketKey) {\n delete next[filterKey];\n } else {\n next[filterKey] = bucketKey;\n }\n return next;\n}\n\nexport function buildProductSearchFacets(\n schema: ResolvedFacetSchema,\n suggestedFacets: SuggestedFacet[] = [],\n): unknown[] {\n const names = requestedFacetNames(schema, suggestedFacets);\n const facets: unknown[] = [];\n for (const name of names) {\n if (name === CATEGORIES_FACET_ID) {\n facets.push({ distinct: { name, field: \"categories\", limit: 12, level: \"products\" } });\n continue;\n }\n if (name === PRICE_FACET_ID) {\n facets.push({\n ranges: {\n name,\n field: \"variants.prices.centAmount\",\n ranges: DEFAULT_PRICE_RANGES.map((range) => ({ ...range })),\n level: \"products\",\n },\n });\n continue;\n }\n\n const attribute = schema.attributes.find((candidate) => candidate.name === name);\n if (!attribute || attribute.kind !== \"distinct\") {\n continue;\n }\n facets.push({\n distinct: {\n name: attribute.name,\n field: attribute.field,\n fieldType: attribute.fieldType,\n limit: 12,\n level: \"products\",\n },\n });\n }\n return facets;\n}\n\n/** Product Projection Search `facet` query parameter expressions. */\nexport function buildProjectionFacetParams(\n schema: ResolvedFacetSchema,\n suggestedFacets: SuggestedFacet[] = [],\n): string[] {\n const names = requestedFacetNames(schema, suggestedFacets);\n const facets: string[] = [];\n\n for (const name of names) {\n if (name === CATEGORIES_FACET_ID) {\n facets.push(`categories.id as ${CATEGORIES_FACET_ID}`);\n continue;\n }\n if (name === PRICE_FACET_ID) {\n const ranges = DEFAULT_PRICE_RANGES.map((range) => {\n const from = \"from\" in range && range.from !== undefined ? String(range.from) : \"*\";\n const to = \"to\" in range && range.to !== undefined ? String(range.to) : \"*\";\n return `(${from} to ${to})`;\n }).join(\", \");\n facets.push(`variants.prices.centAmount:range ${ranges} as ${PRICE_FACET_ID}`);\n continue;\n }\n\n const attribute = schema.attributes.find((candidate) => candidate.name === name);\n if (!attribute || attribute.kind !== \"distinct\") {\n continue;\n }\n facets.push(`${attribute.field} as ${attribute.name}`);\n }\n\n return facets;\n}\n\nexport function normalizeProductSearchFacets(\n rawFacets: unknown,\n schema: ResolvedFacetSchema,\n suggestedFacets: SuggestedFacet[] = [],\n filters: InterpretedSearchFilters = {},\n): SearchFacetGroup[] {\n const raw = Array.isArray(rawFacets)\n ? rawFacets\n : rawFacets && typeof rawFacets === \"object\"\n ? Object.entries(rawFacets as Record<string, unknown>).map(([name, facet]) => ({\n name,\n ...(facet && typeof facet === \"object\" ? facet : {}),\n }))\n : [];\n const labels = new Map(schema.attributes.map((attribute) => [attribute.name, attribute.label]));\n\n const facets: SearchFacetGroup[] = [];\n for (const facet of raw) {\n if (!facet || typeof facet !== \"object\") {\n continue;\n }\n const record = facet as {\n name?: unknown;\n buckets?: unknown;\n terms?: unknown;\n ranges?: unknown;\n };\n if (typeof record.name !== \"string\") {\n continue;\n }\n\n const buckets = normalizeFacetBuckets({\n name: record.name,\n buckets: record.buckets,\n terms: record.terms,\n ranges: record.ranges,\n });\n if (!buckets.length) {\n continue;\n }\n\n facets.push({\n id: record.name,\n label:\n labels.get(record.name) ??\n (record.name === CATEGORIES_FACET_ID\n ? \"Categories\"\n : record.name === PRICE_FACET_ID\n ? \"Price\"\n : record.name),\n type: record.name === PRICE_FACET_ID ? \"range\" : \"distinct\",\n buckets,\n ...(selectedFacetValue(record.name, filters)\n ? { selectedKey: selectedFacetValue(record.name, filters) }\n : {}),\n });\n }\n const requested = requestedFacetNames(schema, suggestedFacets);\n return facets.sort((left, right) => requested.indexOf(left.id) - requested.indexOf(right.id));\n}\n\nexport function filterFacetSuggestions(\n suggestedFacets: SuggestedFacet[] | undefined,\n schema: ResolvedFacetSchema,\n): SuggestedFacet[] {\n const known = new Set([...schema.attributes.map((attribute) => attribute.name), ...schema.systemFacets]);\n return (suggestedFacets ?? []).filter((facet) => known.has(facet.name)).slice(0, 5);\n}\n\nexport function getFacetAttribute(\n schema: ResolvedFacetSchema,\n name: string,\n): FacetAttributeDefinition | undefined {\n return schema.attributes.find((attribute) => attribute.name === name);\n}\n\nfunction requestedFacetNames(\n schema: ResolvedFacetSchema,\n suggestedFacets: SuggestedFacet[],\n): string[] {\n const suggested = filterFacetSuggestions(suggestedFacets, schema).map((facet) => facet.name);\n return suggested.length ? suggested : schema.attributes.slice(0, 3).map((attribute) => attribute.name);\n}\n\nfunction normalizeFacetBuckets(record: {\n buckets?: unknown;\n terms?: unknown;\n ranges?: unknown;\n name?: string;\n}): Array<{ key: string; label: string; count: number }> {\n if (Array.isArray(record.buckets)) {\n return record.buckets.flatMap((bucket) => normalizeBucket(bucket, record.name));\n }\n\n if (Array.isArray(record.terms)) {\n return record.terms.flatMap((term) => normalizeTermBucket(term, record.name));\n }\n\n if (Array.isArray(record.ranges)) {\n return record.ranges.flatMap((range, index) => normalizeRangeBucket(range, index));\n }\n\n return [];\n}\n\nfunction normalizeBucket(bucket: unknown, facetName?: string) {\n if (!bucket || typeof bucket !== \"object\") {\n return [];\n }\n const record = bucket as { key?: unknown; count?: unknown };\n if (typeof record.key !== \"string\" || typeof record.count !== \"number\") {\n return [];\n }\n return [{ key: record.key, label: formatFacetBucketLabel(record.key, facetName), count: record.count }];\n}\n\nfunction normalizeTermBucket(bucket: unknown, facetName?: string) {\n if (!bucket || typeof bucket !== \"object\") {\n return [];\n }\n const record = bucket as { term?: unknown; count?: unknown };\n if (typeof record.term !== \"string\" || typeof record.count !== \"number\") {\n return [];\n }\n return [{ key: record.term, label: formatFacetBucketLabel(record.term, facetName), count: record.count }];\n}\n\nfunction normalizeRangeBucket(bucket: unknown, index: number) {\n if (!bucket || typeof bucket !== \"object\") {\n return [];\n }\n const record = bucket as { from?: unknown; to?: unknown; count?: unknown; key?: unknown };\n if (typeof record.count !== \"number\") {\n return [];\n }\n\n if (typeof record.key === \"string\") {\n return [{ key: record.key, label: record.key, count: record.count }];\n }\n\n const from = typeof record.from === \"number\" ? record.from : undefined;\n const to = typeof record.to === \"number\" ? record.to : undefined;\n const matched = DEFAULT_PRICE_RANGES.find((range) => {\n const rangeFrom = \"from\" in range ? range.from : undefined;\n const rangeTo = \"to\" in range ? range.to : undefined;\n return rangeFrom === from && rangeTo === to;\n });\n const key = matched?.key ?? `${from ?? \"*\"}-${to ?? \"*\"}-${index}`;\n return [{ key, label: key, count: record.count }];\n}\n\nfunction selectedFacetValue(name: string, filters: InterpretedSearchFilters): string | undefined {\n if (name === CATEGORIES_FACET_ID) {\n return filters.category;\n }\n if (name === PRICE_FACET_ID) {\n return priceBucketKeyFromFilters(filters);\n }\n return filters[name];\n}\n\nfunction parseMajorToCents(value?: string): number | undefined {\n if (!value) {\n return undefined;\n }\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed < 0) {\n return undefined;\n }\n return Math.round(parsed * 100);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type Dispatch, type SetStateAction } from \"react\";\nimport type {\n InterpretedSearchFilters,\n MissionSearchResult,\n ProductCard,\n SearchFacetGroup,\n SearchResult,\n SearchSessionState,\n SuggestedFacet,\n SuggestionsResult,\n} from \"@commerce-ai-tool/core/client\";\n\nexport interface SearchLocaleProps {\n queryLocale?: string;\n catalogLocale?: string;\n /** @deprecated Use queryLocale */\n locale?: string;\n}\n\nexport interface SetQueryOptions {\n /** When false, only updates the input without triggering a search. */\n search?: boolean;\n}\n\nexport function buildLocalePayload(options: SearchLocaleProps): Record<string, string> {\n const payload: Record<string, string> = {};\n const queryLocale = options.queryLocale ?? options.locale;\n\n if (options.catalogLocale) {\n payload.catalogLocale = options.catalogLocale;\n }\n\n if (queryLocale) {\n payload.queryLocale = queryLocale;\n }\n\n return payload;\n}\n\nexport function appendLocaleFields(formData: FormData, options: SearchLocaleProps): void {\n const payload = buildLocalePayload(options);\n for (const [key, value] of Object.entries(payload)) {\n formData.append(key, value);\n }\n}\n\nexport interface UseCommerceAISearchOptions extends SearchLocaleProps {\n apiBaseUrl: string;\n debounceMs?: number;\n suggestionsDebounceMs?: number;\n enableAutocomplete?: boolean;\n enableFacets?: boolean;\n persistSession?: boolean;\n enableMissions?: boolean;\n}\n\nexport interface UseCommerceAISearchReturn {\n query: string;\n setQuery: (query: string, options?: SetQueryOptions) => void;\n suggestions: string[];\n isLoadingSuggestions: boolean;\n suggestionsError: string | null;\n suggestionsReady: boolean;\n selectSuggestion: (suggestion: string) => void;\n results: ProductCard[];\n setResults: Dispatch<SetStateAction<ProductCard[]>>;\n mission: MissionSearchResult | null;\n setMission: Dispatch<SetStateAction<MissionSearchResult | null>>;\n meta: SearchResult[\"meta\"] | null;\n setMeta: Dispatch<SetStateAction<SearchResult[\"meta\"] | null>>;\n isLoading: boolean;\n setIsLoading: Dispatch<SetStateAction<boolean>>;\n hasSearched: boolean;\n setHasSearched: Dispatch<SetStateAction<boolean>>;\n error: string | null;\n setError: Dispatch<SetStateAction<string | null>>;\n search: (query?: string) => Promise<void>;\n searchByImage: (file: File) => Promise<void>;\n /** True when a facet refinement session is active (not set for mission results). */\n hasFacetSession: boolean;\n facets?: SearchFacetGroup[];\n suggestedFacets?: SuggestedFacet[];\n refineFilters?: (filters: InterpretedSearchFilters) => Promise<void>;\n refine?: (query: string) => Promise<void>;\n /** Clear session and run a fresh AI search with the current query. */\n startNewSearch?: () => Promise<void>;\n /** Apply a search payload (text, voice, or image) and clear the facet session for missions. */\n applySearchResult: (data: SearchResult, queryOverride?: string) => void;\n clear: () => void;\n}\n\nexport function useCommerceAISearch(\n options: UseCommerceAISearchOptions,\n): UseCommerceAISearchReturn {\n const {\n apiBaseUrl,\n debounceMs = 250,\n suggestionsDebounceMs = 200,\n enableAutocomplete = false,\n enableFacets = false,\n persistSession = true,\n enableMissions = false,\n queryLocale,\n catalogLocale,\n locale,\n } = options;\n const localePayload = useMemo(\n () => buildLocalePayload({ queryLocale, catalogLocale, locale }),\n [queryLocale, catalogLocale, locale],\n );\n const [query, setQueryState] = useState(\"\");\n const [suggestions, setSuggestions] = useState<string[]>([]);\n const [isLoadingSuggestions, setIsLoadingSuggestions] = useState(false);\n const [suggestionsError, setSuggestionsError] = useState<string | null>(null);\n const [suggestionsReady, setSuggestionsReady] = useState(false);\n const [results, setResults] = useState<ProductCard[]>([]);\n const [mission, setMission] = useState<MissionSearchResult | null>(null);\n const [meta, setMeta] = useState<SearchResult[\"meta\"] | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [hasSearched, setHasSearched] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [facets, setFacets] = useState<SearchFacetGroup[]>([]);\n const [suggestedFacets, setSuggestedFacets] = useState<SuggestedFacet[]>([]);\n const [searchSession, setSearchSession] = useState<SearchSessionState | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const suggestionsDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const suggestionsAbortRef = useRef<AbortController | null>(null);\n const requestIdRef = useRef(0);\n const suggestionsRequestIdRef = useRef(0);\n const queryRef = useRef(query);\n queryRef.current = query;\n\n const baseUrl = apiBaseUrl.replace(/\\/$/, \"\");\n const sessionStorageKey = `cat:search-session:${baseUrl}`;\n\n useEffect(() => {\n if (!enableFacets || !persistSession || typeof window === \"undefined\") return;\n const stored = window.sessionStorage.getItem(sessionStorageKey);\n if (!stored) return;\n try {\n setSearchSession(JSON.parse(stored) as SearchSessionState);\n } catch {\n window.sessionStorage.removeItem(sessionStorageKey);\n }\n }, [enableFacets, persistSession, sessionStorageKey]);\n\n useEffect(() => {\n if (!enableFacets || !persistSession || !searchSession || typeof window === \"undefined\") return;\n window.sessionStorage.setItem(sessionStorageKey, JSON.stringify(searchSession));\n }, [enableFacets, persistSession, searchSession, sessionStorageKey]);\n\n const resetResults = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = null;\n suggestionsAbortRef.current?.abort();\n suggestionsAbortRef.current = null;\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n debounceRef.current = null;\n }\n if (suggestionsDebounceRef.current) {\n clearTimeout(suggestionsDebounceRef.current);\n suggestionsDebounceRef.current = null;\n }\n setResults([]);\n setMission(null);\n setMeta(null);\n setError(null);\n setIsLoading(false);\n setHasSearched(false);\n setSuggestions([]);\n setSuggestionsError(null);\n setIsLoadingSuggestions(false);\n setSuggestionsReady(false);\n setFacets([]);\n setSuggestedFacets([]);\n setSearchSession(null);\n if (typeof window !== \"undefined\") {\n window.sessionStorage.removeItem(sessionStorageKey);\n }\n }, [sessionStorageKey]);\n\n const fetchSuggestions = useCallback(\n async (searchQuery: string) => {\n const trimmed = searchQuery.trim();\n if (!enableAutocomplete || trimmed.length < 2) {\n setSuggestions([]);\n setSuggestionsError(null);\n setIsLoadingSuggestions(false);\n setSuggestionsReady(false);\n return;\n }\n\n suggestionsAbortRef.current?.abort();\n const controller = new AbortController();\n suggestionsAbortRef.current = controller;\n const requestId = ++suggestionsRequestIdRef.current;\n\n setIsLoadingSuggestions(true);\n setSuggestionsError(null);\n setSuggestionsReady(false);\n\n try {\n const response = await fetch(`${baseUrl}/search/suggestions`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ query: trimmed, ...localePayload }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const data = (await response.json()) as { error?: string };\n throw new Error(data.error ?? \"Suggestions failed\");\n }\n\n const data = (await response.json()) as SuggestionsResult;\n if (requestId !== suggestionsRequestIdRef.current) return;\n\n setSuggestions(data.suggestions);\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") return;\n if (requestId !== suggestionsRequestIdRef.current) return;\n\n setSuggestions([]);\n setSuggestionsError(err instanceof Error ? err.message : \"Suggestions failed\");\n } finally {\n if (requestId === suggestionsRequestIdRef.current) {\n setIsLoadingSuggestions(false);\n setSuggestionsReady(true);\n }\n }\n },\n [baseUrl, enableAutocomplete, localePayload],\n );\n\n const applySearchResult = useCallback(\n (data: SearchResult, sessionQuery?: string) => {\n setResults(data.products);\n setMission(data.mission ?? null);\n setMeta(data.meta);\n setFacets(data.facets ?? []);\n setSuggestedFacets(data.suggestedFacets ?? []);\n if (data.mission) {\n setSearchSession(null);\n if (typeof window !== \"undefined\") {\n window.sessionStorage.removeItem(sessionStorageKey);\n }\n } else if (enableFacets && data.meta.searchTerms) {\n setSearchSession({\n query: sessionQuery?.trim() || queryRef.current || data.meta.queryInterpretation || \"\",\n searchTerms: data.meta.searchTerms,\n appliedFilters: data.meta.appliedFilters ?? {},\n suggestedFacets: data.suggestedFacets ?? [],\n facetSchema: data.facetSchema,\n schemaEtag: data.meta.schemaEtag,\n });\n }\n },\n [enableFacets, sessionStorageKey],\n );\n\n const search = useCallback(\n async (searchQuery?: string) => {\n const q = (searchQuery ?? queryRef.current).trim();\n if (!q) return;\n\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n debounceRef.current = null;\n }\n if (suggestionsDebounceRef.current) {\n clearTimeout(suggestionsDebounceRef.current);\n suggestionsDebounceRef.current = null;\n }\n\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n const requestId = ++requestIdRef.current;\n\n setIsLoading(true);\n setError(null);\n setResults([]);\n setMission(null);\n setMeta(null);\n setSuggestions([]);\n setSuggestionsError(null);\n\n try {\n const response = await fetch(`${baseUrl}/search`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: q,\n includeFacets: enableFacets,\n ...(enableMissions ? { enableMissions: true } : {}),\n ...localePayload,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const data = (await response.json()) as { error?: string };\n throw new Error(data.error ?? \"Search failed\");\n }\n\n const data = (await response.json()) as SearchResult;\n if (requestId !== requestIdRef.current) return;\n\n applySearchResult(data, q);\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") return;\n if (requestId !== requestIdRef.current) return;\n\n setError(err instanceof Error ? err.message : \"Search failed\");\n setResults([]);\n setMission(null);\n setMeta(null);\n } finally {\n if (requestId === requestIdRef.current) {\n setIsLoading(false);\n setHasSearched(true);\n }\n }\n },\n [applySearchResult, baseUrl, enableFacets, enableMissions, localePayload],\n );\n\n const submitRefinement = useCallback(\n async (\n body: {\n filters?: InterpretedSearchFilters;\n refineQuery?: string;\n },\n ) => {\n if (!searchSession) return;\n\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n const requestId = ++requestIdRef.current;\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await fetch(`${baseUrl}/search`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: searchSession.query,\n searchTerms: searchSession.searchTerms,\n filters: body.filters ?? searchSession.appliedFilters,\n refineQuery: body.refineQuery,\n suggestedFacets: searchSession.suggestedFacets,\n includeFacets: true,\n ...localePayload,\n }),\n signal: controller.signal,\n });\n if (!response.ok) {\n const data = (await response.json()) as { error?: string };\n throw new Error(data.error ?? \"Search refinement failed\");\n }\n const data = (await response.json()) as SearchResult;\n if (requestId !== requestIdRef.current) return;\n applySearchResult(data, searchSession.query);\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") return;\n if (requestId === requestIdRef.current) {\n setError(err instanceof Error ? err.message : \"Search refinement failed\");\n }\n } finally {\n if (requestId === requestIdRef.current) {\n setIsLoading(false);\n setHasSearched(true);\n }\n }\n },\n [applySearchResult, baseUrl, localePayload, searchSession],\n );\n\n const refineFilters = useCallback(\n async (filters: InterpretedSearchFilters) => submitRefinement({ filters }),\n [submitRefinement],\n );\n\n const refine = useCallback(\n async (refineQuery: string) => {\n const trimmed = refineQuery.trim();\n if (trimmed) await submitRefinement({ refineQuery: trimmed });\n },\n [submitRefinement],\n );\n\n const startNewSearch = useCallback(async () => {\n const previousQuery = searchSession?.query;\n const q = (queryRef.current.trim() || previousQuery || \"\").trim();\n setSearchSession(null);\n setFacets([]);\n setSuggestedFacets([]);\n if (typeof window !== \"undefined\") {\n window.sessionStorage.removeItem(sessionStorageKey);\n }\n if (q) {\n if (!queryRef.current.trim() && previousQuery) {\n setQueryState(previousQuery);\n }\n await search(q);\n }\n }, [search, searchSession?.query, sessionStorageKey]);\n\n const searchByImage = useCallback(\n async (file: File) => {\n abortRef.current?.abort();\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n debounceRef.current = null;\n }\n if (suggestionsDebounceRef.current) {\n clearTimeout(suggestionsDebounceRef.current);\n suggestionsDebounceRef.current = null;\n }\n\n setIsLoading(true);\n setError(null);\n setResults([]);\n setMission(null);\n setMeta(null);\n setSuggestions([]);\n\n try {\n const formData = new FormData();\n formData.append(\"image\", file);\n appendLocaleFields(formData, { queryLocale, catalogLocale, locale });\n if (enableMissions) {\n formData.append(\"enableMissions\", \"true\");\n }\n\n const response = await fetch(`${baseUrl}/search/image`, {\n method: \"POST\",\n body: formData,\n });\n\n if (!response.ok) {\n const data = (await response.json()) as { error?: string };\n throw new Error(data.error ?? \"Image search failed\");\n }\n\n const data = (await response.json()) as SearchResult & { interpretation?: string };\n applySearchResult(data, data.interpretation);\n if (data.interpretation) {\n setQueryState(data.interpretation);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Image search failed\");\n setResults([]);\n setMission(null);\n setMeta(null);\n } finally {\n setIsLoading(false);\n setHasSearched(true);\n }\n },\n [applySearchResult, baseUrl, catalogLocale, enableMissions, locale, queryLocale],\n );\n\n const setQuery = useCallback(\n (value: string, options?: SetQueryOptions) => {\n setQueryState(value);\n\n if (options?.search === false) {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n debounceRef.current = null;\n }\n if (suggestionsDebounceRef.current) {\n clearTimeout(suggestionsDebounceRef.current);\n suggestionsDebounceRef.current = null;\n }\n return;\n }\n\n if (debounceRef.current) clearTimeout(debounceRef.current);\n if (suggestionsDebounceRef.current) clearTimeout(suggestionsDebounceRef.current);\n\n const trimmed = value.trim();\n if (trimmed.length === 0 || trimmed.length < 2) {\n resetResults();\n return;\n }\n\n if (enableAutocomplete) {\n // Hide previous results so autocomplete can show while typing after a search.\n setResults([]);\n setMission(null);\n setError(null);\n setIsLoading(false);\n setHasSearched(false);\n setIsLoadingSuggestions(true);\n setSuggestionsError(null);\n suggestionsDebounceRef.current = setTimeout(() => {\n void fetchSuggestions(trimmed);\n }, suggestionsDebounceMs);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n setResults([]);\n setMission(null);\n setMeta(null);\n\n debounceRef.current = setTimeout(() => {\n void search(trimmed);\n }, debounceMs);\n },\n [debounceMs, enableAutocomplete, fetchSuggestions, resetResults, search, suggestionsDebounceMs],\n );\n\n const selectSuggestion = useCallback(\n (suggestion: string) => {\n setQueryState(suggestion);\n setSuggestions([]);\n setSuggestionsError(null);\n void search(suggestion);\n },\n [search],\n );\n\n const clear = useCallback(() => {\n setQueryState(\"\");\n resetResults();\n }, [resetResults]);\n\n return {\n query,\n setQuery,\n suggestions,\n isLoadingSuggestions,\n suggestionsError,\n suggestionsReady,\n selectSuggestion,\n results,\n setResults,\n mission,\n setMission,\n meta,\n setMeta,\n isLoading,\n setIsLoading,\n hasSearched,\n setHasSearched,\n error,\n setError,\n search,\n searchByImage,\n facets,\n suggestedFacets,\n hasFacetSession: searchSession !== null,\n refineFilters,\n refine,\n startNewSearch,\n applySearchResult,\n clear,\n };\n}\n","import { useCallback, useEffect, useRef, useState, type RefObject } from \"react\";\nimport {\n buildCameraConstraints,\n createJpegFileFromVideo,\n getCameraErrorMessage,\n prefersNativeCamera,\n stopMediaStream,\n type CameraFacingMode,\n} from \"../utils/camera.js\";\n\nexport interface UseCameraCaptureOptions {\n facingMode?: CameraFacingMode;\n}\n\nexport interface UseCameraCaptureReturn {\n isOpen: boolean;\n stream: MediaStream | null;\n error: string | null;\n facingMode: CameraFacingMode;\n open: (nativeInputRef: RefObject<HTMLInputElement | null>) => void;\n openOverlay: () => Promise<void>;\n capturePhoto: (video: HTMLVideoElement) => Promise<File>;\n close: () => void;\n clearError: () => void;\n}\n\nexport function useCameraCapture(\n options: UseCameraCaptureOptions = {},\n): UseCameraCaptureReturn {\n const facingMode = options.facingMode ?? \"environment\";\n const [isOpen, setIsOpen] = useState(false);\n const [stream, setStream] = useState<MediaStream | null>(null);\n const [error, setError] = useState<string | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n\n const close = useCallback(() => {\n stopMediaStream(streamRef.current);\n streamRef.current = null;\n setStream(null);\n setIsOpen(false);\n }, []);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const openOverlay = useCallback(async () => {\n setError(null);\n\n try {\n const mediaStream = await navigator.mediaDevices.getUserMedia(\n buildCameraConstraints(facingMode),\n );\n streamRef.current = mediaStream;\n setStream(mediaStream);\n setIsOpen(true);\n } catch (err) {\n setError(getCameraErrorMessage(err));\n close();\n }\n }, [close, facingMode]);\n\n const open = useCallback(\n (nativeInputRef: RefObject<HTMLInputElement | null>) => {\n setError(null);\n\n if (prefersNativeCamera()) {\n nativeInputRef.current?.click();\n return;\n }\n\n void openOverlay();\n },\n [openOverlay],\n );\n\n const capturePhoto = useCallback(\n async (video: HTMLVideoElement) => {\n const file = await createJpegFileFromVideo(video);\n close();\n return file;\n },\n [close],\n );\n\n useEffect(() => {\n return () => {\n stopMediaStream(streamRef.current);\n streamRef.current = null;\n };\n }, []);\n\n return {\n isOpen,\n stream,\n error,\n facingMode,\n open,\n openOverlay,\n capturePhoto,\n close,\n clearError,\n };\n}\n","export type CameraFacingMode = \"environment\" | \"user\";\n\nexport function prefersNativeCamera(): boolean {\n if (typeof navigator === \"undefined\") return false;\n\n return (\n /Android|iPhone|iPad|iPod/i.test(navigator.userAgent) ||\n (navigator.maxTouchPoints > 1 && matchMedia(\"(pointer: coarse)\").matches)\n );\n}\n\nexport function stopMediaStream(stream: MediaStream | null): void {\n stream?.getTracks().forEach((track) => track.stop());\n}\n\nexport function getCameraErrorMessage(error: unknown): string {\n if (error instanceof DOMException) {\n if (error.name === \"NotAllowedError\" || error.name === \"PermissionDeniedError\") {\n return \"Camera access denied\";\n }\n if (error.name === \"NotFoundError\" || error.name === \"DevicesNotFoundError\") {\n return \"No camera found\";\n }\n if (error.name === \"NotReadableError\" || error.name === \"TrackStartError\") {\n return \"Camera is already in use\";\n }\n }\n\n return \"Camera unavailable\";\n}\n\nexport function createJpegFileFromVideo(\n video: HTMLVideoElement,\n fileName = \"camera-capture.jpg\",\n): Promise<File> {\n const width = video.videoWidth;\n const height = video.videoHeight;\n\n if (!width || !height) {\n return Promise.reject(new Error(\"Camera preview is not ready\"));\n }\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return Promise.reject(new Error(\"Could not capture photo\"));\n }\n\n context.drawImage(video, 0, 0, width, height);\n\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"Could not capture photo\"));\n return;\n }\n\n resolve(new File([blob], fileName, { type: \"image/jpeg\" }));\n },\n \"image/jpeg\",\n 0.92,\n );\n });\n}\n\nexport function buildCameraConstraints(facingMode: CameraFacingMode): MediaStreamConstraints {\n return {\n video: {\n facingMode: { ideal: facingMode },\n width: { ideal: 1920 },\n height: { ideal: 1080 },\n },\n audio: false,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n CART_SESSION_HEADER,\n type CartSnapshot,\n type CheckoutAddress,\n type CustomerSnapshot,\n type OrderSnapshot,\n type PaymentMethodOption,\n type PaymentSnapshot,\n type ShippingMethodSnapshot,\n} from \"@commerce-ai-tool/core/client\";\n\nexport const ANONYMOUS_ID_STORAGE_KEY = \"commerce-ai-tool:anonymousId\";\nexport const CUSTOMER_SESSION_STORAGE_KEY = \"commerce-ai-tool:customerSession\";\nexport const CUSTOMER_STORAGE_KEY = \"commerce-ai-tool:customer\";\n\nexport interface AddToCartItem {\n sku?: string;\n productId?: string;\n variantId?: number;\n quantity?: number;\n}\n\nexport interface UseCartOptions {\n apiBaseUrl: string;\n currency?: string;\n country?: string;\n catalogLocale?: string;\n /** When false, skip network calls. Default true for standalone hook usage. */\n enabled?: boolean;\n onCartChange?: (cart: CartSnapshot | null) => void;\n}\n\nexport interface UseCartReturn {\n cart: CartSnapshot | null;\n anonymousId: string;\n customer: CustomerSnapshot | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n isMutating: boolean;\n isLoggingIn: boolean;\n error: string | null;\n isCartOpen: boolean;\n openCart: () => void;\n closeCart: () => void;\n toggleCart: () => void;\n addToCart: (item: AddToCartItem) => Promise<CartSnapshot | null>;\n addItems: (items: AddToCartItem[]) => Promise<CartSnapshot | null>;\n removeFromCart: (lineItemId: string) => Promise<CartSnapshot | null>;\n updateQuantity: (lineItemId: string, quantity: number) => Promise<CartSnapshot | null>;\n setAddresses: (\n shippingAddress: CheckoutAddress,\n billingAddress?: CheckoutAddress,\n ) => Promise<CartSnapshot | null>;\n /** Returns matching methods, or `null` when the request failed. */\n getShippingMethods: () => Promise<ShippingMethodSnapshot[] | null>;\n setShippingMethod: (shippingMethodId: string) => Promise<CartSnapshot | null>;\n /** Returns matching methods, or `null` when the request failed. */\n getPaymentMethods: () => Promise<PaymentMethodOption[] | null>;\n authorizePayment: (method: string) => Promise<PaymentSnapshot | null>;\n getOrder: (orderNumber: string) => Promise<OrderSnapshot | null>;\n listOrders: () => Promise<OrderSnapshot[]>;\n placeOrder: () => Promise<OrderSnapshot | null>;\n login: (input: { email: string; password: string }) => Promise<CartSnapshot | null>;\n logout: () => Promise<void>;\n refresh: () => Promise<void>;\n}\n\ninterface CartApiBody {\n cart?: CartSnapshot | null;\n customer?: CustomerSnapshot | null;\n sessionToken?: string;\n shippingMethods?: ShippingMethodSnapshot[];\n paymentMethods?: PaymentMethodOption[];\n payment?: PaymentSnapshot;\n order?: OrderSnapshot;\n orders?: OrderSnapshot[];\n error?: string;\n}\n\nfunction readStorage(key: string): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction writeStorage(key: string, value: string): void {\n if (typeof window === \"undefined\") {\n return;\n }\n try {\n window.localStorage.setItem(key, value);\n } catch {\n // Ignore quota / privacy mode failures — session still works in memory.\n }\n}\n\nfunction removeStorage(key: string): void {\n if (typeof window === \"undefined\") {\n return;\n }\n try {\n window.localStorage.removeItem(key);\n } catch {\n // Ignore privacy mode failures.\n }\n}\n\nfunction readStoredCustomer(): CustomerSnapshot | null {\n const raw = readStorage(CUSTOMER_STORAGE_KEY);\n if (!raw) {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as CustomerSnapshot;\n if (typeof parsed.id === \"string\" && typeof parsed.email === \"string\") {\n return parsed;\n }\n } catch {\n return null;\n }\n return null;\n}\n\nexport function createAnonymousId(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `anon-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function getOrCreateAnonymousId(): string {\n const existing = readStorage(ANONYMOUS_ID_STORAGE_KEY);\n if (existing) {\n return existing;\n }\n const created = createAnonymousId();\n writeStorage(ANONYMOUS_ID_STORAGE_KEY, created);\n return created;\n}\n\nfunction rotateAnonymousId(): string {\n const created = createAnonymousId();\n writeStorage(ANONYMOUS_ID_STORAGE_KEY, created);\n return created;\n}\n\ntype CartSyncListener = (sourceId: number, cart: CartSnapshot | null) => void;\n\nconst cartSyncListeners = new Set<CartSyncListener>();\nlet cartSyncSeq = 0;\n\nfunction emitCartSync(sourceId: number, cart: CartSnapshot | null): void {\n for (const listener of cartSyncListeners) {\n listener(sourceId, cart);\n }\n}\n\nclass CartRequestError extends Error {\n status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = \"CartRequestError\";\n this.status = status;\n }\n}\n\nasync function parseCartApi(response: Response): Promise<CartApiBody> {\n const body = (await response.json()) as CartApiBody;\n if (!response.ok) {\n throw new CartRequestError(body.error ?? \"Cart request failed\", response.status);\n }\n return body;\n}\n\nexport function useCart(options: UseCartOptions): UseCartReturn {\n const {\n apiBaseUrl,\n currency,\n country,\n catalogLocale,\n enabled = true,\n onCartChange,\n } = options;\n\n const [anonymousId, setAnonymousId] = useState(\"\");\n const [sessionToken, setSessionToken] = useState<string | null>(null);\n const [customer, setCustomer] = useState<CustomerSnapshot | null>(null);\n const [cart, setCart] = useState<CartSnapshot | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isMutating, setIsMutating] = useState(false);\n const [isLoggingIn, setIsLoggingIn] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [isCartOpen, setIsCartOpen] = useState(false);\n const onCartChangeRef = useRef(onCartChange);\n onCartChangeRef.current = onCartChange;\n const cartRef = useRef<CartSnapshot | null>(null);\n const sessionTokenRef = useRef<string | null>(null);\n const mutationChainRef = useRef(Promise.resolve<unknown>(undefined));\n const orderNumberRef = useRef<string | null>(null);\n const [syncId] = useState(() => {\n cartSyncSeq += 1;\n return cartSyncSeq;\n });\n\n const applyCart = useCallback((next: CartSnapshot | null, sync = true) => {\n cartRef.current = next;\n setCart(next);\n onCartChangeRef.current?.(next);\n if (sync) {\n emitCartSync(syncId, next);\n }\n }, [syncId]);\n\n const persistSession = useCallback((token: string, nextCustomer: CustomerSnapshot) => {\n sessionTokenRef.current = token;\n setSessionToken(token);\n setCustomer(nextCustomer);\n writeStorage(CUSTOMER_SESSION_STORAGE_KEY, token);\n writeStorage(CUSTOMER_STORAGE_KEY, JSON.stringify(nextCustomer));\n }, []);\n\n const clearSession = useCallback(() => {\n sessionTokenRef.current = null;\n setSessionToken(null);\n setCustomer(null);\n removeStorage(CUSTOMER_SESSION_STORAGE_KEY);\n removeStorage(CUSTOMER_STORAGE_KEY);\n }, []);\n\n const refresh = useCallback(async () => {\n if (!enabled || !anonymousId) {\n return;\n }\n\n const params = new URLSearchParams();\n const headers: Record<string, string> = {};\n const token = sessionTokenRef.current;\n if (token) {\n headers[CART_SESSION_HEADER] = token;\n } else {\n params.set(\"anonymousId\", anonymousId);\n }\n if (catalogLocale) {\n params.set(\"catalogLocale\", catalogLocale);\n }\n\n setIsLoading(true);\n setError(null);\n try {\n const query = params.toString();\n const url = `${apiBaseUrl}/cart${query ? `?${query}` : \"\"}`;\n const response = await (token\n ? fetch(url, { headers })\n : fetch(url));\n const body = await parseCartApi(response);\n applyCart(body.cart ?? null);\n } catch (err) {\n if (err instanceof CartRequestError && err.status === 401 && sessionTokenRef.current) {\n clearSession();\n const nextAnonymousId = rotateAnonymousId();\n setAnonymousId(nextAnonymousId);\n applyCart(null);\n }\n setError(err instanceof Error ? err.message : \"Cart request failed\");\n } finally {\n setIsLoading(false);\n }\n }, [anonymousId, apiBaseUrl, applyCart, catalogLocale, clearSession, enabled]);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n setAnonymousId(getOrCreateAnonymousId());\n const storedToken = readStorage(CUSTOMER_SESSION_STORAGE_KEY);\n const storedCustomer = readStoredCustomer();\n if (storedToken && storedCustomer) {\n sessionTokenRef.current = storedToken;\n setSessionToken(storedToken);\n setCustomer(storedCustomer);\n }\n }, [enabled]);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n const listener: CartSyncListener = (sourceId, next) => {\n if (sourceId === syncId) {\n return;\n }\n applyCart(next, false);\n };\n cartSyncListeners.add(listener);\n return () => {\n cartSyncListeners.delete(listener);\n };\n }, [applyCart, enabled, syncId]);\n\n useEffect(() => {\n if (!enabled || !anonymousId) {\n return;\n }\n void refresh();\n }, [anonymousId, enabled, refresh]);\n\n const mutate = useCallback(\n async (path: string, body: Record<string, unknown>): Promise<CartSnapshot | null> => {\n if (!enabled || !anonymousId) {\n return null;\n }\n\n const run = async (): Promise<CartSnapshot | null> => {\n setIsMutating(true);\n setError(null);\n try {\n const response = await fetch(`${apiBaseUrl}${path}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n anonymousId,\n sessionToken: sessionTokenRef.current ?? undefined,\n currency,\n country,\n catalogLocale,\n cartId: cartRef.current?.id,\n cartVersion: cartRef.current?.version,\n ...body,\n }),\n });\n const next = await parseCartApi(response);\n applyCart(next.cart ?? null);\n return next.cart ?? null;\n } catch (err) {\n if (err instanceof CartRequestError && err.status === 401 && sessionTokenRef.current) {\n clearSession();\n setAnonymousId(rotateAnonymousId());\n applyCart(null);\n }\n setError(err instanceof Error ? err.message : \"Cart request failed\");\n return null;\n } finally {\n setIsMutating(false);\n }\n };\n\n const pending = mutationChainRef.current.then(run, run);\n mutationChainRef.current = pending.then(\n () => undefined,\n () => undefined,\n );\n return pending;\n },\n [anonymousId, apiBaseUrl, applyCart, catalogLocale, clearSession, country, currency, enabled],\n );\n\n const addToCart = useCallback(\n async (item: AddToCartItem) =>\n mutate(\"/cart/add\", {\n sku: item.sku,\n productId: item.productId,\n variantId: item.variantId,\n quantity: item.quantity,\n }),\n [mutate],\n );\n\n const addItems = useCallback(\n async (items: AddToCartItem[]) => mutate(\"/cart/add-items\", { items }),\n [mutate],\n );\n\n const removeFromCart = useCallback(\n (lineItemId: string) => mutate(\"/cart/remove\", { lineItemId }),\n [mutate],\n );\n\n const updateQuantity = useCallback(\n (lineItemId: string, quantity: number) =>\n mutate(\"/cart/update-quantity\", { lineItemId, quantity }),\n [mutate],\n );\n\n const setAddresses = useCallback(\n (shippingAddress: CheckoutAddress, billingAddress?: CheckoutAddress) =>\n mutate(\"/cart/addresses\", { shippingAddress, billingAddress }),\n [mutate],\n );\n\n const getShippingMethods = useCallback(async (): Promise<\n ShippingMethodSnapshot[] | null\n > => {\n if (!enabled || !anonymousId) {\n return [];\n }\n const params = new URLSearchParams();\n const headers: Record<string, string> = {};\n const token = sessionTokenRef.current;\n if (token) {\n headers[CART_SESSION_HEADER] = token;\n } else {\n params.set(\"anonymousId\", anonymousId);\n }\n if (cartRef.current?.id) {\n params.set(\"cartId\", cartRef.current.id);\n }\n if (catalogLocale) {\n params.set(\"catalogLocale\", catalogLocale);\n }\n\n setIsMutating(true);\n setError(null);\n try {\n const response = await fetch(\n `${apiBaseUrl}/cart/shipping-methods?${params.toString()}`,\n token ? { headers } : undefined,\n );\n const body = await parseCartApi(response);\n return body.shippingMethods ?? [];\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Shipping methods request failed\");\n return null;\n } finally {\n setIsMutating(false);\n }\n }, [anonymousId, apiBaseUrl, catalogLocale, enabled]);\n\n const setShippingMethod = useCallback(\n (shippingMethodId: string) =>\n mutate(\"/cart/shipping-method\", { shippingMethodId }),\n [mutate],\n );\n\n const getPaymentMethods = useCallback(async (): Promise<\n PaymentMethodOption[] | null\n > => {\n if (!enabled || !anonymousId) {\n return [];\n }\n const params = new URLSearchParams();\n const headers: Record<string, string> = {};\n const token = sessionTokenRef.current;\n if (token) {\n headers[CART_SESSION_HEADER] = token;\n } else {\n params.set(\"anonymousId\", anonymousId);\n }\n if (cartRef.current?.id) {\n params.set(\"cartId\", cartRef.current.id);\n }\n if (catalogLocale) {\n params.set(\"catalogLocale\", catalogLocale);\n }\n\n setIsMutating(true);\n setError(null);\n try {\n const response = await fetch(\n `${apiBaseUrl}/cart/payment-methods?${params.toString()}`,\n token ? { headers } : undefined,\n );\n const body = await parseCartApi(response);\n return body.paymentMethods ?? [];\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Payment methods request failed\");\n return null;\n } finally {\n setIsMutating(false);\n }\n }, [anonymousId, apiBaseUrl, catalogLocale, enabled]);\n\n const authorizePayment = useCallback(\n async (method: string): Promise<PaymentSnapshot | null> => {\n if (!enabled || !anonymousId) {\n return null;\n }\n\n const run = async (): Promise<PaymentSnapshot | null> => {\n orderNumberRef.current ??= `cat-${createAnonymousId()}`;\n setIsMutating(true);\n setError(null);\n try {\n const response = await fetch(`${apiBaseUrl}/cart/payment`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n anonymousId,\n sessionToken: sessionTokenRef.current ?? undefined,\n cartId: cartRef.current?.id,\n catalogLocale,\n method,\n orderNumber: orderNumberRef.current,\n }),\n });\n const body = await parseCartApi(response);\n if (body.cart) {\n applyCart(body.cart);\n }\n if (!body.payment) {\n throw new CartRequestError(\"Payment response is missing\", response.status);\n }\n return body.payment;\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Payment failed\");\n return null;\n } finally {\n setIsMutating(false);\n }\n };\n\n const pending = mutationChainRef.current.then(run, run);\n mutationChainRef.current = pending.then(\n () => undefined,\n () => undefined,\n );\n return pending;\n },\n [anonymousId, apiBaseUrl, applyCart, catalogLocale, enabled],\n );\n\n const getOrder = useCallback(\n async (orderNumber: string): Promise<OrderSnapshot | null> => {\n if (!enabled || !anonymousId || !orderNumber.trim()) {\n return null;\n }\n const params = new URLSearchParams();\n const headers: Record<string, string> = {};\n const token = sessionTokenRef.current;\n if (token) {\n headers[CART_SESSION_HEADER] = token;\n }\n params.set(\"anonymousId\", anonymousId);\n params.set(\"orderNumber\", orderNumber.trim());\n if (catalogLocale) {\n params.set(\"catalogLocale\", catalogLocale);\n }\n\n setIsLoading(true);\n setError(null);\n try {\n const response = await fetch(`${apiBaseUrl}/orders?${params.toString()}`, {\n headers,\n });\n const body = await parseCartApi(response);\n return body.order ?? null;\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Order request failed\");\n return null;\n } finally {\n setIsLoading(false);\n }\n },\n [anonymousId, apiBaseUrl, catalogLocale, enabled],\n );\n\n const listOrders = useCallback(async (): Promise<OrderSnapshot[]> => {\n if (!enabled || !anonymousId) {\n return [];\n }\n const params = new URLSearchParams();\n const headers: Record<string, string> = {};\n const token = sessionTokenRef.current;\n if (token) {\n headers[CART_SESSION_HEADER] = token;\n }\n params.set(\"anonymousId\", anonymousId);\n if (catalogLocale) {\n params.set(\"catalogLocale\", catalogLocale);\n }\n\n setIsLoading(true);\n setError(null);\n try {\n const response = await fetch(`${apiBaseUrl}/orders?${params.toString()}`, {\n headers,\n });\n const body = await parseCartApi(response);\n return body.orders ?? [];\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Order request failed\");\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [anonymousId, apiBaseUrl, catalogLocale, enabled]);\n\n const placeOrder = useCallback(async (): Promise<OrderSnapshot | null> => {\n if (!enabled || !anonymousId) {\n return null;\n }\n\n const run = async (): Promise<OrderSnapshot | null> => {\n if (!cartRef.current) {\n return null;\n }\n orderNumberRef.current ??= `cat-${createAnonymousId()}`;\n setIsMutating(true);\n setError(null);\n try {\n const response = await fetch(`${apiBaseUrl}/cart/order`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n anonymousId,\n sessionToken: sessionTokenRef.current ?? undefined,\n cartId: cartRef.current.id,\n catalogLocale,\n orderNumber: orderNumberRef.current,\n }),\n });\n const body = await parseCartApi(response);\n if (!body.order) {\n throw new CartRequestError(\"Order response is missing\", response.status);\n }\n orderNumberRef.current = null;\n applyCart(null);\n return body.order;\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Checkout failed\");\n return null;\n } finally {\n setIsMutating(false);\n }\n };\n\n const pending = mutationChainRef.current.then(run, run);\n mutationChainRef.current = pending.then(\n () => undefined,\n () => undefined,\n );\n return pending;\n }, [anonymousId, apiBaseUrl, applyCart, catalogLocale, enabled]);\n\n const login = useCallback(\n async (input: { email: string; password: string }) => {\n if (!enabled) {\n return null;\n }\n\n setIsLoggingIn(true);\n setError(null);\n try {\n const response = await fetch(`${apiBaseUrl}/cart/login`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n email: input.email,\n password: input.password,\n anonymousId,\n catalogLocale,\n cartId: cartRef.current?.id,\n }),\n });\n const body = await parseCartApi(response);\n if (!body.sessionToken || !body.customer) {\n throw new CartRequestError(\"Sign in failed\", response.status);\n }\n persistSession(body.sessionToken, body.customer);\n applyCart(body.cart ?? null);\n return body.cart ?? null;\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Sign in failed\");\n return null;\n } finally {\n setIsLoggingIn(false);\n }\n },\n [anonymousId, apiBaseUrl, applyCart, catalogLocale, enabled, persistSession],\n );\n\n const logout = useCallback(async () => {\n try {\n await fetch(`${apiBaseUrl}/cart/logout`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({}),\n });\n } catch {\n // Client-side logout still proceeds if the network call fails.\n }\n clearSession();\n applyCart(null);\n setAnonymousId(rotateAnonymousId());\n }, [apiBaseUrl, applyCart, clearSession]);\n\n const openCart = useCallback(() => {\n setIsCartOpen(true);\n // Re-fetch so the panel never shows a stale cart after a mutation\n // from another hook instance (for example host-owned add-to-cart UI).\n void refresh();\n }, [refresh]);\n const closeCart = useCallback(() => setIsCartOpen(false), []);\n const toggleCart = useCallback(() => {\n setIsCartOpen((open) => {\n if (!open) {\n void refresh();\n }\n return !open;\n });\n }, [refresh]);\n\n return {\n cart,\n anonymousId,\n customer,\n isAuthenticated: Boolean(customer && sessionToken),\n isLoading,\n isMutating,\n isLoggingIn,\n error,\n isCartOpen,\n openCart,\n closeCart,\n toggleCart,\n addToCart,\n addItems,\n removeFromCart,\n updateQuantity,\n setAddresses,\n getShippingMethods,\n setShippingMethod,\n getPaymentMethods,\n authorizePayment,\n getOrder,\n listOrders,\n placeOrder,\n login,\n logout,\n refresh,\n };\n}\n","import { useEffect, useState } from \"react\";\n\nexport function formatRecordingDuration(seconds: number): string {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins}:${secs.toString().padStart(2, \"0\")}`;\n}\n\nexport function useRecordingDuration(isRecording: boolean): number {\n const [duration, setDuration] = useState(0);\n\n useEffect(() => {\n if (!isRecording) {\n setDuration(0);\n return;\n }\n\n const interval = setInterval(() => {\n setDuration((current) => current + 1);\n }, 1000);\n\n return () => clearInterval(interval);\n }, [isRecording]);\n\n return duration;\n}\n","import { useCallback, useRef, useState } from \"react\";\nimport type { MissionSearchResult, ProductCard, SearchResult } from \"@commerce-ai-tool/core/client\";\nimport { appendLocaleFields, type SearchLocaleProps } from \"./useCommerceAISearch.js\";\n\nexport interface UseVoiceSearchOptions extends SearchLocaleProps {\n apiBaseUrl: string;\n onResults?: (\n results: ProductCard[],\n meta: SearchResult[\"meta\"],\n extras?: { mission?: MissionSearchResult },\n ) => void;\n onTranscript?: (transcript: string) => void;\n enableTts?: boolean;\n enableMissions?: boolean;\n}\n\nfunction playAudioSummary(base64: string): void {\n const audio = new Audio(`data:audio/mpeg;base64,${base64}`);\n void audio.play();\n}\n\nasync function fetchTtsSummary(baseUrl: string, text: string): Promise<string> {\n const response = await fetch(`${baseUrl}/tts`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ text }),\n });\n\n if (!response.ok) {\n throw new Error(\"TTS failed\");\n }\n\n const blob = await response.blob();\n const buffer = await blob.arrayBuffer();\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!);\n }\n\n return btoa(binary);\n}\n\nexport function useVoiceSearch(options: UseVoiceSearchOptions) {\n const {\n apiBaseUrl,\n queryLocale,\n catalogLocale,\n locale,\n onResults,\n onTranscript,\n enableTts = true,\n enableMissions = false,\n } = options;\n const [isRecording, setIsRecording] = useState(false);\n const [isProcessing, setIsProcessing] = useState(false);\n const [isLoadingTts, setIsLoadingTts] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [audioSummary, setAudioSummary] = useState<string | null>(null);\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n\n const baseUrl = apiBaseUrl.replace(/\\/$/, \"\");\n\n const clearAudioSummary = useCallback(() => {\n setAudioSummary(null);\n }, []);\n\n const replayAudioSummary = useCallback(() => {\n if (audioSummary) {\n playAudioSummary(audioSummary);\n }\n }, [audioSummary]);\n\n const stopRecording = useCallback(() => {\n if (mediaRecorderRef.current?.state === \"recording\") {\n mediaRecorderRef.current.stop();\n }\n setIsRecording(false);\n }, []);\n\n const startRecording = useCallback(async () => {\n setError(null);\n setAudioSummary(null);\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const mediaRecorder = new MediaRecorder(stream);\n mediaRecorderRef.current = mediaRecorder;\n chunksRef.current = [];\n\n mediaRecorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n chunksRef.current.push(event.data);\n }\n };\n\n mediaRecorder.onstop = async () => {\n stream.getTracks().forEach((track) => track.stop());\n const blob = new Blob(chunksRef.current, { type: \"audio/webm\" });\n setIsProcessing(true);\n\n try {\n const formData = new FormData();\n formData.append(\"audio\", blob, \"recording.webm\");\n appendLocaleFields(formData, { queryLocale, catalogLocale, locale });\n formData.append(\"enableTts\", String(enableTts));\n if (enableMissions) {\n formData.append(\"enableMissions\", \"true\");\n }\n\n const response = await fetch(`${baseUrl}/search/voice`, {\n method: \"POST\",\n body: formData,\n });\n\n if (!response.ok) {\n const data = (await response.json()) as { error?: string };\n throw new Error(data.error ?? \"Voice search failed\");\n }\n\n const data = (await response.json()) as {\n transcript: string;\n products: ProductCard[];\n meta: SearchResult[\"meta\"];\n mission?: MissionSearchResult;\n ttsText?: string;\n audioSummary?: string;\n ttsPending?: boolean;\n };\n\n onTranscript?.(data.transcript);\n onResults?.(data.products, data.meta, { mission: data.mission });\n\n if (data.audioSummary) {\n setAudioSummary(data.audioSummary);\n playAudioSummary(data.audioSummary);\n } else if (enableTts && data.ttsText && data.ttsPending) {\n setIsLoadingTts(true);\n try {\n const summary = await fetchTtsSummary(baseUrl, data.ttsText);\n setAudioSummary(summary);\n playAudioSummary(summary);\n } catch {\n setAudioSummary(null);\n } finally {\n setIsLoadingTts(false);\n }\n } else {\n setAudioSummary(null);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Voice search failed\");\n setAudioSummary(null);\n } finally {\n setIsProcessing(false);\n }\n };\n\n mediaRecorder.start();\n setIsRecording(true);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Microphone access denied\");\n }\n }, [baseUrl, catalogLocale, enableMissions, enableTts, locale, onResults, onTranscript, queryLocale]);\n\n const toggleRecording = useCallback(async () => {\n if (isRecording) {\n stopRecording();\n } else {\n await startRecording();\n }\n }, [isRecording, startRecording, stopRecording]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n return {\n isRecording,\n isProcessing,\n isLoadingTts,\n error,\n clearError,\n audioSummary,\n clearAudioSummary,\n replayAudioSummary,\n toggleRecording,\n stopRecording,\n };\n}\n","export const ICON_STROKE = 1.25;\n","import { useEffect, useRef } from \"react\";\nimport { Camera, X } from \"lucide-react\";\nimport type { CommerceAISearchMessages } from \"@commerce-ai-tool/core/client\";\nimport { ICON_STROKE } from \"../icons.js\";\n\nexport interface CameraCaptureOverlayProps {\n stream: MediaStream | null;\n error: string | null;\n messages: Pick<\n CommerceAISearchMessages,\n \"cameraCapture\" | \"cameraPreview\" | \"capturePhoto\" | \"cancel\" | \"dismiss\"\n >;\n onCapture: (video: HTMLVideoElement) => void;\n onClose: () => void;\n onDismissError: () => void;\n}\n\nexport function CameraCaptureOverlay({\n stream,\n error,\n messages,\n onCapture,\n onClose,\n onDismissError,\n}: CameraCaptureOverlayProps) {\n const videoRef = useRef<HTMLVideoElement>(null);\n\n useEffect(() => {\n function onKeyDown(event: KeyboardEvent) {\n if (event.key === \"Escape\") {\n if (error) {\n onDismissError();\n } else {\n onClose();\n }\n }\n }\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [error, onClose, onDismissError]);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n video.srcObject = stream;\n\n if (stream) {\n const playPromise = video.play();\n if (playPromise) {\n void playPromise.catch(() => {\n // Ignore autoplay interruptions in tests or restrictive browsers.\n });\n }\n }\n\n return () => {\n video.srcObject = null;\n };\n }, [stream]);\n\n return (\n <div\n className=\"cat-camera-overlay\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={messages.cameraCapture}\n >\n <div className=\"cat-camera-overlay__panel\">\n {error ? (\n <div className=\"cat-camera-overlay__error\" role=\"alert\">\n <p>{error}</p>\n <button type=\"button\" className=\"cat-camera-overlay__btn\" onClick={onDismissError}>\n {messages.dismiss}\n </button>\n </div>\n ) : (\n <>\n <video\n ref={videoRef}\n className=\"cat-camera-preview\"\n autoPlay\n playsInline\n muted\n aria-label={messages.cameraPreview}\n />\n\n <div className=\"cat-camera-actions\">\n <button\n type=\"button\"\n className=\"cat-camera-overlay__btn cat-camera-overlay__btn--secondary\"\n onClick={onClose}\n aria-label={messages.cancel}\n >\n <X size={16} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n {messages.cancel}\n </button>\n <button\n type=\"button\"\n className=\"cat-camera-overlay__btn cat-camera-overlay__btn--primary\"\n onClick={() => {\n if (videoRef.current) onCapture(videoRef.current);\n }}\n aria-label={messages.capturePhoto}\n >\n <Camera size={16} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n {messages.capturePhoto}\n </button>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n","import { type FormEvent, useState } from \"react\";\nimport {\n ArrowRight,\n ChevronDown,\n Minus,\n Package,\n Plus,\n ShoppingBag,\n Trash2,\n UserRound,\n X,\n} from \"lucide-react\";\nimport type {\n CartSnapshot,\n CommerceAISearchMessages,\n CustomerSnapshot,\n} from \"@commerce-ai-tool/core/client\";\nimport { ICON_STROKE } from \"../icons.js\";\n\nexport interface CartPanelProps {\n cart: CartSnapshot | null;\n customer: CustomerSnapshot | null;\n isLoading: boolean;\n isLoggingIn: boolean;\n error: string | null;\n messages: CommerceAISearchMessages;\n /** Locale used when formatting a fallback line total. */\n catalogLocale?: string;\n onClose: () => void;\n onRemove: (lineItemId: string) => void;\n onQuantityChange: (lineItemId: string, quantity: number) => void;\n onLogin: (input: { email: string; password: string }) => void;\n onLogout: () => void;\n onCheckout?: (cart: CartSnapshot) => void;\n}\n\nfunction displayCartError(\n error: string | null,\n messages: CommerceAISearchMessages,\n): string | null {\n if (!error) {\n return null;\n }\n if (error === \"Invalid credentials\") {\n return messages.invalidCredentials;\n }\n if (error === \"Sign in failed\" || error === \"Login failed\") {\n return messages.signInFailed;\n }\n return error;\n}\n\nfunction formatLineTotal(\n price: CartSnapshot[\"lineItems\"][number][\"price\"],\n quantity: number,\n locale?: string,\n): string | null {\n if (!price) {\n return null;\n }\n return new Intl.NumberFormat(locale || undefined, {\n style: \"currency\",\n currency: price.currency,\n }).format(price.amount * quantity);\n}\n\nexport function CartPanel({\n cart,\n customer,\n isLoading,\n isLoggingIn,\n error,\n messages,\n catalogLocale,\n onClose,\n onRemove,\n onQuantityChange,\n onLogin,\n onLogout,\n onCheckout,\n}: CartPanelProps) {\n const isEmpty = !cart || cart.lineItems.length === 0;\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [isAuthExpanded, setIsAuthExpanded] = useState(false);\n const visibleError = displayCartError(error, messages);\n\n function handleLoginSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n onLogin({ email, password });\n setPassword(\"\");\n }\n\n const authBlock = (\n <div className=\"cat-cart-panel__auth\">\n {customer ? (\n <div className=\"cat-cart-panel__signed-in\">\n <span>\n {messages.signedInAs} {customer.email}\n </span>\n <button\n type=\"button\"\n className=\"cat-cart-panel__sign-out\"\n onClick={onLogout}\n >\n {messages.signOut}\n </button>\n </div>\n ) : (\n <>\n <button\n type=\"button\"\n className=\"cat-cart-panel__auth-toggle\"\n disabled={isLoggingIn}\n aria-expanded={isAuthExpanded}\n onClick={() => setIsAuthExpanded((expanded) => !expanded)}\n >\n <span className=\"cat-cart-panel__auth-toggle-copy\">\n <span className=\"cat-cart-panel__auth-icon\" aria-hidden=\"true\">\n <UserRound size={14} strokeWidth={ICON_STROKE} />\n </span>\n {messages.signInToSyncCart}\n </span>\n <ChevronDown\n className={isAuthExpanded ? \"cat-cart-panel__auth-chevron--open\" : \"\"}\n size={15}\n strokeWidth={ICON_STROKE}\n aria-hidden=\"true\"\n />\n </button>\n {isAuthExpanded ? (\n <form className=\"cat-cart-panel__auth-form\" onSubmit={handleLoginSubmit}>\n <label className=\"cat-cart-panel__field\">\n <span className=\"cat-cart-panel__label\">{messages.email}</span>\n <input\n className=\"cat-cart-panel__input\"\n type=\"email\"\n name=\"email\"\n autoComplete=\"email\"\n required\n disabled={isLoggingIn}\n value={email}\n onChange={(event) => setEmail(event.target.value)}\n />\n </label>\n <label className=\"cat-cart-panel__field\">\n <span className=\"cat-cart-panel__label\">{messages.password}</span>\n <input\n className=\"cat-cart-panel__input\"\n type=\"password\"\n name=\"password\"\n autoComplete=\"current-password\"\n required\n disabled={isLoggingIn}\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n />\n </label>\n <button\n type=\"submit\"\n className=\"cat-cart-panel__submit\"\n disabled={isLoggingIn}\n >\n {messages.signIn}\n </button>\n </form>\n ) : null}\n </>\n )}\n </div>\n );\n\n return (\n <section\n className={`cat-cart-panel${isEmpty ? \"\" : \" cat-cart-panel--with-items\"}`}\n aria-label={messages.cartAriaLabel}\n >\n <header className=\"cat-cart-panel__header\">\n <h2 className=\"cat-cart-panel__title\">{messages.cart}</h2>\n <button\n type=\"button\"\n className=\"cat-icon-btn\"\n onClick={onClose}\n aria-label={messages.closeCart}\n >\n <X size={16} strokeWidth={ICON_STROKE} />\n </button>\n </header>\n\n {visibleError && (\n <div className=\"cat-status cat-status--error\" role=\"alert\">\n {visibleError}\n </div>\n )}\n\n {isEmpty ? (\n <div className=\"cat-cart-panel__empty\">\n <ShoppingBag size={20} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n <span>{messages.emptyCart}</span>\n </div>\n ) : (\n <ul className=\"cat-cart-panel__items\">\n {cart.lineItems.map((item) => (\n <li key={item.id} className=\"cat-cart-item\">\n {item.imageUrl ? (\n <img src={item.imageUrl} alt=\"\" className=\"cat-cart-item__image\" />\n ) : (\n <div className=\"cat-cart-item__image cat-cart-item__image--placeholder\">\n <Package size={16} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n </div>\n )}\n <div className=\"cat-cart-item__info\">\n <div className=\"cat-cart-item__name\">{item.name}</div>\n {item.price ? (\n <div className=\"cat-cart-item__price\">\n <span>{item.price.formatted} {messages.each}</span>\n <strong>\n {item.totalPrice?.formatted ??\n formatLineTotal(item.price, item.quantity, catalogLocale)}\n </strong>\n </div>\n ) : null}\n <div className=\"cat-cart-item__qty\">\n <button\n type=\"button\"\n className=\"cat-cart-item__qty-btn\"\n aria-label={messages.decreaseQuantity}\n disabled={isLoading || item.quantity <= 1}\n onClick={() => onQuantityChange(item.id, item.quantity - 1)}\n >\n <Minus size={12} strokeWidth={ICON_STROKE} />\n </button>\n <span className=\"cat-cart-item__qty-value\">{item.quantity}</span>\n <button\n type=\"button\"\n className=\"cat-cart-item__qty-btn\"\n aria-label={messages.increaseQuantity}\n disabled={isLoading}\n onClick={() => onQuantityChange(item.id, item.quantity + 1)}\n >\n <Plus size={12} strokeWidth={ICON_STROKE} />\n </button>\n </div>\n </div>\n <button\n type=\"button\"\n className=\"cat-icon-btn\"\n aria-label={messages.removeItem}\n disabled={isLoading}\n onClick={() => onRemove(item.id)}\n >\n <Trash2 size={14} strokeWidth={ICON_STROKE} />\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {authBlock}\n\n {!isEmpty && (\n <footer className=\"cat-cart-panel__footer\">\n <div className=\"cat-cart-panel__total\">\n <span>{messages.total}</span>\n <strong>{cart.totalPrice.formatted}</strong>\n </div>\n {onCheckout ? (\n <button\n type=\"button\"\n className=\"cat-checkout-cta\"\n disabled={isLoading}\n onClick={() => onCheckout(cart)}\n >\n <span>{messages.checkout}</span>\n <span className=\"cat-checkout-cta__icon\" aria-hidden=\"true\">\n <ArrowRight size={15} strokeWidth={ICON_STROKE} />\n </span>\n </button>\n ) : null}\n </footer>\n )}\n </section>\n );\n}\n","import { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { Check, Package, SearchX, ShoppingCart } from \"lucide-react\";\nimport type {\n AddToCartLineItem,\n CommerceAISearchMessages,\n MissionSearchResult,\n ProductCard,\n} from \"@commerce-ai-tool/core/client\";\nimport { ICON_STROKE } from \"../icons.js\";\n\nexport interface MissionResultsProps {\n mission: MissionSearchResult;\n messages: CommerceAISearchMessages;\n enableCart: boolean;\n isMutating: boolean;\n addedProductIds?: Record<string, true>;\n onProductSelect?: (product: ProductCard) => void;\n onAddItem?: (product: ProductCard) => void;\n onAddAll: (items: AddToCartLineItem[]) => Promise<unknown>;\n}\n\nfunction formatMissionAddAll(template: string, count: number): string {\n const withPlural = count === 1 ? template.replaceAll(\"top picks\", \"top pick\") : template;\n if (withPlural.includes(\"{count}\")) {\n return withPlural.replaceAll(\"{count}\", String(count));\n }\n return `${withPlural} (${count})`;\n}\n\nfunction toCartItem(product: ProductCard, quantity: number): AddToCartLineItem {\n return product.sku\n ? { sku: product.sku, quantity }\n : { productId: product.id, variantId: product.variantId, quantity };\n}\n\nfunction lineItemKey(item: AddToCartLineItem): string {\n if (item.sku) {\n return `sku:${item.sku}`;\n }\n return `id:${item.productId ?? \"\"}:${item.variantId ?? \"\"}`;\n}\n\nfunction starterBundleItems(mission: MissionSearchResult): AddToCartLineItem[] {\n const items: AddToCartLineItem[] = [];\n const seen = new Set<string>();\n for (const group of mission.intents) {\n if (group.failed) {\n continue;\n }\n const product = group.products[0];\n if (!product || (!product.sku && !product.id)) {\n continue;\n }\n const item = toCartItem(product, 1);\n const key = lineItemKey(item);\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n items.push(item);\n }\n return items;\n}\n\nfunction ProductCardBody({ product }: { product: ProductCard }) {\n return (\n <>\n {product.imageUrl ? (\n <img src={product.imageUrl} alt=\"\" className=\"cat-result-image\" loading=\"lazy\" />\n ) : (\n <div className=\"cat-result-image cat-result-image--placeholder\">\n <Package size={20} strokeWidth={ICON_STROKE} color=\"var(--cat-text-muted)\" />\n </div>\n )}\n <div className=\"cat-result-info\">\n <div className=\"cat-result-name\">{product.name}</div>\n {product.price ? <div className=\"cat-result-price\">{product.price.formatted}</div> : null}\n </div>\n </>\n );\n}\n\nexport function MissionResults({\n mission,\n messages,\n enableCart,\n isMutating,\n addedProductIds,\n onProductSelect,\n onAddItem,\n onAddAll,\n}: MissionResultsProps) {\n const titleId = useId();\n const [justAddedAll, setJustAddedAll] = useState(false);\n const addedAllTimeoutRef = useRef<number | null>(null);\n const bundleItems = useMemo(() => starterBundleItems(mission), [mission]);\n const totalQuantity = bundleItems.reduce((sum, item) => sum + (item.quantity ?? 1), 0);\n\n useEffect(() => {\n setJustAddedAll(false);\n }, [mission]);\n\n useEffect(() => {\n return () => {\n if (addedAllTimeoutRef.current !== null) {\n window.clearTimeout(addedAllTimeoutRef.current);\n }\n };\n }, []);\n\n return (\n <div className=\"cat-mission\">\n <div className=\"cat-mission__header\">\n <h2 id={titleId} className=\"cat-mission__title\">\n {messages.missionTitle}\n </h2>\n {mission.interpretation ? (\n <p className=\"cat-mission__interpretation\">{mission.interpretation}</p>\n ) : null}\n </div>\n\n <div className=\"cat-mission__lanes\" role=\"list\" aria-labelledby={titleId}>\n {mission.intents.map((group) => (\n <section key={group.intent.id} className=\"cat-mission-group\" role=\"listitem\">\n <div className=\"cat-mission-group__header\">\n <h3 className=\"cat-mission-group__label\">{group.intent.label}</h3>\n {group.intent.quantity > 1 ? (\n <span className=\"cat-mission-group__qty\">\n {messages.missionQuantity} {group.intent.quantity}\n </span>\n ) : null}\n </div>\n\n {group.failed ? (\n <div className=\"cat-status cat-status--empty\" role=\"status\">\n <SearchX size={18} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n <div className=\"cat-status__content\">\n <div className=\"cat-status__title\">{messages.missionIntentFailed}</div>\n </div>\n </div>\n ) : group.products.length === 0 ? (\n <div className=\"cat-status cat-status--empty\" role=\"status\">\n <SearchX size={18} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n <div className=\"cat-status__content\">\n <div className=\"cat-status__title\">{messages.missionIntentEmpty}</div>\n </div>\n </div>\n ) : (\n <div className=\"cat-mission-group__products\">\n {group.products.map((product, index) => {\n const canAdd = Boolean(product.sku || product.id);\n const justAdded = Boolean(addedProductIds?.[product.id]);\n const body = <ProductCardBody product={product} />;\n return (\n <article\n key={product.id}\n className={`cat-result-card ${index === 0 ? \"cat-result-card--primary\" : \"cat-result-card--compact\"}`}\n >\n <div className=\"cat-result-card__core\">\n {onProductSelect ? (\n <button\n type=\"button\"\n className=\"cat-result-card__select\"\n onClick={() => onProductSelect(product)}\n >\n {body}\n </button>\n ) : (\n <div className=\"cat-result-card__select\">{body}</div>\n )}\n {enableCart ? (\n <button\n type=\"button\"\n className={`cat-icon-btn cat-result-card__add${justAdded ? \" cat-result-card__add--added\" : \"\"}`}\n aria-label={\n justAdded\n ? messages.itemAdded\n : canAdd\n ? messages.addToCart\n : messages.unableToAddToCart\n }\n disabled={!canAdd || isMutating}\n onClick={() => onAddItem?.(product)}\n >\n {justAdded ? (\n <Check size={16} strokeWidth={ICON_STROKE} />\n ) : (\n <ShoppingCart size={16} strokeWidth={ICON_STROKE} />\n )}\n </button>\n ) : null}\n </div>\n </article>\n );\n })}\n </div>\n )}\n </section>\n ))}\n </div>\n\n {enableCart ? (\n <div className=\"cat-mission__footer\">\n <button\n type=\"button\"\n className={`cat-checkout-cta cat-mission__add-all${justAddedAll ? \" cat-mission__add-all--added\" : \"\"}`}\n disabled={isMutating || bundleItems.length === 0}\n onClick={() => {\n void onAddAll(bundleItems).then((result) => {\n if (result) {\n setJustAddedAll(true);\n if (addedAllTimeoutRef.current !== null) {\n window.clearTimeout(addedAllTimeoutRef.current);\n }\n addedAllTimeoutRef.current = window.setTimeout(() => {\n setJustAddedAll(false);\n addedAllTimeoutRef.current = null;\n }, 1200);\n }\n });\n }}\n >\n {justAddedAll\n ? messages.missionItemsAdded\n : formatMissionAddAll(messages.missionAddAll, totalQuantity)}\n </button>\n </div>\n ) : null}\n </div>\n );\n}\n","import type {\n CommerceAISearchMessages,\n InterpretedSearchFilters,\n SearchFacetGroup,\n SuggestedFacet,\n} from \"@commerce-ai-tool/core/client\";\nimport {\n hexColorSwatchValue,\n isColorLikeFacetName,\n isFacetFilterSelected,\n toggleFacetFilter,\n} from \"@commerce-ai-tool/core/client\";\n\ninterface SearchFacetsProps {\n facets: SearchFacetGroup[];\n suggestedFacets: SuggestedFacet[];\n filters: InterpretedSearchFilters;\n messages: CommerceAISearchMessages;\n onChange: (filters: InterpretedSearchFilters) => void;\n onNewSearch?: () => void;\n}\n\nexport function SearchFacets({\n facets,\n suggestedFacets,\n filters,\n messages,\n onChange,\n onNewSearch,\n}: SearchFacetsProps) {\n const suggestedNames = new Set(suggestedFacets.map((facet) => facet.name));\n const visibleFacets = facets.filter((facet) => suggestedNames.size === 0 || suggestedNames.has(facet.id));\n if (!visibleFacets.length) return null;\n\n return (\n <section className=\"cat-facets\" aria-label={messages.filtersAriaLabel}>\n <div className=\"cat-facets__header\">\n <span>{messages.narrowResults}</span>\n <div className=\"cat-facets__actions\">\n {Object.keys(filters).length > 0 && (\n <button type=\"button\" className=\"cat-facets__clear\" onClick={() => onChange({})}>\n {messages.clearFilters}\n </button>\n )}\n {onNewSearch && (\n <button type=\"button\" className=\"cat-facets__new\" onClick={onNewSearch}>\n {messages.newSearch}\n </button>\n )}\n </div>\n </div>\n {visibleFacets.map((facet) => (\n <div key={facet.id} className=\"cat-facet-group\" role=\"group\" aria-label={facet.label}>\n <span className=\"cat-facet-group__label\">{facet.label}</span>\n <div className=\"cat-facet-group__options\">\n {facet.buckets.map((bucket) => {\n const selected = isFacetFilterSelected(filters, facet.id, bucket.key);\n const swatch = isColorLikeFacetName(facet.id)\n ? hexColorSwatchValue(bucket.key)\n : undefined;\n return (\n <button\n key={bucket.key}\n type=\"button\"\n className={`cat-facet-chip ${selected ? \"cat-facet-chip--selected\" : \"\"}`}\n aria-pressed={selected}\n onClick={() => onChange(toggleFacetFilter(filters, facet.id, bucket.key))}\n >\n {swatch ? (\n <span\n className=\"cat-facet-chip__swatch\"\n style={{ backgroundColor: swatch }}\n aria-hidden=\"true\"\n />\n ) : null}\n {bucket.label}{\" \"}\n <span className=\"cat-facet-chip__count\" aria-hidden=\"true\">\n {bucket.count}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n ))}\n </section>\n );\n}\n","import { X } from \"lucide-react\";\nimport { formatRecordingDuration } from \"../hooks/useRecordingDuration.js\";\nimport type { CommerceAISearchMessages } from \"@commerce-ai-tool/core/client\";\nimport { ICON_STROKE } from \"../icons.js\";\n\nexport interface VoiceStatusBannerProps {\n isRecording: boolean;\n isProcessing: boolean;\n isLoadingTts: boolean;\n error: string | null;\n durationSeconds: number;\n messages: Pick<\n CommerceAISearchMessages,\n \"listening\" | \"tapMicToStop\" | \"understandingQuery\" | \"preparingAudioSummary\" | \"dismiss\"\n >;\n onDismissError?: () => void;\n}\n\nfunction VoiceWaveform() {\n return (\n <div className=\"cat-voice-waveform\" aria-hidden=\"true\">\n <span />\n <span />\n <span />\n <span />\n <span />\n </div>\n );\n}\n\nfunction ProcessingSpinner() {\n return <span className=\"cat-voice-spinner\" aria-hidden=\"true\" />;\n}\n\nexport function VoiceStatusBanner({\n isRecording,\n isProcessing,\n isLoadingTts,\n error,\n durationSeconds,\n messages,\n onDismissError,\n}: VoiceStatusBannerProps) {\n const isError = Boolean(error);\n\n return (\n <div\n className={`cat-voice-banner ${isError ? \"cat-voice-banner--error\" : \"\"}`}\n role=\"status\"\n aria-live=\"polite\"\n >\n {isError && (\n <div className=\"cat-voice-banner__content\">\n <span className=\"cat-voice-banner__label\">{error}</span>\n {onDismissError && (\n <button\n type=\"button\"\n className=\"cat-voice-banner__dismiss\"\n onClick={onDismissError}\n aria-label={messages.dismiss}\n >\n <X size={14} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n )}\n\n {!isError && isRecording && (\n <div className=\"cat-voice-banner__content\">\n <span className=\"cat-voice-dot\" aria-hidden=\"true\" />\n <span className=\"cat-voice-banner__label\">{messages.listening}</span>\n <VoiceWaveform />\n <span className=\"cat-voice-banner__timer\">{formatRecordingDuration(durationSeconds)}</span>\n <span className=\"cat-voice-banner__hint\">{messages.tapMicToStop}</span>\n </div>\n )}\n\n {!isError && !isRecording && isProcessing && (\n <div className=\"cat-voice-banner__content\">\n <ProcessingSpinner />\n <span className=\"cat-voice-banner__label\">{messages.understandingQuery}</span>\n </div>\n )}\n\n {!isError && !isRecording && !isProcessing && isLoadingTts && (\n <div className=\"cat-voice-banner__content\">\n <ProcessingSpinner />\n <span className=\"cat-voice-banner__label\">{messages.preparingAudioSummary}</span>\n </div>\n )}\n </div>\n );\n}\n","import {\n useMemo,\n useState,\n useTransition,\n type ChangeEvent,\n type FormEvent,\n} from \"react\";\nimport { ArrowLeft, ArrowRight, Check, CreditCard, MapPin, Package } from \"lucide-react\";\nimport {\n resolveCommerceAISearchMessages,\n type CheckoutAddress,\n type CommerceAISearchMessages,\n type OrderSnapshot,\n type PaymentMethodOption,\n type PaymentSnapshot,\n type ShippingMethodSnapshot,\n type ThemeMode,\n} from \"@commerce-ai-tool/core/client\";\nimport { useCart } from \"../hooks/useCart.js\";\nimport { ICON_STROKE } from \"../icons.js\";\nimport \"../styles/commerce-ai-search.css\";\n\nexport interface CommerceAICheckoutProps {\n apiBaseUrl: string;\n theme?: ThemeMode;\n catalogLocale?: string;\n currency?: string;\n country?: string;\n messages?: Partial<CommerceAISearchMessages>;\n continueShoppingHref?: string;\n orderStatusHref?: string;\n onOrderPlaced?: (order: OrderSnapshot) => void;\n}\n\ninterface AddressFieldsProps {\n address: CheckoutAddress;\n messages: CommerceAISearchMessages;\n prefix: string;\n locale?: string;\n onChange: (address: CheckoutAddress) => void;\n}\n\nconst CHECKOUT_COUNTRY_CODES = [\n \"AT\",\n \"BE\",\n \"CH\",\n \"CZ\",\n \"DE\",\n \"DK\",\n \"ES\",\n \"FI\",\n \"FR\",\n \"GB\",\n \"IE\",\n \"IT\",\n \"NL\",\n \"NO\",\n \"PL\",\n \"PT\",\n \"SE\",\n \"US\",\n] as const;\n\nfunction checkoutCountryCodes(selected: string): string[] {\n const codes = new Set<string>(CHECKOUT_COUNTRY_CODES);\n const normalized = selected.trim().toUpperCase();\n if (normalized.length === 2) {\n codes.add(normalized);\n }\n return [...codes].sort();\n}\n\nfunction countryLabel(code: string, locale = \"en\"): string {\n try {\n return new Intl.DisplayNames([locale, \"en\"], { type: \"region\" }).of(code) ?? code;\n } catch {\n try {\n return new Intl.DisplayNames([\"en\"], { type: \"region\" }).of(code) ?? code;\n } catch {\n return code;\n }\n }\n}\n\nfunction createEmptyAddress(country: string): CheckoutAddress {\n return {\n firstName: \"\",\n lastName: \"\",\n streetName: \"\",\n postalCode: \"\",\n city: \"\",\n country,\n };\n}\n\nfunction AddressFields({\n address,\n messages,\n prefix,\n locale = \"en\",\n onChange,\n}: AddressFieldsProps) {\n function update(\n field: keyof CheckoutAddress,\n event: ChangeEvent<HTMLInputElement>,\n ) {\n onChange({ ...address, [field]: event.target.value });\n }\n\n return (\n <div className=\"cat-checkout__address-grid\">\n <label className=\"cat-checkout__field\">\n <span>{messages.firstName}</span>\n <input\n name={`${prefix}-firstName`}\n autoComplete=\"given-name\"\n required\n value={address.firstName}\n onChange={(event) => update(\"firstName\", event)}\n />\n </label>\n <label className=\"cat-checkout__field\">\n <span>{messages.lastName}</span>\n <input\n name={`${prefix}-lastName`}\n autoComplete=\"family-name\"\n required\n value={address.lastName}\n onChange={(event) => update(\"lastName\", event)}\n />\n </label>\n <label className=\"cat-checkout__field cat-checkout__field--wide\">\n <span>{messages.streetName}</span>\n <input\n name={`${prefix}-streetName`}\n autoComplete=\"address-line1\"\n required\n value={address.streetName}\n onChange={(event) => update(\"streetName\", event)}\n />\n </label>\n <label className=\"cat-checkout__field cat-checkout__field--wide\">\n <span>{messages.additionalAddress}</span>\n <input\n name={`${prefix}-additionalStreetInfo`}\n autoComplete=\"address-line2\"\n value={address.additionalStreetInfo ?? \"\"}\n onChange={(event) => update(\"additionalStreetInfo\", event)}\n />\n </label>\n <label className=\"cat-checkout__field\">\n <span>{messages.postalCode}</span>\n <input\n name={`${prefix}-postalCode`}\n autoComplete=\"postal-code\"\n required\n value={address.postalCode}\n onChange={(event) => update(\"postalCode\", event)}\n />\n </label>\n <label className=\"cat-checkout__field\">\n <span>{messages.city}</span>\n <input\n name={`${prefix}-city`}\n autoComplete=\"address-level2\"\n required\n value={address.city}\n onChange={(event) => update(\"city\", event)}\n />\n </label>\n <label className=\"cat-checkout__field\">\n <span>{messages.region}</span>\n <input\n name={`${prefix}-region`}\n autoComplete=\"address-level1\"\n value={address.region ?? \"\"}\n onChange={(event) => update(\"region\", event)}\n />\n </label>\n <label className=\"cat-checkout__field\">\n <span>{messages.country}</span>\n <select\n name={`${prefix}-country`}\n autoComplete=\"country\"\n required\n value={address.country}\n onChange={(event) =>\n onChange({ ...address, country: event.target.value.toUpperCase() })\n }\n >\n {checkoutCountryCodes(address.country).map((code) => (\n <option key={code} value={code}>\n {countryLabel(code, locale)}\n </option>\n ))}\n </select>\n </label>\n </div>\n );\n}\n\nfunction OrderSummary({\n cart,\n messages,\n}: {\n cart: NonNullable<ReturnType<typeof useCart>[\"cart\"]>;\n messages: CommerceAISearchMessages;\n}) {\n return (\n <section className=\"cat-checkout__bezel cat-checkout__summary\">\n <div className=\"cat-checkout__core\">\n <div className=\"cat-checkout__section-heading\">\n <Package size={18} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n <h2>{messages.orderSummary}</h2>\n </div>\n <ul className=\"cat-checkout__items\">\n {cart.lineItems.map((item) => (\n <li className=\"cat-checkout__item\" key={item.id}>\n <span className=\"cat-checkout__item-copy\">\n {item.imageUrl ? (\n <img src={item.imageUrl} alt=\"\" className=\"cat-checkout__item-image\" />\n ) : (\n <div className=\"cat-checkout__item-image cat-checkout__item-image--placeholder\">\n <Package size={16} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n </div>\n )}\n <span>\n {item.name}\n <small>× {item.quantity}</small>\n </span>\n </span>\n <strong>{item.price?.formatted ?? \"—\"}</strong>\n </li>\n ))}\n </ul>\n <div className=\"cat-checkout__summary-total\">\n <span>{messages.total}</span>\n <strong>{cart.totalPrice.formatted}</strong>\n </div>\n </div>\n </section>\n );\n}\n\nfunction ShippingMethodCard({\n method,\n selected,\n disabled,\n onSelect,\n}: {\n method: ShippingMethodSnapshot;\n selected: boolean;\n disabled: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n className={`cat-checkout__shipping-card${selected ? \" cat-checkout__shipping-card--selected\" : \"\"}`}\n disabled={disabled}\n aria-pressed={selected}\n onClick={onSelect}\n >\n <span className=\"cat-checkout__shipping-copy\">\n <strong>{method.name}</strong>\n {method.description ? <small>{method.description}</small> : null}\n </span>\n <span className=\"cat-checkout__shipping-price\">\n {method.price?.formatted ?? \"\"}\n <span className=\"cat-checkout__shipping-check\" aria-hidden=\"true\">\n {selected ? <Check size={14} strokeWidth={ICON_STROKE} /> : null}\n </span>\n </span>\n </button>\n );\n}\n\nexport function CommerceAICheckout({\n apiBaseUrl,\n theme = \"auto\",\n catalogLocale,\n currency,\n country = \"DE\",\n messages: messageOverrides,\n continueShoppingHref = \"/\",\n orderStatusHref = \"/orders\",\n onOrderPlaced,\n}: CommerceAICheckoutProps) {\n const messages = useMemo(\n () => resolveCommerceAISearchMessages(messageOverrides),\n [messageOverrides],\n );\n const cart = useCart({ apiBaseUrl, catalogLocale, currency, country });\n const [shippingAddress, setShippingAddress] = useState(() =>\n createEmptyAddress(country),\n );\n const [billingAddress, setBillingAddress] = useState(() =>\n createEmptyAddress(country),\n );\n const [billingMatchesShipping, setBillingMatchesShipping] = useState(true);\n const [shippingMethods, setShippingMethods] = useState<ShippingMethodSnapshot[]>([]);\n const [hasLoadedShippingMethods, setHasLoadedShippingMethods] = useState(false);\n const [selectedShippingMethodId, setSelectedShippingMethodId] = useState(\"\");\n const [paymentMethods, setPaymentMethods] = useState<PaymentMethodOption[]>([]);\n const [paymentMethodsLoaded, setPaymentMethodsLoaded] = useState(false);\n const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(\"\");\n const [authorizedPayment, setAuthorizedPayment] = useState<PaymentSnapshot | null>(null);\n const [order, setOrder] = useState<OrderSnapshot | null>(null);\n const [isPlacingOrder, setIsPlacingOrder] = useState(false);\n const [isPending, startTransition] = useTransition();\n\n function handleAddressSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n startTransition(async () => {\n const updated = await cart.setAddresses(\n shippingAddress,\n billingMatchesShipping ? undefined : billingAddress,\n );\n if (!updated) {\n return;\n }\n const [methods, payments] = await Promise.all([\n cart.getShippingMethods(),\n cart.getPaymentMethods(),\n ]);\n if (methods === null) {\n return;\n }\n setShippingMethods(methods);\n setHasLoadedShippingMethods(true);\n setSelectedShippingMethodId(updated.shippingMethod?.id ?? \"\");\n if (payments === null) {\n setPaymentMethods([]);\n setPaymentMethodsLoaded(false);\n } else {\n setPaymentMethods(payments);\n setPaymentMethodsLoaded(true);\n }\n setSelectedPaymentMethod(\"\");\n setAuthorizedPayment(null);\n });\n }\n\n function selectShippingMethod(methodId: string) {\n startTransition(async () => {\n const updated = await cart.setShippingMethod(methodId);\n if (updated) {\n setSelectedShippingMethodId(methodId);\n setSelectedPaymentMethod(\"\");\n setAuthorizedPayment(null);\n }\n });\n }\n\n function selectPaymentMethod(method: string) {\n if (\n authorizedPayment?.status === \"authorized\" &&\n authorizedPayment.method === method &&\n authorizedPayment.amount.amount === cart.cart?.totalPrice.amount &&\n authorizedPayment.amount.currency === cart.cart?.totalPrice.currency\n ) {\n return;\n }\n startTransition(async () => {\n const payment = await cart.authorizePayment(method);\n if (payment?.status === \"authorized\") {\n setSelectedPaymentMethod(method);\n setAuthorizedPayment(payment);\n }\n });\n }\n\n function placeOrder() {\n setIsPlacingOrder(true);\n startTransition(async () => {\n try {\n const placed = await cart.placeOrder();\n if (placed) {\n setOrder(placed);\n onOrderPlaced?.(placed);\n }\n } finally {\n setIsPlacingOrder(false);\n }\n });\n }\n\n if (order) {\n return (\n <main className=\"cat-root cat-checkout\" data-theme={theme}>\n <section className=\"cat-checkout__success cat-checkout__bezel\">\n <div className=\"cat-checkout__core\">\n <span className=\"cat-checkout__success-icon\" aria-hidden=\"true\">\n <Check size={24} strokeWidth={ICON_STROKE} />\n </span>\n <p className=\"cat-checkout__eyebrow\">{messages.checkout}</p>\n <h1>{messages.orderPlaced}</h1>\n <strong>{order.orderNumber ?? order.id}</strong>\n {(order.orderNumber || order.id) && orderStatusHref ? (\n <a\n className=\"cat-checkout__back\"\n href={`${orderStatusHref}?orderNumber=${encodeURIComponent(order.orderNumber ?? order.id)}`}\n >\n {messages.viewOrderStatus}\n </a>\n ) : null}\n <a className=\"cat-checkout__back\" href={continueShoppingHref}>\n <ArrowLeft size={15} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n {messages.continueShopping}\n </a>\n </div>\n </section>\n </main>\n );\n }\n\n if (!cart.cart) {\n return (\n <main className=\"cat-root cat-checkout\" data-theme={theme}>\n <section className=\"cat-checkout__empty cat-checkout__bezel\">\n <div className=\"cat-checkout__core\">\n <Package size={24} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n <h1>\n {cart.isLoading || !cart.anonymousId\n ? messages.searching\n : messages.emptyCart}\n </h1>\n <a className=\"cat-checkout__back\" href={continueShoppingHref}>\n <ArrowLeft size={15} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n {messages.continueShopping}\n </a>\n </div>\n </section>\n </main>\n );\n }\n\n const checkoutBusy = isPending || cart.isMutating || isPlacingOrder;\n const shippingReady =\n hasLoadedShippingMethods &&\n (shippingMethods.length === 0 || Boolean(selectedShippingMethodId));\n const paymentMethodsUnknown = hasLoadedShippingMethods && !paymentMethodsLoaded;\n const paymentOffered = paymentMethodsLoaded && paymentMethods.length > 0;\n const paymentRequired = paymentMethodsUnknown || paymentOffered;\n const paymentReady =\n !paymentRequired ||\n (authorizedPayment?.status === \"authorized\" &&\n authorizedPayment.amount.amount === cart.cart.totalPrice.amount &&\n authorizedPayment.amount.currency === cart.cart.totalPrice.currency);\n const canPlaceOrder = shippingReady && paymentReady;\n const placeOrderHint = !canPlaceOrder\n ? !hasLoadedShippingMethods\n ? messages.completeAddressToContinue\n : shippingMethods.length > 0 && !selectedShippingMethodId\n ? messages.selectDeliveryToContinue\n : paymentRequired && !paymentReady\n ? messages.selectPaymentToContinue\n : undefined\n : undefined;\n\n return (\n <main className=\"cat-root cat-checkout\" data-theme={theme}>\n <header className=\"cat-checkout__intro\">\n <p className=\"cat-checkout__eyebrow\">{messages.checkout}</p>\n <h1>{messages.checkoutTitle}</h1>\n <ol className=\"cat-checkout__steps\">\n <li\n className={`cat-checkout__step${hasLoadedShippingMethods ? \"\" : \" cat-checkout__step--current\"}`}\n aria-current={hasLoadedShippingMethods ? undefined : \"step\"}\n >\n {messages.checkoutStepAddress}\n </li>\n <li\n className={`cat-checkout__step${hasLoadedShippingMethods ? \" cat-checkout__step--current\" : \"\"}`}\n aria-current={hasLoadedShippingMethods && !paymentRequired ? \"step\" : undefined}\n >\n {messages.checkoutStepDelivery}\n </li>\n {paymentRequired ? (\n <li\n className={`cat-checkout__step${hasLoadedShippingMethods ? \" cat-checkout__step--current\" : \"\"}`}\n aria-current={hasLoadedShippingMethods ? \"step\" : undefined}\n >\n {messages.checkoutStepPayment}\n </li>\n ) : null}\n </ol>\n </header>\n\n {cart.error ? (\n <div className=\"cat-status cat-status--error\" role=\"alert\">\n {cart.error || messages.checkoutFailed}\n </div>\n ) : null}\n\n <div className=\"cat-checkout__layout\">\n <OrderSummary cart={cart.cart} messages={messages} />\n\n <div className=\"cat-checkout__flow\">\n <form\n className=\"cat-checkout__bezel\"\n onSubmit={handleAddressSubmit}\n >\n <div className=\"cat-checkout__core\">\n <div className=\"cat-checkout__section-heading\">\n <MapPin size={18} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n <h2>{messages.shippingAddress}</h2>\n </div>\n <AddressFields\n address={shippingAddress}\n messages={messages}\n prefix=\"shipping\"\n locale={catalogLocale}\n onChange={setShippingAddress}\n />\n <label className=\"cat-checkout__checkbox\">\n <input\n type=\"checkbox\"\n checked={billingMatchesShipping}\n onChange={(event) => setBillingMatchesShipping(event.target.checked)}\n />\n <span>{messages.billingSameAsShipping}</span>\n </label>\n {!billingMatchesShipping ? (\n <div className=\"cat-checkout__billing\">\n <h3>{messages.billingAddress}</h3>\n <AddressFields\n address={billingAddress}\n messages={messages}\n prefix=\"billing\"\n locale={catalogLocale}\n onChange={setBillingAddress}\n />\n </div>\n ) : null}\n <button\n className=\"cat-checkout__secondary\"\n type=\"submit\"\n disabled={checkoutBusy}\n >\n {messages.continueToDelivery}\n </button>\n </div>\n </form>\n\n {hasLoadedShippingMethods ? (\n <section className=\"cat-checkout__bezel\">\n <div className=\"cat-checkout__core\">\n <div className=\"cat-checkout__section-heading\">\n <Package size={18} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n <h2>{messages.shippingMethod}</h2>\n </div>\n {shippingMethods.length > 0 ? (\n <div\n className=\"cat-checkout__shipping-methods\"\n aria-label={messages.selectShippingMethod}\n >\n {shippingMethods.map((method) => (\n <ShippingMethodCard\n key={method.id}\n method={method}\n selected={selectedShippingMethodId === method.id}\n disabled={checkoutBusy}\n onSelect={() => selectShippingMethod(method.id)}\n />\n ))}\n </div>\n ) : (\n <p className=\"cat-checkout__empty-methods\">\n {messages.noShippingMethods}\n </p>\n )}\n </div>\n </section>\n ) : null}\n\n {shippingReady && paymentRequired ? (\n <section className=\"cat-checkout__bezel\">\n <div className=\"cat-checkout__core\">\n <div className=\"cat-checkout__section-heading\">\n <CreditCard size={18} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n <h2>{messages.paymentMethod}</h2>\n </div>\n <div\n className=\"cat-checkout__shipping-methods\"\n aria-label={messages.selectPaymentMethod}\n >\n {paymentMethods.map((method) => (\n <button\n key={method.method}\n type=\"button\"\n className={`cat-checkout__shipping-card${selectedPaymentMethod === method.method ? \" cat-checkout__shipping-card--selected\" : \"\"}`}\n disabled={checkoutBusy}\n aria-pressed={selectedPaymentMethod === method.method}\n onClick={() => selectPaymentMethod(method.method)}\n >\n <span className=\"cat-checkout__shipping-copy\">\n <strong>{method.name}</strong>\n {method.description ? <small>{method.description}</small> : null}\n </span>\n <span className=\"cat-checkout__shipping-price\">\n {authorizedPayment?.status === \"authorized\" &&\n authorizedPayment.method === method.method\n ? messages.paymentAuthorized\n : \"\"}\n <span className=\"cat-checkout__shipping-check\" aria-hidden=\"true\">\n {authorizedPayment?.status === \"authorized\" &&\n authorizedPayment.method === method.method ? (\n <Check size={14} strokeWidth={ICON_STROKE} />\n ) : null}\n </span>\n </span>\n </button>\n ))}\n </div>\n </div>\n </section>\n ) : null}\n </div>\n </div>\n\n <div className=\"cat-checkout__place-island\">\n <button\n type=\"button\"\n className=\"cat-checkout-cta\"\n disabled={!canPlaceOrder || checkoutBusy}\n onClick={placeOrder}\n aria-busy={checkoutBusy && canPlaceOrder ? true : undefined}\n aria-describedby={placeOrderHint ? \"cat-checkout-place-hint\" : undefined}\n >\n <span>{isPlacingOrder ? messages.placingOrder : messages.placeOrder}</span>\n <span className=\"cat-checkout-cta__icon\" aria-hidden=\"true\">\n <ArrowRight size={16} strokeWidth={ICON_STROKE} />\n </span>\n </button>\n {placeOrderHint ? (\n <p id=\"cat-checkout-place-hint\" className=\"cat-checkout__place-hint\">\n {placeOrderHint}\n </p>\n ) : null}\n </div>\n </main>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { ArrowLeft, Package, Truck } from \"lucide-react\";\nimport {\n resolveCommerceAISearchMessages,\n type CommerceAISearchMessages,\n type OrderSnapshot,\n type ThemeMode,\n} from \"@commerce-ai-tool/core/client\";\nimport { useCart } from \"../hooks/useCart.js\";\nimport { ICON_STROKE } from \"../icons.js\";\nimport \"../styles/commerce-ai-search.css\";\n\nexport interface CommerceAIOrderStatusProps {\n apiBaseUrl: string;\n orderNumber?: string;\n theme?: ThemeMode;\n catalogLocale?: string;\n currency?: string;\n country?: string;\n messages?: Partial<CommerceAISearchMessages>;\n continueShoppingHref?: string;\n orderStatusHref?: string;\n}\n\nfunction formatAddress(\n address: NonNullable<OrderSnapshot[\"shippingAddress\"]>,\n): string {\n return [\n `${address.firstName} ${address.lastName}`,\n address.streetName,\n address.additionalStreetInfo,\n `${address.postalCode} ${address.city}`,\n address.country,\n ]\n .filter(Boolean)\n .join(\", \");\n}\n\nfunction formatPlacedAt(iso: string): string {\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) {\n return iso;\n }\n const utc = date.toISOString();\n return `${utc.slice(0, 10)} ${utc.slice(11, 16)} UTC`;\n}\n\nfunction orderHref(orderStatusHref: string, orderNumber: string): string {\n const separator = orderStatusHref.includes(\"?\") ? \"&\" : \"?\";\n return `${orderStatusHref}${separator}orderNumber=${encodeURIComponent(orderNumber)}`;\n}\n\nfunction StatusBadge({ label, value }: { label: string; value?: string }) {\n if (!value) {\n return null;\n }\n return (\n <span className=\"cat-order-status__badge\">\n <small>{label}</small>\n {value}\n </span>\n );\n}\n\nexport function CommerceAIOrderStatus({\n apiBaseUrl,\n orderNumber = \"\",\n theme = \"auto\",\n catalogLocale,\n currency,\n country,\n messages: messageOverrides,\n continueShoppingHref = \"/\",\n orderStatusHref = \"/orders\",\n}: CommerceAIOrderStatusProps) {\n const messages = useMemo(\n () => resolveCommerceAISearchMessages(messageOverrides),\n [messageOverrides],\n );\n const cart = useCart({ apiBaseUrl, catalogLocale, currency, country });\n const trimmedNumber = orderNumber.trim();\n const [order, setOrder] = useState<OrderSnapshot | null>(null);\n const [orders, setOrders] = useState<OrderSnapshot[] | null>(null);\n const [loaded, setLoaded] = useState(false);\n\n useEffect(() => {\n if (!cart.anonymousId) {\n return;\n }\n let cancelled = false;\n setLoaded(false);\n setOrder(null);\n setOrders(null);\n const load = trimmedNumber\n ? cart.getOrder(trimmedNumber).then((next) => {\n if (!cancelled) {\n setOrder(next);\n setLoaded(true);\n }\n })\n : cart.listOrders().then((next) => {\n if (!cancelled) {\n setOrders(next);\n setLoaded(true);\n }\n });\n void load;\n return () => {\n cancelled = true;\n };\n }, [cart.anonymousId, cart.getOrder, cart.listOrders, trimmedNumber]);\n\n if (!loaded || cart.isLoading) {\n return (\n <main className=\"cat-root cat-checkout\" data-theme={theme}>\n <section className=\"cat-checkout__empty cat-checkout__bezel\">\n <div className=\"cat-checkout__core\">\n <Package size={24} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n <h1>{messages.searching}</h1>\n </div>\n </section>\n </main>\n );\n }\n\n if (!trimmedNumber) {\n if (!orders?.length) {\n return (\n <main className=\"cat-root cat-checkout\" data-theme={theme}>\n <section className=\"cat-checkout__empty cat-checkout__bezel\">\n <div className=\"cat-checkout__core\">\n <Package size={24} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n <h1>{messages.noOrdersYet}</h1>\n <a className=\"cat-checkout__back\" href={continueShoppingHref}>\n <ArrowLeft size={15} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n {messages.continueShopping}\n </a>\n </div>\n </section>\n </main>\n );\n }\n\n return (\n <main className=\"cat-root cat-checkout\" data-theme={theme}>\n <header className=\"cat-checkout__intro\">\n <p className=\"cat-checkout__eyebrow\">{messages.orderStatus}</p>\n <h1>{messages.yourOrders}</h1>\n </header>\n\n {cart.error ? (\n <div className=\"cat-status cat-status--error\" role=\"alert\">\n {cart.error}\n </div>\n ) : null}\n\n <section className=\"cat-checkout__bezel cat-checkout__summary\">\n <div className=\"cat-checkout__core\">\n <ul className=\"cat-order-status__list\">\n {orders.map((item) => {\n const number = item.orderNumber ?? item.id;\n return (\n <li key={item.id}>\n <a className=\"cat-order-status__list-link\" href={orderHref(orderStatusHref, number)}>\n <span className=\"cat-order-status__list-copy\">\n <strong>{number}</strong>\n {item.createdAt ? <small>{formatPlacedAt(item.createdAt)}</small> : null}\n </span>\n <span className=\"cat-order-status__list-meta\">\n {item.orderState ? <small>{item.orderState}</small> : null}\n <strong>{item.totalPrice.formatted}</strong>\n </span>\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n </section>\n\n <a className=\"cat-checkout__back\" href={continueShoppingHref}>\n <ArrowLeft size={15} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n {messages.continueShopping}\n </a>\n </main>\n );\n }\n\n if (!order) {\n return (\n <main className=\"cat-root cat-checkout\" data-theme={theme}>\n <section className=\"cat-checkout__empty cat-checkout__bezel\">\n <div className=\"cat-checkout__core\">\n <Package size={24} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n <h1>{messages.orderNotFound}</h1>\n <a className=\"cat-checkout__back\" href={continueShoppingHref}>\n <ArrowLeft size={15} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n {messages.continueShopping}\n </a>\n </div>\n </section>\n </main>\n );\n }\n\n return (\n <main className=\"cat-root cat-checkout\" data-theme={theme}>\n <header className=\"cat-checkout__intro\">\n <p className=\"cat-checkout__eyebrow\">{messages.orderStatus}</p>\n <h1>{order.orderNumber ?? order.id}</h1>\n <div className=\"cat-order-status__badges\">\n <StatusBadge label={messages.orderStatus} value={order.orderState} />\n <StatusBadge label={messages.paymentStateLabel} value={order.paymentState} />\n <StatusBadge label={messages.shipmentStateLabel} value={order.shipmentState} />\n </div>\n {order.createdAt ? (\n <p className=\"cat-order-status__placed\">\n {messages.orderPlacedAt} {formatPlacedAt(order.createdAt)}\n </p>\n ) : null}\n </header>\n\n {cart.error ? (\n <div className=\"cat-status cat-status--error\" role=\"alert\">\n {cart.error}\n </div>\n ) : null}\n\n <div className=\"cat-checkout__layout\">\n <section className=\"cat-checkout__bezel cat-checkout__summary\">\n <div className=\"cat-checkout__core\">\n <div className=\"cat-checkout__section-heading\">\n <Package size={18} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n <h2>{messages.orderSummary}</h2>\n </div>\n <ul className=\"cat-checkout__items\">\n {order.lineItems.map((item) => (\n <li className=\"cat-checkout__item\" key={item.id}>\n <span className=\"cat-checkout__item-copy\">\n {item.imageUrl ? (\n <img src={item.imageUrl} alt=\"\" className=\"cat-checkout__item-image\" />\n ) : (\n <div className=\"cat-checkout__item-image cat-checkout__item-image--placeholder\">\n <Package size={16} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n </div>\n )}\n <span>\n {item.name}\n <small>× {item.quantity}</small>\n </span>\n </span>\n <strong>{item.totalPrice?.formatted ?? item.price?.formatted ?? \"—\"}</strong>\n </li>\n ))}\n </ul>\n <div className=\"cat-checkout__summary-total\">\n <span>{messages.total}</span>\n <strong>{order.totalPrice.formatted}</strong>\n </div>\n </div>\n </section>\n\n <div className=\"cat-checkout__flow\">\n {order.shippingAddress ? (\n <section className=\"cat-checkout__bezel\">\n <div className=\"cat-checkout__core\">\n <h2>{messages.shippingAddress}</h2>\n <p className=\"cat-order-status__copy\">{formatAddress(order.shippingAddress)}</p>\n {order.shippingMethod ? (\n <p className=\"cat-order-status__copy\">{order.shippingMethod.name}</p>\n ) : null}\n </div>\n </section>\n ) : null}\n\n <section className=\"cat-checkout__bezel\">\n <div className=\"cat-checkout__core\">\n <div className=\"cat-checkout__section-heading\">\n <Truck size={18} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n <h2>{messages.shipmentStateLabel}</h2>\n </div>\n {order.deliveries?.length ? (\n <ul className=\"cat-order-status__tracking\">\n {order.deliveries.map((delivery) => (\n <li key={delivery.id}>\n <strong>{messages.trackingNumber}</strong>\n <span>{delivery.trackingId ?? \"—\"}</span>\n {delivery.carrier ? (\n <small>\n {messages.carrier}: {delivery.carrier}\n </small>\n ) : null}\n </li>\n ))}\n </ul>\n ) : (\n <p className=\"cat-checkout__empty-methods\">{messages.noTrackingYet}</p>\n )}\n </div>\n </section>\n </div>\n </div>\n\n <a className=\"cat-checkout__back\" href={continueShoppingHref}>\n <ArrowLeft size={15} strokeWidth={ICON_STROKE} aria-hidden=\"true\" />\n {messages.continueShopping}\n </a>\n </main>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport type { ThemeMode } from \"@commerce-ai-tool/core/client\";\n\nexport function useTheme(theme: ThemeMode = \"auto\"): ThemeMode {\n const [resolved, setResolved] = useState<\"light\" | \"dark\">(\"light\");\n\n useEffect(() => {\n if (theme === \"light\" || theme === \"dark\") {\n setResolved(theme);\n return;\n }\n\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const update = () => setResolved(media.matches ? \"dark\" : \"light\");\n update();\n media.addEventListener(\"change\", update);\n return () => media.removeEventListener(\"change\", update);\n }, [theme]);\n\n return theme === \"auto\" ? \"auto\" : resolved;\n}\n\nexport function useResolvedTheme(theme: ThemeMode = \"auto\"): \"light\" | \"dark\" | \"auto\" {\n const [resolved, setResolved] = useState<\"light\" | \"dark\">(\"light\");\n\n useEffect(() => {\n if (theme !== \"auto\") {\n setResolved(theme);\n return;\n }\n\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const update = () => setResolved(media.matches ? \"dark\" : \"light\");\n update();\n media.addEventListener(\"change\", update);\n return () => media.removeEventListener(\"change\", update);\n }, [theme]);\n\n return theme === \"auto\" ? \"auto\" : resolved;\n}\n"],"mappings":";;;AAAA,SAAS,eAAAA,cAAa,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AACvD;AAAA,EACE,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,gBAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;AC4OA,IAAM,sBAAsB;AC5I5B,IAAM,sCAAgE;EAC3E,aAAa;EACb,iBAAiB;EACjB,wBAAwB;EACxB,wBAAwB;EACxB,WAAW;EACX,iBAAiB;EACjB,aAAa;EACb,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACpB,WAAW;EACX,cAAc;EACd,oBAAoB;EACpB,uBAAuB;EACvB,eAAe;EACf,eAAe;EACf,cAAc;EACd,QAAQ;EACR,SAAS;EACT,cAAc;EACd,mBAAmB;EACnB,sBAAsB;EACtB,sBAAsB;EACtB,oBAAoB;EACpB,eAAe;EACf,kBAAkB;EAClB,cAAc;EACd,eAAe;EACf,WAAW;EACX,WAAW;EACX,MAAM;EACN,WAAW;EACX,YAAY;EACZ,OAAO;EACP,MAAM;EACN,eAAe;EACf,WAAW;EACX,kBAAkB;EAClB,kBAAkB;EAClB,WAAW;EACX,mBAAmB;EACnB,cAAc;EACd,iBAAiB;EACjB,eAAe;EACf,mBAAmB;EACnB,sBAAsB;EACtB,oBAAoB;EACpB,qBAAqB;EACrB,QAAQ;EACR,kBAAkB;EAClB,SAAS;EACT,OAAO;EACP,UAAU;EACV,YAAY;EACZ,oBAAoB;EACpB,cAAc;EACd,UAAU;EACV,eAAe;EACf,cAAc;EACd,iBAAiB;EACjB,gBAAgB;EAChB,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB;EAChB,sBAAsB;EACtB,mBAAmB;EACnB,2BAA2B;EAC3B,0BAA0B;EAC1B,yBAAyB;EACzB,qBAAqB;EACrB,sBAAsB;EACtB,qBAAqB;EACrB,eAAe;EACf,qBAAqB;EACrB,mBAAmB;EACnB,iBAAiB;EACjB,mBAAmB;EACnB,YAAY;EACZ,cAAc;EACd,aAAa;EACb,iBAAiB;EACjB,kBAAkB;EAClB,gBAAgB;EAChB,aAAa;EACb,eAAe;EACf,mBAAmB;EACnB,oBAAoB;EACpB,gBAAgB;EAChB,SAAS;EACT,eAAe;EACf,eAAe;EACf,aAAa;EACb,YAAY;EACZ,WAAW;EACX,UAAU;EACV,YAAY;EACZ,mBAAmB;EACnB,YAAY;EACZ,MAAM;EACN,QAAQ;EACR,SAAS;AACX;AAEO,SAAS,gCACd,WAC0B;AAC1B,SAAO;IACL,GAAG;IACH,GAAG;EACL;AACF;AC9NA,IAAM,iCAAiC;AAMhC,SAAS,8BAA8B,OAAwB;AACpE,SAAO,+BAA+B,KAAK,MAAM,KAAK,CAAC;AACzD;ACPA,IAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8I9B,IAAM,eAAe;AAIrB,IAAM,eAA6B,sBAAsB,KAAK,EAC3D,MAAM,IAAI,EACV,QAAQ,CAAC,SAAS;AACjB,QAAM,YAAY,KAAK,QAAQ,GAAG;AAClC,MAAI,aAAa,GAAG;AAClB,WAAO,CAAC;EACV;AACA,QAAM,OAAO,KAAK,MAAM,GAAG,SAAS;AACpC,QAAM,MAAM,KAAK,MAAM,YAAY,CAAC;AACpC,QAAM,IAAI,OAAO,SAAS,KAAK,EAAE;AACjC,MAAI,CAAC,QAAQ,CAAC,OAAO,SAAS,CAAC,GAAG;AAChC,WAAO,CAAC;EACV;AACA,SAAO,CAAC,EAAE,MAAM,GAAI,KAAK,KAAM,KAAK,GAAI,KAAK,IAAK,KAAK,GAAG,IAAI,IAAI,CAAC;AACrE,CAAC;AAEH,SAAS,YAAY,OAAgD;AACnE,QAAM,QAAQ,aAAa,KAAK,MAAM,KAAK,CAAC;AAC5C,QAAM,WAAW,QAAQ,CAAC;AAC1B,MAAI,CAAC,UAAU;AACb,WAAO;EACT;AACA,QAAM,MACJ,SAAS,WAAW,IAChB,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,KACpF;AACN,QAAM,IAAI,OAAO,SAAS,KAAK,EAAE;AACjC,SAAO,CAAE,KAAK,KAAM,KAAM,KAAK,IAAK,KAAK,IAAI,GAAG;AAClD;AAwBA,IAAM,8BAA8B,KAAK;AAEzC,IAAM,wBAAwB;AAGvB,SAAS,qBAAqB,MAAuB;AAC1D,SAAO,sBAAsB,KAAK,KAAK,KAAK,CAAC;AAC/C;AAQO,SAAS,oBAAoB,OAAmC;AACrE,QAAM,MAAM,YAAY,KAAK;AAC7B,MAAI,CAAC,KAAK;AACR,WAAO;EACT;AACA,SAAO,IAAI,IAAI,IAAI,CAAC,YAAY,QAAQ,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AACjF;ACnNO,IAAM,iBAAiB;AACvB,IAAM,sBAAsB;AAE5B,IAAM,uBAAuB;EAClC,EAAE,KAAK,YAAY,IAAI,IAAM;EAC7B,EAAE,KAAK,aAAa,MAAM,KAAO,IAAI,IAAO;EAC5C,EAAE,KAAK,YAAY,MAAM,IAAO;AAClC;AAKO,SAAS,yBACd,OACyD;AACzD,QAAM,UAAmE,CAAC;AAC1E,MAAI,UAAU,SAAS,MAAM,SAAS,QAAW;AAC/C,YAAQ,WAAW,OAAO,MAAM,OAAO,GAAG;EAC5C;AACA,MAAI,QAAQ,SAAS,MAAM,OAAO,QAAW;AAC3C,YAAQ,WAAW,OAAO,MAAM,KAAK,GAAG;EAC1C;AACA,SAAO;AACT;AAEO,SAAS,0BACd,SACoB;AACpB,QAAM,WAAW,kBAAkB,QAAQ,QAAQ;AACnD,QAAM,WAAW,kBAAkB,QAAQ,QAAQ;AAEnD,aAAW,SAAS,sBAAsB;AACxC,UAAM,OAAO,UAAU,QAAQ,MAAM,OAAO;AAC5C,UAAM,KAAK,QAAQ,QAAQ,MAAM,KAAK;AACtC,QAAI,aAAa,QAAQ,aAAa,IAAI;AACxC,aAAO,MAAM;IACf;EACF;AACA,SAAO;AACT;AAEO,SAAS,sBACd,SACA,SACA,WACS;AACT,MAAI,YAAY,qBAAqB;AACnC,WAAO,QAAQ,aAAa;EAC9B;AACA,MAAI,YAAY,gBAAgB;AAC9B,WAAO,0BAA0B,OAAO,MAAM;EAChD;AACA,SAAO,QAAQ,OAAO,MAAM;AAC9B;AAMO,SAAS,kBACd,SACA,SACA,WAC0B;AAC1B,QAAM,OAAO,EAAE,GAAG,QAAQ;AAE1B,MAAI,YAAY,gBAAgB;AAC9B,QAAI,0BAA0B,IAAI,MAAM,WAAW;AACjD,aAAO,KAAK;AACZ,aAAO,KAAK;AACZ,aAAO;IACT;AACA,WAAO,KAAK;AACZ,WAAO,KAAK;AACZ,UAAM,QAAQ,qBAAqB,KAAK,CAAC,cAAc,UAAU,QAAQ,SAAS;AAClF,QAAI,CAAC,OAAO;AACV,aAAO;IACT;AACA,WAAO,EAAE,GAAG,MAAM,GAAG,yBAAyB,KAAK,EAAE;EACvD;AAEA,QAAM,YAAY,YAAY,sBAAsB,aAAa;AACjE,MAAI,KAAK,SAAS,MAAM,WAAW;AACjC,WAAO,KAAK,SAAS;EACvB,OAAO;AACL,SAAK,SAAS,IAAI;EACpB;AACA,SAAO;AACT;AA4OA,SAAS,kBAAkB,OAAoC;AAC7D,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AACA,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,SAAS,GAAG;AAC1C,WAAO;EACT;AACA,SAAO,KAAK,MAAM,SAAS,GAAG;AAChC;;;ACtVA,SAAS,aAAa,WAAW,SAAS,QAAQ,gBAAoD;AAwB/F,SAAS,mBAAmB,SAAoD;AACrF,QAAM,UAAkC,CAAC;AACzC,QAAM,cAAc,QAAQ,eAAe,QAAQ;AAEnD,MAAI,QAAQ,eAAe;AACzB,YAAQ,gBAAgB,QAAQ;AAAA,EAClC;AAEA,MAAI,aAAa;AACf,YAAQ,cAAc;AAAA,EACxB;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,UAAoB,SAAkC;AACvF,QAAM,UAAU,mBAAmB,OAAO;AAC1C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,aAAS,OAAO,KAAK,KAAK;AAAA,EAC5B;AACF;AA+CO,SAAS,oBACd,SAC2B;AAC3B,QAAM;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,IACb,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,gBAAgB;AAAA,IACpB,MAAM,mBAAmB,EAAE,aAAa,eAAe,OAAO,CAAC;AAAA,IAC/D,CAAC,aAAa,eAAe,MAAM;AAAA,EACrC;AACA,QAAM,CAAC,OAAO,aAAa,IAAI,SAAS,EAAE;AAC1C,QAAM,CAAC,aAAa,cAAc,IAAI,SAAmB,CAAC,CAAC;AAC3D,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAAS,KAAK;AACtE,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAwB,IAAI;AAC5E,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,KAAK;AAC9D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAwB,CAAC,CAAC;AACxD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAqC,IAAI;AACvE,QAAM,CAAC,MAAM,OAAO,IAAI,SAAsC,IAAI;AAClE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA6B,CAAC,CAAC;AAC3D,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAA2B,CAAC,CAAC;AAC3E,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAoC,IAAI;AAClF,QAAM,cAAc,OAA6C,IAAI;AACrE,QAAM,yBAAyB,OAA6C,IAAI;AAChF,QAAM,WAAW,OAA+B,IAAI;AACpD,QAAM,sBAAsB,OAA+B,IAAI;AAC/D,QAAM,eAAe,OAAO,CAAC;AAC7B,QAAM,0BAA0B,OAAO,CAAC;AACxC,QAAM,WAAW,OAAO,KAAK;AAC7B,WAAS,UAAU;AAEnB,QAAM,UAAU,WAAW,QAAQ,OAAO,EAAE;AAC5C,QAAM,oBAAoB,sBAAsB,OAAO;AAEvD,YAAU,MAAM;AACd,QAAI,CAAC,gBAAgB,CAAC,kBAAkB,OAAO,WAAW,YAAa;AACvE,UAAM,SAAS,OAAO,eAAe,QAAQ,iBAAiB;AAC9D,QAAI,CAAC,OAAQ;AACb,QAAI;AACF,uBAAiB,KAAK,MAAM,MAAM,CAAuB;AAAA,IAC3D,QAAQ;AACN,aAAO,eAAe,WAAW,iBAAiB;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,cAAc,gBAAgB,iBAAiB,CAAC;AAEpD,YAAU,MAAM;AACd,QAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,iBAAiB,OAAO,WAAW,YAAa;AACzF,WAAO,eAAe,QAAQ,mBAAmB,KAAK,UAAU,aAAa,CAAC;AAAA,EAChF,GAAG,CAAC,cAAc,gBAAgB,eAAe,iBAAiB,CAAC;AAEnE,QAAM,eAAe,YAAY,MAAM;AACrC,aAAS,SAAS,MAAM;AACxB,aAAS,UAAU;AACnB,wBAAoB,SAAS,MAAM;AACnC,wBAAoB,UAAU;AAC9B,QAAI,YAAY,SAAS;AACvB,mBAAa,YAAY,OAAO;AAChC,kBAAY,UAAU;AAAA,IACxB;AACA,QAAI,uBAAuB,SAAS;AAClC,mBAAa,uBAAuB,OAAO;AAC3C,6BAAuB,UAAU;AAAA,IACnC;AACA,eAAW,CAAC,CAAC;AACb,eAAW,IAAI;AACf,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,iBAAa,KAAK;AAClB,mBAAe,KAAK;AACpB,mBAAe,CAAC,CAAC;AACjB,wBAAoB,IAAI;AACxB,4BAAwB,KAAK;AAC7B,wBAAoB,KAAK;AACzB,cAAU,CAAC,CAAC;AACZ,uBAAmB,CAAC,CAAC;AACrB,qBAAiB,IAAI;AACrB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,WAAW,iBAAiB;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,iBAAiB,CAAC;AAEtB,QAAM,mBAAmB;AAAA,IACvB,OAAO,gBAAwB;AAC7B,YAAM,UAAU,YAAY,KAAK;AACjC,UAAI,CAAC,sBAAsB,QAAQ,SAAS,GAAG;AAC7C,uBAAe,CAAC,CAAC;AACjB,4BAAoB,IAAI;AACxB,gCAAwB,KAAK;AAC7B,4BAAoB,KAAK;AACzB;AAAA,MACF;AAEA,0BAAoB,SAAS,MAAM;AACnC,YAAM,aAAa,IAAI,gBAAgB;AACvC,0BAAoB,UAAU;AAC9B,YAAM,YAAY,EAAE,wBAAwB;AAE5C,8BAAwB,IAAI;AAC5B,0BAAoB,IAAI;AACxB,0BAAoB,KAAK;AAEzB,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,GAAG,OAAO,uBAAuB;AAAA,UAC5D,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,SAAS,GAAG,cAAc,CAAC;AAAA,UACzD,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAMC,QAAQ,MAAM,SAAS,KAAK;AAClC,gBAAM,IAAI,MAAMA,MAAK,SAAS,oBAAoB;AAAA,QACpD;AAEA,cAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,YAAI,cAAc,wBAAwB,QAAS;AAEnD,uBAAe,KAAK,WAAW;AAAA,MACjC,SAAS,KAAK;AACZ,YAAI,eAAe,gBAAgB,IAAI,SAAS,aAAc;AAC9D,YAAI,cAAc,wBAAwB,QAAS;AAEnD,uBAAe,CAAC,CAAC;AACjB,4BAAoB,eAAe,QAAQ,IAAI,UAAU,oBAAoB;AAAA,MAC/E,UAAE;AACA,YAAI,cAAc,wBAAwB,SAAS;AACjD,kCAAwB,KAAK;AAC7B,8BAAoB,IAAI;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,SAAS,oBAAoB,aAAa;AAAA,EAC7C;AAEA,QAAM,oBAAoB;AAAA,IACxB,CAAC,MAAoB,iBAA0B;AAC7C,iBAAW,KAAK,QAAQ;AACxB,iBAAW,KAAK,WAAW,IAAI;AAC/B,cAAQ,KAAK,IAAI;AACjB,gBAAU,KAAK,UAAU,CAAC,CAAC;AAC3B,yBAAmB,KAAK,mBAAmB,CAAC,CAAC;AAC7C,UAAI,KAAK,SAAS;AAChB,yBAAiB,IAAI;AACrB,YAAI,OAAO,WAAW,aAAa;AACjC,iBAAO,eAAe,WAAW,iBAAiB;AAAA,QACpD;AAAA,MACF,WAAW,gBAAgB,KAAK,KAAK,aAAa;AAChD,yBAAiB;AAAA,UACf,OAAO,cAAc,KAAK,KAAK,SAAS,WAAW,KAAK,KAAK,uBAAuB;AAAA,UACpF,aAAa,KAAK,KAAK;AAAA,UACvB,gBAAgB,KAAK,KAAK,kBAAkB,CAAC;AAAA,UAC7C,iBAAiB,KAAK,mBAAmB,CAAC;AAAA,UAC1C,aAAa,KAAK;AAAA,UAClB,YAAY,KAAK,KAAK;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,cAAc,iBAAiB;AAAA,EAClC;AAEA,QAAM,SAAS;AAAA,IACb,OAAO,gBAAyB;AAC9B,YAAM,KAAK,eAAe,SAAS,SAAS,KAAK;AACjD,UAAI,CAAC,EAAG;AAER,UAAI,YAAY,SAAS;AACvB,qBAAa,YAAY,OAAO;AAChC,oBAAY,UAAU;AAAA,MACxB;AACA,UAAI,uBAAuB,SAAS;AAClC,qBAAa,uBAAuB,OAAO;AAC3C,+BAAuB,UAAU;AAAA,MACnC;AAEA,eAAS,SAAS,MAAM;AACxB,YAAM,aAAa,IAAI,gBAAgB;AACvC,eAAS,UAAU;AACnB,YAAM,YAAY,EAAE,aAAa;AAEjC,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,iBAAW,CAAC,CAAC;AACb,iBAAW,IAAI;AACf,cAAQ,IAAI;AACZ,qBAAe,CAAC,CAAC;AACjB,0BAAoB,IAAI;AAExB,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,GAAG,OAAO,WAAW;AAAA,UAChD,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO;AAAA,YACP,eAAe;AAAA,YACf,GAAI,iBAAiB,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAAA,YACjD,GAAG;AAAA,UACL,CAAC;AAAA,UACD,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAMA,QAAQ,MAAM,SAAS,KAAK;AAClC,gBAAM,IAAI,MAAMA,MAAK,SAAS,eAAe;AAAA,QAC/C;AAEA,cAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,YAAI,cAAc,aAAa,QAAS;AAExC,0BAAkB,MAAM,CAAC;AAAA,MAC3B,SAAS,KAAK;AACZ,YAAI,eAAe,gBAAgB,IAAI,SAAS,aAAc;AAC9D,YAAI,cAAc,aAAa,QAAS;AAExC,iBAAS,eAAe,QAAQ,IAAI,UAAU,eAAe;AAC7D,mBAAW,CAAC,CAAC;AACb,mBAAW,IAAI;AACf,gBAAQ,IAAI;AAAA,MACd,UAAE;AACA,YAAI,cAAc,aAAa,SAAS;AACtC,uBAAa,KAAK;AAClB,yBAAe,IAAI;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,mBAAmB,SAAS,cAAc,gBAAgB,aAAa;AAAA,EAC1E;AAEA,QAAM,mBAAmB;AAAA,IACvB,OACE,SAIG;AACH,UAAI,CAAC,cAAe;AAEpB,eAAS,SAAS,MAAM;AACxB,YAAM,aAAa,IAAI,gBAAgB;AACvC,eAAS,UAAU;AACnB,YAAM,YAAY,EAAE,aAAa;AACjC,mBAAa,IAAI;AACjB,eAAS,IAAI;AAEb,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,GAAG,OAAO,WAAW;AAAA,UAChD,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO,cAAc;AAAA,YACrB,aAAa,cAAc;AAAA,YAC3B,SAAS,KAAK,WAAW,cAAc;AAAA,YACvC,aAAa,KAAK;AAAA,YAClB,iBAAiB,cAAc;AAAA,YAC/B,eAAe;AAAA,YACf,GAAG;AAAA,UACL,CAAC;AAAA,UACD,QAAQ,WAAW;AAAA,QACrB,CAAC;AACD,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAMA,QAAQ,MAAM,SAAS,KAAK;AAClC,gBAAM,IAAI,MAAMA,MAAK,SAAS,0BAA0B;AAAA,QAC1D;AACA,cAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,YAAI,cAAc,aAAa,QAAS;AACxC,0BAAkB,MAAM,cAAc,KAAK;AAAA,MAC7C,SAAS,KAAK;AACZ,YAAI,eAAe,gBAAgB,IAAI,SAAS,aAAc;AAC9D,YAAI,cAAc,aAAa,SAAS;AACtC,mBAAS,eAAe,QAAQ,IAAI,UAAU,0BAA0B;AAAA,QAC1E;AAAA,MACF,UAAE;AACA,YAAI,cAAc,aAAa,SAAS;AACtC,uBAAa,KAAK;AAClB,yBAAe,IAAI;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,mBAAmB,SAAS,eAAe,aAAa;AAAA,EAC3D;AAEA,QAAM,gBAAgB;AAAA,IACpB,OAAO,YAAsC,iBAAiB,EAAE,QAAQ,CAAC;AAAA,IACzE,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,SAAS;AAAA,IACb,OAAO,gBAAwB;AAC7B,YAAM,UAAU,YAAY,KAAK;AACjC,UAAI,QAAS,OAAM,iBAAiB,EAAE,aAAa,QAAQ,CAAC;AAAA,IAC9D;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,iBAAiB,YAAY,YAAY;AAC7C,UAAM,gBAAgB,eAAe;AACrC,UAAM,KAAK,SAAS,QAAQ,KAAK,KAAK,iBAAiB,IAAI,KAAK;AAChE,qBAAiB,IAAI;AACrB,cAAU,CAAC,CAAC;AACZ,uBAAmB,CAAC,CAAC;AACrB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,WAAW,iBAAiB;AAAA,IACpD;AACA,QAAI,GAAG;AACL,UAAI,CAAC,SAAS,QAAQ,KAAK,KAAK,eAAe;AAC7C,sBAAc,aAAa;AAAA,MAC7B;AACA,YAAM,OAAO,CAAC;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,QAAQ,eAAe,OAAO,iBAAiB,CAAC;AAEpD,QAAM,gBAAgB;AAAA,IACpB,OAAO,SAAe;AACpB,eAAS,SAAS,MAAM;AACxB,UAAI,YAAY,SAAS;AACvB,qBAAa,YAAY,OAAO;AAChC,oBAAY,UAAU;AAAA,MACxB;AACA,UAAI,uBAAuB,SAAS;AAClC,qBAAa,uBAAuB,OAAO;AAC3C,+BAAuB,UAAU;AAAA,MACnC;AAEA,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,iBAAW,CAAC,CAAC;AACb,iBAAW,IAAI;AACf,cAAQ,IAAI;AACZ,qBAAe,CAAC,CAAC;AAEjB,UAAI;AACF,cAAM,WAAW,IAAI,SAAS;AAC9B,iBAAS,OAAO,SAAS,IAAI;AAC7B,2BAAmB,UAAU,EAAE,aAAa,eAAe,OAAO,CAAC;AACnE,YAAI,gBAAgB;AAClB,mBAAS,OAAO,kBAAkB,MAAM;AAAA,QAC1C;AAEA,cAAM,WAAW,MAAM,MAAM,GAAG,OAAO,iBAAiB;AAAA,UACtD,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAMA,QAAQ,MAAM,SAAS,KAAK;AAClC,gBAAM,IAAI,MAAMA,MAAK,SAAS,qBAAqB;AAAA,QACrD;AAEA,cAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,0BAAkB,MAAM,KAAK,cAAc;AAC3C,YAAI,KAAK,gBAAgB;AACvB,wBAAc,KAAK,cAAc;AAAA,QACnC;AAAA,MACF,SAAS,KAAK;AACZ,iBAAS,eAAe,QAAQ,IAAI,UAAU,qBAAqB;AACnE,mBAAW,CAAC,CAAC;AACb,mBAAW,IAAI;AACf,gBAAQ,IAAI;AAAA,MACd,UAAE;AACA,qBAAa,KAAK;AAClB,uBAAe,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,IACA,CAAC,mBAAmB,SAAS,eAAe,gBAAgB,QAAQ,WAAW;AAAA,EACjF;AAEA,QAAM,WAAW;AAAA,IACf,CAAC,OAAeC,aAA8B;AAC5C,oBAAc,KAAK;AAEnB,UAAIA,UAAS,WAAW,OAAO;AAC7B,YAAI,YAAY,SAAS;AACvB,uBAAa,YAAY,OAAO;AAChC,sBAAY,UAAU;AAAA,QACxB;AACA,YAAI,uBAAuB,SAAS;AAClC,uBAAa,uBAAuB,OAAO;AAC3C,iCAAuB,UAAU;AAAA,QACnC;AACA;AAAA,MACF;AAEA,UAAI,YAAY,QAAS,cAAa,YAAY,OAAO;AACzD,UAAI,uBAAuB,QAAS,cAAa,uBAAuB,OAAO;AAE/E,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,QAAQ,WAAW,KAAK,QAAQ,SAAS,GAAG;AAC9C,qBAAa;AACb;AAAA,MACF;AAEA,UAAI,oBAAoB;AAEtB,mBAAW,CAAC,CAAC;AACb,mBAAW,IAAI;AACf,iBAAS,IAAI;AACb,qBAAa,KAAK;AAClB,uBAAe,KAAK;AACpB,gCAAwB,IAAI;AAC5B,4BAAoB,IAAI;AACxB,+BAAuB,UAAU,WAAW,MAAM;AAChD,eAAK,iBAAiB,OAAO;AAAA,QAC/B,GAAG,qBAAqB;AACxB;AAAA,MACF;AAEA,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,iBAAW,CAAC,CAAC;AACb,iBAAW,IAAI;AACf,cAAQ,IAAI;AAEZ,kBAAY,UAAU,WAAW,MAAM;AACrC,aAAK,OAAO,OAAO;AAAA,MACrB,GAAG,UAAU;AAAA,IACf;AAAA,IACA,CAAC,YAAY,oBAAoB,kBAAkB,cAAc,QAAQ,qBAAqB;AAAA,EAChG;AAEA,QAAM,mBAAmB;AAAA,IACvB,CAAC,eAAuB;AACtB,oBAAc,UAAU;AACxB,qBAAe,CAAC,CAAC;AACjB,0BAAoB,IAAI;AACxB,WAAK,OAAO,UAAU;AAAA,IACxB;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,QAAQ,YAAY,MAAM;AAC9B,kBAAc,EAAE;AAChB,iBAAa;AAAA,EACf,GAAG,CAAC,YAAY,CAAC;AAEjB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,kBAAkB;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACtjBA,SAAS,eAAAC,cAAa,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgC;;;ACElE,SAAS,sBAA+B;AAC7C,MAAI,OAAO,cAAc,YAAa,QAAO;AAE7C,SACE,4BAA4B,KAAK,UAAU,SAAS,KACnD,UAAU,iBAAiB,KAAK,WAAW,mBAAmB,EAAE;AAErE;AAEO,SAAS,gBAAgB,QAAkC;AAChE,UAAQ,UAAU,EAAE,QAAQ,CAAC,UAAU,MAAM,KAAK,CAAC;AACrD;AAEO,SAAS,sBAAsB,OAAwB;AAC5D,MAAI,iBAAiB,cAAc;AACjC,QAAI,MAAM,SAAS,qBAAqB,MAAM,SAAS,yBAAyB;AAC9E,aAAO;AAAA,IACT;AACA,QAAI,MAAM,SAAS,mBAAmB,MAAM,SAAS,wBAAwB;AAC3E,aAAO;AAAA,IACT;AACA,QAAI,MAAM,SAAS,sBAAsB,MAAM,SAAS,mBAAmB;AACzE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,wBACd,OACA,WAAW,sBACI;AACf,QAAM,QAAQ,MAAM;AACpB,QAAM,SAAS,MAAM;AAErB,MAAI,CAAC,SAAS,CAAC,QAAQ;AACrB,WAAO,QAAQ,OAAO,IAAI,MAAM,6BAA6B,CAAC;AAAA,EAChE;AAEA,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ;AACf,SAAO,SAAS;AAEhB,QAAM,UAAU,OAAO,WAAW,IAAI;AACtC,MAAI,CAAC,SAAS;AACZ,WAAO,QAAQ,OAAO,IAAI,MAAM,yBAAyB,CAAC;AAAA,EAC5D;AAEA,UAAQ,UAAU,OAAO,GAAG,GAAG,OAAO,MAAM;AAE5C,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAO;AAAA,MACL,CAAC,SAAS;AACR,YAAI,CAAC,MAAM;AACT,iBAAO,IAAI,MAAM,yBAAyB,CAAC;AAC3C;AAAA,QACF;AAEA,gBAAQ,IAAI,KAAK,CAAC,IAAI,GAAG,UAAU,EAAE,MAAM,aAAa,CAAC,CAAC;AAAA,MAC5D;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,SAAS,uBAAuB,YAAsD;AAC3F,SAAO;AAAA,IACL,OAAO;AAAA,MACL,YAAY,EAAE,OAAO,WAAW;AAAA,MAChC,OAAO,EAAE,OAAO,KAAK;AAAA,MACrB,QAAQ,EAAE,OAAO,KAAK;AAAA,IACxB;AAAA,IACA,OAAO;AAAA,EACT;AACF;;;ADpDO,SAAS,iBACd,UAAmC,CAAC,GACZ;AACxB,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,KAAK;AAC1C,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAA6B,IAAI;AAC7D,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,YAAYC,QAA2B,IAAI;AAEjD,QAAM,QAAQC,aAAY,MAAM;AAC9B,oBAAgB,UAAU,OAAO;AACjC,cAAU,UAAU;AACpB,cAAU,IAAI;AACd,cAAU,KAAK;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,QAAM,aAAaA,aAAY,MAAM;AACnC,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,QAAM,cAAcA,aAAY,YAAY;AAC1C,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,cAAc,MAAM,UAAU,aAAa;AAAA,QAC/C,uBAAuB,UAAU;AAAA,MACnC;AACA,gBAAU,UAAU;AACpB,gBAAU,WAAW;AACrB,gBAAU,IAAI;AAAA,IAChB,SAAS,KAAK;AACZ,eAAS,sBAAsB,GAAG,CAAC;AACnC,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,OAAO,UAAU,CAAC;AAEtB,QAAM,OAAOA;AAAA,IACX,CAAC,mBAAuD;AACtD,eAAS,IAAI;AAEb,UAAI,oBAAoB,GAAG;AACzB,uBAAe,SAAS,MAAM;AAC9B;AAAA,MACF;AAEA,WAAK,YAAY;AAAA,IACnB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,eAAeA;AAAA,IACnB,OAAO,UAA4B;AACjC,YAAM,OAAO,MAAM,wBAAwB,KAAK;AAChD,YAAM;AACN,aAAO;AAAA,IACT;AAAA,IACA,CAAC,KAAK;AAAA,EACR;AAEA,EAAAC,WAAU,MAAM;AACd,WAAO,MAAM;AACX,sBAAgB,UAAU,OAAO;AACjC,gBAAU,UAAU;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AEvGA,SAAS,eAAAC,cAAa,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AAYlD,IAAM,2BAA2B;AACjC,IAAM,+BAA+B;AACrC,IAAM,uBAAuB;AAkEpC,SAAS,YAAY,KAA4B;AAC/C,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,OAAO,aAAa,QAAQ,GAAG;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,KAAa,OAAqB;AACtD,MAAI,OAAO,WAAW,aAAa;AACjC;AAAA,EACF;AACA,MAAI;AACF,WAAO,aAAa,QAAQ,KAAK,KAAK;AAAA,EACxC,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,cAAc,KAAmB;AACxC,MAAI,OAAO,WAAW,aAAa;AACjC;AAAA,EACF;AACA,MAAI;AACF,WAAO,aAAa,WAAW,GAAG;AAAA,EACpC,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,qBAA8C;AACrD,QAAM,MAAM,YAAY,oBAAoB;AAC5C,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,OAAO,OAAO,OAAO,YAAY,OAAO,OAAO,UAAU,UAAU;AACrE,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,oBAA4B;AAC1C,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AAC5E,WAAO,OAAO,WAAW;AAAA,EAC3B;AACA,SAAO,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACtE;AAEO,SAAS,yBAAiC;AAC/C,QAAM,WAAW,YAAY,wBAAwB;AACrD,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,QAAM,UAAU,kBAAkB;AAClC,eAAa,0BAA0B,OAAO;AAC9C,SAAO;AACT;AAEA,SAAS,oBAA4B;AACnC,QAAM,UAAU,kBAAkB;AAClC,eAAa,0BAA0B,OAAO;AAC9C,SAAO;AACT;AAIA,IAAM,oBAAoB,oBAAI,IAAsB;AACpD,IAAI,cAAc;AAElB,SAAS,aAAa,UAAkB,MAAiC;AACvE,aAAW,YAAY,mBAAmB;AACxC,aAAS,UAAU,IAAI;AAAA,EACzB;AACF;AAEA,IAAM,mBAAN,cAA+B,MAAM;AAAA,EACnC;AAAA,EAEA,YAAY,SAAiB,QAAgB;AAC3C,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AACF;AAEA,eAAe,aAAa,UAA0C;AACpE,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,iBAAiB,KAAK,SAAS,uBAAuB,SAAS,MAAM;AAAA,EACjF;AACA,SAAO;AACT;AAEO,SAAS,QAAQ,SAAwC;AAC9D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,aAAa,cAAc,IAAIC,UAAS,EAAE;AACjD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAwB,IAAI;AACpE,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAkC,IAAI;AACtE,QAAM,CAAC,MAAM,OAAO,IAAIA,UAA8B,IAAI;AAC1D,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,kBAAkBC,QAAO,YAAY;AAC3C,kBAAgB,UAAU;AAC1B,QAAM,UAAUA,QAA4B,IAAI;AAChD,QAAM,kBAAkBA,QAAsB,IAAI;AAClD,QAAM,mBAAmBA,QAAO,QAAQ,QAAiB,MAAS,CAAC;AACnE,QAAM,iBAAiBA,QAAsB,IAAI;AACjD,QAAM,CAAC,MAAM,IAAID,UAAS,MAAM;AAC9B,mBAAe;AACf,WAAO;AAAA,EACT,CAAC;AAED,QAAM,YAAYE,aAAY,CAAC,MAA2B,OAAO,SAAS;AACxE,YAAQ,UAAU;AAClB,YAAQ,IAAI;AACZ,oBAAgB,UAAU,IAAI;AAC9B,QAAI,MAAM;AACR,mBAAa,QAAQ,IAAI;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,iBAAiBA,aAAY,CAAC,OAAe,iBAAmC;AACpF,oBAAgB,UAAU;AAC1B,oBAAgB,KAAK;AACrB,gBAAY,YAAY;AACxB,iBAAa,8BAA8B,KAAK;AAChD,iBAAa,sBAAsB,KAAK,UAAU,YAAY,CAAC;AAAA,EACjE,GAAG,CAAC,CAAC;AAEL,QAAM,eAAeA,aAAY,MAAM;AACrC,oBAAgB,UAAU;AAC1B,oBAAgB,IAAI;AACpB,gBAAY,IAAI;AAChB,kBAAc,4BAA4B;AAC1C,kBAAc,oBAAoB;AAAA,EACpC,GAAG,CAAC,CAAC;AAEL,QAAM,UAAUA,aAAY,YAAY;AACtC,QAAI,CAAC,WAAW,CAAC,aAAa;AAC5B;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,gBAAgB;AACnC,UAAM,UAAkC,CAAC;AACzC,UAAM,QAAQ,gBAAgB;AAC9B,QAAI,OAAO;AACT,cAAQ,mBAAmB,IAAI;AAAA,IACjC,OAAO;AACL,aAAO,IAAI,eAAe,WAAW;AAAA,IACvC;AACA,QAAI,eAAe;AACjB,aAAO,IAAI,iBAAiB,aAAa;AAAA,IAC3C;AAEA,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,QAAQ,OAAO,SAAS;AAC9B,YAAM,MAAM,GAAG,UAAU,QAAQ,QAAQ,IAAI,KAAK,KAAK,EAAE;AACzD,YAAM,WAAW,OAAO,QACpB,MAAM,KAAK,EAAE,QAAQ,CAAC,IACtB,MAAM,GAAG;AACb,YAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,gBAAU,KAAK,QAAQ,IAAI;AAAA,IAC7B,SAAS,KAAK;AACZ,UAAI,eAAe,oBAAoB,IAAI,WAAW,OAAO,gBAAgB,SAAS;AACpF,qBAAa;AACb,cAAM,kBAAkB,kBAAkB;AAC1C,uBAAe,eAAe;AAC9B,kBAAU,IAAI;AAAA,MAChB;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,qBAAqB;AAAA,IACrE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,YAAY,WAAW,eAAe,cAAc,OAAO,CAAC;AAE7E,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,mBAAe,uBAAuB,CAAC;AACvC,UAAM,cAAc,YAAY,4BAA4B;AAC5D,UAAM,iBAAiB,mBAAmB;AAC1C,QAAI,eAAe,gBAAgB;AACjC,sBAAgB,UAAU;AAC1B,sBAAgB,WAAW;AAC3B,kBAAY,cAAc;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,UAAM,WAA6B,CAAC,UAAU,SAAS;AACrD,UAAI,aAAa,QAAQ;AACvB;AAAA,MACF;AACA,gBAAU,MAAM,KAAK;AAAA,IACvB;AACA,sBAAkB,IAAI,QAAQ;AAC9B,WAAO,MAAM;AACX,wBAAkB,OAAO,QAAQ;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,WAAW,SAAS,MAAM,CAAC;AAE/B,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,CAAC,aAAa;AAC5B;AAAA,IACF;AACA,SAAK,QAAQ;AAAA,EACf,GAAG,CAAC,aAAa,SAAS,OAAO,CAAC;AAElC,QAAM,SAASD;AAAA,IACb,OAAO,MAAc,SAAgE;AACnF,UAAI,CAAC,WAAW,CAAC,aAAa;AAC5B,eAAO;AAAA,MACT;AAEA,YAAM,MAAM,YAA0C;AACpD,sBAAc,IAAI;AAClB,iBAAS,IAAI;AACb,YAAI;AACF,gBAAM,WAAW,MAAM,MAAM,GAAG,UAAU,GAAG,IAAI,IAAI;AAAA,YACnD,QAAQ;AAAA,YACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,YAC9C,MAAM,KAAK,UAAU;AAAA,cACnB;AAAA,cACA,cAAc,gBAAgB,WAAW;AAAA,cACzC;AAAA,cACA;AAAA,cACA;AAAA,cACA,QAAQ,QAAQ,SAAS;AAAA,cACzB,aAAa,QAAQ,SAAS;AAAA,cAC9B,GAAG;AAAA,YACL,CAAC;AAAA,UACH,CAAC;AACD,gBAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,oBAAU,KAAK,QAAQ,IAAI;AAC3B,iBAAO,KAAK,QAAQ;AAAA,QACtB,SAAS,KAAK;AACZ,cAAI,eAAe,oBAAoB,IAAI,WAAW,OAAO,gBAAgB,SAAS;AACpF,yBAAa;AACb,2BAAe,kBAAkB,CAAC;AAClC,sBAAU,IAAI;AAAA,UAChB;AACA,mBAAS,eAAe,QAAQ,IAAI,UAAU,qBAAqB;AACnE,iBAAO;AAAA,QACT,UAAE;AACA,wBAAc,KAAK;AAAA,QACrB;AAAA,MACF;AAEA,YAAM,UAAU,iBAAiB,QAAQ,KAAK,KAAK,GAAG;AACtD,uBAAiB,UAAU,QAAQ;AAAA,QACjC,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,aAAa,YAAY,WAAW,eAAe,cAAc,SAAS,UAAU,OAAO;AAAA,EAC9F;AAEA,QAAM,YAAYA;AAAA,IAChB,OAAO,SACL,OAAO,aAAa;AAAA,MAClB,KAAK,KAAK;AAAA,MACV,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,IACjB,CAAC;AAAA,IACH,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,WAAWA;AAAA,IACf,OAAO,UAA2B,OAAO,mBAAmB,EAAE,MAAM,CAAC;AAAA,IACrE,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,iBAAiBA;AAAA,IACrB,CAAC,eAAuB,OAAO,gBAAgB,EAAE,WAAW,CAAC;AAAA,IAC7D,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,iBAAiBA;AAAA,IACrB,CAAC,YAAoB,aACnB,OAAO,yBAAyB,EAAE,YAAY,SAAS,CAAC;AAAA,IAC1D,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,eAAeA;AAAA,IACnB,CAAC,iBAAkC,mBACjC,OAAO,mBAAmB,EAAE,iBAAiB,eAAe,CAAC;AAAA,IAC/D,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,qBAAqBA,aAAY,YAElC;AACH,QAAI,CAAC,WAAW,CAAC,aAAa;AAC5B,aAAO,CAAC;AAAA,IACV;AACA,UAAM,SAAS,IAAI,gBAAgB;AACnC,UAAM,UAAkC,CAAC;AACzC,UAAM,QAAQ,gBAAgB;AAC9B,QAAI,OAAO;AACT,cAAQ,mBAAmB,IAAI;AAAA,IACjC,OAAO;AACL,aAAO,IAAI,eAAe,WAAW;AAAA,IACvC;AACA,QAAI,QAAQ,SAAS,IAAI;AACvB,aAAO,IAAI,UAAU,QAAQ,QAAQ,EAAE;AAAA,IACzC;AACA,QAAI,eAAe;AACjB,aAAO,IAAI,iBAAiB,aAAa;AAAA,IAC3C;AAEA,kBAAc,IAAI;AAClB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,UAAU,0BAA0B,OAAO,SAAS,CAAC;AAAA,QACxD,QAAQ,EAAE,QAAQ,IAAI;AAAA,MACxB;AACA,YAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,aAAO,KAAK,mBAAmB,CAAC;AAAA,IAClC,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,IAAI,UAAU,iCAAiC;AAC/E,aAAO;AAAA,IACT,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,aAAa,YAAY,eAAe,OAAO,CAAC;AAEpD,QAAM,oBAAoBA;AAAA,IACxB,CAAC,qBACC,OAAO,yBAAyB,EAAE,iBAAiB,CAAC;AAAA,IACtD,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,oBAAoBA,aAAY,YAEjC;AACH,QAAI,CAAC,WAAW,CAAC,aAAa;AAC5B,aAAO,CAAC;AAAA,IACV;AACA,UAAM,SAAS,IAAI,gBAAgB;AACnC,UAAM,UAAkC,CAAC;AACzC,UAAM,QAAQ,gBAAgB;AAC9B,QAAI,OAAO;AACT,cAAQ,mBAAmB,IAAI;AAAA,IACjC,OAAO;AACL,aAAO,IAAI,eAAe,WAAW;AAAA,IACvC;AACA,QAAI,QAAQ,SAAS,IAAI;AACvB,aAAO,IAAI,UAAU,QAAQ,QAAQ,EAAE;AAAA,IACzC;AACA,QAAI,eAAe;AACjB,aAAO,IAAI,iBAAiB,aAAa;AAAA,IAC3C;AAEA,kBAAc,IAAI;AAClB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,UAAU,yBAAyB,OAAO,SAAS,CAAC;AAAA,QACvD,QAAQ,EAAE,QAAQ,IAAI;AAAA,MACxB;AACA,YAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,aAAO,KAAK,kBAAkB,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,IAAI,UAAU,gCAAgC;AAC9E,aAAO;AAAA,IACT,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,aAAa,YAAY,eAAe,OAAO,CAAC;AAEpD,QAAM,mBAAmBA;AAAA,IACvB,OAAO,WAAoD;AACzD,UAAI,CAAC,WAAW,CAAC,aAAa;AAC5B,eAAO;AAAA,MACT;AAEA,YAAM,MAAM,YAA6C;AACvD,uBAAe,YAAY,OAAO,kBAAkB,CAAC;AACrD,sBAAc,IAAI;AAClB,iBAAS,IAAI;AACb,YAAI;AACF,gBAAM,WAAW,MAAM,MAAM,GAAG,UAAU,iBAAiB;AAAA,YACzD,QAAQ;AAAA,YACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,YAC9C,MAAM,KAAK,UAAU;AAAA,cACnB;AAAA,cACA,cAAc,gBAAgB,WAAW;AAAA,cACzC,QAAQ,QAAQ,SAAS;AAAA,cACzB;AAAA,cACA;AAAA,cACA,aAAa,eAAe;AAAA,YAC9B,CAAC;AAAA,UACH,CAAC;AACD,gBAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,cAAI,KAAK,MAAM;AACb,sBAAU,KAAK,IAAI;AAAA,UACrB;AACA,cAAI,CAAC,KAAK,SAAS;AACjB,kBAAM,IAAI,iBAAiB,+BAA+B,SAAS,MAAM;AAAA,UAC3E;AACA,iBAAO,KAAK;AAAA,QACd,SAAS,KAAK;AACZ,mBAAS,eAAe,QAAQ,IAAI,UAAU,gBAAgB;AAC9D,iBAAO;AAAA,QACT,UAAE;AACA,wBAAc,KAAK;AAAA,QACrB;AAAA,MACF;AAEA,YAAM,UAAU,iBAAiB,QAAQ,KAAK,KAAK,GAAG;AACtD,uBAAiB,UAAU,QAAQ;AAAA,QACjC,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,aAAa,YAAY,WAAW,eAAe,OAAO;AAAA,EAC7D;AAEA,QAAM,WAAWA;AAAA,IACf,OAAO,gBAAuD;AAC5D,UAAI,CAAC,WAAW,CAAC,eAAe,CAAC,YAAY,KAAK,GAAG;AACnD,eAAO;AAAA,MACT;AACA,YAAM,SAAS,IAAI,gBAAgB;AACnC,YAAM,UAAkC,CAAC;AACzC,YAAM,QAAQ,gBAAgB;AAC9B,UAAI,OAAO;AACT,gBAAQ,mBAAmB,IAAI;AAAA,MACjC;AACA,aAAO,IAAI,eAAe,WAAW;AACrC,aAAO,IAAI,eAAe,YAAY,KAAK,CAAC;AAC5C,UAAI,eAAe;AACjB,eAAO,IAAI,iBAAiB,aAAa;AAAA,MAC3C;AAEA,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,GAAG,UAAU,WAAW,OAAO,SAAS,CAAC,IAAI;AAAA,UACxE;AAAA,QACF,CAAC;AACD,cAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,eAAO,KAAK,SAAS;AAAA,MACvB,SAAS,KAAK;AACZ,iBAAS,eAAe,QAAQ,IAAI,UAAU,sBAAsB;AACpE,eAAO;AAAA,MACT,UAAE;AACA,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,aAAa,YAAY,eAAe,OAAO;AAAA,EAClD;AAEA,QAAM,aAAaA,aAAY,YAAsC;AACnE,QAAI,CAAC,WAAW,CAAC,aAAa;AAC5B,aAAO,CAAC;AAAA,IACV;AACA,UAAM,SAAS,IAAI,gBAAgB;AACnC,UAAM,UAAkC,CAAC;AACzC,UAAM,QAAQ,gBAAgB;AAC9B,QAAI,OAAO;AACT,cAAQ,mBAAmB,IAAI;AAAA,IACjC;AACA,WAAO,IAAI,eAAe,WAAW;AACrC,QAAI,eAAe;AACjB,aAAO,IAAI,iBAAiB,aAAa;AAAA,IAC3C;AAEA,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,UAAU,WAAW,OAAO,SAAS,CAAC,IAAI;AAAA,QACxE;AAAA,MACF,CAAC;AACD,YAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,aAAO,KAAK,UAAU,CAAC;AAAA,IACzB,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,IAAI,UAAU,sBAAsB;AACpE,aAAO,CAAC;AAAA,IACV,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,YAAY,eAAe,OAAO,CAAC;AAEpD,QAAM,aAAaA,aAAY,YAA2C;AACxE,QAAI,CAAC,WAAW,CAAC,aAAa;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,YAA2C;AACrD,UAAI,CAAC,QAAQ,SAAS;AACpB,eAAO;AAAA,MACT;AACA,qBAAe,YAAY,OAAO,kBAAkB,CAAC;AACrD,oBAAc,IAAI;AAClB,eAAS,IAAI;AACb,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,GAAG,UAAU,eAAe;AAAA,UACvD,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU;AAAA,YACnB;AAAA,YACA,cAAc,gBAAgB,WAAW;AAAA,YACzC,QAAQ,QAAQ,QAAQ;AAAA,YACxB;AAAA,YACA,aAAa,eAAe;AAAA,UAC9B,CAAC;AAAA,QACH,CAAC;AACD,cAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,YAAI,CAAC,KAAK,OAAO;AACf,gBAAM,IAAI,iBAAiB,6BAA6B,SAAS,MAAM;AAAA,QACzE;AACA,uBAAe,UAAU;AACzB,kBAAU,IAAI;AACd,eAAO,KAAK;AAAA,MACd,SAAS,KAAK;AACZ,iBAAS,eAAe,QAAQ,IAAI,UAAU,iBAAiB;AAC/D,eAAO;AAAA,MACT,UAAE;AACA,sBAAc,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,UAAM,UAAU,iBAAiB,QAAQ,KAAK,KAAK,GAAG;AACtD,qBAAiB,UAAU,QAAQ;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,YAAY,WAAW,eAAe,OAAO,CAAC;AAE/D,QAAM,QAAQA;AAAA,IACZ,OAAO,UAA+C;AACpD,UAAI,CAAC,SAAS;AACZ,eAAO;AAAA,MACT;AAEA,qBAAe,IAAI;AACnB,eAAS,IAAI;AACb,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,GAAG,UAAU,eAAe;AAAA,UACvD,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO,MAAM;AAAA,YACb,UAAU,MAAM;AAAA,YAChB;AAAA,YACA;AAAA,YACA,QAAQ,QAAQ,SAAS;AAAA,UAC3B,CAAC;AAAA,QACH,CAAC;AACD,cAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,YAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,UAAU;AACxC,gBAAM,IAAI,iBAAiB,kBAAkB,SAAS,MAAM;AAAA,QAC9D;AACA,uBAAe,KAAK,cAAc,KAAK,QAAQ;AAC/C,kBAAU,KAAK,QAAQ,IAAI;AAC3B,eAAO,KAAK,QAAQ;AAAA,MACtB,SAAS,KAAK;AACZ,iBAAS,eAAe,QAAQ,IAAI,UAAU,gBAAgB;AAC9D,eAAO;AAAA,MACT,UAAE;AACA,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,CAAC,aAAa,YAAY,WAAW,eAAe,SAAS,cAAc;AAAA,EAC7E;AAEA,QAAM,SAASA,aAAY,YAAY;AACrC,QAAI;AACF,YAAM,MAAM,GAAG,UAAU,gBAAgB;AAAA,QACvC,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,MACzB,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AACA,iBAAa;AACb,cAAU,IAAI;AACd,mBAAe,kBAAkB,CAAC;AAAA,EACpC,GAAG,CAAC,YAAY,WAAW,YAAY,CAAC;AAExC,QAAM,WAAWA,aAAY,MAAM;AACjC,kBAAc,IAAI;AAGlB,SAAK,QAAQ;AAAA,EACf,GAAG,CAAC,OAAO,CAAC;AACZ,QAAM,YAAYA,aAAY,MAAM,cAAc,KAAK,GAAG,CAAC,CAAC;AAC5D,QAAM,aAAaA,aAAY,MAAM;AACnC,kBAAc,CAAC,SAAS;AACtB,UAAI,CAAC,MAAM;AACT,aAAK,QAAQ;AAAA,MACf;AACA,aAAO,CAAC;AAAA,IACV,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,QAAQ,YAAY,YAAY;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACjuBA,SAAS,aAAAE,YAAW,YAAAC,iBAAgB;AAE7B,SAAS,wBAAwB,SAAyB;AAC/D,QAAM,OAAO,KAAK,MAAM,UAAU,EAAE;AACpC,QAAM,OAAO,UAAU;AACvB,SAAO,GAAG,IAAI,IAAI,KAAK,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AACpD;AAEO,SAAS,qBAAqB,aAA8B;AACjE,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,CAAC;AAE1C,EAAAD,WAAU,MAAM;AACd,QAAI,CAAC,aAAa;AAChB,kBAAY,CAAC;AACb;AAAA,IACF;AAEA,UAAM,WAAW,YAAY,MAAM;AACjC,kBAAY,CAAC,YAAY,UAAU,CAAC;AAAA,IACtC,GAAG,GAAI;AAEP,WAAO,MAAM,cAAc,QAAQ;AAAA,EACrC,GAAG,CAAC,WAAW,CAAC;AAEhB,SAAO;AACT;;;ACzBA,SAAS,eAAAE,cAAa,UAAAC,SAAQ,YAAAC,iBAAgB;AAgB9C,SAAS,iBAAiB,QAAsB;AAC9C,QAAM,QAAQ,IAAI,MAAM,0BAA0B,MAAM,EAAE;AAC1D,OAAK,MAAM,KAAK;AAClB;AAEA,eAAe,gBAAgB,SAAiB,MAA+B;AAC7E,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,QAAQ;AAAA,IAC7C,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,EAC/B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAM,SAAS,MAAM,KAAK,YAAY;AACtC,QAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAU,OAAO,aAAa,MAAM,CAAC,CAAE;AAAA,EACzC;AAEA,SAAO,KAAK,MAAM;AACpB;AAEO,SAAS,eAAe,SAAgC;AAC7D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,iBAAiB;AAAA,EACnB,IAAI;AACJ,QAAM,CAAC,aAAa,cAAc,IAAIC,UAAS,KAAK;AACpD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAwB,IAAI;AACpE,QAAM,mBAAmBC,QAA6B,IAAI;AAC1D,QAAM,YAAYA,QAAe,CAAC,CAAC;AAEnC,QAAM,UAAU,WAAW,QAAQ,OAAO,EAAE;AAE5C,QAAM,oBAAoBC,aAAY,MAAM;AAC1C,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqBA,aAAY,MAAM;AAC3C,QAAI,cAAc;AAChB,uBAAiB,YAAY;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,gBAAgBA,aAAY,MAAM;AACtC,QAAI,iBAAiB,SAAS,UAAU,aAAa;AACnD,uBAAiB,QAAQ,KAAK;AAAA,IAChC;AACA,mBAAe,KAAK;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiBA,aAAY,YAAY;AAC7C,aAAS,IAAI;AACb,oBAAgB,IAAI;AAEpB,QAAI;AACF,YAAM,SAAS,MAAM,UAAU,aAAa,aAAa,EAAE,OAAO,KAAK,CAAC;AACxE,YAAM,gBAAgB,IAAI,cAAc,MAAM;AAC9C,uBAAiB,UAAU;AAC3B,gBAAU,UAAU,CAAC;AAErB,oBAAc,kBAAkB,CAAC,UAAU;AACzC,YAAI,MAAM,KAAK,OAAO,GAAG;AACvB,oBAAU,QAAQ,KAAK,MAAM,IAAI;AAAA,QACnC;AAAA,MACF;AAEA,oBAAc,SAAS,YAAY;AACjC,eAAO,UAAU,EAAE,QAAQ,CAAC,UAAU,MAAM,KAAK,CAAC;AAClD,cAAM,OAAO,IAAI,KAAK,UAAU,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/D,wBAAgB,IAAI;AAEpB,YAAI;AACF,gBAAM,WAAW,IAAI,SAAS;AAC9B,mBAAS,OAAO,SAAS,MAAM,gBAAgB;AAC/C,6BAAmB,UAAU,EAAE,aAAa,eAAe,OAAO,CAAC;AACnE,mBAAS,OAAO,aAAa,OAAO,SAAS,CAAC;AAC9C,cAAI,gBAAgB;AAClB,qBAAS,OAAO,kBAAkB,MAAM;AAAA,UAC1C;AAEA,gBAAM,WAAW,MAAM,MAAM,GAAG,OAAO,iBAAiB;AAAA,YACtD,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAED,cAAI,CAAC,SAAS,IAAI;AAChB,kBAAMC,QAAQ,MAAM,SAAS,KAAK;AAClC,kBAAM,IAAI,MAAMA,MAAK,SAAS,qBAAqB;AAAA,UACrD;AAEA,gBAAM,OAAQ,MAAM,SAAS,KAAK;AAUlC,yBAAe,KAAK,UAAU;AAC9B,sBAAY,KAAK,UAAU,KAAK,MAAM,EAAE,SAAS,KAAK,QAAQ,CAAC;AAE/D,cAAI,KAAK,cAAc;AACrB,4BAAgB,KAAK,YAAY;AACjC,6BAAiB,KAAK,YAAY;AAAA,UACpC,WAAW,aAAa,KAAK,WAAW,KAAK,YAAY;AACvD,4BAAgB,IAAI;AACpB,gBAAI;AACF,oBAAM,UAAU,MAAM,gBAAgB,SAAS,KAAK,OAAO;AAC3D,8BAAgB,OAAO;AACvB,+BAAiB,OAAO;AAAA,YAC1B,QAAQ;AACN,8BAAgB,IAAI;AAAA,YACtB,UAAE;AACA,8BAAgB,KAAK;AAAA,YACvB;AAAA,UACF,OAAO;AACL,4BAAgB,IAAI;AAAA,UACtB;AAAA,QACF,SAAS,KAAK;AACZ,mBAAS,eAAe,QAAQ,IAAI,UAAU,qBAAqB;AACnE,0BAAgB,IAAI;AAAA,QACtB,UAAE;AACA,0BAAgB,KAAK;AAAA,QACvB;AAAA,MACF;AAEA,oBAAc,MAAM;AACpB,qBAAe,IAAI;AAAA,IACrB,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,IAAI,UAAU,0BAA0B;AAAA,IAC1E;AAAA,EACF,GAAG,CAAC,SAAS,eAAe,gBAAgB,WAAW,QAAQ,WAAW,cAAc,WAAW,CAAC;AAEpG,QAAM,kBAAkBD,aAAY,YAAY;AAC9C,QAAI,aAAa;AACf,oBAAc;AAAA,IAChB,OAAO;AACL,YAAM,eAAe;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,aAAa,gBAAgB,aAAa,CAAC;AAE/C,QAAM,aAAaA,aAAY,MAAM;AACnC,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC9LO,IAAM,cAAc;;;ACA3B,SAAS,aAAAE,YAAW,UAAAC,eAAc;AAClC,SAAS,QAAQ,SAAS;AAsEhB,SAOA,UANE,KADF;AAtDH,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,WAAWC,QAAyB,IAAI;AAE9C,EAAAC,WAAU,MAAM;AACd,aAAS,UAAU,OAAsB;AACvC,UAAI,MAAM,QAAQ,UAAU;AAC1B,YAAI,OAAO;AACT,yBAAe;AAAA,QACjB,OAAO;AACL,kBAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,SAAS;AAC5C,WAAO,MAAM,OAAO,oBAAoB,WAAW,SAAS;AAAA,EAC9D,GAAG,CAAC,OAAO,SAAS,cAAc,CAAC;AAEnC,EAAAA,WAAU,MAAM;AACd,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,MAAO;AAEZ,UAAM,YAAY;AAElB,QAAI,QAAQ;AACV,YAAM,cAAc,MAAM,KAAK;AAC/B,UAAI,aAAa;AACf,aAAK,YAAY,MAAM,MAAM;AAAA,QAE7B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,MAAM;AACX,YAAM,YAAY;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,cAAW;AAAA,MACX,cAAY,SAAS;AAAA,MAErB,8BAAC,SAAI,WAAU,6BACZ,kBACC,qBAAC,SAAI,WAAU,6BAA4B,MAAK,SAC9C;AAAA,4BAAC,OAAG,iBAAM;AAAA,QACV,oBAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,gBAChE,mBAAS,SACZ;AAAA,SACF,IAEA,iCACE;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAU;AAAA,YACV,UAAQ;AAAA,YACR,aAAW;AAAA,YACX,OAAK;AAAA,YACL,cAAY,SAAS;AAAA;AAAA,QACvB;AAAA,QAEA,qBAAC,SAAI,WAAU,sBACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cACT,cAAY,SAAS;AAAA,cAErB;AAAA,oCAAC,KAAE,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,gBACzD,SAAS;AAAA;AAAA;AAAA,UACZ;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM;AACb,oBAAI,SAAS,QAAS,WAAU,SAAS,OAAO;AAAA,cAClD;AAAA,cACA,cAAY,SAAS;AAAA,cAErB;AAAA,oCAAC,UAAO,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,gBAC9D,SAAS;AAAA;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,SACF,GAEJ;AAAA;AAAA,EACF;AAEJ;;;ACnHA,SAAyB,YAAAC,iBAAgB;AACzC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAAC;AAAA,OACK;AAsFG,SAYF,YAAAC,WATE,OAAAC,MAHA,QAAAC,aAAA;AA7DV,SAAS,iBACP,OACA,UACe;AACf,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,MAAI,UAAU,uBAAuB;AACnC,WAAO,SAAS;AAAA,EAClB;AACA,MAAI,UAAU,oBAAoB,UAAU,gBAAgB;AAC1D,WAAO,SAAS;AAAA,EAClB;AACA,SAAO;AACT;AAEA,SAAS,gBACP,OACA,UACA,QACe;AACf,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,SAAO,IAAI,KAAK,aAAa,UAAU,QAAW;AAAA,IAChD,OAAO;AAAA,IACP,UAAU,MAAM;AAAA,EAClB,CAAC,EAAE,OAAO,MAAM,SAAS,QAAQ;AACnC;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,UAAU,CAAC,QAAQ,KAAK,UAAU,WAAW;AACnD,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,EAAE;AAC3C,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,KAAK;AAC1D,QAAM,eAAe,iBAAiB,OAAO,QAAQ;AAErD,WAAS,kBAAkB,OAAmC;AAC5D,UAAM,eAAe;AACrB,YAAQ,EAAE,OAAO,SAAS,CAAC;AAC3B,gBAAY,EAAE;AAAA,EAChB;AAEA,QAAM,YACJ,gBAAAF,KAAC,SAAI,WAAU,wBACZ,qBACC,gBAAAC,MAAC,SAAI,WAAU,6BACb;AAAA,oBAAAA,MAAC,UACE;AAAA,eAAS;AAAA,MAAW;AAAA,MAAE,SAAS;AAAA,OAClC;AAAA,IACA,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS;AAAA,QAER,mBAAS;AAAA;AAAA,IACZ;AAAA,KACF,IAEA,gBAAAC,MAAAF,WAAA,EACE;AAAA,oBAAAE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,UAAU;AAAA,QACV,iBAAe;AAAA,QACf,SAAS,MAAM,kBAAkB,CAAC,aAAa,CAAC,QAAQ;AAAA,QAExD;AAAA,0BAAAA,MAAC,UAAK,WAAU,oCACd;AAAA,4BAAAD,KAAC,UAAK,WAAU,6BAA4B,eAAY,QACtD,0BAAAA,KAAC,aAAU,MAAM,IAAI,aAAa,aAAa,GACjD;AAAA,YACC,SAAS;AAAA,aACZ;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,iBAAiB,uCAAuC;AAAA,cACnE,MAAM;AAAA,cACN,aAAa;AAAA,cACb,eAAY;AAAA;AAAA,UACd;AAAA;AAAA;AAAA,IACF;AAAA,IACC,iBACC,gBAAAC,MAAC,UAAK,WAAU,6BAA4B,UAAU,mBACpD;AAAA,sBAAAA,MAAC,WAAM,WAAU,yBACf;AAAA,wBAAAD,KAAC,UAAK,WAAU,yBAAyB,mBAAS,OAAM;AAAA,QACxD,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,MAAK;AAAA,YACL,cAAa;AAAA,YACb,UAAQ;AAAA,YACR,UAAU;AAAA,YACV,OAAO;AAAA,YACP,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA;AAAA,QAClD;AAAA,SACF;AAAA,MACA,gBAAAC,MAAC,WAAM,WAAU,yBACf;AAAA,wBAAAD,KAAC,UAAK,WAAU,yBAAyB,mBAAS,UAAS;AAAA,QAC3D,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,MAAK;AAAA,YACL,cAAa;AAAA,YACb,UAAQ;AAAA,YACR,UAAU;AAAA,YACV,OAAO;AAAA,YACP,UAAU,CAAC,UAAU,YAAY,MAAM,OAAO,KAAK;AAAA;AAAA,QACrD;AAAA,SACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU;AAAA,UAET,mBAAS;AAAA;AAAA,MACZ;AAAA,OACF,IACE;AAAA,KACN,GAEJ;AAGF,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,iBAAiB,UAAU,KAAK,6BAA6B;AAAA,MACxE,cAAY,SAAS;AAAA,MAErB;AAAA,wBAAAA,MAAC,YAAO,WAAU,0BAChB;AAAA,0BAAAD,KAAC,QAAG,WAAU,yBAAyB,mBAAS,MAAK;AAAA,UACrD,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cACT,cAAY,SAAS;AAAA,cAErB,0BAAAA,KAACG,IAAA,EAAE,MAAM,IAAI,aAAa,aAAa;AAAA;AAAA,UACzC;AAAA,WACF;AAAA,QAEC,gBACC,gBAAAH,KAAC,SAAI,WAAU,gCAA+B,MAAK,SAChD,wBACH;AAAA,QAGD,UACC,gBAAAC,MAAC,SAAI,WAAU,yBACb;AAAA,0BAAAD,KAAC,eAAY,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,UACpE,gBAAAA,KAAC,UAAM,mBAAS,WAAU;AAAA,WAC5B,IAEA,gBAAAA,KAAC,QAAG,WAAU,yBACX,eAAK,UAAU,IAAI,CAAC,SACnB,gBAAAC,MAAC,QAAiB,WAAU,iBACzB;AAAA,eAAK,WACJ,gBAAAD,KAAC,SAAI,KAAK,KAAK,UAAU,KAAI,IAAG,WAAU,wBAAuB,IAEjE,gBAAAA,KAAC,SAAI,WAAU,0DACb,0BAAAA,KAAC,WAAQ,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO,GAClE;AAAA,UAEF,gBAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,4BAAAD,KAAC,SAAI,WAAU,uBAAuB,eAAK,MAAK;AAAA,YAC/C,KAAK,QACJ,gBAAAC,MAAC,SAAI,WAAU,wBACb;AAAA,8BAAAA,MAAC,UAAM;AAAA,qBAAK,MAAM;AAAA,gBAAU;AAAA,gBAAE,SAAS;AAAA,iBAAK;AAAA,cAC5C,gBAAAD,KAAC,YACE,eAAK,YAAY,aAChB,gBAAgB,KAAK,OAAO,KAAK,UAAU,aAAa,GAC5D;AAAA,eACF,IACE;AAAA,YACJ,gBAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,cAAY,SAAS;AAAA,kBACrB,UAAU,aAAa,KAAK,YAAY;AAAA,kBACxC,SAAS,MAAM,iBAAiB,KAAK,IAAI,KAAK,WAAW,CAAC;AAAA,kBAE1D,0BAAAA,KAAC,SAAM,MAAM,IAAI,aAAa,aAAa;AAAA;AAAA,cAC7C;AAAA,cACA,gBAAAA,KAAC,UAAK,WAAU,4BAA4B,eAAK,UAAS;AAAA,cAC1D,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,cAAY,SAAS;AAAA,kBACrB,UAAU;AAAA,kBACV,SAAS,MAAM,iBAAiB,KAAK,IAAI,KAAK,WAAW,CAAC;AAAA,kBAE1D,0BAAAA,KAAC,QAAK,MAAM,IAAI,aAAa,aAAa;AAAA;AAAA,cAC5C;AAAA,eACF;AAAA,aACF;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,cAAY,SAAS;AAAA,cACrB,UAAU;AAAA,cACV,SAAS,MAAM,SAAS,KAAK,EAAE;AAAA,cAE/B,0BAAAA,KAAC,UAAO,MAAM,IAAI,aAAa,aAAa;AAAA;AAAA,UAC9C;AAAA,aAjDO,KAAK,EAkDd,CACD,GACH;AAAA,QAGD;AAAA,QAEA,CAAC,WACA,gBAAAC,MAAC,YAAO,WAAU,0BAChB;AAAA,0BAAAA,MAAC,SAAI,WAAU,yBACb;AAAA,4BAAAD,KAAC,UAAM,mBAAS,OAAM;AAAA,YACtB,gBAAAA,KAAC,YAAQ,eAAK,WAAW,WAAU;AAAA,aACrC;AAAA,UACC,aACC,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,UAAU;AAAA,cACV,SAAS,MAAM,WAAW,IAAI;AAAA,cAE9B;AAAA,gCAAAD,KAAC,UAAM,mBAAS,UAAS;AAAA,gBACzB,gBAAAA,KAAC,UAAK,WAAU,0BAAyB,eAAY,QACnD,0BAAAA,KAAC,cAAW,MAAM,IAAI,aAAa,aAAa,GAClD;AAAA;AAAA;AAAA,UACF,IACE;AAAA,WACN;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AC3RA,SAAS,aAAAI,YAAW,OAAO,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AAC5D,SAAS,OAAO,WAAAC,UAAS,SAAS,oBAAoB;AAiElD,qBAAAC,WAEI,OAAAC,MAMF,QAAAC,aARF;AA7CJ,SAAS,oBAAoB,UAAkB,OAAuB;AACpE,QAAM,aAAa,UAAU,IAAI,SAAS,WAAW,aAAa,UAAU,IAAI;AAChF,MAAI,WAAW,SAAS,SAAS,GAAG;AAClC,WAAO,WAAW,WAAW,WAAW,OAAO,KAAK,CAAC;AAAA,EACvD;AACA,SAAO,GAAG,UAAU,KAAK,KAAK;AAChC;AAEA,SAAS,WAAW,SAAsB,UAAqC;AAC7E,SAAO,QAAQ,MACX,EAAE,KAAK,QAAQ,KAAK,SAAS,IAC7B,EAAE,WAAW,QAAQ,IAAI,WAAW,QAAQ,WAAW,SAAS;AACtE;AAEA,SAAS,YAAY,MAAiC;AACpD,MAAI,KAAK,KAAK;AACZ,WAAO,OAAO,KAAK,GAAG;AAAA,EACxB;AACA,SAAO,MAAM,KAAK,aAAa,EAAE,IAAI,KAAK,aAAa,EAAE;AAC3D;AAEA,SAAS,mBAAmB,SAAmD;AAC7E,QAAM,QAA6B,CAAC;AACpC,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,SAAS,QAAQ,SAAS;AACnC,QAAI,MAAM,QAAQ;AAChB;AAAA,IACF;AACA,UAAM,UAAU,MAAM,SAAS,CAAC;AAChC,QAAI,CAAC,WAAY,CAAC,QAAQ,OAAO,CAAC,QAAQ,IAAK;AAC7C;AAAA,IACF;AACA,UAAM,OAAO,WAAW,SAAS,CAAC;AAClC,UAAM,MAAM,YAAY,IAAI;AAC5B,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB;AAAA,IACF;AACA,SAAK,IAAI,GAAG;AACZ,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,EAAE,QAAQ,GAA6B;AAC9D,SACE,gBAAAA,MAAAF,WAAA,EACG;AAAA,YAAQ,WACP,gBAAAC,KAAC,SAAI,KAAK,QAAQ,UAAU,KAAI,IAAG,WAAU,oBAAmB,SAAQ,QAAO,IAE/E,gBAAAA,KAAC,SAAI,WAAU,kDACb,0BAAAA,KAACE,UAAA,EAAQ,MAAM,IAAI,aAAa,aAAa,OAAM,yBAAwB,GAC7E;AAAA,IAEF,gBAAAD,MAAC,SAAI,WAAU,mBACb;AAAA,sBAAAD,KAAC,SAAI,WAAU,mBAAmB,kBAAQ,MAAK;AAAA,MAC9C,QAAQ,QAAQ,gBAAAA,KAAC,SAAI,WAAU,oBAAoB,kBAAQ,MAAM,WAAU,IAAS;AAAA,OACvF;AAAA,KACF;AAEJ;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,UAAU,MAAM;AACtB,QAAM,CAAC,cAAc,eAAe,IAAIG,UAAS,KAAK;AACtD,QAAM,qBAAqBC,QAAsB,IAAI;AACrD,QAAM,cAAcC,SAAQ,MAAM,mBAAmB,OAAO,GAAG,CAAC,OAAO,CAAC;AACxE,QAAM,gBAAgB,YAAY,OAAO,CAAC,KAAK,SAAS,OAAO,KAAK,YAAY,IAAI,CAAC;AAErF,EAAAC,WAAU,MAAM;AACd,oBAAgB,KAAK;AAAA,EACvB,GAAG,CAAC,OAAO,CAAC;AAEZ,EAAAA,WAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,mBAAmB,YAAY,MAAM;AACvC,eAAO,aAAa,mBAAmB,OAAO;AAAA,MAChD;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACE,gBAAAL,MAAC,SAAI,WAAU,eACb;AAAA,oBAAAA,MAAC,SAAI,WAAU,uBACb;AAAA,sBAAAD,KAAC,QAAG,IAAI,SAAS,WAAU,sBACxB,mBAAS,cACZ;AAAA,MACC,QAAQ,iBACP,gBAAAA,KAAC,OAAE,WAAU,+BAA+B,kBAAQ,gBAAe,IACjE;AAAA,OACN;AAAA,IAEA,gBAAAA,KAAC,SAAI,WAAU,sBAAqB,MAAK,QAAO,mBAAiB,SAC9D,kBAAQ,QAAQ,IAAI,CAAC,UACpB,gBAAAC,MAAC,aAA8B,WAAU,qBAAoB,MAAK,YAChE;AAAA,sBAAAA,MAAC,SAAI,WAAU,6BACb;AAAA,wBAAAD,KAAC,QAAG,WAAU,4BAA4B,gBAAM,OAAO,OAAM;AAAA,QAC5D,MAAM,OAAO,WAAW,IACvB,gBAAAC,MAAC,UAAK,WAAU,0BACb;AAAA,mBAAS;AAAA,UAAgB;AAAA,UAAE,MAAM,OAAO;AAAA,WAC3C,IACE;AAAA,SACN;AAAA,MAEC,MAAM,SACL,gBAAAA,MAAC,SAAI,WAAU,gCAA+B,MAAK,UACjD;AAAA,wBAAAD,KAAC,WAAQ,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,QAChE,gBAAAA,KAAC,SAAI,WAAU,uBACb,0BAAAA,KAAC,SAAI,WAAU,qBAAqB,mBAAS,qBAAoB,GACnE;AAAA,SACF,IACE,MAAM,SAAS,WAAW,IAC5B,gBAAAC,MAAC,SAAI,WAAU,gCAA+B,MAAK,UACjD;AAAA,wBAAAD,KAAC,WAAQ,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,QAChE,gBAAAA,KAAC,SAAI,WAAU,uBACb,0BAAAA,KAAC,SAAI,WAAU,qBAAqB,mBAAS,oBAAmB,GAClE;AAAA,SACF,IAEA,gBAAAA,KAAC,SAAI,WAAU,+BACZ,gBAAM,SAAS,IAAI,CAAC,SAAS,UAAU;AACtC,cAAM,SAAS,QAAQ,QAAQ,OAAO,QAAQ,EAAE;AAChD,cAAM,YAAY,QAAQ,kBAAkB,QAAQ,EAAE,CAAC;AACvD,cAAM,OAAO,gBAAAA,KAAC,mBAAgB,SAAkB;AAChD,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW,mBAAmB,UAAU,IAAI,6BAA6B,0BAA0B;AAAA,YAEnG,0BAAAC,MAAC,SAAI,WAAU,yBACZ;AAAA,gCACC,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM,gBAAgB,OAAO;AAAA,kBAErC;AAAA;AAAA,cACH,IAEA,gBAAAA,KAAC,SAAI,WAAU,2BAA2B,gBAAK;AAAA,cAEhD,aACC,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,oCAAoC,YAAY,iCAAiC,EAAE;AAAA,kBAC9F,cACE,YACI,SAAS,YACT,SACE,SAAS,YACT,SAAS;AAAA,kBAEjB,UAAU,CAAC,UAAU;AAAA,kBACrB,SAAS,MAAM,YAAY,OAAO;AAAA,kBAEjC,sBACC,gBAAAA,KAAC,SAAM,MAAM,IAAI,aAAa,aAAa,IAE3C,gBAAAA,KAAC,gBAAa,MAAM,IAAI,aAAa,aAAa;AAAA;AAAA,cAEtD,IACE;AAAA,eACN;AAAA;AAAA,UApCK,QAAQ;AAAA,QAqCf;AAAA,MAEJ,CAAC,GACH;AAAA,SAxEU,MAAM,OAAO,EA0E3B,CACD,GACH;AAAA,IAEC,aACC,gBAAAA,KAAC,SAAI,WAAU,uBACb,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,wCAAwC,eAAe,iCAAiC,EAAE;AAAA,QACrG,UAAU,cAAc,YAAY,WAAW;AAAA,QAC/C,SAAS,MAAM;AACb,eAAK,SAAS,WAAW,EAAE,KAAK,CAAC,WAAW;AAC1C,gBAAI,QAAQ;AACV,8BAAgB,IAAI;AACpB,kBAAI,mBAAmB,YAAY,MAAM;AACvC,uBAAO,aAAa,mBAAmB,OAAO;AAAA,cAChD;AACA,iCAAmB,UAAU,OAAO,WAAW,MAAM;AACnD,gCAAgB,KAAK;AACrB,mCAAmB,UAAU;AAAA,cAC/B,GAAG,IAAI;AAAA,YACT;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QAEC,yBACG,SAAS,oBACT,oBAAoB,SAAS,eAAe,aAAa;AAAA;AAAA,IAC/D,GACF,IACE;AAAA,KACN;AAEJ;;;ACjMQ,gBAAAO,MACA,QAAAC,aADA;AAfD,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,iBAAiB,IAAI,IAAI,gBAAgB,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AACzE,QAAM,gBAAgB,OAAO,OAAO,CAAC,UAAU,eAAe,SAAS,KAAK,eAAe,IAAI,MAAM,EAAE,CAAC;AACxG,MAAI,CAAC,cAAc,OAAQ,QAAO;AAElC,SACE,gBAAAA,MAAC,aAAQ,WAAU,cAAa,cAAY,SAAS,kBACnD;AAAA,oBAAAA,MAAC,SAAI,WAAU,sBACb;AAAA,sBAAAD,KAAC,UAAM,mBAAS,eAAc;AAAA,MAC9B,gBAAAC,MAAC,SAAI,WAAU,uBACZ;AAAA,eAAO,KAAK,OAAO,EAAE,SAAS,KAC7B,gBAAAD,KAAC,YAAO,MAAK,UAAS,WAAU,qBAAoB,SAAS,MAAM,SAAS,CAAC,CAAC,GAC3E,mBAAS,cACZ;AAAA,QAED,eACC,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,mBAAkB,SAAS,aACxD,mBAAS,WACZ;AAAA,SAEJ;AAAA,OACF;AAAA,IACC,cAAc,IAAI,CAAC,UAClB,gBAAAC,MAAC,SAAmB,WAAU,mBAAkB,MAAK,SAAQ,cAAY,MAAM,OAC7E;AAAA,sBAAAD,KAAC,UAAK,WAAU,0BAA0B,gBAAM,OAAM;AAAA,MACtD,gBAAAA,KAAC,SAAI,WAAU,4BACZ,gBAAM,QAAQ,IAAI,CAAC,WAAW;AAC7B,cAAM,WAAW,sBAAsB,SAAS,MAAM,IAAI,OAAO,GAAG;AACpE,cAAM,SAAS,qBAAqB,MAAM,EAAE,IACxC,oBAAoB,OAAO,GAAG,IAC9B;AACJ,eACE,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAW,kBAAkB,WAAW,6BAA6B,EAAE;AAAA,YACvE,gBAAc;AAAA,YACd,SAAS,MAAM,SAAS,kBAAkB,SAAS,MAAM,IAAI,OAAO,GAAG,CAAC;AAAA,YAEvE;AAAA,uBACC,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO,EAAE,iBAAiB,OAAO;AAAA,kBACjC,eAAY;AAAA;AAAA,cACd,IACE;AAAA,cACH,OAAO;AAAA,cAAO;AAAA,cACf,gBAAAA,KAAC,UAAK,WAAU,yBAAwB,eAAY,QACjD,iBAAO,OACV;AAAA;AAAA;AAAA,UAhBK,OAAO;AAAA,QAiBd;AAAA,MAEJ,CAAC,GACH;AAAA,SA9BQ,MAAM,EA+BhB,CACD;AAAA,KACH;AAEJ;;;ACvFA,SAAS,KAAAE,UAAS;AAoBd,SACE,OAAAC,MADF,QAAAC,aAAA;AAFJ,SAAS,gBAAgB;AACvB,SACE,gBAAAA,MAAC,SAAI,WAAU,sBAAqB,eAAY,QAC9C;AAAA,oBAAAD,KAAC,UAAK;AAAA,IACN,gBAAAA,KAAC,UAAK;AAAA,IACN,gBAAAA,KAAC,UAAK;AAAA,IACN,gBAAAA,KAAC,UAAK;AAAA,IACN,gBAAAA,KAAC,UAAK;AAAA,KACR;AAEJ;AAEA,SAAS,oBAAoB;AAC3B,SAAO,gBAAAA,KAAC,UAAK,WAAU,qBAAoB,eAAY,QAAO;AAChE;AAEO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,UAAU,QAAQ,KAAK;AAE7B,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,oBAAoB,UAAU,4BAA4B,EAAE;AAAA,MACvE,MAAK;AAAA,MACL,aAAU;AAAA,MAET;AAAA,mBACC,gBAAAA,MAAC,SAAI,WAAU,6BACb;AAAA,0BAAAD,KAAC,UAAK,WAAU,2BAA2B,iBAAM;AAAA,UAChD,kBACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cACT,cAAY,SAAS;AAAA,cAErB,0BAAAA,KAACE,IAAA,EAAE,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA;AAAA,UAC5D;AAAA,WAEJ;AAAA,QAGD,CAAC,WAAW,eACX,gBAAAD,MAAC,SAAI,WAAU,6BACb;AAAA,0BAAAD,KAAC,UAAK,WAAU,iBAAgB,eAAY,QAAO;AAAA,UACnD,gBAAAA,KAAC,UAAK,WAAU,2BAA2B,mBAAS,WAAU;AAAA,UAC9D,gBAAAA,KAAC,iBAAc;AAAA,UACf,gBAAAA,KAAC,UAAK,WAAU,2BAA2B,kCAAwB,eAAe,GAAE;AAAA,UACpF,gBAAAA,KAAC,UAAK,WAAU,0BAA0B,mBAAS,cAAa;AAAA,WAClE;AAAA,QAGD,CAAC,WAAW,CAAC,eAAe,gBAC3B,gBAAAC,MAAC,SAAI,WAAU,6BACb;AAAA,0BAAAD,KAAC,qBAAkB;AAAA,UACnB,gBAAAA,KAAC,UAAK,WAAU,2BAA2B,mBAAS,oBAAmB;AAAA,WACzE;AAAA,QAGD,CAAC,WAAW,CAAC,eAAe,CAAC,gBAAgB,gBAC5C,gBAAAC,MAAC,SAAI,WAAU,6BACb;AAAA,0BAAAD,KAAC,qBAAkB;AAAA,UACnB,gBAAAA,KAAC,UAAK,WAAU,2BAA2B,mBAAS,uBAAsB;AAAA,WAC5E;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AjByTQ,SAmDE,YAAAG,WAnDF,OAAAC,MAmDE,QAAAC,aAnDF;AA3UD,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,WAAWC;AAAA,IACf,MACE,gCAAgC;AAAA,MAC9B,GAAG;AAAA,MACH,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,IACvC,CAAC;AAAA,IACH,CAAC,kBAAkB,WAAW;AAAA,EAChC;AAEA,QAAM,eAAeC,QAAyB,IAAI;AAClD,QAAM,iBAAiBA,QAAyB,IAAI;AACpD,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,KAAK;AAClD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAqB,IAAI;AACrE,QAAM,CAAC,uBAAuB,wBAAwB,IAAIA,UAAS,EAAE;AACrE,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,UAAS,KAAK;AAEtE,QAAM,SAAS,iBAAiB,EAAE,YAAY,iBAAiB,CAAC;AAEhE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,CAAC;AAAA,IACV,kBAAkB,CAAC;AAAA,IACnB,kBAAkB;AAAA,IAClB,gBAAgB,YAAY;AAAA,IAC5B,SAAS,YAAY;AAAA,IACrB,iBAAiB,YAAY;AAAA,IAC7B,oBAAoB,MAAM;AAAA,EAC5B,IAAI,oBAAoB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,eAAe;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,CAAC,UAAU,YAAY,WAAW;AAC3C,wBAAkB,OAAO;AACzB,wBAAkB;AAAA,QAChB;AAAA,QACA,MAAM;AAAA,QACN,SAAS,QAAQ;AAAA,MACnB,CAAC;AACD,eAAS,IAAI;AACb,mBAAa,KAAK;AAClB,qBAAe,IAAI;AAAA,IACrB;AAAA,IACA,cAAc,CAAC,eAAe,SAAS,YAAY,EAAE,QAAQ,MAAM,CAAC;AAAA,EACtE,CAAC;AAED,QAAM,oBAAoB,qBAAqB,MAAM,WAAW;AAChE,QAAM,kBACJ,gBACC,MAAM,eAAe,MAAM,gBAAgB,MAAM,gBAAgB,QAAQ,MAAM,KAAK;AAEvF,QAAM,OAAO,QAAQ;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AACD,QAAM,eAAe,KAAK,MAAM,iBAAiB;AACjD,QAAM,iBAAiB,eAAe,KAAK,QAAQ,OAAO,YAAY;AACtE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAA+B,CAAC,CAAC;AAE/E,QAAM,kBAAkBC;AAAA,IACtB,OAAO,YAAyB;AAC9B,UAAI,CAAC,QAAQ,OAAO,CAAC,QAAQ,IAAI;AAC/B;AAAA,MACF;AACA,YAAM,OAAO,MAAM,KAAK;AAAA,QACtB,QAAQ,MACJ,EAAE,KAAK,QAAQ,IAAI,IACnB,EAAE,WAAW,QAAQ,IAAI,WAAW,QAAQ,UAAU;AAAA,MAC5D;AACA,UAAI,CAAC,MAAM;AACT;AAAA,MACF;AACA,yBAAmB,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,KAAK,EAAE;AACpE,aAAO,WAAW,MAAM;AACtB,2BAAmB,CAAC,YAAY;AAC9B,gBAAM,YAAY,EAAE,GAAG,QAAQ;AAC/B,iBAAO,UAAU,QAAQ,EAAE;AAC3B,iBAAO;AAAA,QACT,CAAC;AAAA,MACH,GAAG,IAAI;AAAA,IACT;AAAA,IACA,CAAC,KAAK,SAAS;AAAA,EACjB;AAEA,QAAM,iBAAiB;AACvB,QAAM,cAAc,QAAQ,OAAO;AACnC,QAAM,mBAAmB,SAAS,QAAQ,UAAU;AACpD,QAAM,mBACJ,CAAC,aACD,CAAC,SACD,eACA,eAAe,WAAW,KAC1B,CAAC,eACD,MAAM,KAAK,EAAE,SAAS;AACxB,QAAM,cACJ,MAAM,KAAK,EAAE,SAAS,MACrB,aACC,CAAC,CAAC,SACF,eAAe,SAAS,KACxB,oBACA;AACJ,QAAM,kBACJ,sBACA,CAAC,wBACD,CAAC,eACD,MAAM,KAAK,EAAE,UAAU,MACtB,wBAAwB,YAAY,SAAS,KAAK,CAAC,CAAC,oBAAoB;AAE3E,QAAM,eAAeA;AAAA,IACnB,CAAC,UAA2B;AAC1B,YAAM,eAAe;AACrB,wBAAkB,MAAM;AACxB,YAAM,kBAAkB;AACxB,+BAAyB,EAAE;AAE3B,UAAI,sBAAsB,yBAAyB,KAAK,YAAY,qBAAqB,GAAG;AAC1F,yBAAiB,YAAY,qBAAqB,CAAE;AACpD;AAAA,MACF;AAEA,UACE,gBACA,mBACA,EAAE,kBAAkB,8BAA8B,KAAK,IACvD;AACA,aAAK,OAAO,KAAK;AAAA,MACnB,OAAO;AACL,aAAK,OAAO,KAAK;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoBA;AAAA,IACxB,CAAC,UAAkB;AACjB,+BAAyB,EAAE;AAC3B,8BAAwB,KAAK;AAC7B,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,CAAC,SAAS;AACZ,0BAAkB,IAAI;AACtB,cAAM,kBAAkB;AAAA,MAC1B,WAAW,QAAQ,UAAU,GAAG;AAC9B,0BAAkB,MAAM;AACxB,cAAM,kBAAkB;AAAA,MAC1B;AACA,eAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,UAAU,KAAK;AAAA,EAClB;AAEA,QAAM,yBAAyBA;AAAA,IAC7B,CAAC,eAAuB;AACtB,+BAAyB,EAAE;AAC3B,wBAAkB,MAAM;AACxB,YAAM,kBAAkB;AACxB,uBAAiB,UAAU;AAAA,IAC7B;AAAA,IACA,CAAC,kBAAkB,KAAK;AAAA,EAC1B;AAEA,QAAM,qBAAqBA;AAAA,IACzB,CAAC,UAAiD;AAChD,UAAI,MAAM,QAAQ,UAAU;AAC1B,iCAAyB,EAAE;AAC3B,gCAAwB,IAAI;AAC5B;AAAA,MACF;AAEA,UAAI,CAAC,mBAAmB,YAAY,WAAW,GAAG;AAChD;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,aAAa;AAC7B,cAAM,eAAe;AACrB,iCAAyB,CAAC,YAAa,UAAU,YAAY,SAAS,IAAI,UAAU,IAAI,CAAE;AAC1F;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,WAAW;AAC3B,cAAM,eAAe;AACrB,iCAAyB,CAAC,YAAa,UAAU,IAAI,UAAU,IAAI,YAAY,SAAS,CAAE;AAC1F;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,WAAW,yBAAyB,GAAG;AACvD,cAAM,eAAe;AACrB,cAAM,aAAa,YAAY,qBAAqB;AACpD,YAAI,YAAY;AACd,iCAAuB,UAAU;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,uBAAuB,wBAAwB,iBAAiB,WAAW;AAAA,EAC9E;AAEA,QAAM,oBAAoBA;AAAA,IACxB,CAAC,SAAe;AACd,UAAI,CAAC,KAAK,KAAK,WAAW,QAAQ,EAAG;AACrC,wBAAkB,OAAO;AACzB,YAAM,kBAAkB;AACxB,WAAK,cAAc,IAAI;AAAA,IACzB;AAAA,IACA,CAAC,eAAe,KAAK;AAAA,EACvB;AAEA,QAAM,sBAAsBA;AAAA,IAC1B,OAAO,UAA4B;AACjC,UAAI;AACF,cAAM,OAAO,MAAM,OAAO,aAAa,KAAK;AAC5C,0BAAkB,IAAI;AAAA,MACxB,SAAS,KAAK;AACZ,eAAO,MAAM;AACb,iBAAS,eAAe,QAAQ,IAAI,UAAU,SAAS,oBAAoB;AAAA,MAC7E;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,mBAAmB,SAAS,sBAAsB,QAAQ;AAAA,EACrE;AAEA,QAAM,aAAaA;AAAA,IACjB,CAAC,UAA2B;AAC1B,YAAM,eAAe;AACrB,oBAAc,KAAK;AACnB,UAAI,CAAC,mBAAmB;AACtB;AAAA,MACF;AACA,YAAM,OAAO,MAAM,aAAa,MAAM,CAAC;AACvC,UAAI,KAAM,mBAAkB,IAAI;AAAA,IAClC;AAAA,IACA,CAAC,mBAAmB,iBAAiB;AAAA,EACvC;AAEA,QAAM,kBACJ,eAAe,aAAa,mBAAmB,WAAW,QAAQ,MAAM,YAAY;AAEtF,SACE,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,eAAe,CAAC,aAAa,CAAC,QAC1B,6CAA6C,KAAK,IAAI,KAAK,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC,KACvF;AAAA,QACJ,aAAa;AAAA,MACf,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,cAAY;AAAA,MACZ,YAAY,CAAC,MAAM;AACjB,YAAI,CAAC,mBAAmB;AACtB;AAAA,QACF;AACA,UAAE,eAAe;AACjB,sBAAc,IAAI;AAAA,MACpB;AAAA,MACA,aAAa,MAAM,cAAc,KAAK;AAAA,MACtC,QAAQ;AAAA,MACR,MAAK;AAAA,MACL,cAAY,SAAS;AAAA,MAEpB;AAAA,sBAAc,qBACb,gBAAAD,KAAC,SAAI,WAAU,oBAAmB,eAAY,QAC3C,mBAAS,mBACZ;AAAA,QAGF,gBAAAA,KAAC,SAAI,WAAU,oBACf,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,kBAAkB,MAAM,cAAc,iCAAiC,EAAE;AAAA,YACpF,UAAU;AAAA,YAEV;AAAA,8BAAAD,KAAC,UAAO,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO,OAAM,yBAAwB;AAAA,cAC7F,gBAAAA,KAAC,SAAI,WAAU,yBACb,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,kBAAkB,EAAE,OAAO,KAAK;AAAA,kBACjD,WAAW;AAAA,kBACX,aAAa,SAAS;AAAA,kBACtB,cAAY,SAAS;AAAA,kBACrB,iBAAe,qBAAqB,YAAY;AAAA,kBAChD,qBAAmB,qBAAqB,SAAS;AAAA,kBACjD,iBAAe;AAAA,kBACf,iBAAe,kBAAkB,4BAA4B;AAAA,kBAC7D,yBACE,yBAAyB,IAAI,kBAAkB,qBAAqB,KAAK;AAAA,kBAE3E,cAAa;AAAA,kBACb,MAAM,qBAAqB,aAAa;AAAA;AAAA,cAC1C,GACF;AAAA,cAEA,gBAAAC,MAAC,SAAI,WAAU,sBACd;AAAA,+BACC,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAW,gBAAgB,MAAM,cAAc,yBAAyB,EAAE;AAAA,oBAC1E,SAAS,MAAM,KAAK,MAAM,gBAAgB;AAAA,oBAC1C,UAAU,MAAM;AAAA,oBAChB,cAAY,MAAM,cAAc,SAAS,gBAAgB,SAAS;AAAA,oBAClE,gBAAc,MAAM;AAAA,oBAEnB,gBAAM,cACL,gBAAAA,KAAC,UAAO,MAAM,IAAI,aAAa,aAAa,IAE5C,gBAAAA,KAAC,OAAI,MAAM,IAAI,aAAa,aAAa;AAAA;AAAA,gBAE7C;AAAA,gBAGD,qBACC,gBAAAC,MAAAF,WAAA,EACE;AAAA,kCAAAC;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS,MAAM,OAAO,KAAK,cAAc;AAAA,sBACzC,UAAU;AAAA,sBACV,cAAY,SAAS;AAAA,sBAErB,0BAAAA,KAACM,SAAA,EAAO,MAAM,IAAI,aAAa,aAAa;AAAA;AAAA,kBAC9C;AAAA,kBACA,gBAAAN;AAAA,oBAAC;AAAA;AAAA,sBACC,KAAK;AAAA,sBACL,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,SAAS;AAAA,sBACT,WAAU;AAAA,sBACV,UAAU,CAAC,MAAM;AACf,8BAAM,OAAO,EAAE,OAAO,QAAQ,CAAC;AAC/B,0BAAE,OAAO,QAAQ;AACjB,4BAAI,KAAM,mBAAkB,IAAI;AAAA,sBAClC;AAAA;AAAA,kBACF;AAAA,mBACF,IACE;AAAA,gBAEH,oBACC,gBAAAC,MAAAF,WAAA,EACE;AAAA,kCAAAC;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS,MAAM,aAAa,SAAS,MAAM;AAAA,sBAC3C,UAAU;AAAA,sBACV,cAAY,SAAS;AAAA,sBAErB,0BAAAA,KAAC,aAAU,MAAM,IAAI,aAAa,aAAa;AAAA;AAAA,kBACjD;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,KAAK;AAAA,sBACL,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,WAAU;AAAA,sBACV,UAAU,CAAC,MAAM;AACf,8BAAM,OAAO,EAAE,OAAO,QAAQ,CAAC;AAC/B,4BAAI,KAAM,mBAAkB,IAAI;AAAA,sBAClC;AAAA;AAAA,kBACF;AAAA,mBACF,IACE;AAAA,gBAEH,mBACC,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS,MAAM,MAAM,mBAAmB;AAAA,oBACxC,cAAY,SAAS;AAAA,oBAErB,0BAAAA,KAAC,WAAQ,MAAM,IAAI,aAAa,aAAa;AAAA;AAAA,gBAC/C;AAAA,iBAEF;AAAA,cAEC,cACC,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,gCAAgC,KAAK,aAAa,0BAA0B,EAAE;AAAA,kBACzF,SAAS,KAAK;AAAA,kBACd,cACE,eAAe,IACX,GAAG,SAAS,aAAa,KAAK,cAAc,MAC5C,SAAS;AAAA,kBAEf,iBAAe,KAAK;AAAA,kBACpB,gBAAc,KAAK;AAAA,kBAEnB;AAAA,oCAAAD,KAACO,eAAA,EAAa,MAAM,IAAI,aAAa,aAAa;AAAA,oBACjD,eAAe,KACd,gBAAAP,KAAC,UAAK,WAAU,kBAAiB,eAAY,QAC1C,0BACH;AAAA;AAAA;AAAA,cAEJ;AAAA,cAGD,mBACC,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,cAAY,SAAS;AAAA,kBAEpB;AAAA,4CAAwB,YAAY,WAAW,KAAK,CAAC,oBACpD,gBAAAD,KAAC,SAAI,WAAU,2BAA2B,mBAAS,oBAAmB;AAAA,oBAGvE,oBACC,gBAAAA,KAAC,SAAI,WAAU,0DAAyD,MAAK,SAC1E,4BACH;AAAA,oBAGD,CAAC,wBACA,CAAC,oBACD,oBACA,YAAY,WAAW,KACrB,gBAAAA,KAAC,SAAI,WAAU,2BAA2B,mBAAS,eAAc;AAAA,oBAGpE,YAAY,IAAI,CAAC,YAAY,UAC5B,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBAEC,IAAI,kBAAkB,KAAK;AAAA,wBAC3B,MAAK;AAAA,wBACL,WAAW,yBACT,UAAU,wBAAwB,kCAAkC,EACtE;AAAA,wBACA,MAAK;AAAA,wBACL,iBAAe,UAAU;AAAA,wBACzB,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,wBAC7C,SAAS,MAAM,uBAAuB,UAAU;AAAA,wBAE/C;AAAA;AAAA,sBAXI,GAAG,KAAK,IAAI,UAAU;AAAA,oBAY7B,CACD;AAAA;AAAA;AAAA,cACH;AAAA;AAAA;AAAA,QAEJ,GACA;AAAA,QAEC,mBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa,MAAM;AAAA,YACnB,cAAc,MAAM;AAAA,YACpB,cAAc,MAAM;AAAA,YACpB,OAAO,MAAM;AAAA,YACb,iBAAiB;AAAA,YACjB;AAAA,YACA,gBAAgB,MAAM;AAAA;AAAA,QACxB;AAAA,QAGD,gBAAgB,mBAAmB,UAAU,eAAe,CAAC,eAC5D,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,SAAS,MAAM,kBAAkB,CAAC;AAAA,YAClC;AAAA,YACA,UAAU,CAAC,YAAY,KAAK,cAAc,OAAO;AAAA,YACjD,aAAa,MAAM,KAAK,eAAe;AAAA;AAAA,QACzC;AAAA,QAGD,uBAAuB,OAAO,UAAU,OAAO,UAC9C,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,OAAO;AAAA,YACf,OAAO,OAAO;AAAA,YACd;AAAA,YACA,WAAW,CAAC,UAAU,KAAK,oBAAoB,KAAK;AAAA,YACpD,SAAS,OAAO;AAAA,YAChB,gBAAgB,OAAO;AAAA;AAAA,QACzB;AAAA,QAGD,eAAe,aAAa,gBAAAA,KAAC,SAAI,WAAU,cAAc,mBAAS,WAAU;AAAA,QAC5E,eAAe,SAAS,gBAAAA,KAAC,SAAI,WAAU,gCAAgC,iBAAM;AAAA,QAE7E,CAAC,aAAa,CAAC,SAAS,eAAe,eAAe,UACrD,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA,WAAW,CAAC,YAAY,KAAK,gBAAgB,OAAO;AAAA,YACpD,UAAU,CAAC,UAAU,KAAK,SAAS,KAAK;AAAA;AAAA,QAC1C,IACE;AAAA,QAEH,eAAe,CAAC,eAAe,CAAC,aAAa,CAAC,SAC7C,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAM,CAAC,aAAa,eAAe,SAAS,IAAI,SAAS;AAAA,YACzD,cACE,CAAC,aAAa,eAAe,SAAS,IAClC,SAAS,yBACT;AAAA,YAGL;AAAA,eAAC,aACA,eAAe,IAAI,CAAC,SAAS,UAAU;AACrC,sBAAM,SAAS,QAAQ,QAAQ,OAAO,QAAQ,EAAE;AAChD,sBAAM,YAAY,QAAQ,gBAAgB,QAAQ,EAAE,CAAC;AACrD,sBAAM,cACJ,gBAAAA,MAAAF,WAAA,EACG;AAAA,0BAAQ,WACP,gBAAAC;AAAA,oBAAC;AAAA;AAAA,sBACC,KAAK,QAAQ;AAAA,sBACb,KAAI;AAAA,sBACJ,WAAU;AAAA,sBACV,SAAQ;AAAA;AAAA,kBACV,IAEA,gBAAAA,KAAC,SAAI,WAAU,kDACb,0BAAAA,KAACQ,UAAA,EAAQ,MAAM,IAAI,aAAa,aAAa,OAAM,yBAAwB,GAC7E;AAAA,kBAEF,gBAAAP,MAAC,SAAI,WAAU,mBACb;AAAA,oCAAAD,KAAC,SAAI,WAAU,mBAAmB,kBAAQ,MAAK;AAAA,oBAC9C,QAAQ,SACP,gBAAAA,KAAC,SAAI,WAAU,oBAAoB,kBAAQ,MAAM,WAAU;AAAA,qBAE/D;AAAA,mBACF;AAGF,uBACE,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBAEC,WAAW,kBAAkB,UAAU,IAAI,+BAA+B,EAAE;AAAA,oBAC5E,MAAK;AAAA,oBAEL,0BAAAC,MAAC,SAAI,WAAU,yBACb;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,WAAU;AAAA,0BACV,SAAS,MAAM,kBAAkB,OAAO;AAAA,0BAEvC;AAAA;AAAA,sBACH;AAAA,sBACC,aACC,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,WAAW,qCAAqC,YAAY,gCAAgC,EAAE;AAAA,0BAC9F,cACE,YACI,SAAS,YACT,SACE,SAAS,YACT,SAAS;AAAA,0BAEjB,UAAU,CAAC,UAAU,KAAK;AAAA,0BAC1B,SAAS,MAAM,gBAAgB,OAAO;AAAA,0BAErC,sBACC,gBAAAA,KAACS,QAAA,EAAM,MAAM,IAAI,aAAa,aAAa,IAE3C,gBAAAT,KAACO,eAAA,EAAa,MAAM,IAAI,aAAa,aAAa;AAAA;AAAA,sBAEtD,IACE;AAAA,uBACN;AAAA;AAAA,kBAjCK,QAAQ;AAAA,gBAkCf;AAAA,cAEJ,CAAC;AAAA,cAEF,CAAC,aAAa,CAAC,SAAS,eAAe,WAAW,KAAK,oBACtD,gBAAAN,MAAC,SAAI,WAAU,gCAA+B,MAAK,UAAS,aAAU,UACpE;AAAA,gCAAAD,KAACU,UAAA,EAAQ,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,gBAChE,gBAAAT,MAAC,SAAI,WAAU,uBACb;AAAA,kCAAAD,KAAC,SAAI,WAAU,qBAAqB,mBAAS,iBAAgB;AAAA,kBAC5D,MAAM,uBACL,gBAAAC,MAAC,SAAI,WAAU,oBACZ;AAAA,6BAAS;AAAA,oBAAY;AAAA,oBAAE,KAAK;AAAA,qBAC/B;AAAA,mBAEJ;AAAA,iBACF;AAAA;AAAA;AAAA,QAEJ;AAAA,QAGD,cAAc,KAAK,cAClB,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YACf,WAAW,KAAK,aAAa,KAAK;AAAA,YAClC,aAAa,KAAK;AAAA,YAClB,OAAO,KAAK;AAAA,YACZ;AAAA,YACA;AAAA,YACA,SAAS,KAAK;AAAA,YACd,UAAU,CAAC,eAAe,KAAK,KAAK,eAAe,UAAU;AAAA,YAC7D,kBAAkB,CAAC,YAAY,aAC7B,KAAK,KAAK,eAAe,YAAY,QAAQ;AAAA,YAE/C,SAAS,CAAC,UAAU,KAAK,KAAK,MAAM,KAAK;AAAA,YACzC,UAAU,MAAM,KAAK,KAAK,OAAO;AAAA,YACjC;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AkB5uBA;AAAA,EACE,WAAAW;AAAA,EACA,YAAAC;AAAA,EACA;AAAA,OAGK;AACP,SAAS,WAAW,cAAAC,aAAY,SAAAC,QAAO,YAAY,QAAQ,WAAAC,gBAAe;AAwGpE,SACE,OAAAC,MADF,QAAAC,aAAA;AArEN,IAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,qBAAqB,UAA4B;AACxD,QAAM,QAAQ,IAAI,IAAY,sBAAsB;AACpD,QAAM,aAAa,SAAS,KAAK,EAAE,YAAY;AAC/C,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI,UAAU;AAAA,EACtB;AACA,SAAO,CAAC,GAAG,KAAK,EAAE,KAAK;AACzB;AAEA,SAAS,aAAa,MAAc,SAAS,MAAc;AACzD,MAAI;AACF,WAAO,IAAI,KAAK,aAAa,CAAC,QAAQ,IAAI,GAAG,EAAE,MAAM,SAAS,CAAC,EAAE,GAAG,IAAI,KAAK;AAAA,EAC/E,QAAQ;AACN,QAAI;AACF,aAAO,IAAI,KAAK,aAAa,CAAC,IAAI,GAAG,EAAE,MAAM,SAAS,CAAC,EAAE,GAAG,IAAI,KAAK;AAAA,IACvE,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,SAAkC;AAC5D,SAAO;AAAA,IACL,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,MAAM;AAAA,IACN;AAAA,EACF;AACF;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AACF,GAAuB;AACrB,WAAS,OACP,OACA,OACA;AACA,aAAS,EAAE,GAAG,SAAS,CAAC,KAAK,GAAG,MAAM,OAAO,MAAM,CAAC;AAAA,EACtD;AAEA,SACE,gBAAAA,MAAC,SAAI,WAAU,8BACb;AAAA,oBAAAA,MAAC,WAAM,WAAU,uBACf;AAAA,sBAAAD,KAAC,UAAM,mBAAS,WAAU;AAAA,MAC1B,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,GAAG,MAAM;AAAA,UACf,cAAa;AAAA,UACb,UAAQ;AAAA,UACR,OAAO,QAAQ;AAAA,UACf,UAAU,CAAC,UAAU,OAAO,aAAa,KAAK;AAAA;AAAA,MAChD;AAAA,OACF;AAAA,IACA,gBAAAC,MAAC,WAAM,WAAU,uBACf;AAAA,sBAAAD,KAAC,UAAM,mBAAS,UAAS;AAAA,MACzB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,GAAG,MAAM;AAAA,UACf,cAAa;AAAA,UACb,UAAQ;AAAA,UACR,OAAO,QAAQ;AAAA,UACf,UAAU,CAAC,UAAU,OAAO,YAAY,KAAK;AAAA;AAAA,MAC/C;AAAA,OACF;AAAA,IACA,gBAAAC,MAAC,WAAM,WAAU,iDACf;AAAA,sBAAAD,KAAC,UAAM,mBAAS,YAAW;AAAA,MAC3B,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,GAAG,MAAM;AAAA,UACf,cAAa;AAAA,UACb,UAAQ;AAAA,UACR,OAAO,QAAQ;AAAA,UACf,UAAU,CAAC,UAAU,OAAO,cAAc,KAAK;AAAA;AAAA,MACjD;AAAA,OACF;AAAA,IACA,gBAAAC,MAAC,WAAM,WAAU,iDACf;AAAA,sBAAAD,KAAC,UAAM,mBAAS,mBAAkB;AAAA,MAClC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,GAAG,MAAM;AAAA,UACf,cAAa;AAAA,UACb,OAAO,QAAQ,wBAAwB;AAAA,UACvC,UAAU,CAAC,UAAU,OAAO,wBAAwB,KAAK;AAAA;AAAA,MAC3D;AAAA,OACF;AAAA,IACA,gBAAAC,MAAC,WAAM,WAAU,uBACf;AAAA,sBAAAD,KAAC,UAAM,mBAAS,YAAW;AAAA,MAC3B,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,GAAG,MAAM;AAAA,UACf,cAAa;AAAA,UACb,UAAQ;AAAA,UACR,OAAO,QAAQ;AAAA,UACf,UAAU,CAAC,UAAU,OAAO,cAAc,KAAK;AAAA;AAAA,MACjD;AAAA,OACF;AAAA,IACA,gBAAAC,MAAC,WAAM,WAAU,uBACf;AAAA,sBAAAD,KAAC,UAAM,mBAAS,MAAK;AAAA,MACrB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,GAAG,MAAM;AAAA,UACf,cAAa;AAAA,UACb,UAAQ;AAAA,UACR,OAAO,QAAQ;AAAA,UACf,UAAU,CAAC,UAAU,OAAO,QAAQ,KAAK;AAAA;AAAA,MAC3C;AAAA,OACF;AAAA,IACA,gBAAAC,MAAC,WAAM,WAAU,uBACf;AAAA,sBAAAD,KAAC,UAAM,mBAAS,QAAO;AAAA,MACvB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,GAAG,MAAM;AAAA,UACf,cAAa;AAAA,UACb,OAAO,QAAQ,UAAU;AAAA,UACzB,UAAU,CAAC,UAAU,OAAO,UAAU,KAAK;AAAA;AAAA,MAC7C;AAAA,OACF;AAAA,IACA,gBAAAC,MAAC,WAAM,WAAU,uBACf;AAAA,sBAAAD,KAAC,UAAM,mBAAS,SAAQ;AAAA,MACxB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,GAAG,MAAM;AAAA,UACf,cAAa;AAAA,UACb,UAAQ;AAAA,UACR,OAAO,QAAQ;AAAA,UACf,UAAU,CAAC,UACT,SAAS,EAAE,GAAG,SAAS,SAAS,MAAM,OAAO,MAAM,YAAY,EAAE,CAAC;AAAA,UAGnE,+BAAqB,QAAQ,OAAO,EAAE,IAAI,CAAC,SAC1C,gBAAAA,KAAC,YAAkB,OAAO,MACvB,uBAAa,MAAM,MAAM,KADf,IAEb,CACD;AAAA;AAAA,MACH;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AACF,GAGG;AACD,SACE,gBAAAA,KAAC,aAAQ,WAAU,6CACjB,0BAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,oBAAAA,MAAC,SAAI,WAAU,iCACb;AAAA,sBAAAD,KAACE,UAAA,EAAQ,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,MAChE,gBAAAF,KAAC,QAAI,mBAAS,cAAa;AAAA,OAC7B;AAAA,IACA,gBAAAA,KAAC,QAAG,WAAU,uBACX,eAAK,UAAU,IAAI,CAAC,SACnB,gBAAAC,MAAC,QAAG,WAAU,sBACZ;AAAA,sBAAAA,MAAC,UAAK,WAAU,2BACb;AAAA,aAAK,WACJ,gBAAAD,KAAC,SAAI,KAAK,KAAK,UAAU,KAAI,IAAG,WAAU,4BAA2B,IAErE,gBAAAA,KAAC,SAAI,WAAU,kEACb,0BAAAA,KAACE,UAAA,EAAQ,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO,GAClE;AAAA,QAEF,gBAAAD,MAAC,UACE;AAAA,eAAK;AAAA,UACN,gBAAAA,MAAC,WAAM;AAAA;AAAA,YAAG,KAAK;AAAA,aAAS;AAAA,WAC1B;AAAA,SACF;AAAA,MACA,gBAAAD,KAAC,YAAQ,eAAK,OAAO,aAAa,UAAI;AAAA,SAdA,KAAK,EAe7C,CACD,GACH;AAAA,IACA,gBAAAC,MAAC,SAAI,WAAU,+BACb;AAAA,sBAAAD,KAAC,UAAM,mBAAS,OAAM;AAAA,MACtB,gBAAAA,KAAC,YAAQ,eAAK,WAAW,WAAU;AAAA,OACrC;AAAA,KACF,GACF;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW,8BAA8B,WAAW,2CAA2C,EAAE;AAAA,MACjG;AAAA,MACA,gBAAc;AAAA,MACd,SAAS;AAAA,MAET;AAAA,wBAAAA,MAAC,UAAK,WAAU,+BACd;AAAA,0BAAAD,KAAC,YAAQ,iBAAO,MAAK;AAAA,UACpB,OAAO,cAAc,gBAAAA,KAAC,WAAO,iBAAO,aAAY,IAAW;AAAA,WAC9D;AAAA,QACA,gBAAAC,MAAC,UAAK,WAAU,gCACb;AAAA,iBAAO,OAAO,aAAa;AAAA,UAC5B,gBAAAD,KAAC,UAAK,WAAU,gCAA+B,eAAY,QACxD,qBAAW,gBAAAA,KAACG,QAAA,EAAM,MAAM,IAAI,aAAa,aAAa,IAAK,MAC9D;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB;AACF,GAA4B;AAC1B,QAAM,WAAWC;AAAA,IACf,MAAM,gCAAgC,gBAAgB;AAAA,IACtD,CAAC,gBAAgB;AAAA,EACnB;AACA,QAAM,OAAO,QAAQ,EAAE,YAAY,eAAe,UAAU,QAAQ,CAAC;AACrE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIC;AAAA,IAAS,MACrD,mBAAmB,OAAO;AAAA,EAC5B;AACA,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA;AAAA,IAAS,MACnD,mBAAmB,OAAO;AAAA,EAC5B;AACA,QAAM,CAAC,wBAAwB,yBAAyB,IAAIA,UAAS,IAAI;AACzE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAmC,CAAC,CAAC;AACnF,QAAM,CAAC,0BAA0B,2BAA2B,IAAIA,UAAS,KAAK;AAC9E,QAAM,CAAC,0BAA0B,2BAA2B,IAAIA,UAAS,EAAE;AAC3E,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAgC,CAAC,CAAC;AAC9E,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,UAAS,KAAK;AACtE,QAAM,CAAC,uBAAuB,wBAAwB,IAAIA,UAAS,EAAE;AACrE,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAiC,IAAI;AACvF,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAA+B,IAAI;AAC7D,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,KAAK;AAC1D,QAAM,CAAC,WAAW,eAAe,IAAI,cAAc;AAEnD,WAAS,oBAAoB,OAAmC;AAC9D,UAAM,eAAe;AACrB,oBAAgB,YAAY;AAC1B,YAAM,UAAU,MAAM,KAAK;AAAA,QACzB;AAAA,QACA,yBAAyB,SAAY;AAAA,MACvC;AACA,UAAI,CAAC,SAAS;AACZ;AAAA,MACF;AACA,YAAM,CAAC,SAAS,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC5C,KAAK,mBAAmB;AAAA,QACxB,KAAK,kBAAkB;AAAA,MACzB,CAAC;AACD,UAAI,YAAY,MAAM;AACpB;AAAA,MACF;AACA,yBAAmB,OAAO;AAC1B,kCAA4B,IAAI;AAChC,kCAA4B,QAAQ,gBAAgB,MAAM,EAAE;AAC5D,UAAI,aAAa,MAAM;AACrB,0BAAkB,CAAC,CAAC;AACpB,gCAAwB,KAAK;AAAA,MAC/B,OAAO;AACL,0BAAkB,QAAQ;AAC1B,gCAAwB,IAAI;AAAA,MAC9B;AACA,+BAAyB,EAAE;AAC3B,2BAAqB,IAAI;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,WAAS,qBAAqB,UAAkB;AAC9C,oBAAgB,YAAY;AAC1B,YAAM,UAAU,MAAM,KAAK,kBAAkB,QAAQ;AACrD,UAAI,SAAS;AACX,oCAA4B,QAAQ;AACpC,iCAAyB,EAAE;AAC3B,6BAAqB,IAAI;AAAA,MAC3B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,oBAAoB,QAAgB;AAC3C,QACE,mBAAmB,WAAW,gBAC9B,kBAAkB,WAAW,UAC7B,kBAAkB,OAAO,WAAW,KAAK,MAAM,WAAW,UAC1D,kBAAkB,OAAO,aAAa,KAAK,MAAM,WAAW,UAC5D;AACA;AAAA,IACF;AACA,oBAAgB,YAAY;AAC1B,YAAM,UAAU,MAAM,KAAK,iBAAiB,MAAM;AAClD,UAAI,SAAS,WAAW,cAAc;AACpC,iCAAyB,MAAM;AAC/B,6BAAqB,OAAO;AAAA,MAC9B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,aAAa;AACpB,sBAAkB,IAAI;AACtB,oBAAgB,YAAY;AAC1B,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,WAAW;AACrC,YAAI,QAAQ;AACV,mBAAS,MAAM;AACf,0BAAgB,MAAM;AAAA,QACxB;AAAA,MACF,UAAE;AACA,0BAAkB,KAAK;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,OAAO;AACT,WACE,gBAAAL,KAAC,UAAK,WAAU,yBAAwB,cAAY,OAClD,0BAAAA,KAAC,aAAQ,WAAU,6CACjB,0BAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,sBAAAD,KAAC,UAAK,WAAU,8BAA6B,eAAY,QACvD,0BAAAA,KAACG,QAAA,EAAM,MAAM,IAAI,aAAa,aAAa,GAC7C;AAAA,MACA,gBAAAH,KAAC,OAAE,WAAU,yBAAyB,mBAAS,UAAS;AAAA,MACxD,gBAAAA,KAAC,QAAI,mBAAS,aAAY;AAAA,MAC1B,gBAAAA,KAAC,YAAQ,gBAAM,eAAe,MAAM,IAAG;AAAA,OACrC,MAAM,eAAe,MAAM,OAAO,kBAClC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAM,GAAG,eAAe,gBAAgB,mBAAmB,MAAM,eAAe,MAAM,EAAE,CAAC;AAAA,UAExF,mBAAS;AAAA;AAAA,MACZ,IACE;AAAA,MACJ,gBAAAC,MAAC,OAAE,WAAU,sBAAqB,MAAM,sBACtC;AAAA,wBAAAD,KAAC,aAAU,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,QACjE,SAAS;AAAA,SACZ;AAAA,OACF,GACF,GACF;AAAA,EAEJ;AAEA,MAAI,CAAC,KAAK,MAAM;AACd,WACE,gBAAAA,KAAC,UAAK,WAAU,yBAAwB,cAAY,OAClD,0BAAAA,KAAC,aAAQ,WAAU,2CACjB,0BAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,sBAAAD,KAACE,UAAA,EAAQ,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,MAChE,gBAAAF,KAAC,QACE,eAAK,aAAa,CAAC,KAAK,cACrB,SAAS,YACT,SAAS,WACf;AAAA,MACA,gBAAAC,MAAC,OAAE,WAAU,sBAAqB,MAAM,sBACtC;AAAA,wBAAAD,KAAC,aAAU,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,QACjE,SAAS;AAAA,SACZ;AAAA,OACF,GACF,GACF;AAAA,EAEJ;AAEA,QAAM,eAAe,aAAa,KAAK,cAAc;AACrD,QAAM,gBACJ,6BACC,gBAAgB,WAAW,KAAK,QAAQ,wBAAwB;AACnE,QAAM,wBAAwB,4BAA4B,CAAC;AAC3D,QAAM,iBAAiB,wBAAwB,eAAe,SAAS;AACvE,QAAM,kBAAkB,yBAAyB;AACjD,QAAM,eACJ,CAAC,mBACA,mBAAmB,WAAW,gBAC7B,kBAAkB,OAAO,WAAW,KAAK,KAAK,WAAW,UACzD,kBAAkB,OAAO,aAAa,KAAK,KAAK,WAAW;AAC/D,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,iBAAiB,CAAC,gBACpB,CAAC,2BACC,SAAS,4BACT,gBAAgB,SAAS,KAAK,CAAC,2BAC7B,SAAS,2BACT,mBAAmB,CAAC,eAClB,SAAS,0BACT,SACN;AAEJ,SACE,gBAAAC,MAAC,UAAK,WAAU,yBAAwB,cAAY,OAClD;AAAA,oBAAAA,MAAC,YAAO,WAAU,uBAChB;AAAA,sBAAAD,KAAC,OAAE,WAAU,yBAAyB,mBAAS,UAAS;AAAA,MACxD,gBAAAA,KAAC,QAAI,mBAAS,eAAc;AAAA,MAC5B,gBAAAC,MAAC,QAAG,WAAU,uBACZ;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,qBAAqB,2BAA2B,KAAK,8BAA8B;AAAA,YAC9F,gBAAc,2BAA2B,SAAY;AAAA,YAEpD,mBAAS;AAAA;AAAA,QACZ;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,qBAAqB,2BAA2B,iCAAiC,EAAE;AAAA,YAC9F,gBAAc,4BAA4B,CAAC,kBAAkB,SAAS;AAAA,YAErE,mBAAS;AAAA;AAAA,QACZ;AAAA,QACC,kBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,qBAAqB,2BAA2B,iCAAiC,EAAE;AAAA,YAC9F,gBAAc,2BAA2B,SAAS;AAAA,YAEjD,mBAAS;AAAA;AAAA,QACZ,IACE;AAAA,SACN;AAAA,OACF;AAAA,IAEC,KAAK,QACJ,gBAAAA,KAAC,SAAI,WAAU,gCAA+B,MAAK,SAChD,eAAK,SAAS,SAAS,gBAC1B,IACE;AAAA,IAEJ,gBAAAC,MAAC,SAAI,WAAU,wBACb;AAAA,sBAAAD,KAAC,gBAAa,MAAM,KAAK,MAAM,UAAoB;AAAA,MAEnD,gBAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,UAAU;AAAA,YAEV,0BAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,8BAAAA,MAAC,SAAI,WAAU,iCACb;AAAA,gCAAAD,KAAC,UAAO,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,gBAC/D,gBAAAA,KAAC,QAAI,mBAAS,iBAAgB;AAAA,iBAChC;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS;AAAA,kBACT;AAAA,kBACA,QAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,UAAU;AAAA;AAAA,cACZ;AAAA,cACA,gBAAAC,MAAC,WAAM,WAAU,0BACf;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,UAAU,CAAC,UAAU,0BAA0B,MAAM,OAAO,OAAO;AAAA;AAAA,gBACrE;AAAA,gBACA,gBAAAA,KAAC,UAAM,mBAAS,uBAAsB;AAAA,iBACxC;AAAA,cACC,CAAC,yBACA,gBAAAC,MAAC,SAAI,WAAU,yBACb;AAAA,gCAAAD,KAAC,QAAI,mBAAS,gBAAe;AAAA,gBAC7B,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS;AAAA,oBACT;AAAA,oBACA,QAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,UAAU;AAAA;AAAA,gBACZ;AAAA,iBACF,IACE;AAAA,cACJ,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,UAAU;AAAA,kBAET,mBAAS;AAAA;AAAA,cACZ;AAAA,eACF;AAAA;AAAA,QACF;AAAA,QAEC,2BACD,gBAAAA,KAAC,aAAQ,WAAU,uBACjB,0BAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,iCACb;AAAA,4BAAAD,KAACE,UAAA,EAAQ,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,YAChE,gBAAAF,KAAC,QAAI,mBAAS,gBAAe;AAAA,aAC/B;AAAA,UACC,gBAAgB,SAAS,IACxB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,cAAY,SAAS;AAAA,cAEpB,0BAAgB,IAAI,CAAC,WACpB,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC;AAAA,kBACA,UAAU,6BAA6B,OAAO;AAAA,kBAC9C,UAAU;AAAA,kBACV,UAAU,MAAM,qBAAqB,OAAO,EAAE;AAAA;AAAA,gBAJzC,OAAO;AAAA,cAKd,CACD;AAAA;AAAA,UACH,IAEA,gBAAAA,KAAC,OAAE,WAAU,+BACV,mBAAS,mBACZ;AAAA,WAEJ,GACF,IACI;AAAA,QAEH,iBAAiB,kBAClB,gBAAAA,KAAC,aAAQ,WAAU,uBACjB,0BAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,iCACb;AAAA,4BAAAD,KAAC,cAAW,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,YACnE,gBAAAA,KAAC,QAAI,mBAAS,eAAc;AAAA,aAC9B;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,cAAY,SAAS;AAAA,cAEpB,yBAAe,IAAI,CAAC,WACnB,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBAEC,MAAK;AAAA,kBACL,WAAW,8BAA8B,0BAA0B,OAAO,SAAS,2CAA2C,EAAE;AAAA,kBAChI,UAAU;AAAA,kBACV,gBAAc,0BAA0B,OAAO;AAAA,kBAC/C,SAAS,MAAM,oBAAoB,OAAO,MAAM;AAAA,kBAEhD;AAAA,oCAAAA,MAAC,UAAK,WAAU,+BACd;AAAA,sCAAAD,KAAC,YAAQ,iBAAO,MAAK;AAAA,sBACpB,OAAO,cAAc,gBAAAA,KAAC,WAAO,iBAAO,aAAY,IAAW;AAAA,uBAC9D;AAAA,oBACA,gBAAAC,MAAC,UAAK,WAAU,gCACb;AAAA,yCAAmB,WAAW,gBAC/B,kBAAkB,WAAW,OAAO,SAChC,SAAS,oBACT;AAAA,sBACJ,gBAAAD,KAAC,UAAK,WAAU,gCAA+B,eAAY,QACxD,6BAAmB,WAAW,gBAC/B,kBAAkB,WAAW,OAAO,SAClC,gBAAAA,KAACG,QAAA,EAAM,MAAM,IAAI,aAAa,aAAa,IACzC,MACN;AAAA,uBACF;AAAA;AAAA;AAAA,gBAtBK,OAAO;AAAA,cAuBd,CACD;AAAA;AAAA,UACH;AAAA,WACF,GACF,IACI;AAAA,SACN;AAAA,OACF;AAAA,IAEA,gBAAAF,MAAC,SAAI,WAAU,8BACb;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU,CAAC,iBAAiB;AAAA,UAC5B,SAAS;AAAA,UACT,aAAW,gBAAgB,gBAAgB,OAAO;AAAA,UAClD,oBAAkB,iBAAiB,4BAA4B;AAAA,UAE/D;AAAA,4BAAAD,KAAC,UAAM,2BAAiB,SAAS,eAAe,SAAS,YAAW;AAAA,YACpE,gBAAAA,KAAC,UAAK,WAAU,0BAAyB,eAAY,QACnD,0BAAAA,KAACM,aAAA,EAAW,MAAM,IAAI,aAAa,aAAa,GAClD;AAAA;AAAA;AAAA,MACF;AAAA,MACC,iBACC,gBAAAN,KAAC,OAAE,IAAG,2BAA0B,WAAU,4BACvC,0BACH,IACE;AAAA,OACN;AAAA,KACF;AAEJ;;;ACnoBA,SAAS,aAAAO,YAAW,WAAAC,UAAS,YAAAC,kBAAgB;AAC7C,SAAS,aAAAC,YAAW,WAAAC,UAAS,aAAa;AAwDtC,SACE,OAAAC,MADF,QAAAC,aAAA;AAjCJ,SAAS,cACP,SACQ;AACR,SAAO;AAAA,IACL,GAAG,QAAQ,SAAS,IAAI,QAAQ,QAAQ;AAAA,IACxC,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,GAAG,QAAQ,UAAU,IAAI,QAAQ,IAAI;AAAA,IACrC,QAAQ;AAAA,EACV,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AACd;AAEA,SAAS,eAAe,KAAqB;AAC3C,QAAM,OAAO,IAAI,KAAK,GAAG;AACzB,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG;AAChC,WAAO;AAAA,EACT;AACA,QAAM,MAAM,KAAK,YAAY;AAC7B,SAAO,GAAG,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC;AACjD;AAEA,SAAS,UAAU,iBAAyB,aAA6B;AACvE,QAAM,YAAY,gBAAgB,SAAS,GAAG,IAAI,MAAM;AACxD,SAAO,GAAG,eAAe,GAAG,SAAS,eAAe,mBAAmB,WAAW,CAAC;AACrF;AAEA,SAAS,YAAY,EAAE,OAAO,MAAM,GAAsC;AACxE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,SACE,gBAAAA,MAAC,UAAK,WAAU,2BACd;AAAA,oBAAAD,KAAC,WAAO,iBAAM;AAAA,IACb;AAAA,KACH;AAEJ;AAEO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA,cAAc;AAAA,EACd,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,kBAAkB;AACpB,GAA+B;AAC7B,QAAM,WAAWE;AAAA,IACf,MAAM,gCAAgC,gBAAgB;AAAA,IACtD,CAAC,gBAAgB;AAAA,EACnB;AACA,QAAM,OAAO,QAAQ,EAAE,YAAY,eAAe,UAAU,QAAQ,CAAC;AACrE,QAAM,gBAAgB,YAAY,KAAK;AACvC,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAA+B,IAAI;AAC7D,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAiC,IAAI;AACjE,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,KAAK;AAE1C,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,KAAK,aAAa;AACrB;AAAA,IACF;AACA,QAAI,YAAY;AAChB,cAAU,KAAK;AACf,aAAS,IAAI;AACb,cAAU,IAAI;AACd,UAAM,OAAO,gBACT,KAAK,SAAS,aAAa,EAAE,KAAK,CAAC,SAAS;AAC1C,UAAI,CAAC,WAAW;AACd,iBAAS,IAAI;AACb,kBAAU,IAAI;AAAA,MAChB;AAAA,IACF,CAAC,IACD,KAAK,WAAW,EAAE,KAAK,CAAC,SAAS;AAC/B,UAAI,CAAC,WAAW;AACd,kBAAU,IAAI;AACd,kBAAU,IAAI;AAAA,MAChB;AAAA,IACF,CAAC;AACL,SAAK;AACL,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,KAAK,aAAa,KAAK,UAAU,KAAK,YAAY,aAAa,CAAC;AAEpE,MAAI,CAAC,UAAU,KAAK,WAAW;AAC7B,WACE,gBAAAJ,KAAC,UAAK,WAAU,yBAAwB,cAAY,OAClD,0BAAAA,KAAC,aAAQ,WAAU,2CACjB,0BAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,sBAAAD,KAACK,UAAA,EAAQ,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,MAChE,gBAAAL,KAAC,QAAI,mBAAS,WAAU;AAAA,OAC1B,GACF,GACF;AAAA,EAEJ;AAEA,MAAI,CAAC,eAAe;AAClB,QAAI,CAAC,QAAQ,QAAQ;AACnB,aACE,gBAAAA,KAAC,UAAK,WAAU,yBAAwB,cAAY,OAClD,0BAAAA,KAAC,aAAQ,WAAU,2CACjB,0BAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,wBAAAD,KAACK,UAAA,EAAQ,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,QAChE,gBAAAL,KAAC,QAAI,mBAAS,aAAY;AAAA,QAC1B,gBAAAC,MAAC,OAAE,WAAU,sBAAqB,MAAM,sBACtC;AAAA,0BAAAD,KAACM,YAAA,EAAU,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,UACjE,SAAS;AAAA,WACZ;AAAA,SACF,GACF,GACF;AAAA,IAEJ;AAEA,WACE,gBAAAL,MAAC,UAAK,WAAU,yBAAwB,cAAY,OAClD;AAAA,sBAAAA,MAAC,YAAO,WAAU,uBAChB;AAAA,wBAAAD,KAAC,OAAE,WAAU,yBAAyB,mBAAS,aAAY;AAAA,QAC3D,gBAAAA,KAAC,QAAI,mBAAS,YAAW;AAAA,SAC3B;AAAA,MAEC,KAAK,QACJ,gBAAAA,KAAC,SAAI,WAAU,gCAA+B,MAAK,SAChD,eAAK,OACR,IACE;AAAA,MAEJ,gBAAAA,KAAC,aAAQ,WAAU,6CACjB,0BAAAA,KAAC,SAAI,WAAU,sBACb,0BAAAA,KAAC,QAAG,WAAU,0BACX,iBAAO,IAAI,CAAC,SAAS;AACpB,cAAM,SAAS,KAAK,eAAe,KAAK;AACxC,eACE,gBAAAA,KAAC,QACC,0BAAAC,MAAC,OAAE,WAAU,+BAA8B,MAAM,UAAU,iBAAiB,MAAM,GAChF;AAAA,0BAAAA,MAAC,UAAK,WAAU,+BACd;AAAA,4BAAAD,KAAC,YAAQ,kBAAO;AAAA,YACf,KAAK,YAAY,gBAAAA,KAAC,WAAO,yBAAe,KAAK,SAAS,GAAE,IAAW;AAAA,aACtE;AAAA,UACA,gBAAAC,MAAC,UAAK,WAAU,+BACb;AAAA,iBAAK,aAAa,gBAAAD,KAAC,WAAO,eAAK,YAAW,IAAW;AAAA,YACtD,gBAAAA,KAAC,YAAQ,eAAK,WAAW,WAAU;AAAA,aACrC;AAAA,WACF,KAVO,KAAK,EAWd;AAAA,MAEJ,CAAC,GACH,GACF,GACF;AAAA,MAEA,gBAAAC,MAAC,OAAE,WAAU,sBAAqB,MAAM,sBACtC;AAAA,wBAAAD,KAACM,YAAA,EAAU,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,QACjE,SAAS;AAAA,SACZ;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,CAAC,OAAO;AACV,WACE,gBAAAN,KAAC,UAAK,WAAU,yBAAwB,cAAY,OAClD,0BAAAA,KAAC,aAAQ,WAAU,2CACjB,0BAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,sBAAAD,KAACK,UAAA,EAAQ,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,MAChE,gBAAAL,KAAC,QAAI,mBAAS,eAAc;AAAA,MAC5B,gBAAAC,MAAC,OAAE,WAAU,sBAAqB,MAAM,sBACtC;AAAA,wBAAAD,KAACM,YAAA,EAAU,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,QACjE,SAAS;AAAA,SACZ;AAAA,OACF,GACF,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAL,MAAC,UAAK,WAAU,yBAAwB,cAAY,OAClD;AAAA,oBAAAA,MAAC,YAAO,WAAU,uBAChB;AAAA,sBAAAD,KAAC,OAAE,WAAU,yBAAyB,mBAAS,aAAY;AAAA,MAC3D,gBAAAA,KAAC,QAAI,gBAAM,eAAe,MAAM,IAAG;AAAA,MACnC,gBAAAC,MAAC,SAAI,WAAU,4BACb;AAAA,wBAAAD,KAAC,eAAY,OAAO,SAAS,aAAa,OAAO,MAAM,YAAY;AAAA,QACnE,gBAAAA,KAAC,eAAY,OAAO,SAAS,mBAAmB,OAAO,MAAM,cAAc;AAAA,QAC3E,gBAAAA,KAAC,eAAY,OAAO,SAAS,oBAAoB,OAAO,MAAM,eAAe;AAAA,SAC/E;AAAA,MACC,MAAM,YACL,gBAAAC,MAAC,OAAE,WAAU,4BACV;AAAA,iBAAS;AAAA,QAAc;AAAA,QAAE,eAAe,MAAM,SAAS;AAAA,SAC1D,IACE;AAAA,OACN;AAAA,IAEC,KAAK,QACJ,gBAAAD,KAAC,SAAI,WAAU,gCAA+B,MAAK,SAChD,eAAK,OACR,IACE;AAAA,IAEJ,gBAAAC,MAAC,SAAI,WAAU,wBACb;AAAA,sBAAAD,KAAC,aAAQ,WAAU,6CACjB,0BAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,wBAAAA,MAAC,SAAI,WAAU,iCACb;AAAA,0BAAAD,KAACK,UAAA,EAAQ,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,UAChE,gBAAAL,KAAC,QAAI,mBAAS,cAAa;AAAA,WAC7B;AAAA,QACA,gBAAAA,KAAC,QAAG,WAAU,uBACX,gBAAM,UAAU,IAAI,CAAC,SACpB,gBAAAC,MAAC,QAAG,WAAU,sBACZ;AAAA,0BAAAA,MAAC,UAAK,WAAU,2BACb;AAAA,iBAAK,WACJ,gBAAAD,KAAC,SAAI,KAAK,KAAK,UAAU,KAAI,IAAG,WAAU,4BAA2B,IAErE,gBAAAA,KAAC,SAAI,WAAU,kEACb,0BAAAA,KAACK,UAAA,EAAQ,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO,GAClE;AAAA,YAEF,gBAAAJ,MAAC,UACE;AAAA,mBAAK;AAAA,cACN,gBAAAA,MAAC,WAAM;AAAA;AAAA,gBAAG,KAAK;AAAA,iBAAS;AAAA,eAC1B;AAAA,aACF;AAAA,UACA,gBAAAD,KAAC,YAAQ,eAAK,YAAY,aAAa,KAAK,OAAO,aAAa,UAAI;AAAA,aAd9B,KAAK,EAe7C,CACD,GACH;AAAA,QACA,gBAAAC,MAAC,SAAI,WAAU,+BACb;AAAA,0BAAAD,KAAC,UAAM,mBAAS,OAAM;AAAA,UACtB,gBAAAA,KAAC,YAAQ,gBAAM,WAAW,WAAU;AAAA,WACtC;AAAA,SACF,GACF;AAAA,MAEA,gBAAAC,MAAC,SAAI,WAAU,sBACZ;AAAA,cAAM,kBACL,gBAAAD,KAAC,aAAQ,WAAU,uBACjB,0BAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,0BAAAD,KAAC,QAAI,mBAAS,iBAAgB;AAAA,UAC9B,gBAAAA,KAAC,OAAE,WAAU,0BAA0B,wBAAc,MAAM,eAAe,GAAE;AAAA,UAC3E,MAAM,iBACL,gBAAAA,KAAC,OAAE,WAAU,0BAA0B,gBAAM,eAAe,MAAK,IAC/D;AAAA,WACN,GACF,IACE;AAAA,QAEJ,gBAAAA,KAAC,aAAQ,WAAU,uBACjB,0BAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,iCACb;AAAA,4BAAAD,KAAC,SAAM,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,YAC9D,gBAAAA,KAAC,QAAI,mBAAS,oBAAmB;AAAA,aACnC;AAAA,UACC,MAAM,YAAY,SACjB,gBAAAA,KAAC,QAAG,WAAU,8BACX,gBAAM,WAAW,IAAI,CAAC,aACrB,gBAAAC,MAAC,QACC;AAAA,4BAAAD,KAAC,YAAQ,mBAAS,gBAAe;AAAA,YACjC,gBAAAA,KAAC,UAAM,mBAAS,cAAc,UAAI;AAAA,YACjC,SAAS,UACR,gBAAAC,MAAC,WACE;AAAA,uBAAS;AAAA,cAAQ;AAAA,cAAG,SAAS;AAAA,eAChC,IACE;AAAA,eAPG,SAAS,EAQlB,CACD,GACH,IAEA,gBAAAD,KAAC,OAAE,WAAU,+BAA+B,mBAAS,eAAc;AAAA,WAEvE,GACF;AAAA,SACF;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,OAAE,WAAU,sBAAqB,MAAM,sBACtC;AAAA,sBAAAD,KAACM,YAAA,EAAU,MAAM,IAAI,aAAa,aAAa,eAAY,QAAO;AAAA,MACjE,SAAS;AAAA,OACZ;AAAA,KACF;AAEJ;;;ACrTA,SAAS,aAAAC,YAAW,YAAAC,kBAAgB;AAG7B,SAAS,SAAS,QAAmB,QAAmB;AAC7D,QAAM,CAAC,UAAU,WAAW,IAAIA,WAA2B,OAAO;AAElE,EAAAD,WAAU,MAAM;AACd,QAAI,UAAU,WAAW,UAAU,QAAQ;AACzC,kBAAY,KAAK;AACjB;AAAA,IACF;AAEA,UAAM,QAAQ,OAAO,WAAW,8BAA8B;AAC9D,UAAM,SAAS,MAAM,YAAY,MAAM,UAAU,SAAS,OAAO;AACjE,WAAO;AACP,UAAM,iBAAiB,UAAU,MAAM;AACvC,WAAO,MAAM,MAAM,oBAAoB,UAAU,MAAM;AAAA,EACzD,GAAG,CAAC,KAAK,CAAC;AAEV,SAAO,UAAU,SAAS,SAAS;AACrC;AAEO,SAAS,iBAAiB,QAAmB,QAAmC;AACrF,QAAM,CAAC,UAAU,WAAW,IAAIC,WAA2B,OAAO;AAElE,EAAAD,WAAU,MAAM;AACd,QAAI,UAAU,QAAQ;AACpB,kBAAY,KAAK;AACjB;AAAA,IACF;AAEA,UAAM,QAAQ,OAAO,WAAW,8BAA8B;AAC9D,UAAM,SAAS,MAAM,YAAY,MAAM,UAAU,SAAS,OAAO;AACjE,WAAO;AACP,UAAM,iBAAiB,UAAU,MAAM;AACvC,WAAO,MAAM,MAAM,oBAAoB,UAAU,MAAM;AAAA,EACzD,GAAG,CAAC,KAAK,CAAC;AAEV,SAAO,UAAU,SAAS,SAAS;AACrC;","names":["useCallback","useMemo","useRef","useState","Camera","Check","Package","SearchX","ShoppingCart","data","options","useCallback","useEffect","useRef","useState","useState","useRef","useCallback","useEffect","useCallback","useEffect","useRef","useState","useState","useRef","useCallback","useEffect","useEffect","useState","useCallback","useRef","useState","useState","useRef","useCallback","data","useEffect","useRef","useRef","useEffect","useState","X","Fragment","jsx","jsxs","useState","X","useEffect","useMemo","useRef","useState","Package","Fragment","jsx","jsxs","Package","useState","useRef","useMemo","useEffect","jsx","jsxs","X","jsx","jsxs","X","Fragment","jsx","jsxs","useMemo","useRef","useState","useCallback","Camera","ShoppingCart","Package","Check","SearchX","useMemo","useState","ArrowRight","Check","Package","jsx","jsxs","Package","Check","useMemo","useState","ArrowRight","useEffect","useMemo","useState","ArrowLeft","Package","jsx","jsxs","useMemo","useState","useEffect","Package","ArrowLeft","useEffect","useState"]}