@best-bundles/bundle-ui 0.0.50 → 0.0.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/BundleBuilderDrawer.d.ts.map +1 -1
- package/dist/components/BundleBuilderPanel.d.ts.map +1 -1
- package/dist/components/RuleRewardDisplay.d.ts +15 -0
- package/dist/components/RuleRewardDisplay.d.ts.map +1 -0
- package/dist/components/VolumeDiscountPanel.d.ts.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/context/BundleProvider.d.ts.map +1 -1
- package/dist/i18n.d.ts +1 -1
- package/dist/i18n.d.ts.map +1 -1
- package/dist/index.js +2030 -1837
- package/dist/index.js.map +1 -1
- package/dist/liquid/bundle-ui.iife.css +1 -1
- package/dist/liquid/bundle-ui.iife.js +18 -18
- package/dist/liquid/bundle-ui.iife.js.map +1 -1
- package/dist/stories/BundleUI.stories.d.ts.map +1 -1
- package/dist/stories/fixtures/productBundle.d.ts.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/previewMode.d.ts +7 -0
- package/dist/utils/previewMode.d.ts.map +1 -0
- package/dist/utils/ruleReward.d.ts +11 -0
- package/dist/utils/ruleReward.d.ts.map +1 -0
- package/dist/utils/stock.d.ts +1 -0
- package/dist/utils/stock.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/constants.ts","../src/api/fetchActiveBundleConfigs.ts","../src/api/fetchBundleConfig.ts","../src/api/fetchBundleConfigStatus.ts","../src/utils/stock.ts","../src/utils/analytics.ts","../src/i18n.ts","../src/context/BundleProvider.tsx","../src/hooks/useBundleBuilder.ts","../src/hooks/useBundleBuilderDrawer.ts","../src/components/BundleButton.tsx","../../../node_modules/tween-functions/index.js","../../../node_modules/react-confetti/dist/react-confetti.mjs","../../../node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/lucide-react/dist/esm/icons/chevron-down.js","../../../node_modules/lucide-react/dist/esm/icons/plus.js","../../../node_modules/lucide-react/dist/esm/icons/search.js","../../../node_modules/lucide-react/dist/esm/icons/trash-2.js","../src/components/BundleBuilderDrawer.tsx","../src/components/BundleBuilderPanel.tsx","../src/components/VolumeDiscountPanel.tsx","../src/adapters/LiquidAdapter.ts"],"sourcesContent":["export const BundleLineAttributeKeys = {\n bundleId: \"_bundle_id\",\n bundleConfig: \"_bundle_config\",\n bundleSource: \"_bundle_source\",\n bundleTitle: \"_bundle_title\",\n} as const;\n\nexport const BundleSessionStorageKeys = {\n pendingActions: \"best_bundles_pending_actions\",\n redirectedBundleState: \"best_bundles_redirected_bundle_state\",\n} as const;\n","import type { PublicActiveBundleConfigsResponse } from \"../types\";\n\nexport async function fetchActiveBundleConfigs(params: {\n apiBaseUrl: string;\n shop: string;\n signal?: AbortSignal;\n}): Promise<PublicActiveBundleConfigsResponse> {\n const url = new URL(\"/api/public/bundle-configs-active\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicActiveBundleConfigsResponse;\n}\n","import type { PublicBundleConfigResponse } from \"../types\";\n\nexport async function fetchBundleConfig(params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n fresh?: boolean;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigResponse> {\n const url = new URL(\"/api/public/bundle-config\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n if (params.configHandle) {\n url.searchParams.set(\"handle\", params.configHandle);\n }\n if (params.fresh) {\n url.searchParams.set(\"fresh\", \"1\");\n }\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n // The endpoint uses 4xx/5xx for some errors; normalize to {ok:false}.\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigResponse;\n}\n","import type { PublicBundleConfigStatusResponse } from \"../types\";\n\nexport async function fetchBundleConfigStatus(params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigStatusResponse> {\n const url = new URL(\"/api/public/bundle-config-status\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n if (params.configHandle) {\n url.searchParams.set(\"handle\", params.configHandle);\n }\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigStatusResponse;\n}\n","import type { BundleEligibleVariant } from \"../types\";\n\nexport function getVariantSelectionLimit(variant: BundleEligibleVariant | null | undefined) {\n if (!variant || variant.availableForSale === false) return 0;\n if (variant.inventoryPolicy === \"CONTINUE\") return Number.POSITIVE_INFINITY;\n // Untracked inventory can surface as null/0 sellable quantity while still available for sale.\n if (variant.sellableOnlineQuantity == null) return Number.POSITIVE_INFINITY;\n\n const quantity = Number(variant.sellableOnlineQuantity);\n if (!Number.isFinite(quantity)) return Number.POSITIVE_INFINITY;\n if (quantity <= 0 && variant.availableForSale === true) return Number.POSITIVE_INFINITY;\n return Math.max(0, Math.floor(quantity));\n}\n\nexport function isVariantAtStockLimit(\n variant: BundleEligibleVariant | null | undefined,\n quantity: number,\n) {\n const limit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(limit)) return false;\n return Math.max(0, Math.floor(quantity || 0)) >= limit;\n}\n","const ANONYMOUS_USER_ID_KEY = \"bb_anonymous_user_id\";\n\n/**\n * Gets or creates an anonymous user ID stored in localStorage.\n * This ID persists across sessions to attribute events to the same user.\n */\nexport function getOrCreateAnonymousUserId(): string {\n if (typeof window === \"undefined\" || typeof localStorage === \"undefined\") {\n // Fallback for SSR or environments without localStorage\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n try {\n const existing = localStorage.getItem(ANONYMOUS_USER_ID_KEY);\n if (existing && typeof existing === \"string\" && existing.length > 0) {\n return existing;\n }\n\n // Generate new ID\n let newId: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) {\n newId = cryptoAny.randomUUID();\n } else {\n throw new Error(\"crypto.randomUUID not available\");\n }\n } catch {\n // Fallback UUID generation\n newId = `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n localStorage.setItem(ANONYMOUS_USER_ID_KEY, newId);\n return newId;\n } catch {\n // If localStorage fails, generate a temporary ID\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n\nexport type AnalyticsEventType =\n | \"DRAWER_OPENED\"\n | \"DRAWER_CLOSED\"\n | \"VARIANT_SELECTION_CHANGED\"\n | \"BUNDLE_ADDED_TO_BASKET\";\n\n/** Mixpanel event names used for the bundle funnel (backend maps these to Mixpanel). */\nexport type MixpanelBundleEventName =\n | \"bundle_opened\"\n | \"bundle_closed\"\n | \"bundle_started\"\n | \"bundle_completed\"\n | \"bundle_added_to_cart\"\n | \"checkout_started_with_bundle\";\n\nexport type DrawerOpenedEvent = {\n eventType: \"DRAWER_OPENED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_opened\";\n};\n\nexport type DrawerClosedEvent = {\n eventType: \"DRAWER_CLOSED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_closed\";\n};\n\nexport type VariantSelectionChangedEvent = {\n eventType: \"VARIANT_SELECTION_CHANGED\";\n shop: string;\n anonymousUserId: string;\n before: Record<string, number>; // variantId -> quantity\n after: Record<string, number>;\n timestamp: string;\n mixpanelEvent?: \"bundle_started\" | \"bundle_completed\";\n};\n\nexport type BundleAddedToBasketEvent = {\n eventType: \"BUNDLE_ADDED_TO_BASKET\";\n shop: string;\n anonymousUserId: string;\n bundleId: string;\n productVariantIds: string[];\n grossPrice: number;\n discountedPrice: number;\n currency?: string;\n discountThresholdIdentifier: string; // rule handle\n discountLabel: string;\n discountPercentage: number | null;\n discountedAmount: number;\n timestamp: string;\n checkout?: boolean;\n mixpanelEvent?: \"bundle_added_to_cart\" | \"checkout_started_with_bundle\";\n};\n\nexport type AnalyticsEvent =\n | DrawerOpenedEvent\n | DrawerClosedEvent\n | VariantSelectionChangedEvent\n | BundleAddedToBasketEvent;\n\n/**\n * Sends an analytics event to the backend API endpoint.\n * Failures are silently caught to prevent breaking bundle functionality.\n */\nexport async function trackEvent(\n analyticsEndpoint: string,\n shop: string,\n event: AnalyticsEvent,\n): Promise<void> {\n if (typeof window === \"undefined\") {\n return; // Skip in SSR\n }\n\n try {\n const url = new URL(analyticsEndpoint, window.location.origin);\n url.searchParams.set(\"shop\", shop);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(event),\n // Don't wait for response - fire and forget\n keepalive: true,\n });\n\n if (!response.ok) {\n console.warn(\n `[Bundle Analytics] Event tracking failed with status ${response.status}:`,\n await response.text().catch(() => \"Unable to read response\"),\n );\n }\n } catch (error) {\n // Log error for debugging but don't break bundle functionality\n console.warn(\"[Bundle Analytics] Failed to track event:\", error);\n }\n}\n","export type BundleUiLocale = \"en\" | \"fr\" | \"de\" | \"es\";\n\nexport type BundleUiMessageKey =\n | \"bundle.title.default\"\n | \"bundle.loading\"\n | \"bundle.empty\"\n | \"bundle.drawer.aria\"\n | \"bundle.search\"\n | \"bundle.search.expanded\"\n | \"bundle.search.placeholder\"\n | \"bundle.search.clear\"\n | \"bundle.close\"\n | \"bundle.section.discount_tiers\"\n | \"bundle.section.your_bundle\"\n | \"bundle.section.select_items\"\n | \"bundle.select.items\"\n | \"bundle.size.min\"\n | \"bundle.stock.max_reached\"\n | \"bundle.stock.max_added\"\n | \"bundle.stock.sold_out\"\n | \"bundle.item.generic\"\n | \"bundle.slot\"\n | \"bundle.unlocks\"\n | \"bundle.totals\"\n | \"bundle.discount.badge\"\n | \"bundle.discount.off_label\"\n | \"bundle.celebration.received_discount\"\n | \"bundle.cta.adding\"\n | \"bundle.cta.processing\"\n | \"bundle.cta.checkout\"\n | \"bundle.cta.add_to_bundle\"\n | \"bundle.cta.add_to_basket\"\n | \"bundle.cta.add_more\"\n | \"bundle.powered_by\"\n | \"bundle.button.default\"\n | \"bundle.provider.inactive_error\"\n | \"bundle.provider.load_error\"\n | \"bundle.provider.stock_error\"\n | \"bundle.provider.add_error\"\n | \"bundle.a11y.add_to_bundle\"\n | \"bundle.a11y.remove_from_bundle\"\n | \"bundle.a11y.quantity\"\n | \"bundle.a11y.sold_out\"\n | \"bundle.a11y.max_available_selected\"\n | \"bundle.a11y.increase\"\n | \"bundle.a11y.decrease\"\n | \"bundle.select.variant\"\n | \"bundle.stock.sold_out_suffix\";\n\nexport type BundleUiMessages = Partial<Record<BundleUiMessageKey, string>>;\n\ntype Dict = Record<BundleUiMessageKey, string>;\n\nconst EN: Dict = {\n \"bundle.title.default\": \"Build your bundle\",\n \"bundle.loading\": \"Loading...\",\n \"bundle.empty\": \"Your selected eligible products for bundling will show here\",\n \"bundle.drawer.aria\": \"Bundle builder\",\n \"bundle.search\": \"Search\",\n \"bundle.search.expanded\": \"Search (expanded)\",\n \"bundle.search.placeholder\": \"Search\",\n \"bundle.search.clear\": \"Clear search\",\n \"bundle.close\": \"Close\",\n \"bundle.section.discount_tiers\": \"Discount tiers\",\n \"bundle.section.your_bundle\": \"Your bundle\",\n \"bundle.section.select_items\": \"Choose items\",\n \"bundle.select.items\": \"Select items\",\n \"bundle.size.min\": \"(min {{min}})\",\n \"bundle.stock.max_reached\": \"Max Reached\",\n \"bundle.stock.max_added\": \"Max Added To Cart\",\n \"bundle.stock.sold_out\": \"Sold Out\",\n \"bundle.item.generic\": \"Item\",\n \"bundle.slot\": \"Slot {{slot}}\",\n \"bundle.unlocks\": \"Unlocks {{discount}}\",\n \"bundle.totals\": \"Totals\",\n \"bundle.discount.badge\": \"{{discount}}% Discount\",\n \"bundle.discount.off_label\": \"{{discount}}% off\",\n \"bundle.celebration.received_discount\": \"You received a {{discount}}% discount!\",\n \"bundle.cta.adding\": \"Adding...\",\n \"bundle.cta.processing\": \"Processing...\",\n \"bundle.cta.checkout\": \"Checkout\",\n \"bundle.cta.add_to_bundle\": \"Add\",\n \"bundle.cta.add_to_basket\": \"Add to Basket\",\n \"bundle.cta.add_more\": \"Add {{count}} more {{productWord}}\",\n \"bundle.powered_by\": \"powered by\",\n \"bundle.button.default\": \"Build a bundle\",\n \"bundle.provider.inactive_error\": \"Bundle is inactive.\",\n \"bundle.provider.load_error\": \"Failed to load bundle config.\",\n \"bundle.provider.stock_error\": \"Some bundle items are no longer available in the requested quantity. Please review your selection.\",\n \"bundle.provider.add_error\": \"We couldn't add this bundle right now. Please try again.\",\n \"bundle.a11y.add_to_bundle\": \"Add {{name}} to bundle\",\n \"bundle.a11y.remove_from_bundle\": \"Remove {{name}} from bundle\",\n \"bundle.a11y.quantity\": \"{{name}} quantity {{qty}}\",\n \"bundle.a11y.sold_out\": \"{{name}} is sold out\",\n \"bundle.a11y.max_available_selected\": \"{{name}} max available selected\",\n \"bundle.a11y.increase\": \"Increase {{name}}\",\n \"bundle.a11y.decrease\": \"Decrease {{name}}\",\n \"bundle.select.variant\": \"Select\",\n \"bundle.stock.sold_out_suffix\": \"— Sold Out\",\n};\n\nconst FR: Dict = {\n ...EN,\n \"bundle.title.default\": \"Creez votre bundle\",\n \"bundle.loading\": \"Chargement...\",\n \"bundle.empty\": \"Vos produits eligibles selectionnes pour le bundle apparaitront ici\",\n \"bundle.drawer.aria\": \"Constructeur de bundle\",\n \"bundle.search\": \"Rechercher\",\n \"bundle.search.expanded\": \"Rechercher (deplie)\",\n \"bundle.search.placeholder\": \"Rechercher\",\n \"bundle.search.clear\": \"Effacer la recherche\",\n \"bundle.close\": \"Fermer\",\n \"bundle.section.discount_tiers\": \"Paliers de remise\",\n \"bundle.section.your_bundle\": \"Votre bundle\",\n \"bundle.section.select_items\": \"Choisir des articles\",\n \"bundle.select.items\": \"Selectionner des articles\",\n \"bundle.stock.max_reached\": \"Maximum atteint\",\n \"bundle.stock.max_added\": \"Maximum deja dans le panier\",\n \"bundle.stock.sold_out\": \"Rupture de stock\",\n \"bundle.totals\": \"Totaux\",\n \"bundle.discount.badge\": \"{{discount}}% de réduction\",\n \"bundle.discount.off_label\": \"{{discount}}% de réduction\",\n \"bundle.celebration.received_discount\": \"Vous avez recu une reduction de {{discount}}% !\",\n \"bundle.cta.checkout\": \"Paiement\",\n \"bundle.cta.add_to_bundle\": \"Ajouter\",\n \"bundle.cta.add_to_basket\": \"Ajouter au panier\",\n \"bundle.cta.add_more\": \"Ajoutez encore {{count}} {{productWord}}\",\n \"bundle.powered_by\": \"propulse par\",\n \"bundle.button.default\": \"Creer un bundle\",\n \"bundle.a11y.add_to_bundle\": \"Ajouter {{name}} au bundle\",\n \"bundle.a11y.remove_from_bundle\": \"Retirer {{name}} du bundle\",\n \"bundle.a11y.quantity\": \"Quantite de {{name}} : {{qty}}\",\n \"bundle.a11y.sold_out\": \"{{name}} est en rupture de stock\",\n \"bundle.a11y.max_available_selected\": \"{{name}} quantite maximale deja selectionnee\",\n \"bundle.a11y.increase\": \"Augmenter {{name}}\",\n \"bundle.a11y.decrease\": \"Diminuer {{name}}\",\n \"bundle.select.variant\": \"Sélectionner\",\n \"bundle.stock.sold_out_suffix\": \"— Rupture de stock\",\n};\n\nconst DE: Dict = {\n ...EN,\n \"bundle.title.default\": \"Bundle erstellen\",\n \"bundle.loading\": \"Wird geladen...\",\n \"bundle.empty\": \"Ihre ausgewahlten bundelbaren Produkte werden hier angezeigt\",\n \"bundle.drawer.aria\": \"Bundle-Builder\",\n \"bundle.search\": \"Suchen\",\n \"bundle.search.expanded\": \"Suche (erweitert)\",\n \"bundle.search.placeholder\": \"Suchen\",\n \"bundle.search.clear\": \"Suche loschen\",\n \"bundle.close\": \"Schliessen\",\n \"bundle.section.discount_tiers\": \"Rabattstufen\",\n \"bundle.section.your_bundle\": \"Ihr Bundle\",\n \"bundle.section.select_items\": \"Artikel auswahlen\",\n \"bundle.select.items\": \"Artikel auswahlen\",\n \"bundle.stock.max_reached\": \"Maximum erreicht\",\n \"bundle.stock.max_added\": \"Maximum bereits im Warenkorb\",\n \"bundle.stock.sold_out\": \"Ausverkauft\",\n \"bundle.totals\": \"Summen\",\n \"bundle.discount.badge\": \"{{discount}}% Rabatt\",\n \"bundle.discount.off_label\": \"{{discount}}% Rabatt\",\n \"bundle.celebration.received_discount\": \"Sie haben {{discount}}% Rabatt erhalten!\",\n \"bundle.cta.checkout\": \"Zur Kasse\",\n \"bundle.cta.add_to_bundle\": \"Hinzufügen\",\n \"bundle.cta.add_to_basket\": \"In den Warenkorb\",\n \"bundle.cta.add_more\": \"Fuge noch {{count}} {{productWord}} hinzu\",\n \"bundle.powered_by\": \"powered by\",\n \"bundle.button.default\": \"Bundle erstellen\",\n \"bundle.a11y.add_to_bundle\": \"{{name}} zum Bundle hinzufügen\",\n \"bundle.a11y.remove_from_bundle\": \"{{name}} aus dem Bundle entfernen\",\n \"bundle.a11y.quantity\": \"{{name}} Menge {{qty}}\",\n \"bundle.a11y.sold_out\": \"{{name}} ist ausverkauft\",\n \"bundle.a11y.max_available_selected\": \"{{name}} maximale verfugbare Menge bereits ausgewahlt\",\n \"bundle.a11y.increase\": \"{{name}} erhöhen\",\n \"bundle.a11y.decrease\": \"{{name}} verringern\",\n \"bundle.select.variant\": \"Auswählen\",\n \"bundle.stock.sold_out_suffix\": \"— Ausverkauft\",\n};\n\nconst ES: Dict = {\n ...EN,\n \"bundle.title.default\": \"Crea tu bundle\",\n \"bundle.loading\": \"Cargando...\",\n \"bundle.empty\": \"Tus productos elegibles seleccionados para el bundle se mostraran aqui\",\n \"bundle.drawer.aria\": \"Constructor de bundles\",\n \"bundle.search\": \"Buscar\",\n \"bundle.search.expanded\": \"Buscar (expandido)\",\n \"bundle.search.placeholder\": \"Buscar\",\n \"bundle.search.clear\": \"Limpiar busqueda\",\n \"bundle.close\": \"Cerrar\",\n \"bundle.section.discount_tiers\": \"Niveles de descuento\",\n \"bundle.section.your_bundle\": \"Tu bundle\",\n \"bundle.section.select_items\": \"Elegir articulos\",\n \"bundle.select.items\": \"Seleccionar articulos\",\n \"bundle.stock.max_reached\": \"Maximo alcanzado\",\n \"bundle.stock.max_added\": \"Maximo agregado al carrito\",\n \"bundle.stock.sold_out\": \"Agotado\",\n \"bundle.totals\": \"Totales\",\n \"bundle.discount.badge\": \"{{discount}}% de descuento\",\n \"bundle.discount.off_label\": \"{{discount}}% de descuento\",\n \"bundle.celebration.received_discount\": \"Has recibido un {{discount}}% de descuento!\",\n \"bundle.cta.checkout\": \"Pagar\",\n \"bundle.cta.add_to_bundle\": \"Agregar\",\n \"bundle.cta.add_to_basket\": \"Agregar al carrito\",\n \"bundle.cta.add_more\": \"Agrega {{count}} {{productWord}} mas\",\n \"bundle.powered_by\": \"impulsado por\",\n \"bundle.button.default\": \"Crear bundle\",\n \"bundle.a11y.add_to_bundle\": \"Agregar {{name}} al bundle\",\n \"bundle.a11y.remove_from_bundle\": \"Quitar {{name}} del bundle\",\n \"bundle.a11y.quantity\": \"Cantidad de {{name}}: {{qty}}\",\n \"bundle.a11y.sold_out\": \"{{name}} esta agotado\",\n \"bundle.a11y.max_available_selected\": \"{{name}} cantidad maxima disponible ya seleccionada\",\n \"bundle.a11y.increase\": \"Aumentar {{name}}\",\n \"bundle.a11y.decrease\": \"Disminuir {{name}}\",\n \"bundle.select.variant\": \"Seleccionar\",\n \"bundle.stock.sold_out_suffix\": \"— Agotado\",\n};\n\nconst DICTS: Record<BundleUiLocale, Dict> = {\n en: EN,\n fr: FR,\n de: DE,\n es: ES,\n};\n\nexport function normalizeBundleLocale(raw: string | null | undefined): BundleUiLocale {\n const value = String(raw ?? \"\").trim().toLowerCase();\n if (!value) return \"en\";\n const base = value.split(\"-\")[0] ?? \"en\";\n if (base === \"fr\" || base === \"de\" || base === \"en\" || base === \"es\") return base;\n return \"en\";\n}\n\nexport function translateBundleUi(\n locale: BundleUiLocale,\n key: BundleUiMessageKey,\n vars?: Record<string, string | number>,\n overrides?: BundleUiMessages,\n): string {\n const template = overrides?.[key] ?? DICTS[locale]?.[key] ?? EN[key] ?? key;\n if (!vars) return template;\n return Object.entries(vars).reduce((text, [name, value]) => {\n return text.replaceAll(`{{${name}}}`, String(value));\n }, template);\n}\n\nexport function formatBundleCurrency(amount: string | number, currencyCode: string | null, locale: string) {\n const n = Number(amount);\n if (!Number.isFinite(n)) return String(amount);\n\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(locale || undefined, { style: \"currency\", currency: currencyCode }).format(n);\n } catch {\n // ignore and fall through\n }\n }\n\n return `$${n.toFixed(2)}`;\n}\n\nexport function getProductWord(locale: BundleUiLocale, count: number) {\n const plural = count === 1 ? \"one\" : \"many\";\n if (locale === \"fr\") return plural === \"one\" ? \"produit\" : \"produits\";\n if (locale === \"de\") return plural === \"one\" ? \"Produkt\" : \"Produkte\";\n if (locale === \"es\") return plural === \"one\" ? \"producto\" : \"productos\";\n return plural === \"one\" ? \"product\" : \"products\";\n}\n","import { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { fetchActiveBundleConfigs } from \"../api/fetchActiveBundleConfigs\";\nimport { fetchBundleConfig as defaultFetchBundleConfig } from \"../api/fetchBundleConfig\";\nimport { fetchBundleConfigStatus } from \"../api/fetchBundleConfigStatus\";\nimport { BundleLineAttributeKeys, BundleSessionStorageKeys } from \"../constants\";\nimport type {\n BundleCartAdapter,\n BundleConfig,\n BundleCartLineAttribute,\n BundleEligibleVariant,\n BundleSelectedLine,\n BundleSelectionSnapshot,\n PublicActiveBundleConfigsResponse,\n PublicBundleConfigResponse,\n PublicBundleConfigStatusResponse,\n StyleSettings,\n} from \"../types\";\nimport { getVariantSelectionLimit } from \"../utils/stock\";\nimport { getOrCreateAnonymousUserId, trackEvent } from \"../utils/analytics\";\nimport type { BundleUiLocale, BundleUiMessageKey, BundleUiMessages } from \"../i18n\";\nimport { normalizeBundleLocale, translateBundleUi } from \"../i18n\";\n\ntype BundleProviderData = {\n currencyCode: string | null;\n config: BundleConfig;\n eligibleVariants: BundleEligibleVariant[];\n};\n\ntype BundleProviderCacheEntry = BundleProviderData;\ntype BundleConfigCache = Record<string, BundleProviderCacheEntry>;\ntype BundleSelectionState = Record<string, number>;\ntype BundleSelectionOrder = string[];\ntype BundleSelectedLines = BundleSelectedLine[];\ntype OpenSource = \"api\" | \"hash\" | \"click\";\n\nexport type BundleProviderProps = {\n apiBaseUrl: string;\n shop: string;\n cartAdapter: BundleCartAdapter;\n configHandle?: string;\n initialData?: BundleProviderData;\n configFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n fresh?: boolean;\n signal?: AbortSignal;\n }) => Promise<PublicBundleConfigResponse>;\n activeConfigsFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n signal?: AbortSignal;\n }) => Promise<PublicActiveBundleConfigsResponse>;\n configStatusFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n }) => Promise<PublicBundleConfigStatusResponse>;\n analyticsEndpoint?: string;\n allowDrawerWhenInactive?: boolean;\n locale?: string;\n messages?: BundleUiMessages;\n children: React.ReactNode;\n};\n\nexport type BundleBuilderContextValue = {\n isOpen: boolean;\n open: () => void;\n openForHandle: (handle: string, source?: OpenSource) => void;\n close: () => void;\n toggle: () => void;\n syncCartQuantities: () => Promise<void>;\n currentHandle: string;\n setConfigHandle: (handle: string) => void;\n loadHandle: (handle: string) => void;\n\n loading: boolean;\n submitting: boolean;\n error: string | null;\n\n currencyCode: string | null;\n config: BundleConfig | null;\n eligibleVariants: BundleEligibleVariant[];\n\n selections: BundleSelectionState;\n selectionOrder: BundleSelectionOrder;\n selectedLines: BundleSelectedLines;\n getVariantMaxSelectableQuantity: (merchandiseId: string) => number | null;\n setQuantity: (merchandiseId: string, quantity: number) => void;\n addConfiguredVariant: (input: {\n merchandiseId: string;\n configHandle?: string;\n attributes?: BundleCartLineAttribute[];\n restoreSnapshot?: BundleSelectionSnapshot | null;\n }) => boolean;\n getSelectionSnapshot: () => BundleSelectionSnapshot;\n restoreSelectionSnapshot: (snapshot: BundleSelectionSnapshot | null | undefined) => void;\n redirectVariantToProductPage: (variant: BundleEligibleVariant) => void;\n clearSelections: () => void;\n\n bundleSize: number;\n minRequired: number;\n canSubmit: boolean;\n submit: () => Promise<void>;\n submitAndCheckout: () => Promise<void>;\n locale: BundleUiLocale;\n t: (key: BundleUiMessageKey, vars?: Record<string, string | number>) => string;\n};\n\nexport const BundleBuilderContext = createContext<BundleBuilderContextValue | null>(null);\n\nconst BUNDLE_DRAWER_HASH = \"#best-bundles\";\nconst EMPTY_ELIGIBLE_VARIANTS: BundleEligibleVariant[] = [];\n\nfunction normalizeBundleHandle(raw: string | null | undefined) {\n const value = String(raw ?? \"\").trim().toLowerCase();\n if (!value) return \"default\";\n const cleaned = value\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+/, \"\")\n .replace(/-+$/, \"\")\n .replace(/-{2,}/g, \"-\");\n return cleaned || \"default\";\n}\n\nfunction getBundleHashHandle(hash: string): string | null {\n const value = String(hash ?? \"\").trim().toLowerCase();\n if (!value.startsWith(BUNDLE_DRAWER_HASH)) return null;\n if (value === BUNDLE_DRAWER_HASH) return \"default\";\n const prefix = `${BUNDLE_DRAWER_HASH}:`;\n if (!value.startsWith(prefix)) return null;\n return normalizeBundleHandle(value.slice(prefix.length));\n}\n\ntype StyleSettingCssVarKey = Exclude<keyof StyleSettings, \"confettiColors\">;\nconst STYLE_SETTINGS_TO_CSS_VAR: Record<StyleSettingCssVarKey, string> = {\n primaryColor: \"--bb-cta-bg\",\n primaryHoverColor: \"--bb-cta-bg-hover\",\n primaryTextColor: \"--bb-cta-text\",\n backgroundColor: \"--bb-surface-bg\",\n backdropColor: \"--bb-backdrop-bg\",\n textColor: \"--bb-text-color\",\n titleColor: \"--bb-title-color\",\n mutedTextColor: \"--bb-muted-color\",\n borderRadius: \"--bb-panel-radius\",\n borderColor: \"--bb-border-color\",\n borderStrongColor: \"--bb-border-strong-color\",\n focusRingColor: \"--bb-focus-ring\",\n tierBorderColor: \"--bb-tier-border\",\n tierTextColor: \"--bb-tier-text\",\n tierBackgroundColor: \"--bb-tier-bg\",\n celebrationTextColor: \"--bb-celebration-text\",\n celebrationBgTop: \"--bb-celebration-bg-top\",\n celebrationBgBottom: \"--bb-celebration-bg-bottom\",\n celebrationBorderColor: \"--bb-celebration-border\",\n fontFamilyBody: \"--bb-font-family-body\",\n fontFamilyTitle: \"--bb-font-family-title\",\n};\n\nconst GOOGLE_FONTS_LINK_ID = \"bb-google-fonts\";\n\nfunction fontNameToParam(name: string): string {\n const s = (name ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n return s ? encodeURIComponent(s).replace(/%20/g, \"+\") : \"\";\n}\n\nfunction injectGoogleFontsLink(styles: StyleSettings | undefined) {\n if (typeof document === \"undefined\" || !document.head) return;\n if (!styles) {\n document.getElementById(GOOGLE_FONTS_LINK_ID)?.remove();\n return;\n }\n const body = (styles.fontFamilyBody ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const title = (styles.fontFamilyTitle ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const families: string[] = [];\n if (body) families.push(\"family=\" + fontNameToParam(body));\n if (title && title !== body) families.push(\"family=\" + fontNameToParam(title));\n const existing = document.getElementById(GOOGLE_FONTS_LINK_ID) as HTMLLinkElement | null;\n if (families.length === 0) {\n existing?.remove();\n return;\n }\n const href = `https://fonts.googleapis.com/css2?${families.join(\"&\")}&display=swap`;\n if (existing) {\n if (existing.getAttribute(\"href\") !== href) existing.setAttribute(\"href\", href);\n return;\n }\n const link = document.createElement(\"link\");\n link.id = GOOGLE_FONTS_LINK_ID;\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n}\n\nfunction injectStyleVariables(styles: StyleSettings | undefined) {\n if (!styles) return;\n injectGoogleFontsLink(styles);\n const root = document.documentElement;\n (Object.entries(STYLE_SETTINGS_TO_CSS_VAR) as Array<[StyleSettingCssVarKey, string]>).forEach(([key, cssVar]) => {\n let value = styles[key];\n if (value) {\n if ((key === \"fontFamilyBody\" || key === \"fontFamilyTitle\") && /^\\s*\\S+\\s+\\S/.test(value) && !/^[\"']/.test(value.trim())) {\n value = `\"${value.trim().replace(/^[\"']|[\"']$/g, \"\")}\"`;\n }\n root.style.setProperty(cssVar, value);\n }\n });\n}\n\nfunction getEffectiveStyleSettings(configSettings: StyleSettings | undefined): StyleSettings | undefined {\n if (typeof window === \"undefined\") return configSettings;\n const preview = (window as Window & { __BUNDLE_PREVIEW_STYLES__?: StyleSettings }).__BUNDLE_PREVIEW_STYLES__;\n if (preview && typeof preview === \"object\") return preview;\n return configSettings;\n}\n\nfunction safeRandomUUID() {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) return cryptoAny.randomUUID();\n } catch {\n // ignore\n }\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction clampQty(n: number) {\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.floor(n));\n}\n\nfunction clampToVariantLimit(quantity: number, limit: number) {\n const normalized = clampQty(quantity);\n if (!Number.isFinite(limit)) return normalized;\n return Math.min(normalized, Math.max(0, Math.floor(limit)));\n}\n\nfunction normalizeLineAttributes(attributes?: BundleCartLineAttribute[]) {\n if (!Array.isArray(attributes) || !attributes.length) return undefined;\n const normalized = attributes\n .map((attribute) => {\n const key = String(attribute?.key ?? \"\").trim();\n if (!key) return null;\n return {\n key,\n value: String(attribute?.value ?? \"\"),\n };\n })\n .filter(Boolean) as BundleCartLineAttribute[];\n return normalized.length ? normalized : undefined;\n}\n\nfunction attributesSignature(attributes?: BundleCartLineAttribute[]) {\n const normalized = normalizeLineAttributes(attributes);\n if (!normalized?.length) return \"\";\n return JSON.stringify(\n [...normalized]\n .sort((a, b) => a.key.localeCompare(b.key) || a.value.localeCompare(b.value)),\n );\n}\n\nfunction createSelectedLine(merchandiseId: string, attributes?: BundleCartLineAttribute[]): BundleSelectedLine {\n return {\n id: safeRandomUUID(),\n merchandiseId,\n quantity: 1,\n attributes: normalizeLineAttributes(attributes),\n };\n}\n\nfunction snapshotFromLines(lines: BundleSelectedLines): BundleSelectionSnapshot {\n return {\n lines: lines.map((line) => ({\n id: line.id,\n merchandiseId: line.merchandiseId,\n quantity: clampQty(line.quantity || 1) || 1,\n ...(line.attributes?.length ? { attributes: normalizeLineAttributes(line.attributes) } : {}),\n })),\n };\n}\n\nfunction restoreLinesFromSnapshot(snapshot: BundleSelectionSnapshot | null | undefined): BundleSelectedLines {\n if (!snapshot || !Array.isArray(snapshot.lines)) return [];\n return snapshot.lines\n .map((line) => {\n const merchandiseId = String(line?.merchandiseId ?? \"\").trim();\n if (!merchandiseId) return null;\n return {\n id: String(line?.id ?? \"\").trim() || safeRandomUUID(),\n merchandiseId,\n quantity: clampQty(line?.quantity || 1) || 1,\n attributes: normalizeLineAttributes(line?.attributes),\n } satisfies BundleSelectedLine;\n })\n .filter(Boolean) as BundleSelectedLines;\n}\n\nfunction shouldUseActiveConfigPreload(\n allowDrawerWhenInactive: boolean,\n initialData?: BundleProviderData,\n) {\n return !allowDrawerWhenInactive && !initialData;\n}\n\nexport function BundleProvider(props: BundleProviderProps) {\n const {\n apiBaseUrl,\n shop,\n cartAdapter,\n configHandle = \"default\",\n initialData,\n configFetcher,\n activeConfigsFetcher,\n configStatusFetcher,\n analyticsEndpoint: providedAnalyticsEndpoint,\n allowDrawerWhenInactive = false,\n locale: inputLocale,\n messages,\n children,\n } = props;\n\n const locale = normalizeBundleLocale(inputLocale);\n const t = useCallback((key: BundleUiMessageKey, vars?: Record<string, string | number>) => {\n return translateBundleUi(locale, key, vars, messages);\n }, [locale, messages]);\n\n const normalizedInitialHandle = normalizeBundleHandle(configHandle);\n const analyticsEndpoint = providedAnalyticsEndpoint ?? `${apiBaseUrl}/api/public/bundle-analytics`;\n const useActivePreload = shouldUseActiveConfigPreload(allowDrawerWhenInactive, initialData);\n\n const [isOpen, setIsOpen] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [cartSyncing, setCartSyncing] = useState(false);\n const [cartQuantitiesByMerchandiseId, setCartQuantitiesByMerchandiseId] = useState<Record<string, number>>({});\n const [currentHandle, setCurrentHandleState] = useState(normalizedInitialHandle);\n const [configCache, setConfigCache] = useState<BundleConfigCache>(() => (\n initialData ? { [normalizedInitialHandle]: initialData } : {}\n ));\n const [bootstrapLoading, setBootstrapLoading] = useState(useActivePreload);\n const [blockingHandleLoad, setBlockingHandleLoad] = useState<string | null>(\n !useActivePreload && !initialData ? normalizedInitialHandle : null,\n );\n const [statusCheckPending, setStatusCheckPending] = useState<string | null>(null);\n const [pendingOpenHandle, setPendingOpenHandle] = useState<{ handle: string; source: OpenSource } | null>(null);\n const [selectedLines, setSelectedLines] = useState<BundleSelectedLines>(() => []);\n\n const preloadAbortRef = useRef<AbortController | null>(null);\n const handleFetchAbortRef = useRef<AbortController | null>(null);\n const statusAbortRef = useRef<AbortController | null>(null);\n const cartSyncSeqRef = useRef(0);\n const currentHandleRef = useRef(currentHandle);\n const configCacheRef = useRef(configCache);\n const bootstrapLoadingRef = useRef(bootstrapLoading);\n const openForHandleRef = useRef<((handle: string, source?: OpenSource) => void) | null>(null);\n const lastSeenHashRef = useRef<string | null>(null);\n const skipSelectionResetOnHandleChangeRef = useRef(false);\n const preserveSelectionsUntilHandleLoadedRef = useRef<string | null>(null);\n const fetcher = configFetcher ?? defaultFetchBundleConfig;\n const activePreloadFetcher = activeConfigsFetcher ?? fetchActiveBundleConfigs;\n const statusFetcher = configStatusFetcher ?? fetchBundleConfigStatus;\n\n const loadCartQuantities = useCallback(async () => {\n if (typeof cartAdapter.getLineQuantitiesByMerchandiseId !== \"function\") return null;\n const quantities = await cartAdapter.getLineQuantitiesByMerchandiseId();\n return Object.entries(quantities ?? {}).reduce<Record<string, number>>((acc, [id, quantity]) => {\n const q = clampQty(quantity);\n if (q > 0) acc[id] = q;\n return acc;\n }, {});\n }, [cartAdapter]);\n\n const refreshCartQuantities = useCallback(async () => {\n const syncSeq = ++cartSyncSeqRef.current;\n setCartSyncing(true);\n try {\n const quantities = await loadCartQuantities();\n if (quantities && syncSeq === cartSyncSeqRef.current) {\n setCartQuantitiesByMerchandiseId(quantities);\n }\n return quantities;\n } catch {\n return null;\n } finally {\n if (syncSeq === cartSyncSeqRef.current) setCartSyncing(false);\n }\n }, [loadCartQuantities]);\n\n useEffect(() => {\n currentHandleRef.current = currentHandle;\n }, [currentHandle]);\n\n useEffect(() => {\n configCacheRef.current = configCache;\n }, [configCache]);\n\n useEffect(() => {\n bootstrapLoadingRef.current = bootstrapLoading;\n }, [bootstrapLoading]);\n\n useEffect(() => {\n void refreshCartQuantities();\n }, [refreshCartQuantities]);\n\n const setConfigHandle = useCallback((handle: string) => {\n setCurrentHandleState(normalizeBundleHandle(handle));\n }, []);\n\n const close = useCallback(() => {\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_CLOSED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_closed\",\n }).catch((trackError) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer closed:\", trackError);\n });\n } catch (trackError) {\n console.warn(\"[Bundle Analytics] Error in close() callback:\", trackError);\n }\n }\n setIsOpen(false);\n if (typeof window !== \"undefined\" && window.location.hash.toLowerCase().startsWith(BUNDLE_DRAWER_HASH)) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n }, [analyticsEndpoint, shop]);\n\n const openDrawerOnly = useCallback(() => {\n setIsOpen((current) => {\n if (current) return current;\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_OPENED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_opened\",\n }).catch((trackError) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer opened:\", trackError);\n });\n } catch (trackError) {\n console.warn(\"[Bundle Analytics] Error in open() callback:\", trackError);\n }\n }\n return true;\n });\n }, [analyticsEndpoint, shop]);\n\n const applyLatestConfigResponse = useCallback((handle: string, response: PublicBundleConfigResponse) => {\n if (!response.ok) {\n setConfigCache((prev) => {\n if (!prev[handle]) return prev;\n const next = { ...prev };\n delete next[handle];\n return next;\n });\n if (!allowDrawerWhenInactive && currentHandleRef.current === handle) {\n setError(response.error || t(\"bundle.provider.load_error\"));\n setIsOpen(false);\n }\n return false;\n }\n\n if (response.config.isActive === false && !allowDrawerWhenInactive) {\n setConfigCache((prev) => {\n if (!prev[handle]) return prev;\n const next = { ...prev };\n delete next[handle];\n return next;\n });\n if (currentHandleRef.current === handle) {\n setError(t(\"bundle.provider.inactive_error\"));\n setIsOpen(false);\n if (typeof window !== \"undefined\" && window.location.hash.toLowerCase().startsWith(BUNDLE_DRAWER_HASH)) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n }\n return false;\n }\n\n setConfigCache((prev) => ({\n ...prev,\n [handle]: {\n currencyCode: response.currencyCode ?? null,\n config: response.config,\n eligibleVariants: response.eligibleVariants ?? [],\n },\n }));\n if (currentHandleRef.current === handle) {\n setError(null);\n }\n return true;\n }, [allowDrawerWhenInactive, t]);\n\n const refreshHandleConfig = useCallback((handle: string, options?: { blocking?: boolean }) => {\n const normalizedHandle = normalizeBundleHandle(handle);\n handleFetchAbortRef.current?.abort();\n const ac = new AbortController();\n handleFetchAbortRef.current = ac;\n\n if (options?.blocking) {\n setBlockingHandleLoad(normalizedHandle);\n }\n setError(null);\n\n fetcher({\n apiBaseUrl,\n shop,\n configHandle: normalizedHandle,\n fresh: options?.blocking === true && !configCacheRef.current[normalizedHandle],\n signal: ac.signal,\n })\n .then((response) => {\n if (ac.signal.aborted) return;\n applyLatestConfigResponse(normalizedHandle, response);\n })\n .catch((fetchError: unknown) => {\n if (ac.signal.aborted) return;\n const message = fetchError instanceof Error ? fetchError.message : t(\"bundle.provider.load_error\");\n if (currentHandleRef.current === normalizedHandle) setError(message);\n })\n .finally(() => {\n if (ac.signal.aborted) return;\n setBlockingHandleLoad((current) => current === normalizedHandle ? null : current);\n });\n }, [apiBaseUrl, applyLatestConfigResponse, fetcher, shop, t]);\n\n const loadHandle = useCallback((handle: string) => {\n const normalizedHandle = normalizeBundleHandle(handle);\n const cachedEntry = configCacheRef.current[normalizedHandle];\n setCurrentHandleState(normalizedHandle);\n setError(null);\n refreshHandleConfig(normalizedHandle, { blocking: !cachedEntry });\n }, [refreshHandleConfig]);\n\n const openForHandle = useCallback((handle: string, source: OpenSource = \"api\") => {\n const normalizedHandle = normalizeBundleHandle(handle);\n const cachedEntry = configCacheRef.current[normalizedHandle];\n\n if (useActivePreload && bootstrapLoadingRef.current && !cachedEntry) {\n setPendingOpenHandle({ handle: normalizedHandle, source });\n return;\n }\n\n setCurrentHandleState(normalizedHandle);\n\n if (allowDrawerWhenInactive) {\n openDrawerOnly();\n refreshHandleConfig(normalizedHandle, { blocking: !cachedEntry });\n return;\n }\n\n if (cachedEntry?.config?.isActive) {\n setError(null);\n openDrawerOnly();\n refreshHandleConfig(normalizedHandle, { blocking: false });\n return;\n }\n\n setStatusCheckPending(normalizedHandle);\n statusAbortRef.current?.abort();\n const ac = new AbortController();\n statusAbortRef.current = ac;\n\n statusFetcher({\n apiBaseUrl,\n shop,\n configHandle: normalizedHandle,\n signal: ac.signal,\n })\n .then((status) => {\n if (ac.signal.aborted) return;\n setStatusCheckPending((current) => current === normalizedHandle ? null : current);\n if (status.ok && status.isActive !== true) {\n if (source === \"hash\" && typeof window !== \"undefined\" && getBundleHashHandle(window.location.hash) === normalizedHandle) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n return;\n }\n if (!status.ok) {\n return;\n }\n\n setError(null);\n setCurrentHandleState(normalizedHandle);\n openDrawerOnly();\n refreshHandleConfig(normalizedHandle, { blocking: true });\n })\n .catch(() => {\n if (ac.signal.aborted) return;\n setStatusCheckPending((current) => current === normalizedHandle ? null : current);\n });\n }, [\n allowDrawerWhenInactive,\n apiBaseUrl,\n openDrawerOnly,\n refreshHandleConfig,\n shop,\n statusFetcher,\n useActivePreload,\n ]);\n\n const open = useCallback(() => {\n void refreshCartQuantities();\n openForHandle(currentHandleRef.current, \"api\");\n }, [openForHandle, refreshCartQuantities]);\n\n useEffect(() => {\n openForHandleRef.current = openForHandle;\n }, [openForHandle]);\n\n const toggle = useCallback(() => {\n if (isOpen) {\n close();\n return;\n }\n void refreshCartQuantities();\n openForHandle(currentHandleRef.current, \"api\");\n }, [close, isOpen, openForHandle, refreshCartQuantities]);\n\n useEffect(() => {\n setCurrentHandleState(normalizeBundleHandle(configHandle));\n }, [configHandle]);\n\n useEffect(() => {\n if (!useActivePreload) {\n setBootstrapLoading(false);\n if (!initialData) {\n refreshHandleConfig(normalizedInitialHandle, { blocking: true });\n }\n return;\n }\n\n preloadAbortRef.current?.abort();\n const ac = new AbortController();\n preloadAbortRef.current = ac;\n setBootstrapLoading(true);\n\n activePreloadFetcher({ apiBaseUrl, shop, signal: ac.signal })\n .then((response: PublicActiveBundleConfigsResponse) => {\n if (ac.signal.aborted) return;\n if (!response.ok) return;\n setConfigCache((prev) => {\n const next: BundleConfigCache = { ...prev };\n for (const [handle, entry] of Object.entries(response.configs ?? {})) {\n next[normalizeBundleHandle(handle)] = {\n currencyCode: entry.currencyCode ?? null,\n config: entry.config,\n eligibleVariants: entry.eligibleVariants ?? [],\n };\n }\n return next;\n });\n })\n .catch(() => {\n // Ignore preload failures; open flow falls back to status + single fetch.\n })\n .finally(() => {\n if (ac.signal.aborted) return;\n setBootstrapLoading(false);\n });\n\n return () => ac.abort();\n }, [activePreloadFetcher, apiBaseUrl, initialData, normalizedInitialHandle, refreshHandleConfig, shop, useActivePreload]);\n\n useEffect(() => {\n if (bootstrapLoading || !pendingOpenHandle) return;\n openForHandle(pendingOpenHandle.handle, pendingOpenHandle.source);\n setPendingOpenHandle(null);\n }, [bootstrapLoading, openForHandle, pendingOpenHandle]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const openIfHash = (force = false) => {\n const nextHash = String(window.location.hash ?? \"\");\n if (!force && nextHash === lastSeenHashRef.current) return;\n lastSeenHashRef.current = nextHash;\n const handleInHash = getBundleHashHandle(nextHash);\n if (!handleInHash) return;\n openForHandleRef.current?.(handleInHash, \"hash\");\n };\n const openIfHashForced = () => openIfHash(true);\n const openIfHashOnFocus = () => {\n window.setTimeout(() => openIfHash(true), 0);\n };\n openIfHash(true);\n window.addEventListener(\"hashchange\", openIfHashForced);\n window.addEventListener(\"pageshow\", openIfHashForced);\n window.addEventListener(\"popstate\", openIfHashForced);\n window.addEventListener(\"focus\", openIfHashOnFocus);\n document.addEventListener(\"visibilitychange\", openIfHashForced);\n return () => {\n window.removeEventListener(\"hashchange\", openIfHashForced);\n window.removeEventListener(\"pageshow\", openIfHashForced);\n window.removeEventListener(\"popstate\", openIfHashForced);\n window.removeEventListener(\"focus\", openIfHashOnFocus);\n document.removeEventListener(\"visibilitychange\", openIfHashForced);\n };\n }, []);\n\n const currentEntry = configCache[currentHandle] ?? null;\n const config = currentEntry?.config ?? null;\n const eligibleVariants = currentEntry?.eligibleVariants ?? EMPTY_ELIGIBLE_VARIANTS;\n const currencyCode = currentEntry?.currencyCode ?? null;\n const loading = (!config && (blockingHandleLoad === currentHandle || statusCheckPending === currentHandle))\n || (allowDrawerWhenInactive && !config && blockingHandleLoad != null);\n\n useEffect(() => {\n const effective = getEffectiveStyleSettings(config?.styleSettings);\n if (effective) injectStyleVariables(effective);\n }, [config?.styleSettings]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handlePreviewStyles = () => {\n const effective = getEffectiveStyleSettings(undefined);\n if (effective) injectStyleVariables(effective);\n };\n window.addEventListener(\"bundle-preview-styles-updated\", handlePreviewStyles);\n return () => window.removeEventListener(\"bundle-preview-styles-updated\", handlePreviewStyles);\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const win = window as Window & {\n __BUNDLE_PREVIEW_CONFIG__?: BundleConfig;\n __BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__?: BundleEligibleVariant[];\n __BUNDLE_PREVIEW_VARIANTS_LOADING__?: boolean;\n };\n const applyPreviewConfig = () => {\n const previewConfig = win.__BUNDLE_PREVIEW_CONFIG__;\n if (!previewConfig) return;\n const previewVariants = Array.isArray(win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__)\n ? win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__\n : [];\n const previewVariantsLoading = win.__BUNDLE_PREVIEW_VARIANTS_LOADING__ === true;\n setConfigCache((prev) => ({\n ...prev,\n [currentHandleRef.current]: {\n currencyCode: currencyCode ?? null,\n config: previewConfig,\n eligibleVariants: previewVariantsLoading\n ? (prev[currentHandleRef.current]?.eligibleVariants ?? [])\n : previewVariants,\n },\n }));\n if (previewVariantsLoading) {\n setBlockingHandleLoad(currentHandleRef.current);\n } else {\n setBlockingHandleLoad((current) => current === currentHandleRef.current ? null : current);\n }\n };\n if (win.__BUNDLE_PREVIEW_CONFIG__) applyPreviewConfig();\n window.addEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n return () => window.removeEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n }, [currencyCode]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? Number.NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const variantSelectionLimitById = useMemo(() => {\n return new Map(\n eligibleVariants.map((variant) => {\n const baseLimit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(baseLimit)) return [variant.id, baseLimit] as const;\n const inCart = clampQty(cartQuantitiesByMerchandiseId[variant.id] ?? 0);\n return [variant.id, Math.max(0, Math.floor(baseLimit) - inCart)] as const;\n }),\n );\n }, [eligibleVariants, cartQuantitiesByMerchandiseId]);\n\n const eligibleVariantIdsSet = useMemo(() => {\n return new Set(\n eligibleVariants\n .filter((variant) => getVariantSelectionLimit(variant) > 0)\n .map((variant) => variant.id),\n );\n }, [eligibleVariants]);\n\n const minRequired = useMemo(() => {\n const rules = config?.rules ?? [];\n const ruleMin = rules.length ? Math.min(...rules.map((rule) => rule.minBundleSize)) : 2;\n const normalizedRuleMin = Number.isFinite(ruleMin) && ruleMin > 0 ? ruleMin : 2;\n const configuredRaw = Number(config?.minBundleSize ?? Number.NaN);\n const configuredMin =\n Number.isFinite(configuredRaw) && Number.isInteger(configuredRaw)\n ? Math.max(2, Math.min(100, configuredRaw))\n : null;\n return configuredMin == null\n ? normalizedRuleMin\n : Math.min(normalizedRuleMin, configuredMin);\n }, [config?.minBundleSize, config?.rules]);\n\n const getSelectionsFromLines = useCallback((lines: BundleSelectedLines) => {\n return lines.reduce<BundleSelectionState>((acc, line) => {\n const quantity = clampQty(line.quantity || 1) || 1;\n acc[line.merchandiseId] = (acc[line.merchandiseId] ?? 0) + quantity;\n return acc;\n }, {});\n }, []);\n\n const setQuantity = useCallback((merchandiseId: string, quantity: number) => {\n if (cartSyncing) return;\n if (!eligibleVariantIdsSet.has(merchandiseId)) {\n if (!loading) return;\n }\n\n const variantLimit = variantSelectionLimitById.get(merchandiseId) ?? (loading ? Number.POSITIVE_INFINITY : 0);\n const q = clampToVariantLimit(quantity, variantLimit);\n setSelectedLines((prev) => {\n const prevSelections = getSelectionsFromLines(prev);\n const prevQty = prevSelections[merchandiseId] ?? 0;\n const requestedDelta = q - prevQty;\n const currentBundleSize = prev.length;\n const variantRemaining =\n Number.isFinite(variantLimit)\n ? Math.max(0, Math.floor(variantLimit) - prevQty)\n : requestedDelta;\n const delta =\n requestedDelta > 0\n ? Math.min(\n requestedDelta,\n Math.max(0, maxBundleSize - currentBundleSize),\n variantRemaining,\n )\n : requestedDelta;\n\n if (delta === 0) return prev;\n\n let nextLines = prev;\n if (delta > 0) {\n nextLines = [...prev, ...Array.from({ length: delta }, () => createSelectedLine(merchandiseId))];\n } else {\n let remainingToRemove = -delta;\n const keptReversed: BundleSelectedLines = [];\n for (let i = prev.length - 1; i >= 0; i--) {\n const line = prev[i];\n if (line.merchandiseId === merchandiseId && remainingToRemove > 0) {\n remainingToRemove--;\n continue;\n }\n keptReversed.push(line);\n }\n keptReversed.reverse();\n nextLines = keptReversed;\n }\n\n const nextSelections = getSelectionsFromLines(nextLines);\n const prevBundleSize = currentBundleSize;\n const nextBundleSize = nextLines.length;\n\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const basePayload = {\n eventType: \"VARIANT_SELECTION_CHANGED\" as const,\n shop,\n anonymousUserId,\n before: { ...prevSelections },\n after: { ...nextSelections },\n timestamp: new Date().toISOString(),\n };\n trackEvent(analyticsEndpoint, shop, basePayload);\n\n if (prevBundleSize === 0 && nextBundleSize >= 1) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_started\",\n });\n }\n if (prevBundleSize < minRequired && nextBundleSize >= minRequired) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_completed\",\n });\n }\n } catch {\n // Analytics should not break functionality.\n }\n }\n\n return nextLines;\n });\n }, [analyticsEndpoint, cartSyncing, eligibleVariantIdsSet, getSelectionsFromLines, loading, maxBundleSize, minRequired, shop, variantSelectionLimitById]);\n\n const addConfiguredVariant = useCallback((input: {\n merchandiseId: string;\n configHandle?: string;\n attributes?: BundleCartLineAttribute[];\n restoreSnapshot?: BundleSelectionSnapshot | null;\n }) => {\n const merchandiseId = String(input.merchandiseId ?? \"\").trim();\n if (!merchandiseId) return false;\n const targetHandle = normalizeBundleHandle(input.configHandle ?? currentHandleRef.current);\n const isTargetingDifferentHandle = targetHandle !== currentHandleRef.current;\n const targetEntry = isTargetingDifferentHandle ? configCacheRef.current[targetHandle] : currentEntry;\n const targetEligibleVariantIdsSet = targetEntry\n ? new Set(\n targetEntry.eligibleVariants\n .filter((variant) => getVariantSelectionLimit(variant) > 0)\n .map((variant) => variant.id),\n )\n : null;\n if (\n (!isTargetingDifferentHandle || targetEligibleVariantIdsSet)\n && !(targetEligibleVariantIdsSet ?? eligibleVariantIdsSet).has(merchandiseId)\n && !loading\n ) {\n return false;\n }\n\n const baseLines = input.restoreSnapshot ? restoreLinesFromSnapshot(input.restoreSnapshot) : null;\n const currentSelections = getSelectionsFromLines(baseLines ?? selectedLines);\n const currentQty = currentSelections[merchandiseId] ?? 0;\n const targetMaxBundleSize = (() => {\n const raw = Number(targetEntry?.config?.maxBundleSize ?? maxBundleSize ?? Number.NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n })();\n const variantLimit = (() => {\n if (targetEntry) {\n const targetVariant = targetEntry.eligibleVariants.find((variant) => variant.id === merchandiseId);\n if (targetVariant) {\n const baseLimit = getVariantSelectionLimit(targetVariant);\n if (!Number.isFinite(baseLimit)) return Number.POSITIVE_INFINITY;\n const inCart = clampQty(cartQuantitiesByMerchandiseId[merchandiseId] ?? 0);\n return Math.max(0, Math.floor(baseLimit) - inCart);\n }\n }\n return isTargetingDifferentHandle || loading ? Number.POSITIVE_INFINITY : 0;\n })();\n const currentBundleSize = (baseLines ?? selectedLines).length;\n const canAddAnother =\n currentBundleSize < targetMaxBundleSize\n && (!Number.isFinite(variantLimit) || currentQty < Math.max(0, Math.floor(variantLimit)));\n\n if (!canAddAnother) return false;\n\n const nextLines = [...(baseLines ?? selectedLines), createSelectedLine(merchandiseId, input.attributes)];\n if (isTargetingDifferentHandle) {\n skipSelectionResetOnHandleChangeRef.current = true;\n preserveSelectionsUntilHandleLoadedRef.current = targetHandle;\n setCurrentHandleState(targetHandle);\n setError(null);\n refreshHandleConfig(targetHandle, { blocking: !configCacheRef.current[targetHandle] });\n }\n setSelectedLines(nextLines);\n setError(null);\n openDrawerOnly();\n return true;\n }, [cartQuantitiesByMerchandiseId, currentEntry, eligibleVariantIdsSet, getSelectionsFromLines, loading, maxBundleSize, openDrawerOnly, refreshHandleConfig, selectedLines]);\n\n useEffect(() => {\n const isWaitingForPreservedHandle =\n preserveSelectionsUntilHandleLoadedRef.current === currentHandle\n && (!currentEntry || blockingHandleLoad === currentHandle);\n if (loading || isWaitingForPreservedHandle) return;\n setSelectedLines((prev) => {\n const nextLines = prev.filter((line) => {\n if (!eligibleVariantIdsSet.has(line.merchandiseId)) return false;\n const limit = variantSelectionLimitById.get(line.merchandiseId) ?? 0;\n return !Number.isFinite(limit) || limit > 0;\n });\n\n if (nextLines.length <= maxBundleSize) {\n return nextLines.length === prev.length ? prev : nextLines;\n }\n return nextLines.slice(0, maxBundleSize);\n });\n }, [blockingHandleLoad, currentEntry, currentHandle, eligibleVariantIdsSet, loading, maxBundleSize, variantSelectionLimitById]);\n\n useEffect(() => {\n if (\n preserveSelectionsUntilHandleLoadedRef.current === currentHandle\n && currentEntry\n && blockingHandleLoad !== currentHandle\n ) {\n preserveSelectionsUntilHandleLoadedRef.current = null;\n }\n }, [blockingHandleLoad, currentEntry, currentHandle]);\n\n useEffect(() => {\n if (skipSelectionResetOnHandleChangeRef.current) {\n skipSelectionResetOnHandleChangeRef.current = false;\n return;\n }\n setSelectedLines([]);\n }, [currentHandle]);\n\n const clearSelections = useCallback(() => setSelectedLines([]), []);\n const syncCartQuantities = useCallback(async () => {\n await refreshCartQuantities();\n }, [refreshCartQuantities]);\n const getVariantMaxSelectableQuantity = useCallback((merchandiseId: string) => {\n const limit = variantSelectionLimitById.get(merchandiseId);\n if (limit == null || !Number.isFinite(limit)) return null;\n return Math.max(0, Math.floor(limit));\n }, [variantSelectionLimitById]);\n const selections = useMemo(() => getSelectionsFromLines(selectedLines), [getSelectionsFromLines, selectedLines]);\n const selectionOrder = useMemo(() => selectedLines.map((line) => line.merchandiseId), [selectedLines]);\n\n const bundleSize = selectedLines.length;\n\n const canSubmit = useMemo(() => {\n if (loading || cartSyncing || submitting) return false;\n if (error) return false;\n if (!config?.isActive) return false;\n if (bundleSize < minRequired) return false;\n return true;\n }, [bundleSize, cartSyncing, config?.isActive, error, loading, minRequired, submitting]);\n\n const getSelectionSnapshot = useCallback(() => snapshotFromLines(selectedLines), [selectedLines]);\n\n const restoreSelectionSnapshot = useCallback((snapshot: BundleSelectionSnapshot | null | undefined) => {\n setSelectedLines(restoreLinesFromSnapshot(snapshot));\n }, []);\n\n const redirectVariantToProductPage = useCallback((variant: BundleEligibleVariant) => {\n if (typeof window === \"undefined\") return;\n const productHandle = variant.product?.handle?.trim();\n if (!productHandle) return;\n const params = new URLSearchParams();\n const variantParam = variant.id.match(/\\/(\\d+)$/)?.[1];\n if (variantParam) params.set(\"variant\", variantParam);\n params.set(\"best_bundles_source\", \"bundle_builder\");\n params.set(\"best_bundles_handle\", currentHandle);\n try {\n window.sessionStorage.setItem(\n BundleSessionStorageKeys.redirectedBundleState,\n JSON.stringify({\n bundleHandle: currentHandle,\n returnUrl: window.location.href,\n snapshot: getSelectionSnapshot(),\n }),\n );\n } catch {\n // Ignore storage failures and still navigate.\n }\n const search = params.toString();\n window.location.href = `/products/${productHandle}${search ? `?${search}` : \"\"}`;\n }, [currentHandle, getSelectionSnapshot]);\n\n const performCartAddition = useCallback(async (options?: { onComplete?: () => void; checkout?: boolean }) => {\n if (!canSubmit || !config) return;\n\n const bundleId = safeRandomUUID();\n const bundleTitle = (config.title ?? \"\").trim().slice(0, 255);\n const latestCartQuantities = await refreshCartQuantities();\n const effectiveLimitById = new Map(\n eligibleVariants.map((variant) => {\n const baseLimit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(baseLimit)) return [variant.id, baseLimit] as const;\n const inCart = clampQty((latestCartQuantities ?? cartQuantitiesByMerchandiseId)[variant.id] ?? 0);\n return [variant.id, Math.max(0, Math.floor(baseLimit) - inCart)] as const;\n }),\n );\n const linesBySignature = new Map<string, {\n merchandiseId: string;\n quantity: number;\n attributes: BundleCartLineAttribute[];\n }>();\n\n for (const selectedLine of selectedLines) {\n if (!eligibleVariantIdsSet.has(selectedLine.merchandiseId)) continue;\n const remaining = effectiveLimitById.get(selectedLine.merchandiseId) ?? 0;\n const existingQtyForVariant = Array.from(linesBySignature.values())\n .filter((line) => line.merchandiseId === selectedLine.merchandiseId)\n .reduce((sum, line) => sum + line.quantity, 0);\n if (Number.isFinite(remaining) && existingQtyForVariant >= remaining) continue;\n const attributes = [\n { key: BundleLineAttributeKeys.bundleId, value: bundleId },\n { key: BundleLineAttributeKeys.bundleConfig, value: currentHandle },\n { key: BundleLineAttributeKeys.bundleSource, value: \"bundle_builder\" },\n ...(bundleTitle ? [{ key: BundleLineAttributeKeys.bundleTitle, value: bundleTitle }] : []),\n ...(normalizeLineAttributes(selectedLine.attributes) ?? []),\n ];\n const signature = `${selectedLine.merchandiseId}:${attributesSignature(selectedLine.attributes)}`;\n const existing = linesBySignature.get(signature);\n if (existing) {\n existing.quantity += 1;\n } else {\n linesBySignature.set(signature, {\n merchandiseId: selectedLine.merchandiseId,\n quantity: 1,\n attributes,\n });\n }\n }\n\n const lines = Array.from(linesBySignature.values());\n\n if (!lines.length) return;\n\n const byId = new Map(eligibleVariants.map((variant) => [variant.id, variant] as const));\n let grossPrice = 0;\n for (const line of lines) {\n const q = line.quantity ?? 0;\n if (q <= 0) continue;\n const variant = byId.get(line.merchandiseId);\n const price = Number(variant?.price);\n if (!Number.isFinite(price)) continue;\n grossPrice += price * q;\n }\n grossPrice = Math.round(grossPrice * 100) / 100;\n\n const rulesSorted = [...(config.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n let appliedRule: (typeof rulesSorted)[number] | null = null;\n for (const rule of rulesSorted) {\n if (bundleSize >= rule.minBundleSize) appliedRule = rule;\n }\n\n const appliedDiscountPercent = appliedRule\n ? (() => {\n const pct = Number.parseFloat(appliedRule!.discountPercent);\n return Number.isFinite(pct) && pct > 0 ? pct : null;\n })()\n : null;\n\n const discountedPrice = appliedDiscountPercent\n ? Math.round(grossPrice * (1 - appliedDiscountPercent / 100) * 100) / 100\n : grossPrice;\n const discountedAmount = grossPrice - discountedPrice;\n const productVariantIds = lines.map((line) => line.merchandiseId);\n const discountThresholdIdentifier = appliedRule?.handle ?? \"\";\n const discountLabel = appliedRule?.label?.trim() || \"\";\n\n setSubmitting(true);\n try {\n if (options?.checkout) {\n await cartAdapter.linesAddForCheckout(lines);\n } else {\n await cartAdapter.linesAdd(lines);\n }\n\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const isCheckout = !!options?.checkout;\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"BUNDLE_ADDED_TO_BASKET\",\n shop,\n anonymousUserId,\n bundleId,\n productVariantIds,\n grossPrice,\n discountedPrice,\n currency: currencyCode ?? undefined,\n discountThresholdIdentifier,\n discountLabel,\n discountPercentage: appliedDiscountPercent,\n discountedAmount,\n timestamp: new Date().toISOString(),\n checkout: isCheckout,\n mixpanelEvent: isCheckout ? \"checkout_started_with_bundle\" : \"bundle_added_to_cart\",\n });\n } catch {\n // Analytics should not break functionality.\n }\n }\n\n clearSelections();\n close();\n void refreshCartQuantities();\n options?.onComplete?.();\n setError(null);\n } catch (addError) {\n const rawMessage = addError instanceof Error ? addError.message : \"\";\n const isStockError = /stock|sold out|inventory|insufficient|available|422/i.test(rawMessage);\n setError(\n isStockError\n ? t(\"bundle.provider.stock_error\")\n : t(\"bundle.provider.add_error\"),\n );\n void refreshCartQuantities();\n } finally {\n setSubmitting(false);\n }\n }, [\n analyticsEndpoint,\n bundleSize,\n canSubmit,\n cartAdapter,\n clearSelections,\n close,\n config,\n currencyCode,\n cartQuantitiesByMerchandiseId,\n currentHandle,\n eligibleVariantIdsSet,\n eligibleVariants,\n refreshCartQuantities,\n selectedLines,\n shop,\n t,\n ]);\n\n const submit = useCallback(async () => {\n await performCartAddition({\n onComplete: () => {\n cartAdapter.openCartUI?.();\n },\n });\n }, [cartAdapter, performCartAddition]);\n\n const submitAndCheckout = useCallback(async () => {\n await performCartAddition({\n checkout: true,\n onComplete: () => {\n cartAdapter.navigateToCheckout?.();\n },\n });\n }, [cartAdapter, performCartAddition]);\n\n const value: BundleBuilderContextValue = useMemo(() => ({\n isOpen,\n open,\n openForHandle,\n close,\n toggle,\n currentHandle,\n setConfigHandle,\n loadHandle,\n syncCartQuantities,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n selectedLines,\n getVariantMaxSelectableQuantity,\n setQuantity,\n addConfiguredVariant,\n getSelectionSnapshot,\n restoreSelectionSnapshot,\n redirectVariantToProductPage,\n clearSelections,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n }), [\n bundleSize,\n canSubmit,\n clearSelections,\n close,\n config,\n currencyCode,\n currentHandle,\n eligibleVariants,\n error,\n isOpen,\n loading,\n minRequired,\n open,\n openForHandle,\n selectedLines,\n selectionOrder,\n selections,\n setConfigHandle,\n loadHandle,\n syncCartQuantities,\n getVariantMaxSelectableQuantity,\n setQuantity,\n addConfiguredVariant,\n getSelectionSnapshot,\n restoreSelectionSnapshot,\n redirectVariantToProductPage,\n submit,\n submitAndCheckout,\n submitting,\n toggle,\n locale,\n t,\n ]);\n\n return <BundleBuilderContext.Provider value={value}>{children}</BundleBuilderContext.Provider>;\n}\n","import { useContext } from \"react\";\nimport { BundleBuilderContext } from \"../context/BundleProvider\";\n\nexport function useBundleBuilder() {\n const ctx = useContext(BundleBuilderContext);\n if (!ctx) {\n throw new Error(\"useBundleBuilder must be used within <BundleProvider />\");\n }\n return ctx;\n}\n\n","import { useBundleBuilder } from \"./useBundleBuilder\";\n\nexport type BundleBuilderDrawerControls = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n};\n\n/**\n * Convenience hook for controlling the drawer (alternative to using <BundleButton />).\n * Must be used within <BundleProvider />.\n */\nexport function useBundleBuilderDrawer(): BundleBuilderDrawerControls {\n const { isOpen, open, close, toggle } = useBundleBuilder();\n return { isOpen, open, close, toggle };\n}\n\n","import React from \"react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleButton.module.css\";\n\nexport type BundleButtonProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function BundleButton(props: BundleButtonProps) {\n const { toggle, t } = useBundleBuilder();\n return (\n <button\n type=\"button\"\n onClick={toggle}\n className={[styles.button, props.className].filter(Boolean).join(\" \")}\n >\n {props.children ?? t(\"bundle.button.default\")}\n </button>\n );\n}\n","'use strict';\n\n// t: current time, b: beginning value, _c: final value, d: total duration\nvar tweenFunctions = {\n linear: function(t, b, _c, d) {\n var c = _c - b;\n return c * t / d + b;\n },\n easeInQuad: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t + b;\n },\n easeOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (t /= d) * (t - 2) + b;\n },\n easeInOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t + b;\n } else {\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n }\n },\n easeInCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t + b;\n },\n easeOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t + 1) + b;\n },\n easeInOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n },\n easeInQuart: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t + b;\n },\n easeOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n },\n easeInOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t + b;\n } else {\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n },\n easeInQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t * t + b;\n },\n easeOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n },\n easeInOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n },\n easeInSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n },\n easeOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n },\n easeInOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n },\n easeInExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n },\n easeOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n },\n easeInOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n } else {\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n },\n easeInCirc: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n },\n easeOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n },\n easeInOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n } else {\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n },\n easeInElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n },\n easeOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n },\n easeInOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d / 2) === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n } else {\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b;\n }\n },\n easeInBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n },\n easeOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n },\n easeInOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n } else {\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }\n },\n easeInBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n v = tweenFunctions.easeOutBounce(d - t, 0, c, d);\n return c - v + b;\n },\n easeOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n },\n easeInOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n if (t < d / 2) {\n v = tweenFunctions.easeInBounce(t * 2, 0, c, d);\n return v * 0.5 + b;\n } else {\n v = tweenFunctions.easeOutBounce(t * 2 - d, 0, c, d);\n return v * 0.5 + c * 0.5 + b;\n }\n }\n};\n\nmodule.exports = tweenFunctions;\n","import { jsx } from 'react/jsx-runtime';\nimport React from 'react';\nimport * as tweens from 'tween-functions';\n\nfunction degreesToRads(degrees) {\n return (degrees * Math.PI) / 180;\n}\nfunction randomRange(min, max) {\n return min + Math.random() * (max - min);\n}\nfunction randomInt(min, max) {\n return Math.floor(min + Math.random() * (max - min + 1));\n}\n\nvar ParticleShape;\n(function (ParticleShape) {\n ParticleShape[ParticleShape[\"Circle\"] = 0] = \"Circle\";\n ParticleShape[ParticleShape[\"Square\"] = 1] = \"Square\";\n ParticleShape[ParticleShape[\"Strip\"] = 2] = \"Strip\";\n})(ParticleShape || (ParticleShape = {}));\nvar RotationDirection;\n(function (RotationDirection) {\n RotationDirection[RotationDirection[\"Positive\"] = 1] = \"Positive\";\n RotationDirection[RotationDirection[\"Negative\"] = -1] = \"Negative\";\n})(RotationDirection || (RotationDirection = {}));\nconst DEFAULT_FRAME_TIME = 1000 / 60;\nclass Particle {\n constructor(context, getOptions, x, y) {\n this.getOptions = getOptions;\n const { colors, initialVelocityX, initialVelocityY } = this.getOptions();\n this.context = context;\n this.x = x;\n this.y = y;\n this.w = randomRange(5, 20);\n this.h = randomRange(5, 20);\n this.radius = randomRange(5, 10);\n this.vx =\n typeof initialVelocityX === 'number'\n ? randomRange(-initialVelocityX, initialVelocityX)\n : randomRange(initialVelocityX.min, initialVelocityX.max);\n this.vy =\n typeof initialVelocityY === 'number'\n ? randomRange(-initialVelocityY, 0)\n : randomRange(initialVelocityY.min, initialVelocityY.max);\n this.shape = randomInt(0, 2);\n this.angle = degreesToRads(randomRange(0, 360));\n this.angularSpin = randomRange(-0.2, 0.2);\n this.color = colors[Math.floor(Math.random() * colors.length)];\n this.rotateY = randomRange(0, 1);\n this.rotationDirection = randomRange(0, 1)\n ? RotationDirection.Positive\n : RotationDirection.Negative;\n }\n update(elapsed) {\n const { gravity, wind, friction, opacity, drawShape } = this.getOptions();\n const frameTimeMultiplier = elapsed / DEFAULT_FRAME_TIME;\n this.x += this.vx * frameTimeMultiplier;\n this.y += this.vy * frameTimeMultiplier;\n this.vy += gravity * frameTimeMultiplier;\n this.vx += wind * frameTimeMultiplier;\n this.vx *= friction ** frameTimeMultiplier;\n this.vy *= friction ** frameTimeMultiplier;\n if (this.rotateY >= 1 &&\n this.rotationDirection === RotationDirection.Positive) {\n this.rotationDirection = RotationDirection.Negative;\n }\n else if (this.rotateY <= -1 &&\n this.rotationDirection === RotationDirection.Negative) {\n this.rotationDirection = RotationDirection.Positive;\n }\n const rotateDelta = 0.1 * this.rotationDirection * frameTimeMultiplier;\n this.rotateY += rotateDelta;\n this.angle += this.angularSpin;\n this.context.save();\n this.context.translate(this.x, this.y);\n this.context.rotate(this.angle);\n this.context.scale(1, this.rotateY);\n this.context.rotate(this.angle);\n this.context.beginPath();\n this.context.fillStyle = this.color;\n this.context.strokeStyle = this.color;\n this.context.globalAlpha = opacity;\n this.context.lineCap = 'round';\n this.context.lineWidth = 2;\n if (drawShape && typeof drawShape === 'function') {\n drawShape.call(this, this.context);\n }\n else {\n switch (this.shape) {\n case ParticleShape.Circle: {\n this.context.beginPath();\n this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);\n this.context.fill();\n break;\n }\n case ParticleShape.Square: {\n this.context.fillRect(-this.w / 2, -this.h / 2, this.w, this.h);\n break;\n }\n case ParticleShape.Strip: {\n this.context.fillRect(-this.w / 6, -this.h / 2, this.w / 3, this.h);\n break;\n }\n }\n }\n this.context.closePath();\n this.context.restore();\n }\n}\n\nclass ParticleGenerator {\n constructor(canvas, getOptions) {\n this.x = 0;\n this.y = 0;\n this.w = 0;\n this.h = 0;\n this.lastNumberOfPieces = 0;\n this.tweenProgress = 0;\n this.tweenFrom = 0;\n this.particles = [];\n this.particlesGenerated = 0;\n this.removeParticleAt = (i) => {\n this.particles.splice(i, 1);\n };\n this.getParticle = () => {\n const newParticleX = randomRange(this.x, this.w + this.x);\n const newParticleY = randomRange(this.y, this.h + this.y);\n return new Particle(this.context, this.getOptions, newParticleX, newParticleY);\n };\n this.animate = (elapsed) => {\n const { canvas, context, particlesGenerated, lastNumberOfPieces } = this;\n const { run, recycle, numberOfPieces, debug, tweenFunction, tweenDuration, } = this.getOptions();\n if (!run) {\n return false;\n }\n const nP = this.particles.length;\n const activeCount = recycle ? nP : particlesGenerated;\n // Initial population\n if (activeCount < numberOfPieces) {\n // Use the numberOfPieces prop as a key to reset the easing timing\n if (lastNumberOfPieces !== numberOfPieces) {\n this.tweenProgress = 0;\n this.tweenFrom = activeCount;\n this.lastNumberOfPieces = numberOfPieces;\n }\n // Clamp tweenProgress between 0 and tweenDuration\n this.tweenProgress = Math.min(tweenDuration, Math.max(0, this.tweenProgress + elapsed));\n const tweenedVal = tweenFunction(this.tweenProgress, this.tweenFrom, numberOfPieces, tweenDuration);\n const numToAdd = Math.round(tweenedVal - activeCount);\n for (let i = 0; i < numToAdd; i++) {\n this.particles.push(this.getParticle());\n }\n this.particlesGenerated += numToAdd;\n }\n if (debug) {\n // Draw debug text\n context.font = '12px sans-serif';\n context.fillStyle = '#333';\n context.textAlign = 'right';\n context.fillText(`Particles: ${nP}`, canvas.width - 10, canvas.height - 20);\n }\n // Maintain the population, iterating backwards to prevent issues when removing particles\n for (let i = this.particles.length - 1; i >= 0; i--) {\n const p = this.particles[i];\n // Update each particle's position\n p.update(elapsed);\n // Prune the off-canvas particles\n if (p.y > canvas.height ||\n p.y < -100 ||\n p.x > canvas.width + 100 ||\n p.x < -100) {\n if (recycle && activeCount <= numberOfPieces) {\n // Replace the particle with a brand new one\n this.particles[i] = this.getParticle();\n }\n else {\n this.removeParticleAt(i);\n }\n }\n }\n return nP > 0 || activeCount < numberOfPieces;\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.getOptions = getOptions;\n }\n}\n\nconst confettiDefaults = {\n width: typeof window !== 'undefined' ? window.innerWidth : 300,\n height: typeof window !== 'undefined' ? window.innerHeight : 200,\n numberOfPieces: 200,\n friction: 0.99,\n wind: 0,\n gravity: 0.1,\n initialVelocityX: 4,\n initialVelocityY: 10,\n colors: [\n '#f44336',\n '#e91e63',\n '#9c27b0',\n '#673ab7',\n '#3f51b5',\n '#2196f3',\n '#03a9f4',\n '#00bcd4',\n '#009688',\n '#4CAF50',\n '#8BC34A',\n '#CDDC39',\n '#FFEB3B',\n '#FFC107',\n '#FF9800',\n '#FF5722',\n '#795548',\n ],\n opacity: 1.0,\n debug: false,\n tweenFunction: tweens.easeInOutQuad,\n tweenDuration: 5000,\n recycle: true,\n run: true,\n};\nclass Confetti {\n constructor(canvas, opts) {\n this.lastFrameTime = 0;\n this.setOptionsWithDefaults = (opts) => {\n const computedConfettiDefaults = {\n confettiSource: {\n x: 0,\n y: 0,\n w: this.canvas.width,\n h: 0,\n },\n };\n this._options = {\n ...computedConfettiDefaults,\n ...confettiDefaults,\n ...opts,\n };\n Object.assign(this, opts.confettiSource);\n };\n this.update = (timestamp = 0) => {\n const { options: { run, onConfettiComplete, frameRate }, canvas, context, } = this;\n // Cap elapsed time to 50ms to prevent large time steps\n const elapsed = Math.min(timestamp - this.lastFrameTime, 50);\n // Throttle the frame rate if set\n if (frameRate && elapsed < 1000 / frameRate) {\n this.rafId = requestAnimationFrame(this.update);\n return;\n }\n this.lastFrameTime = timestamp - (frameRate ? elapsed % frameRate : 0);\n if (run) {\n context.fillStyle = 'white';\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n if (this.generator.animate(elapsed)) {\n this.rafId = requestAnimationFrame(this.update);\n }\n else {\n if (onConfettiComplete &&\n typeof onConfettiComplete === 'function' &&\n this.generator.particlesGenerated > 0) {\n onConfettiComplete.call(this, this);\n }\n this._options.run = false;\n }\n };\n this.reset = () => {\n if (this.generator && this.generator.particlesGenerated > 0) {\n this.generator.particlesGenerated = 0;\n this.generator.particles = [];\n this.generator.lastNumberOfPieces = 0;\n }\n };\n this.stop = () => {\n this.options = { run: false };\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = undefined;\n }\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.generator = new ParticleGenerator(this.canvas, () => this.options);\n this.options = opts;\n this.update();\n }\n get options() {\n return this._options;\n }\n set options(opts) {\n const lastRunState = this._options?.run;\n const lastRecycleState = this._options?.recycle;\n this.setOptionsWithDefaults(opts);\n if (this.generator) {\n Object.assign(this.generator, this.options.confettiSource);\n if (typeof opts.recycle === 'boolean' &&\n opts.recycle &&\n lastRecycleState === false) {\n this.generator.lastNumberOfPieces = this.generator.particles.length;\n }\n }\n if (typeof opts.run === 'boolean' && opts.run && lastRunState === false) {\n this.update();\n }\n }\n}\n\nconst ref = React.createRef();\nclass ReactConfettiInternal extends React.Component {\n constructor(props) {\n super(props);\n this.canvas = React.createRef();\n this.canvas = props.canvasRef || ref;\n }\n componentDidMount() {\n if (this.canvas.current) {\n const opts = extractCanvasProps(this.props)[0];\n this.confetti = new Confetti(this.canvas.current, opts);\n }\n }\n componentDidUpdate() {\n const confettiOptions = extractCanvasProps(this.props)[0];\n if (this.confetti) {\n this.confetti.options = confettiOptions;\n }\n }\n componentWillUnmount() {\n if (this.confetti) {\n this.confetti.stop();\n }\n this.confetti = undefined;\n }\n render() {\n const [confettiOptions, passedProps] = extractCanvasProps(this.props);\n const canvasStyles = {\n zIndex: 2,\n position: 'absolute',\n pointerEvents: 'none',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n ...passedProps.style,\n };\n return (jsx(\"canvas\", { width: confettiOptions.width, height: confettiOptions.height, ref: this.canvas, ...passedProps, style: canvasStyles }));\n }\n}\nReactConfettiInternal.defaultProps = {\n ...confettiDefaults,\n};\nReactConfettiInternal.displayName = 'ReactConfetti';\nfunction extractCanvasProps(props) {\n const confettiOptions = {};\n const refs = {};\n const rest = {};\n const confettiOptionKeys = [\n ...Object.keys(confettiDefaults),\n 'confettiSource',\n 'drawShape',\n 'onConfettiComplete',\n 'frameRate',\n ];\n const refProps = ['canvasRef'];\n for (const prop in props) {\n const val = props[prop];\n if (confettiOptionKeys.includes(prop)) {\n confettiOptions[prop] = val;\n }\n else if (refProps.includes(prop)) {\n refProps[prop] = val;\n }\n else {\n rest[prop] = val;\n }\n }\n return [confettiOptions, rest, refs];\n}\nconst ReactConfetti = React.forwardRef((props, ref) => jsx(ReactConfettiInternal, { canvasRef: ref, ...props }));\n\nexport { ReactConfetti as default };\n//# sourceMappingURL=react-confetti.mjs.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport Confetti from \"react-confetti\";\nimport { Link, Search, ChevronDown } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport { formatBundleCurrency, getProductWord } from \"../i18n\";\nimport styles from \"./BundleBuilderDrawer.module.css\";\n\nexport type BundleBuilderDrawerProps = {\n className?: string;\n};\n\nexport function BundleBuilderDrawer(props: BundleBuilderDrawerProps) {\n const {\n isOpen,\n close,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n redirectVariantToProductPage,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n } = useBundleBuilder();\n\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const footerRef = useRef<HTMLElement | null>(null);\n const celebrationChipRef = useRef<HTMLDivElement | null>(null);\n\n const [windowSize, setWindowSize] = useState<{ width: number; height: number }>(() => {\n if (typeof window === \"undefined\") return { width: 0, height: 0 };\n return { width: window.innerWidth, height: window.innerHeight };\n });\n\n const [confettiKey, setConfettiKey] = useState(0);\n const [confettiSource, setConfettiSource] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n const [isConfettiActive, setIsConfettiActive] = useState(false);\n const confettiTimerRef = useRef<number | null>(null);\n const prevBundleSizeForConfettiRef = useRef<number>(bundleSize);\n const confettiSettleMs = 7000;\n\n const [celebrationKey, setCelebrationKey] = useState(0);\n const [celebrationText, setCelebrationText] = useState<string | null>(null);\n const [isCelebrationActive, setIsCelebrationActive] = useState(false);\n const celebrationTimerRef = useRef<number | null>(null);\n const celebrationDurationMs = 2800;\n\n const DEFAULT_CONFETTI_COLORS = [\n \"#2563eb\",\n \"#3b82f6\",\n \"#60a5fa\",\n \"#93c5fd\",\n \"#bae6fd\",\n \"#e0f2fe\",\n ] as const;\n\n const confettiColors = useMemo(() => {\n const c = config?.styleSettings?.confettiColors;\n if (Array.isArray(c) && c.length >= 6) {\n return c.slice(0, 6).map((s, i) =>\n typeof s === \"string\" && s.trim() ? s : DEFAULT_CONFETTI_COLORS[i],\n );\n }\n return [...DEFAULT_CONFETTI_COLORS];\n }, [config?.styleSettings?.confettiColors]);\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n if (value.toLowerCase() === \"default title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" · \");\n };\n\n const isDefaultTitle = (value: string | null | undefined) => {\n return value?.trim().toLowerCase() === \"default title\";\n };\n\n const getVariantPrimaryName = (v: (typeof eligibleVariants)[number]) => {\n const displayName = v.displayName?.trim();\n if (displayName && !isDefaultTitle(displayName)) return displayName;\n\n const productTitle = v.product?.title?.trim();\n if (productTitle) return productTitle;\n\n const variantTitle = v.title?.trim();\n if (variantTitle && !isDefaultTitle(variantTitle)) return variantTitle;\n\n return displayName || variantTitle || productTitle || \"\";\n };\n\n const getVariantA11yLabel = (v: (typeof eligibleVariants)[number]) => {\n const name = getVariantPrimaryName(v);\n const opts = formatVariantOptions(v.selectedOptions);\n return [name, opts].filter(Boolean).join(\" — \");\n };\n\n const getVariantOptionLabel = (v: (typeof eligibleVariants)[number]) => {\n const options = formatVariantOptions(v.selectedOptions);\n if (options) return options;\n\n const variantTitle = v.title?.trim();\n if (variantTitle && !isDefaultTitle(variantTitle)) return variantTitle;\n\n return getVariantPrimaryName(v);\n };\n\n const title = config?.title?.trim() || t(\"bundle.title.default\");\n const redirectToProductPage = Boolean(config?.redirectEligibleProductsToProductPage);\n const isReadyToRender = Boolean(config);\n const visualOpen = isOpen && isReadyToRender;\n const [isMounted, setIsMounted] = useState(visualOpen);\n const closeTimerRef = useRef<number | null>(null);\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n\n return formatBundleCurrency(n, currencyCode, locale);\n };\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n const handleVariantAdd = (variant: (typeof eligibleVariants)[number], nextQuantity: number) => {\n const currentQty = selections[variant.id] ?? 0;\n if (redirectToProductPage && nextQuantity > currentQty) {\n redirectVariantToProductPage(variant);\n return;\n }\n setQuantity(variant.id, nextQuantity);\n };\n\n const sorted = useMemo(() => {\n return [...eligibleVariants];\n }, [eligibleVariants]);\n\n const filteredVariants = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n if (!q) return sorted;\n\n const tokens = q.split(/\\s+/).filter(Boolean);\n const matches = (v: (typeof sorted)[number]) => {\n const parts: string[] = [];\n parts.push(v.displayName);\n if (v.product?.title) parts.push(v.product.title);\n for (const o of v.selectedOptions ?? []) {\n parts.push(o.name);\n parts.push(o.value);\n }\n const haystack = parts.join(\" \").toLowerCase();\n return tokens.every((t) => haystack.includes(t));\n };\n\n return sorted.filter(matches);\n }, [searchQuery, sorted]);\n\n const groupedProducts = useMemo(() => {\n if (!config?.groupVariantsByProduct) return null;\n const q = searchQuery.trim().toLowerCase();\n const tokens = q ? q.split(/\\s+/).filter(Boolean) : [];\n\n const matchesSearch = (v: (typeof sorted)[number]) => {\n if (!tokens.length) return true;\n const parts: string[] = [v.displayName];\n if (v.product?.title) parts.push(v.product.title);\n for (const o of v.selectedOptions ?? []) { parts.push(o.name); parts.push(o.value); }\n const haystack = parts.join(\" \").toLowerCase();\n return tokens.every((tok) => haystack.includes(tok));\n };\n\n const map = new Map<string, { productId: string; productTitle: string; variants: typeof sorted; filteredVariants: typeof sorted }>();\n for (const v of sorted) {\n const productId = v.product?.id ?? \"unknown\";\n if (!map.has(productId)) {\n map.set(productId, { productId, productTitle: v.product?.title ?? \"\", variants: [], filteredVariants: [] });\n }\n const group = map.get(productId)!;\n group.variants.push(v);\n if (matchesSearch(v)) group.filteredVariants.push(v);\n }\n\n return Array.from(map.values()).filter((g) => g.filteredVariants.length > 0);\n }, [config?.groupVariantsByProduct, sorted, searchQuery]);\n\n const [openProductPicker, setOpenProductPicker] = useState<string | null>(null);\n const pickerRef = useRef<HTMLLIElement | null>(null);\n\n useEffect(() => {\n if (!openProductPicker) return;\n const handleClick = (e: MouseEvent) => {\n if (pickerRef.current && !pickerRef.current.contains(e.target as Node)) {\n setOpenProductPicker(null);\n }\n };\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [openProductPicker]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n // Keep cents stable for display.\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n // Slot index (0-based) => rule that becomes active at that slot.\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const slotCount = useMemo(() => {\n // Placeholders show until highest tier; if user adds more, extend (scroll).\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n // Track animation state for dual button split animation\n const [isDualButtonAnimationLoaded, setIsDualButtonAnimationLoaded] = useState(true);\n const prevItemsRemainingRef = useRef(itemsRemaining);\n\n // Trigger animation when itemsRemaining changes from > 0 to 0 in add_to_cart_checkout mode\n useEffect(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n const wasPositive = prevItemsRemainingRef.current > 0;\n const isNowZero = itemsRemaining === 0;\n\n if (wasPositive && isNowZero) {\n // Trigger animation\n setIsDualButtonAnimationLoaded(false);\n } else {\n // Reset animation\n setIsDualButtonAnimationLoaded(true);\n }\n }\n prevItemsRemainingRef.current = itemsRemaining;\n }, [itemsRemaining, config?.ctaButtonMode]);\n\n const panelRef = useRef<HTMLDivElement | null>(null);\n const bodyRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = bodyRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\"${variantId}\"]`);\n if (!row) return;\n\n const c = container.getBoundingClientRect();\n const r = row.getBoundingClientRect();\n const padding = 8;\n const isFullyVisible = r.top >= c.top + padding && r.bottom <= c.bottom - padding;\n if (isFullyVisible) return;\n\n const maxTop = Math.max(0, container.scrollHeight - container.clientHeight);\n const rowCenterOffset = (r.top - c.top) + r.height / 2;\n const targetTop = container.scrollTop + rowCenterOffset - container.clientHeight / 2;\n const nextTop = Math.min(maxTop, Math.max(0, targetTop));\n container.scrollTo({ top: nextTop, behavior: \"smooth\" });\n };\n\n useEffect(() => {\n if (!visualOpen) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") close();\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [close, visualOpen]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setWindowSize({ width: window.innerWidth, height: window.innerHeight });\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n useEffect(() => {\n if (closeTimerRef.current != null) {\n window.clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n if (visualOpen) {\n setIsMounted(true);\n return;\n }\n\n // Keep mounted long enough to play exit animation.\n closeTimerRef.current = window.setTimeout(() => {\n setIsMounted(false);\n closeTimerRef.current = null;\n }, 220);\n }, [visualOpen]);\n\n useEffect(() => {\n return () => {\n if (closeTimerRef.current != null) window.clearTimeout(closeTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n if (!visualOpen) return;\n if (!isSearchOpen) return;\n const raf = requestAnimationFrame(() => searchInputRef.current?.focus());\n return () => cancelAnimationFrame(raf);\n }, [visualOpen, isSearchOpen]);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n\n // When hitting a threshold, try to reveal the NEXT threshold (aligned right) if it's off-screen to the right.\n // If no remaining thresholds, scroll the newest added item into view.\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n // Only scroll rightward when the target is off-screen to the right.\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n\n useEffect(() => {\n if (!visualOpen) return;\n\n const prev = prevBundleSizeForConfettiRef.current;\n prevBundleSizeForConfettiRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n // Trigger when crossing an exact configured threshold (e.g. 2 items, 3 items, etc.).\n const hitRule = rulesSorted.find((r) => r.minBundleSize === bundleSize);\n if (!hitRule) return;\n\n // Celebration chip (centered)\n setCelebrationText(\n t(\"bundle.celebration.received_discount\", {\n discount: formatPercent0dp(hitRule.discountPercent),\n }),\n );\n setCelebrationKey((k) => k + 1);\n setIsCelebrationActive(true);\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n celebrationTimerRef.current = window.setTimeout(() => {\n setIsCelebrationActive(false);\n celebrationTimerRef.current = null;\n }, celebrationDurationMs);\n }, [bundleSize, visualOpen, rulesSorted]);\n\n useEffect(() => {\n if (!visualOpen) return;\n if (!isCelebrationActive) return;\n if (!celebrationText) return;\n\n // After the chip renders, measure its rect and shoot confetti from it.\n const raf = requestAnimationFrame(() => {\n const chipEl = celebrationChipRef.current;\n const rect = chipEl?.getBoundingClientRect();\n\n // Fallback: use the drawer panel center if chip rect isn't available yet.\n const panelRect = panelRef.current?.getBoundingClientRect();\n const originX = rect ? rect.left + rect.width / 2 : panelRect ? panelRect.left + panelRect.width / 2 : window.innerWidth / 2;\n const originY = rect ? rect.top + rect.height / 2 : panelRect ? panelRect.top + panelRect.height / 2 : window.innerHeight / 2;\n\n const source = {\n x: originX - 2,\n y: originY - 2,\n w: 4,\n h: 4,\n };\n\n setConfettiSource(source);\n setConfettiKey((k) => k + 1);\n setIsConfettiActive(true);\n\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n confettiTimerRef.current = window.setTimeout(() => {\n setIsConfettiActive(false);\n confettiTimerRef.current = null;\n }, confettiSettleMs);\n });\n\n return () => cancelAnimationFrame(raf);\n }, [celebrationKey, celebrationText, confettiSettleMs, isCelebrationActive, visualOpen]);\n\n useEffect(() => {\n if (!visualOpen) return;\n panelRef.current?.focus();\n }, [visualOpen]);\n\n if (!isMounted) return null;\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t(\"bundle.drawer.aria\")}\n className={[styles.backdrop, visualOpen ? styles.backdropOpen : styles.backdropClosed, props.className].filter(Boolean).join(\" \")}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) close();\n }}\n >\n {isConfettiActive && confettiSource && windowSize.width > 0 && windowSize.height > 0 ? (\n <Confetti\n key={confettiKey}\n width={windowSize.width}\n height={windowSize.height}\n confettiSource={confettiSource}\n colors={confettiColors}\n recycle={false}\n numberOfPieces={70}\n tweenDuration={100}\n gravity={0.45}\n initialVelocityY={{ min: -10, max: -30 }}\n initialVelocityX={{ min: -6, max: 6 }}\n style={{ position: \"fixed\", inset: 0, pointerEvents: \"none\", zIndex: 2147483646 }}\n />\n ) : null}\n <aside ref={panelRef} className={[styles.panel, visualOpen ? styles.panelOpen : styles.panelClosed].filter(Boolean).join(\" \")} tabIndex={-1}>\n {isCelebrationActive && celebrationText ? (\n <div className={styles.celebrationOverlay} aria-hidden=\"true\">\n <div key={celebrationKey} ref={celebrationChipRef} className={styles.celebrationChip}>\n {celebrationText}\n </div>\n </div>\n ) : null}\n <header className={[styles.header, isSearchOpen ? styles.headerSearchOpen : null].filter(Boolean).join(\" \")}>\n <button\n type=\"button\"\n className={styles.searchIconButton}\n aria-label={isSearchOpen ? t(\"bundle.search.expanded\") : t(\"bundle.search\")}\n aria-expanded={isSearchOpen}\n onClick={() => {\n setIsSearchOpen(true);\n }}\n >\n <Search size={18} aria-hidden=\"true\" />\n </button>\n\n <div className={styles.headerCenter}>\n <div className={styles.headerTitleWrap} aria-hidden={isSearchOpen}>\n <h2 className={styles.title}>{title}</h2>\n </div>\n\n <div className={styles.headerSearchWrap} aria-hidden={!isSearchOpen}>\n <div className={styles.searchBar}>\n <input\n ref={searchInputRef}\n className={styles.searchInput}\n type=\"search\"\n value={searchQuery}\n placeholder={t(\"bundle.search.placeholder\")}\n onChange={(e) => setSearchQuery(e.target.value)}\n onBlur={() => {\n if (searchQuery.trim() === \"\") setIsSearchOpen(false);\n }}\n />\n {searchQuery.trim() ? (\n <button\n type=\"button\"\n className={styles.searchClearButton}\n onMouseDown={(e) => {\n // Prevent input blur so the bar stays open and focused.\n e.preventDefault();\n }}\n onClick={() => {\n setSearchQuery(\"\");\n searchInputRef.current?.focus();\n }}\n aria-label={t(\"bundle.search.clear\")}\n >\n {t(\"bundle.search.clear\")}\n </button>\n ) : null}\n </div>\n </div>\n </div>\n\n <button type=\"button\" onClick={close} disabled={submitting} className={styles.closeButton} aria-label={t(\"bundle.close\")}>\n ×\n </button>\n </header>\n\n <div className={styles.body} ref={bodyRef}>\n {loading ? <p className={styles.muted}>{t(\"bundle.loading\")}</p> : null}\n {error ? <p className={styles.error}>{error}</p> : null}\n\n <div className={styles.variants}>\n {!loading && !error && eligibleVariants.length === 0 ? (\n <p className={styles.emptyState}>{t(\"bundle.empty\")}</p>\n ) : groupedProducts ? (\n <ul className={styles.variantList}>\n {groupedProducts.map((group) => {\n const productImage = group.variants.find((v) => v.image?.url)?.image ?? null;\n const hasMultipleVariants = group.variants.length > 1;\n const isPickerOpen = openProductPicker === group.productId;\n const selectedVariants = group.variants.filter((v) => (selections[v.id] ?? 0) > 0);\n\n // Single-variant: render identically to flat rows\n if (!hasMultipleVariants) {\n const v = group.variants[0];\n if (!v) return null;\n const qty = selections[v.id] ?? 0;\n const variantA11y = getVariantA11yLabel(v);\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const normalizedLimit = vLimit == null ? Number.POSITIVE_INFINITY : vLimit;\n const isAtLimit = qty >= normalizedLimit;\n const isUnavailable = v.availableForSale === false;\n const canIncrease = !isUnavailable && !isAtMaxBundleSize && !isAtLimit;\n const stockLabel = !isUnavailable && isAtLimit ? t(\"bundle.stock.max_reached\") : null;\n const origPrice = Number(v.price);\n const hasDiscount = appliedDiscountPercent != null && Number.isFinite(appliedDiscountPercent) && appliedDiscountPercent > 0 && Number.isFinite(origPrice);\n const discountedPrice = hasDiscount ? Math.round(origPrice * (1 - appliedDiscountPercent! / 100) * 100) / 100 : null;\n const fallbackVariantTitle = v.title?.trim();\n const optionText = formatVariantOptions(v.selectedOptions)\n ?? (fallbackVariantTitle && fallbackVariantTitle.toLowerCase() !== \"default title\" ? fallbackVariantTitle : null);\n return (\n <li key={group.productId} className={[styles.variantRow, isUnavailable ? styles.variantRowSoldOut : null].filter(Boolean).join(\" \")} data-variant-row={v.id}>\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {productImage?.url ? <img className={styles.variantThumbImg} src={productImage.url} alt={productImage.altText ?? group.productTitle} loading=\"lazy\" /> : <div className={styles.variantThumbFallback}>{group.productTitle.slice(0, 1).toUpperCase() || \"•\"}</div>}\n </div>\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{group.productTitle}</div>\n {optionText ? <div className={styles.variantMeta}>{optionText}</div> : null}\n <div className={styles.variantPriceRow}>\n {hasDiscount ? <span className={styles.variantCompareAt}>{formatMoney(origPrice.toFixed(2))}</span> : null}\n <span className={styles.variantPrice}>{formatMoney(discountedPrice != null ? discountedPrice.toFixed(2) : origPrice.toFixed(2))}</span>\n </div>\n </div>\n </div>\n {isUnavailable ? (\n <div className={styles.soldOutContainer}><span className={styles.soldOut} aria-label={t(\"bundle.a11y.sold_out\", { name: variantA11y })}>{t(\"bundle.stock.sold_out\")}</span></div>\n ) : qty <= 0 && normalizedLimit <= 0 ? (\n <div className={styles.stockLimitContainer}><span className={styles.stockLimitNotice}>{t(\"bundle.stock.max_added\")}</span></div>\n ) : qty <= 0 ? (\n <button type=\"button\" onClick={() => handleVariantAdd(v, 1)} disabled={submitting || !canIncrease} className={styles.addToBundleButton} aria-label={t(\"bundle.a11y.add_to_bundle\", { name: variantA11y })}>\n {t(\"bundle.cta.add_to_bundle\")}\n </button>\n ) : (\n <div className={styles.qtyControlsWrap}>\n <div className={styles.qtyControls}>\n <button type=\"button\" onClick={() => setQuantity(v.id, qty - 1)} disabled={submitting || qty <= 0} className={styles.qtyButton} aria-label={t(\"bundle.a11y.decrease\", { name: variantA11y })}>−</button>\n <span className={styles.qtyValue} aria-label={t(\"bundle.a11y.quantity\", { name: variantA11y, qty })}>{qty}</span>\n <button type=\"button\" onClick={() => handleVariantAdd(v, qty + 1)} disabled={submitting || !canIncrease} className={styles.qtyButton} aria-label={stockLabel ? `${variantA11y} ${stockLabel.toLowerCase()}` : t(\"bundle.a11y.increase\", { name: variantA11y })}>+</button>\n </div>\n {stockLabel ? <div className={styles.stockLimitNotice}>{stockLabel}</div> : null}\n </div>\n )}\n </li>\n );\n }\n\n // Multi-variant: header + inline picker + selected sub-rows\n return (\n <li key={group.productId} ref={isPickerOpen ? pickerRef : null} className={styles.drawerProductGroup}>\n {/* Product header row */}\n <div className={styles.variantRow} data-variant-row={group.productId}>\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {productImage?.url ? <img className={styles.variantThumbImg} src={productImage.url} alt={productImage.altText ?? group.productTitle} loading=\"lazy\" /> : <div className={styles.variantThumbFallback}>{group.productTitle.slice(0, 1).toUpperCase() || \"•\"}</div>}\n </div>\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{group.productTitle}</div>\n </div>\n </div>\n <button\n type=\"button\"\n className={[styles.addToBundleButton, styles.selectButton].filter(Boolean).join(\" \")}\n aria-expanded={isPickerOpen}\n disabled={submitting}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={() => setOpenProductPicker((prev) => prev === group.productId ? null : group.productId)}\n >\n {t(\"bundle.select.variant\")}\n <ChevronDown size={13} strokeWidth={2.5} className={[styles.selectButtonChevron, isPickerOpen ? styles.selectButtonChevronOpen : null].filter(Boolean).join(\" \")} />\n </button>\n </div>\n\n {/* Inline variant picker */}\n {isPickerOpen && (\n <div className={styles.variantPicker}>\n {group.filteredVariants.map((v) => {\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const isAlreadySelected = (selections[v.id] ?? 0) > 0;\n const isSoldOut = v.availableForSale === false;\n const isMaxAdded = vLimit != null && vLimit <= 0;\n const isBundleFull = !isAlreadySelected && isAtMaxBundleSize;\n const isDisabled = (\n submitting\n || isSoldOut\n || isMaxAdded\n || isBundleFull\n );\n const statusLabel = isSoldOut\n ? t(\"bundle.stock.sold_out\")\n : isMaxAdded\n ? t(\"bundle.stock.max_added\")\n : isBundleFull\n ? t(\"bundle.stock.max_reached\")\n : null;\n const optionLabel = getVariantOptionLabel(v);\n const origPrice = Number(v.price);\n const hasDiscount = appliedDiscountPercent != null && Number.isFinite(appliedDiscountPercent) && appliedDiscountPercent > 0 && Number.isFinite(origPrice);\n const discountedPrice = hasDiscount ? Math.round(origPrice * (1 - appliedDiscountPercent! / 100) * 100) / 100 : null;\n return (\n <button\n key={v.id}\n type=\"button\"\n disabled={isDisabled}\n className={[styles.variantPickerRow, isAlreadySelected ? styles.variantPickerRowSelected : null].filter(Boolean).join(\" \")}\n onClick={() => {\n if (!isAlreadySelected) {\n if (redirectToProductPage) {\n handleVariantAdd(v, 1);\n setOpenProductPicker(null);\n return;\n }\n handleVariantAdd(v, 1);\n }\n setOpenProductPicker(null);\n }}\n >\n <span className={styles.variantPickerLabel}>{optionLabel}</span>\n <span className={styles.variantPickerPriceGroup}>\n {statusLabel ? (\n <span className={styles.variantPickerSoldOut}>{statusLabel}</span>\n ) : (\n <>\n {hasDiscount ? <span className={styles.variantPickerCompareAt}>{formatMoney(origPrice.toFixed(2))}</span> : null}\n <span className={styles.variantPickerPrice}>{formatMoney(discountedPrice != null ? discountedPrice.toFixed(2) : origPrice.toFixed(2))}</span>\n </>\n )}\n </span>\n {isAlreadySelected ? <span className={styles.variantPickerCheck} aria-hidden=\"true\">✓</span> : null}\n </button>\n );\n })}\n </div>\n )}\n\n {/* Selected variant sub-rows */}\n {selectedVariants.length > 0 && (\n <div className={styles.drawerSelectedList}>\n {selectedVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const variantA11y = getVariantA11yLabel(v);\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const normalizedLimit = vLimit == null ? Number.POSITIVE_INFINITY : vLimit;\n const isAtLimit = qty >= normalizedLimit;\n const canIncrease = v.availableForSale !== false && !isAtMaxBundleSize && !isAtLimit;\n const stockLabel = v.availableForSale !== false && isAtLimit ? t(\"bundle.stock.max_reached\") : null;\n const origPrice = Number(v.price);\n const hasDiscount = appliedDiscountPercent != null && Number.isFinite(appliedDiscountPercent) && appliedDiscountPercent > 0 && Number.isFinite(origPrice);\n const discountedPrice = hasDiscount ? Math.round(origPrice * (1 - appliedDiscountPercent! / 100) * 100) / 100 : null;\n const optionLabel = getVariantOptionLabel(v);\n return (\n <div key={v.id} className={styles.drawerSubRow} data-variant-row={v.id}>\n <div className={styles.drawerSubRowInfo}>\n <span className={styles.drawerSubRowName}>{optionLabel}</span>\n <div className={styles.variantPriceRow}>\n {hasDiscount ? <span className={styles.variantCompareAt}>{formatMoney(origPrice.toFixed(2))}</span> : null}\n <span className={styles.variantPrice}>{formatMoney(discountedPrice != null ? discountedPrice.toFixed(2) : origPrice.toFixed(2))}</span>\n </div>\n </div>\n <div className={styles.qtyControlsWrap}>\n <div className={styles.qtyControls}>\n <button type=\"button\" onClick={() => setQuantity(v.id, qty - 1)} disabled={submitting || qty <= 0} className={styles.qtyButton} aria-label={t(\"bundle.a11y.decrease\", { name: variantA11y })}>−</button>\n <span className={styles.qtyValue} aria-label={t(\"bundle.a11y.quantity\", { name: variantA11y, qty })}>{qty}</span>\n <button type=\"button\" onClick={() => handleVariantAdd(v, qty + 1)} disabled={submitting || !canIncrease} className={styles.qtyButton} aria-label={stockLabel ? `${variantA11y} ${stockLabel.toLowerCase()}` : t(\"bundle.a11y.increase\", { name: variantA11y })}>+</button>\n </div>\n {stockLabel ? <div className={styles.stockLimitNotice}>{stockLabel}</div> : null}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n ) : (\n <ul className={styles.variantList}>\n {filteredVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const variantPrimaryName = getVariantPrimaryName(v);\n const variantOptionText = formatVariantOptions(v.selectedOptions);\n const variantA11y = getVariantA11yLabel(v);\n const variantSelectionLimit = getVariantMaxSelectableQuantity(v.id);\n const normalizedVariantSelectionLimit = variantSelectionLimit == null\n ? Number.POSITIVE_INFINITY\n : variantSelectionLimit;\n const isAtVariantStockLimit = qty >= normalizedVariantSelectionLimit;\n const canIncreaseQuantity = v.availableForSale !== false && !isAtMaxBundleSize && !isAtVariantStockLimit;\n const stockStatusLabel =\n v.availableForSale === false\n ? null\n : isAtVariantStockLimit\n ? t(\"bundle.stock.max_reached\")\n : null;\n\n // Show discounted variant price only when a rule is actually unlocked.\n const discountPercentToUse = appliedDiscountPercent;\n const originalPriceNumber = Number(v.price);\n const hasDiscount =\n discountPercentToUse != null &&\n Number.isFinite(discountPercentToUse) &&\n discountPercentToUse > 0 &&\n Number.isFinite(originalPriceNumber);\n const discountedPriceNumber = hasDiscount\n ? Math.round(originalPriceNumber * (1 - discountPercentToUse / 100) * 100) / 100\n : null;\n\n return (\n <li\n key={v.id}\n className={[styles.variantRow, v.availableForSale === false && styles.variantRowSoldOut]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={v.id}\n >\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {v.image?.url ? (\n <img\n className={styles.variantThumbImg}\n src={v.image.url}\n alt={v.image.altText ?? variantA11y}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantThumbFallback}>{v.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}</div>\n )}\n </div>\n\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{variantPrimaryName}</div>\n {variantOptionText ? <div className={styles.variantMeta}>{variantOptionText}</div> : null}\n <div className={styles.variantPriceRow}>\n {hasDiscount ? (\n <span className={styles.variantCompareAt}>\n {formatMoney(Number.isFinite(originalPriceNumber) ? originalPriceNumber.toFixed(2) : v.price)}\n </span>\n ) : null}\n <span className={styles.variantPrice}>\n {formatMoney(\n discountedPriceNumber != null\n ? discountedPriceNumber.toFixed(2)\n : Number.isFinite(originalPriceNumber)\n ? originalPriceNumber.toFixed(2)\n : v.price,\n )}\n </span>\n </div>\n </div>\n </div>\n {v.availableForSale === false ? (\n <div className={styles.soldOutContainer}>\n <span className={styles.soldOut} aria-label={t(\"bundle.a11y.sold_out\", { name: variantA11y })}>\n {t(\"bundle.stock.sold_out\")}\n </span>\n </div>\n ) : qty <= 0 && normalizedVariantSelectionLimit <= 0 ? (\n <div className={styles.stockLimitContainer}>\n <span className={styles.stockLimitNotice} aria-label={t(\"bundle.a11y.max_available_selected\", { name: variantA11y })}>\n {t(\"bundle.stock.max_added\")}\n </span>\n </div>\n ) : qty <= 0 ? (\n <button\n type=\"button\"\n onClick={() => handleVariantAdd(v, 1)}\n disabled={submitting || !canIncreaseQuantity}\n className={styles.addToBundleButton}\n aria-label={stockStatusLabel ? `${variantA11y} ${stockStatusLabel.toLowerCase()}` : t(\"bundle.a11y.add_to_bundle\", { name: variantA11y })}\n >\n {t(\"bundle.cta.add_to_bundle\")}\n </button>\n ) : (\n <div className={styles.qtyControlsWrap}>\n <div className={styles.qtyControls}>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty - 1)}\n disabled={submitting || qty <= 0}\n className={styles.qtyButton}\n aria-label={t(\"bundle.a11y.decrease\", { name: variantA11y })}\n >\n −\n </button>\n <span className={styles.qtyValue} aria-label={t(\"bundle.a11y.quantity\", { name: variantA11y, qty })}>\n {qty}\n </span>\n <button\n type=\"button\"\n onClick={() => handleVariantAdd(v, qty + 1)}\n disabled={submitting || !canIncreaseQuantity}\n className={styles.qtyButton}\n aria-label={stockStatusLabel ? `${variantA11y} ${stockStatusLabel.toLowerCase()}` : t(\"bundle.a11y.increase\", { name: variantA11y })}\n >\n +\n </button>\n </div>\n {stockStatusLabel ? <div className={styles.stockLimitNotice}>{stockStatusLabel}</div> : null}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n\n <footer className={styles.footer} ref={footerRef}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n\n // Per your preference: show discount text only while it's still a placeholder (unlocked display comes later elsewhere).\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const discountText = threshold\n ? t(\"bundle.discount.off_label\", { discount: formatPercent0dp(threshold.discountPercent) })\n : null;\n\n const titleText = isFilled ? variant!.displayName : t(\"bundle.slot\", { slot: idx + 1 });\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && discountText ? `${titleText}. ${t(\"bundle.unlocks\", { discount: discountText })}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • ${t(\"bundle.unlocks\", { discount: discountText })}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && discountText ? (\n <div className={styles.boxItemDiscountText}>{discountText}</div>\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{threshold!.label}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n <div\n className={[styles.ctaTotalsWrap, hasUnlockedFirstDiscount ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={!hasUnlockedFirstDiscount}\n >\n <div className={styles.ctaTotals} aria-label={t(\"bundle.totals\")}>\n {appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>\n {t(\"bundle.discount.badge\", { discount: appliedDiscountPercent })}\n </span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n\n {(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n // Show single button with \"Add X more\" when items remaining\n // Show both buttons side-by-side when minimum is met\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })}\n </button>\n );\n }\n\n return (\n <div className={`${styles.ctaButtonGroup} ${isDualButtonAnimationLoaded ? styles.ctaButtonGroupAnimating : \"\"}`}>\n <button\n type=\"button\"\n onClick={submit}\n disabled={!canSubmit}\n className={`${styles.ctaDualLeft} ${isDualButtonAnimationLoaded ? styles.ctaDualLeftAnimating : \"\"}`}\n >\n <span>{submitting ? t(\"bundle.cta.adding\") : t(\"bundle.cta.add_to_basket\")}</span>\n </button>\n <button\n type=\"button\"\n onClick={submitAndCheckout}\n disabled={!canSubmit}\n className={`${styles.ctaDualRight} ${isDualButtonAnimationLoaded ? styles.ctaDualRightAnimating : \"\"}`}\n >\n <span>{submitting ? t(\"bundle.cta.processing\") : t(\"bundle.cta.checkout\")}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.processing\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.checkout\")}\n </button>\n );\n }\n\n // Default: add_to_cart\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.add_to_basket\")}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n {t(\"bundle.powered_by\")} <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\"> BestBundles</a>\n </div>\n </footer>\n </aside>\n </div>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Plus, Trash2, ChevronDown } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport { formatBundleCurrency, getProductWord } from \"../i18n\";\nimport styles from \"./BundleBuilderPanel.module.css\";\n\nexport type BundleBuilderPanelProps = {\n className?: string;\n showRules?: boolean;\n showVariants?: boolean;\n};\n\nexport function BundleBuilderPanel(props: BundleBuilderPanelProps) {\n const {\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n redirectVariantToProductPage,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n } = useBundleBuilder();\n\n const {\n className,\n showRules = true,\n showVariants = true,\n } = props;\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n if (value.toLowerCase() === \"default title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" • \");\n };\n\n const isDefaultTitle = (value: string | null | undefined) => {\n return value?.trim().toLowerCase() === \"default title\";\n };\n\n const getVariantPrimaryName = (v: (typeof eligibleVariants)[number]) => {\n const displayName = v.displayName?.trim();\n if (displayName && !isDefaultTitle(displayName)) return displayName;\n\n const productTitle = v.product?.title?.trim();\n if (productTitle) return productTitle;\n\n const variantTitle = v.title?.trim();\n if (variantTitle && !isDefaultTitle(variantTitle)) return variantTitle;\n\n return displayName || variantTitle || productTitle || \"\";\n };\n\n const getVariantA11yLabel = (v: (typeof eligibleVariants)[number]) => {\n const primaryName = getVariantPrimaryName(v);\n const options = formatVariantOptions(v.selectedOptions);\n return [primaryName, options].filter(Boolean).join(\" — \");\n };\n\n const getVariantOptionLabel = (v: (typeof eligibleVariants)[number]) => {\n const options = formatVariantOptions(v.selectedOptions);\n if (options) return options;\n\n const variantTitle = v.title?.trim();\n if (variantTitle && !isDefaultTitle(variantTitle)) return variantTitle;\n\n return getVariantPrimaryName(v);\n };\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n return formatBundleCurrency(n, currencyCode, locale);\n };\n\n const displayVariants = useMemo(() => {\n return [...eligibleVariants];\n }, [eligibleVariants]);\n\n const groupedProducts = useMemo(() => {\n if (!config?.groupVariantsByProduct) return null;\n const map = new Map<string, { productId: string; productTitle: string; variants: typeof eligibleVariants }>();\n for (const v of displayVariants) {\n const productId = v.product?.id ?? \"unknown\";\n if (!map.has(productId)) {\n map.set(productId, { productId, productTitle: v.product?.title ?? \"\", variants: [] });\n }\n map.get(productId)!.variants.push(v);\n }\n return Array.from(map.values());\n }, [config?.groupVariantsByProduct, displayVariants]);\n\n const [openProductPicker, setOpenProductPicker] = useState<string | null>(null);\n const pickerRef = useRef<HTMLLIElement | null>(null);\n\n useEffect(() => {\n if (!openProductPicker) return;\n const handleClick = (e: MouseEvent) => {\n if (pickerRef.current && !pickerRef.current.contains(e.target as Node)) {\n setOpenProductPicker(null);\n }\n };\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [openProductPicker]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const title = config?.title?.trim() || t(\"bundle.title.default\");\n const redirectToProductPage = Boolean(config?.redirectEligibleProductsToProductPage);\n const handleVariantAdd = (variant: (typeof eligibleVariants)[number], nextQuantity: number) => {\n const currentQty = selections[variant.id] ?? 0;\n if (redirectToProductPage && nextQuantity > currentQty) {\n redirectVariantToProductPage(variant);\n return;\n }\n setQuantity(variant.id, nextQuantity);\n };\n\n const slotCount = useMemo(() => {\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n\n const variantsRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = variantsRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\\\"${variantId}\\\"]`);\n if (!row) return;\n row.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n };\n\n return (\n <section className={[styles.panel, className].filter(Boolean).join(\" \")} aria-busy={loading}>\n <header className={styles.header}>\n <h2 className={styles.title}>{title}</h2>\n </header>\n\n {loading ? <div className={styles.status}>{t(\"bundle.loading\")}</div> : null}\n {error ? <div className={styles.error}>{error}</div> : null}\n\n {showRules && rulesSorted.length ? (\n <div className={styles.section}>\n <div className={styles.rulesVisual}>\n <div className={styles.rulesLabelsRow}>\n {Array.from({ length: maxRuleSize }).map((_, idx) => {\n const lineIndex = idx + 1;\n const ruleForLine = rulesSorted.find((r) => r.minBundleSize === lineIndex);\n const discountLabel = ruleForLine\n ? t(\"bundle.discount.off_label\", { discount: formatPercent0dp(ruleForLine.discountPercent) })\n : null;\n\n return (\n <div key={lineIndex} className={styles.rulesLineLabelCell}>\n {discountLabel ? <span className={styles.rulesLineLabel}>{discountLabel}</span> : null}\n </div>\n );\n })}\n </div>\n <div className={styles.rulesLinesRow}>\n {Array.from({ length: maxRuleSize }).map((_, idx) => {\n const lineIndex = idx + 1;\n const isFilled = bundleSize >= lineIndex;\n\n return (\n <div\n key={lineIndex}\n className={[\n styles.rulesLine,\n isFilled ? styles.rulesLineFilled : styles.rulesLineEmpty,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n })}\n </div>\n </div>\n </div>\n ) : null}\n\n {showVariants ? (\n <div className={styles.section} ref={variantsRef}>\n <div className={styles.sectionTitle}>{t(\"bundle.select.items\")}</div>\n <div className={styles.variants}>\n {!loading && !error && displayVariants.length === 0 ? (\n <div className={styles.emptyState}>{t(\"bundle.empty\")}</div>\n ) : groupedProducts ? (\n <ul className={styles.variantList}>\n {groupedProducts.map((group) => {\n const productImage = group.variants.find((v) => v.image?.url)?.image ?? null;\n const hasMultipleVariants = group.variants.length > 1;\n const isPickerOpen = openProductPicker === group.productId;\n const selectedVariants = group.variants.filter((v) => (selections[v.id] ?? 0) > 0);\n\n // Single-variant: show qty controls directly in the header\n if (!hasMultipleVariants) {\n const variant = group.variants[0];\n if (!variant) return null;\n const qty = selections[variant.id] ?? 0;\n const fallbackVariantTitle = variant.title?.trim();\n const optionText = formatVariantOptions(variant.selectedOptions)\n ?? (fallbackVariantTitle && fallbackVariantTitle.toLowerCase() !== \"default title\" ? fallbackVariantTitle : null);\n const isUnavailable = variant.availableForSale === false;\n const vLimit = getVariantMaxSelectableQuantity(variant.id);\n const normalizedLimit = vLimit == null ? Number.POSITIVE_INFINITY : vLimit;\n const isAtLimit = qty >= normalizedLimit;\n const canIncrease = !submitting && !isUnavailable && !isAtMaxBundleSize && !isAtLimit;\n const stockLabel = !isUnavailable && isAtLimit ? t(\"bundle.stock.max_reached\") : null;\n\n return (\n <li key={group.productId} className={styles.productGroup}>\n <div className={styles.productGroupHeader}>\n <div className={styles.productGroupThumbWrap}>\n {productImage?.url ? (\n <img src={productImage.url} alt={productImage.altText ?? group.productTitle} width={productImage.width ?? 56} height={productImage.height ?? 56} className={styles.productGroupThumb} loading=\"lazy\" />\n ) : (\n <div className={styles.productGroupThumbFallback}>{group.productTitle.slice(0, 1).toUpperCase() || \"•\"}</div>\n )}\n </div>\n <div className={styles.productGroupInfo}>\n <div className={styles.productGroupTitle}>{group.productTitle}</div>\n {optionText ? <div className={styles.variantMeta}>{optionText}</div> : null}\n <div className={styles.variantPrice}>{formatMoney(variant.price)}</div>\n </div>\n <div className={styles.productGroupActions}>\n {isUnavailable ? (\n <div className={styles.soldOut}>{t(\"bundle.stock.sold_out\")}</div>\n ) : qty <= 0 && normalizedLimit <= 0 ? (\n <div className={styles.stockLimitNotice}>{t(\"bundle.stock.max_added\")}</div>\n ) : (\n <div className={styles.qtyActionsWrap}>\n {stockLabel ? <div className={styles.stockLimitNotice}>{stockLabel}</div> : null}\n <div className={styles.qtyActions}>\n {qty > 0 ? (\n <button type=\"button\" className={styles.qtyTrash} aria-label={t(\"bundle.a11y.remove_from_bundle\", { name: variant.displayName })} disabled={submitting} onClick={() => setQuantity(variant.id, 0)}>\n <Trash2 size={14} />\n </button>\n ) : null}\n <div\n className={[styles.qtyChip, canIncrease ? styles.qtyChipInteractive : null].filter(Boolean).join(\" \")}\n role={canIncrease ? \"button\" : undefined}\n tabIndex={canIncrease ? 0 : undefined}\n aria-label={t(\"bundle.a11y.quantity\", { name: variant.displayName, qty })}\n onClick={canIncrease ? () => handleVariantAdd(variant, qty + 1) : undefined}\n onKeyDown={canIncrease ? (e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); handleVariantAdd(variant, qty + 1); } } : undefined}\n >\n {qty <= 0 ? (\n <span className={styles.qtyChipPlus} aria-hidden=\"true\"><Plus size={18} strokeWidth={1.8} /></span>\n ) : (\n <>\n <span className={styles.qtyChipValue}>{qty}</span>\n <button type=\"button\" className={styles.qtyChipClear} aria-label={t(\"bundle.a11y.increase\", { name: variant.displayName })} disabled={!canIncrease} onClick={(e) => { e.stopPropagation(); handleVariantAdd(variant, qty + 1); }} onKeyDown={(e) => e.stopPropagation()}>\n <Plus size={12} strokeWidth={2} />\n </button>\n </>\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </li>\n );\n }\n\n // Multi-variant: \"Select\" button opens an inline picker; selected variants appear as sub-rows\n return (\n <li key={group.productId} ref={isPickerOpen ? pickerRef : null} className={[styles.productGroup, isPickerOpen ? styles.productGroupPickerOpen : null].filter(Boolean).join(\" \")}>\n <div className={styles.productGroupHeader}>\n <div className={styles.productGroupThumbWrap}>\n {productImage?.url ? (\n <img src={productImage.url} alt={productImage.altText ?? group.productTitle} width={productImage.width ?? 56} height={productImage.height ?? 56} className={styles.productGroupThumb} loading=\"lazy\" />\n ) : (\n <div className={styles.productGroupThumbFallback}>{group.productTitle.slice(0, 1).toUpperCase() || \"•\"}</div>\n )}\n </div>\n <div className={styles.productGroupInfo}>\n <div className={styles.productGroupTitle}>{group.productTitle}</div>\n </div>\n <div className={styles.productGroupActions}>\n <button\n type=\"button\"\n className={[styles.selectButton, isPickerOpen ? styles.selectButtonOpen : null].filter(Boolean).join(\" \")}\n aria-expanded={isPickerOpen}\n disabled={submitting}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={() => setOpenProductPicker((prev) => prev === group.productId ? null : group.productId)}\n >\n {t(\"bundle.select.variant\")}\n <ChevronDown size={13} strokeWidth={2.5} className={styles.selectButtonChevron} />\n </button>\n </div>\n </div>\n\n {/* Inline variant picker */}\n {isPickerOpen && (\n <div className={styles.variantPicker}>\n {group.variants.map((v) => {\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const isAlreadySelected = (selections[v.id] ?? 0) > 0;\n const isSoldOut = v.availableForSale === false;\n const isMaxAdded = vLimit != null && vLimit <= 0;\n const isBundleFull = !isAlreadySelected && isAtMaxBundleSize;\n const isDisabled = (\n submitting\n || isSoldOut\n || isMaxAdded\n || isBundleFull\n );\n const statusLabel = isSoldOut\n ? t(\"bundle.stock.sold_out\")\n : isMaxAdded\n ? t(\"bundle.stock.max_added\")\n : isBundleFull\n ? t(\"bundle.stock.max_reached\")\n : null;\n const optionLabel = getVariantOptionLabel(v);\n return (\n <button\n key={v.id}\n type=\"button\"\n disabled={isDisabled}\n className={[styles.variantPickerRow, isAlreadySelected ? styles.variantPickerRowSelected : null].filter(Boolean).join(\" \")}\n onClick={() => {\n if (!isAlreadySelected) {\n if (redirectToProductPage) {\n handleVariantAdd(v, 1);\n setOpenProductPicker(null);\n return;\n }\n handleVariantAdd(v, 1);\n }\n setOpenProductPicker(null);\n }}\n >\n <span className={styles.variantPickerLabel}>{optionLabel}</span>\n <span className={styles.variantPickerPrice}>\n {statusLabel ?? formatMoney(v.price)}\n </span>\n {isAlreadySelected ? <span className={styles.variantPickerCheck} aria-hidden=\"true\">✓</span> : null}\n </button>\n );\n })}\n </div>\n )}\n\n {/* Selected variants sub-rows */}\n {selectedVariants.length > 0 && (\n <ul className={styles.selectedVariantsList}>\n {selectedVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const normalizedLimit = vLimit == null ? Number.POSITIVE_INFINITY : vLimit;\n const isAtLimit = qty >= normalizedLimit;\n const canIncrease = !submitting && v.availableForSale !== false && !isAtMaxBundleSize && !isAtLimit;\n const optionLabel = getVariantOptionLabel(v);\n return (\n <li key={v.id} className={styles.selectedVariantRow} data-variant-row={v.id}>\n <div className={styles.selectedVariantInfo}>\n <span className={styles.selectedVariantName}>{optionLabel}</span>\n <span className={styles.selectedVariantPrice}>{formatMoney(v.price)}</span>\n </div>\n <div className={styles.qtyActions}>\n <button type=\"button\" className={styles.qtyTrash} aria-label={t(\"bundle.a11y.remove_from_bundle\", { name: v.displayName })} disabled={submitting} onClick={() => setQuantity(v.id, 0)}>\n <Trash2 size={14} />\n </button>\n <div\n className={[styles.qtyChip, canIncrease ? styles.qtyChipInteractive : null].filter(Boolean).join(\" \")}\n role={canIncrease ? \"button\" : undefined}\n tabIndex={canIncrease ? 0 : undefined}\n aria-label={t(\"bundle.a11y.quantity\", { name: v.displayName, qty })}\n onClick={canIncrease ? () => handleVariantAdd(v, qty + 1) : undefined}\n onKeyDown={canIncrease ? (e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); handleVariantAdd(v, qty + 1); } } : undefined}\n >\n <span className={styles.qtyChipValue}>{qty}</span>\n <button type=\"button\" className={styles.qtyChipClear} aria-label={t(\"bundle.a11y.increase\", { name: v.displayName })} disabled={!canIncrease} onClick={(e) => { e.stopPropagation(); handleVariantAdd(v, qty + 1); }} onKeyDown={(e) => e.stopPropagation()}>\n <Plus size={12} strokeWidth={2} />\n </button>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </li>\n );\n })}\n </ul>\n ) : (\n <ul className={styles.variantList}>\n {displayVariants.map((variant) => {\n const qty = selections[variant.id] ?? 0;\n const variantPrimaryName = getVariantPrimaryName(variant);\n const variantA11y = getVariantA11yLabel(variant);\n const options = formatVariantOptions(variant.selectedOptions);\n const isUnavailable = variant.availableForSale === false;\n const variantSelectionLimit = getVariantMaxSelectableQuantity(variant.id);\n const normalizedVariantSelectionLimit = variantSelectionLimit == null\n ? Number.POSITIVE_INFINITY\n : variantSelectionLimit;\n const isAtVariantStockLimit = qty >= normalizedVariantSelectionLimit;\n const canIncreaseQuantity = !isUnavailable && !isAtMaxBundleSize && !isAtVariantStockLimit;\n const isClickable = !redirectToProductPage && canIncreaseQuantity;\n const stockStatusLabel = !isUnavailable && isAtVariantStockLimit ? t(\"bundle.stock.max_reached\") : null;\n\n return (\n <li\n key={variant.id}\n className={[\n styles.variantRow,\n isClickable ? styles.variantRowInteractive : null,\n qty > 0 ? styles.variantRowSelected : null,\n isUnavailable ? styles.variantRowSoldOut : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={variant.id}\n role={isClickable ? \"button\" : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onClick={\n isClickable\n ? () => {\n handleVariantAdd(variant, qty + 1);\n }\n : undefined\n }\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleVariantAdd(variant, qty + 1);\n scrollVariantRowIntoView(variant.id);\n }\n }\n : undefined\n }\n aria-label={\n isUnavailable\n ? t(\"bundle.a11y.sold_out\", { name: variantA11y })\n : stockStatusLabel\n ? `${variantA11y} ${stockStatusLabel.toLowerCase()}`\n : t(\"bundle.a11y.add_to_bundle\", { name: variantA11y })\n }\n >\n <div className={styles.variantMedia}>\n {variant.image?.url ? (\n <img\n src={variant.image.url}\n alt={variant.image.altText ?? variantA11y}\n width={variant.image.width ?? 64}\n height={variant.image.height ?? 64}\n className={styles.variantImage}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantImageFallback}>{t(\"bundle.item.generic\")}</div>\n )}\n </div>\n <div className={styles.variantContent}>\n <div className={styles.variantHeader}>\n <div className={styles.variantTitle}>{variantPrimaryName}</div>\n {options ? <div className={styles.variantMeta}>{options}</div> : null}\n </div>\n <div className={styles.variantFooterRow}>\n <div className={styles.variantPrice}>{formatMoney(variant.price)}</div>\n <div className={styles.variantActions}>\n {isUnavailable ? (\n <div className={styles.soldOut} aria-label={t(\"bundle.a11y.sold_out\", { name: variantA11y })}>\n {t(\"bundle.stock.sold_out\")}\n </div>\n ) : qty <= 0 && normalizedVariantSelectionLimit <= 0 ? (\n <div className={styles.stockLimitNotice} aria-label={t(\"bundle.a11y.max_available_selected\", { name: variantA11y })}>\n {t(\"bundle.stock.max_added\")}\n </div>\n ) : (\n <div className={styles.qtyActionsWrap}>\n <div className={styles.qtyActions}>\n {qty > 0 ? (\n <button\n type=\"button\"\n className={styles.qtyTrash}\n aria-label={t(\"bundle.a11y.remove_from_bundle\", { name: variantA11y })}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, 0);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n >\n <Trash2 size={14} />\n </button>\n ) : null}\n <div\n className={[styles.qtyChip, canIncreaseQuantity ? styles.qtyChipInteractive : null].filter(Boolean).join(\" \")}\n aria-label={t(\"bundle.a11y.quantity\", { name: variantA11y, qty })}\n onClick={canIncreaseQuantity\n ? (e) => {\n e.stopPropagation();\n handleVariantAdd(variant, qty + 1);\n }\n : undefined}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n role={canIncreaseQuantity ? \"button\" : undefined}\n tabIndex={canIncreaseQuantity ? 0 : undefined}\n >\n {qty <= 0 ? (\n <span className={styles.qtyChipPlus} aria-hidden=\"true\">\n <Plus size={18} strokeWidth={1.8} />\n </span>\n ) : (\n <>\n <span className={styles.qtyChipValue}>{qty}</span>\n <button\n type=\"button\"\n className={styles.qtyChipClear}\n aria-label={t(\"bundle.a11y.increase\", { name: variantA11y })}\n onClick={(e) => {\n e.stopPropagation();\n handleVariantAdd(variant, qty + 1);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n disabled={!canIncreaseQuantity}\n >\n <Plus size={12} strokeWidth={2} />\n </button>\n </>\n )}\n </div>\n </div>\n {stockStatusLabel ? <div className={styles.stockLimitNotice}>{stockStatusLabel}</div> : null}\n </div>\n )}\n </div>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n ) : null}\n\n <footer className={styles.footer}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const discountText = threshold\n ? t(\"bundle.discount.off_label\", { discount: formatPercent0dp(threshold.discountPercent) })\n : null;\n const titleText = isFilled ? variant!.displayName : t(\"bundle.slot\", { slot: idx + 1 });\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && discountText ? `${titleText}. ${t(\"bundle.unlocks\", { discount: discountText })}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • ${t(\"bundle.unlocks\", { discount: discountText })}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n width={1}\n height={1}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && discountText ? (\n <div className={styles.boxItemDiscountText}>{discountText}</div>\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{threshold!.label}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n\n <div className={[styles.totalsReveal, hasUnlockedFirstDiscount ? styles.totalsRevealOpen : null].filter(Boolean).join(\" \")}>\n <div\n className={[styles.ctaTotalsWrap, hasUnlockedFirstDiscount ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={!hasUnlockedFirstDiscount}\n >\n <div className={styles.ctaTotals} aria-label={t(\"bundle.totals\")}>\n {appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>{t(\"bundle.discount.badge\", { discount: appliedDiscountPercent })}</span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n </div>\n\n {(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })}\n </button>\n );\n }\n\n return (\n <div className={styles.ctaButtonGroup}>\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.ctaDualLeft}>\n <span>{submitting ? t(\"bundle.cta.adding\") : t(\"bundle.cta.add_to_basket\")}</span>\n </button>\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.ctaDualRight}>\n <span>{submitting ? t(\"bundle.cta.processing\") : t(\"bundle.cta.checkout\")}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.processing\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.checkout\")}\n </button>\n );\n }\n\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.add_to_basket\")}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n {t(\"bundle.powered_by\")}{\" \"}\n <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\">\n BestBundles\n </a>\n </div>\n </footer>\n </section>\n );\n}\n","import React, { useEffect, useMemo, useState } from \"react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport { formatBundleCurrency } from \"../i18n\";\nimport styles from \"./VolumeDiscountPanel.module.css\";\n\nfunction normalizeVariantId(raw: string | null | undefined) {\n const value = String(raw ?? \"\").trim();\n if (!value) return \"\";\n if (value.startsWith(\"gid://shopify/ProductVariant/\")) return value;\n const digits = value.replace(/\\D/g, \"\");\n return digits ? `gid://shopify/ProductVariant/${digits}` : \"\";\n}\n\nfunction getCurrentVariantId() {\n if (typeof window === \"undefined\") return \"\";\n const variantParam = new URLSearchParams(window.location.search).get(\"variant\");\n if (variantParam) return normalizeVariantId(variantParam);\n\n const productForm = document.querySelector('form[action*=\"/cart/add\"]');\n const input = productForm?.querySelector<HTMLInputElement | HTMLSelectElement>('input[name=\"id\"], select[name=\"id\"]');\n return normalizeVariantId(input?.value ?? \"\");\n}\n\nfunction getQuantityInput() {\n if (typeof document === \"undefined\") return null;\n const productForm = document.querySelector('form[action*=\"/cart/add\"]');\n return productForm?.querySelector<HTMLInputElement>('input[name=\"quantity\"]') ?? null;\n}\n\nfunction getCurrentQuantity() {\n const quantityInput = getQuantityInput();\n if (!quantityInput) return null;\n const quantity = Number(quantityInput.value ?? NaN);\n if (!Number.isFinite(quantity) || quantity <= 0) return null;\n return Math.floor(quantity);\n}\n\nfunction updateProductFormQuantity(nextQuantity: number) {\n const quantityInput = getQuantityInput();\n if (!quantityInput) return false;\n quantityInput.value = String(nextQuantity);\n quantityInput.dispatchEvent(new Event(\"input\", { bubbles: true }));\n quantityInput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return true;\n}\n\nexport type VolumeDiscountPanelProps = {\n className?: string;\n preferFirstEligibleVariant?: boolean;\n};\n\nexport function VolumeDiscountPanel({ className, preferFirstEligibleVariant = false }: VolumeDiscountPanelProps) {\n const { loading, error, config, eligibleVariants, currencyCode, locale } = useBundleBuilder();\n const [currentVariantId, setCurrentVariantId] = useState(\"\");\n const [currentQuantity, setCurrentQuantity] = useState<number | null>(null);\n const [selectedRuleHandle, setSelectedRuleHandle] = useState<string | null>(null);\n const shouldPreferFirstEligibleVariant =\n preferFirstEligibleVariant ||\n (typeof window !== \"undefined\" &&\n Boolean(\n (window as Window & { __BUNDLE_PREVIEW_CONFIG__?: unknown }).__BUNDLE_PREVIEW_CONFIG__,\n ));\n\n useEffect(() => {\n const syncVariantId = () => setCurrentVariantId(getCurrentVariantId());\n syncVariantId();\n document.addEventListener(\"variant:change\", syncVariantId);\n const timer = window.setInterval(syncVariantId, 500);\n return () => {\n document.removeEventListener(\"variant:change\", syncVariantId);\n window.clearInterval(timer);\n };\n }, []);\n\n useEffect(() => {\n const syncQuantity = () => setCurrentQuantity(getCurrentQuantity());\n const handleQuantityEvent = (event: Event) => {\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) return;\n if (target.name !== \"quantity\") return;\n syncQuantity();\n };\n\n syncQuantity();\n document.addEventListener(\"input\", handleQuantityEvent, true);\n document.addEventListener(\"change\", handleQuantityEvent, true);\n const timer = window.setInterval(syncQuantity, 500);\n\n return () => {\n document.removeEventListener(\"input\", handleQuantityEvent, true);\n document.removeEventListener(\"change\", handleQuantityEvent, true);\n window.clearInterval(timer);\n };\n }, []);\n\n const rules = useMemo(\n () => [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize),\n [config?.rules],\n );\n\n const activeVariantId = shouldPreferFirstEligibleVariant\n ? eligibleVariants[0]?.id || \"\"\n : currentVariantId || eligibleVariants[0]?.id || \"\";\n const activeVariant = eligibleVariants.find((variant) => variant.id === activeVariantId) ?? null;\n\n useEffect(() => {\n if (!rules.length) {\n setSelectedRuleHandle(null);\n return;\n }\n if (currentQuantity != null) {\n let matchedRuleHandle: string | null = null;\n for (const rule of rules) {\n if (rule.minBundleSize <= currentQuantity) {\n matchedRuleHandle = rule.handle;\n }\n }\n setSelectedRuleHandle(matchedRuleHandle ?? rules[0]?.handle ?? null);\n return;\n }\n setSelectedRuleHandle((current) => current ?? rules[0]?.handle ?? null);\n }, [currentQuantity, rules]);\n\n if (config?.bundleType !== \"volume_discount\") {\n return null;\n }\n\n return (\n <section className={[styles.panel, className].filter(Boolean).join(\" \")} aria-busy={loading}>\n <h2 className={styles.title}>{config?.title?.trim() || \"Volume discount\"}</h2>\n {loading ? <div className={styles.status}>Loading volume discounts…</div> : null}\n {error ? <div className={styles.error}>{error}</div> : null}\n {!loading && !error && !activeVariant ? (\n <div className={styles.status}>Select an eligible variant to view volume discounts.</div>\n ) : null}\n {!loading && !error && activeVariant ? (\n <>\n <div className={styles.rules}>\n {rules.map((rule) => {\n const percentValue = Number.parseFloat(rule.discountPercent);\n const subtitle = Number.isFinite(percentValue) && percentValue > 0\n ? `Save ${Math.round(percentValue)}%`\n : \"Standard\";\n const checked = selectedRuleHandle === rule.handle;\n\n return (\n <div\n key={rule.handle}\n className={[styles.rule, checked ? styles.ruleSelected : \"\"].filter(Boolean).join(\" \")}\n >\n <label className={styles.ruleLabel}>\n <div className={styles.ruleLabelContent}>\n <input\n className={styles.ruleInput}\n type=\"radio\"\n checked={checked}\n name=\"bb-volume-discount-rule\"\n onChange={() => {\n setSelectedRuleHandle(rule.handle);\n updateProductFormQuantity(rule.minBundleSize);\n }}\n />\n <span className={styles.ruleTitle}>{`Buy ${rule.minBundleSize}`}</span>\n <span className={styles.ruleSubtitle}>{subtitle}</span>\n </div>\n <div>\n {(() => {\n const unitPrice = Number(activeVariant.price ?? NaN);\n if (!Number.isFinite(unitPrice)) return null;\n const totalPrice = unitPrice * rule.minBundleSize;\n const hasDiscount = Number.isFinite(percentValue) && percentValue > 0;\n const discountedPrice = hasDiscount\n ? totalPrice * (1 - (percentValue / 100))\n : totalPrice;\n\n if (!hasDiscount) {\n return (\n <span className={styles.priceRow}>\n <span className={styles.newPrice}>\n {formatBundleCurrency(totalPrice, currencyCode, locale)}\n </span>\n </span>\n );\n }\n\n return (\n <span className={styles.priceRow}>\n <span className={styles.oldPrice}>\n {formatBundleCurrency(totalPrice, currencyCode, locale)}\n </span>\n <span className={styles.newPrice}>\n {formatBundleCurrency(discountedPrice, currencyCode, locale)}\n </span>\n </span>\n );\n })()}\n </div>\n </label>\n </div>\n );\n })}\n </div>\n </>\n ) : null}\n </section>\n );\n}\n","import type { BundleCartAdapter, BundleCartLineAttribute } from \"../types\";\n\nfunction toProperties(attributes?: BundleCartLineAttribute[]) {\n if (!attributes?.length) return undefined;\n return attributes.reduce<Record<string, string>>((acc, attr) => {\n if (attr?.key) acc[attr.key] = attr.value ?? \"\";\n return acc;\n }, {});\n}\n\nfunction normalizeVariantId(merchandiseId: string) {\n const match = /\\/(\\d+)$/.exec(merchandiseId);\n return match ? match[1] : merchandiseId;\n}\n\nfunction toVariantGid(variantId: string | number | null | undefined) {\n if (variantId == null) return null;\n const raw = String(variantId).trim();\n if (!raw) return null;\n if (raw.startsWith(\"gid://shopify/ProductVariant/\")) return raw;\n return `gid://shopify/ProductVariant/${raw}`;\n}\n\nfunction getShopifyTheme() {\n if (typeof window === \"undefined\") return null;\n return (window as Window & {\n Shopify?: { theme?: { schema_name?: string | null; name?: string | null } };\n }).Shopify?.theme ?? null;\n}\n\nfunction isSleekTheme() {\n const theme = getShopifyTheme();\n if (!theme) return false;\n\n if (theme.schema_name === \"Sleek\") return true;\n return /sleek/i.test(theme.name ?? \"\");\n}\n\nfunction hasSleekCartDrawer() {\n if (typeof document === \"undefined\") return false;\n return !!document.querySelector(\"cart-drawer\");\n}\n\nfunction tryOpenSleekCartDrawer() {\n if (!isSleekTheme() || !hasSleekCartDrawer()) return false;\n\n document.dispatchEvent(new CustomEvent(\"cart:refresh\", {\n bubbles: true,\n detail: { open: true },\n }));\n\n return true;\n}\n\n/**\n * Refreshes the page so the theme re-renders with the updated cart.\n * Liquid themes fetch cart state on load, so a full reload guarantees the cart UI\n * (drawer, icon bubble, etc.) shows the correct state after adding bundle items.\n */\nfunction reloadPageForCartUpdate() {\n window.location.reload();\n}\n\nasync function postCartJson(endpoint: string, payload: Record<string, unknown>) {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(text || `Cart request failed: ${res.status}`);\n }\n return res.json().catch(() => null);\n}\n\nasync function getCartJson() {\n const res = await fetch(\"/cart.js\", {\n method: \"GET\",\n cache: \"no-store\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n });\n if (!res.ok) {\n throw new Error(`Cart request failed: ${res.status}`);\n }\n return res.json() as Promise<{ items?: Array<{ id?: number | string | null; quantity?: number | null }> }>;\n}\n\nexport function createLiquidCartAdapter(): BundleCartAdapter {\n return {\n async linesAdd(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesAddForCheckout(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesUpdate(lines) {\n for (const line of lines) {\n await postCartJson(\"/cart/change.js\", {\n id: line.id,\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n });\n }\n },\n async linesRemove(lineIds) {\n for (const id of lineIds) {\n await postCartJson(\"/cart/change.js\", { id, quantity: 0 });\n }\n },\n async getLineQuantitiesByMerchandiseId() {\n const cart = await getCartJson();\n const quantities: Record<string, number> = {};\n for (const item of cart.items ?? []) {\n const merchandiseId = toVariantGid(item.id);\n if (!merchandiseId) continue;\n const quantity = Number(item.quantity ?? 0);\n if (!Number.isFinite(quantity) || quantity <= 0) continue;\n quantities[merchandiseId] = (quantities[merchandiseId] ?? 0) + Math.floor(quantity);\n }\n return quantities;\n },\n openCartUI() {\n if (tryOpenSleekCartDrawer()) return;\n\n // Reload the page so the theme fetches and displays the updated cart.\n window.setTimeout(() => reloadPageForCartUpdate(), 0);\n },\n navigateToCheckout() {\n // Navigate to Shopify checkout page\n window.location.href = \"/checkout\";\n },\n };\n}\n"],"names":["BundleLineAttributeKeys","BundleSessionStorageKeys","fetchActiveBundleConfigs","params","url","json","fetchBundleConfig","fetchBundleConfigStatus","getVariantSelectionLimit","variant","quantity","ANONYMOUS_USER_ID_KEY","getOrCreateAnonymousUserId","existing","newId","cryptoAny","trackEvent","analyticsEndpoint","shop","event","response","error","EN","FR","DE","ES","DICTS","normalizeBundleLocale","raw","value","base","translateBundleUi","locale","key","vars","overrides","template","_a","text","name","formatBundleCurrency","amount","currencyCode","n","getProductWord","count","plural","BundleBuilderContext","createContext","BUNDLE_DRAWER_HASH","EMPTY_ELIGIBLE_VARIANTS","normalizeBundleHandle","getBundleHashHandle","hash","prefix","STYLE_SETTINGS_TO_CSS_VAR","GOOGLE_FONTS_LINK_ID","fontNameToParam","s","injectGoogleFontsLink","styles","body","title","families","href","link","injectStyleVariables","root","cssVar","getEffectiveStyleSettings","configSettings","preview","safeRandomUUID","clampQty","clampToVariantLimit","limit","normalized","normalizeLineAttributes","attributes","attribute","attributesSignature","a","b","createSelectedLine","merchandiseId","snapshotFromLines","lines","line","restoreLinesFromSnapshot","snapshot","shouldUseActiveConfigPreload","allowDrawerWhenInactive","initialData","BundleProvider","props","apiBaseUrl","cartAdapter","configHandle","configFetcher","activeConfigsFetcher","configStatusFetcher","providedAnalyticsEndpoint","inputLocale","messages","children","t","useCallback","normalizedInitialHandle","useActivePreload","isOpen","setIsOpen","useState","submitting","setSubmitting","setError","cartSyncing","setCartSyncing","cartQuantitiesByMerchandiseId","setCartQuantitiesByMerchandiseId","currentHandle","setCurrentHandleState","configCache","setConfigCache","bootstrapLoading","setBootstrapLoading","blockingHandleLoad","setBlockingHandleLoad","statusCheckPending","setStatusCheckPending","pendingOpenHandle","setPendingOpenHandle","selectedLines","setSelectedLines","preloadAbortRef","useRef","handleFetchAbortRef","statusAbortRef","cartSyncSeqRef","currentHandleRef","configCacheRef","bootstrapLoadingRef","openForHandleRef","lastSeenHashRef","skipSelectionResetOnHandleChangeRef","preserveSelectionsUntilHandleLoadedRef","fetcher","defaultFetchBundleConfig","activePreloadFetcher","statusFetcher","loadCartQuantities","quantities","acc","id","q","refreshCartQuantities","syncSeq","useEffect","setConfigHandle","handle","close","anonymousUserId","trackError","openDrawerOnly","current","applyLatestConfigResponse","prev","next","refreshHandleConfig","options","normalizedHandle","ac","fetchError","message","loadHandle","cachedEntry","openForHandle","source","_b","status","open","toggle","entry","openIfHash","force","nextHash","handleInHash","openIfHashForced","openIfHashOnFocus","currentEntry","config","eligibleVariants","loading","effective","handlePreviewStyles","win","applyPreviewConfig","previewConfig","previewVariants","previewVariantsLoading","maxBundleSize","useMemo","variantSelectionLimitById","baseLimit","inCart","eligibleVariantIdsSet","minRequired","rules","ruleMin","rule","normalizedRuleMin","configuredRaw","configuredMin","getSelectionsFromLines","setQuantity","variantLimit","prevSelections","prevQty","requestedDelta","currentBundleSize","variantRemaining","delta","nextLines","remainingToRemove","keptReversed","i","nextSelections","prevBundleSize","nextBundleSize","basePayload","addConfiguredVariant","input","targetHandle","isTargetingDifferentHandle","targetEntry","targetEligibleVariantIdsSet","baseLines","currentQty","targetMaxBundleSize","targetVariant","isWaitingForPreservedHandle","clearSelections","syncCartQuantities","getVariantMaxSelectableQuantity","selections","selectionOrder","bundleSize","canSubmit","getSelectionSnapshot","restoreSelectionSnapshot","redirectVariantToProductPage","productHandle","variantParam","_c","search","performCartAddition","bundleId","bundleTitle","latestCartQuantities","effectiveLimitById","linesBySignature","selectedLine","remaining","existingQtyForVariant","sum","signature","byId","grossPrice","price","rulesSorted","appliedRule","appliedDiscountPercent","pct","discountedPrice","discountedAmount","productVariantIds","discountThresholdIdentifier","discountLabel","isCheckout","addError","rawMessage","isStockError","submit","submitAndCheckout","jsx","useBundleBuilder","ctx","useContext","useBundleBuilderDrawer","BundleButton","tweenFunctions","d","c","p","tweenFunctions_1","degreesToRads","degrees","randomRange","min","max","randomInt","ParticleShape","RotationDirection","DEFAULT_FRAME_TIME","Particle","context","getOptions","x","y","colors","initialVelocityX","initialVelocityY","elapsed","gravity","wind","friction","opacity","drawShape","frameTimeMultiplier","rotateDelta","ParticleGenerator","canvas","newParticleX","newParticleY","particlesGenerated","lastNumberOfPieces","run","recycle","numberOfPieces","debug","tweenFunction","tweenDuration","nP","activeCount","tweenedVal","numToAdd","confettiDefaults","tweens.easeInOutQuad","Confetti","opts","computedConfettiDefaults","timestamp","onConfettiComplete","frameRate","lastRunState","lastRecycleState","ref","React","ReactConfettiInternal","extractCanvasProps","confettiOptions","passedProps","canvasStyles","refs","rest","confettiOptionKeys","refProps","prop","val","ReactConfetti","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","iconNode","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","ChevronDown","Plus","Search","Trash2","BundleBuilderDrawer","isSearchOpen","setIsSearchOpen","searchQuery","setSearchQuery","searchInputRef","footerRef","celebrationChipRef","windowSize","setWindowSize","confettiKey","setConfettiKey","confettiSource","setConfettiSource","isConfettiActive","setIsConfettiActive","confettiTimerRef","prevBundleSizeForConfettiRef","confettiSettleMs","celebrationKey","setCelebrationKey","celebrationText","setCelebrationText","isCelebrationActive","setIsCelebrationActive","celebrationTimerRef","celebrationDurationMs","DEFAULT_CONFETTI_COLORS","confettiColors","formatPercent0dp","formatVariantOptions","selectedOptions","o","isDefaultTitle","getVariantPrimaryName","v","displayName","productTitle","variantTitle","_d","getVariantA11yLabel","getVariantOptionLabel","redirectToProductPage","visualOpen","isMounted","setIsMounted","closeTimerRef","formatMoney","isAtMaxBundleSize","handleVariantAdd","nextQuantity","sorted","filteredVariants","tokens","matches","parts","haystack","groupedProducts","matchesSearch","tok","map","productId","group","g","openProductPicker","setOpenProductPicker","pickerRef","handleClick","e","itemsRemaining","best","firstRule","hasUnlockedFirstDiscount","subtotal","total","variantId","qty","discountedTotal","maxRuleSize","r","filledVariants","thresholdByIndex","idx","slotCount","isDualButtonAnimationLoaded","setIsDualButtonAnimationLoaded","prevItemsRemainingRef","wasPositive","panelRef","bodyRef","boxSummaryWindowRef","prevBundleSizeRef","scrollVariantRowIntoView","container","row","padding","maxTop","rowCenterOffset","targetTop","nextTop","onKeyDown","onResize","raf","hitThreshold","nextThreshold","targetIdx","el","containerRect","deltaRight","maxLeft","nextLeft","hitRule","k","chipEl","rect","panelRect","originX","originY","jsxs","productImage","hasMultipleVariants","isPickerOpen","selectedVariants","variantA11y","vLimit","normalizedLimit","isAtLimit","isUnavailable","canIncrease","stockLabel","origPrice","hasDiscount","fallbackVariantTitle","optionText","isAlreadySelected","isSoldOut","isMaxAdded","isBundleFull","isDisabled","statusLabel","optionLabel","Fragment","variantPrimaryName","variantOptionText","variantSelectionLimit","normalizedVariantSelectionLimit","isAtVariantStockLimit","canIncreaseQuantity","stockStatusLabel","discountPercentToUse","originalPriceNumber","discountedPriceNumber","_","threshold","isFilled","isThreshold","showThreshold","discountText","titleText","buttonMode","BundleBuilderPanel","showRules","showVariants","primaryName","displayVariants","variantsRef","lineIndex","ruleForLine","isClickable","normalizeVariantId","digits","getCurrentVariantId","productForm","getQuantityInput","getCurrentQuantity","quantityInput","updateProductFormQuantity","VolumeDiscountPanel","preferFirstEligibleVariant","currentVariantId","setCurrentVariantId","currentQuantity","setCurrentQuantity","selectedRuleHandle","setSelectedRuleHandle","shouldPreferFirstEligibleVariant","syncVariantId","timer","syncQuantity","handleQuantityEvent","target","activeVariantId","activeVariant","matchedRuleHandle","percentValue","subtitle","checked","unitPrice","totalPrice","toProperties","attr","toVariantGid","getShopifyTheme","isSleekTheme","theme","hasSleekCartDrawer","tryOpenSleekCartDrawer","reloadPageForCartUpdate","postCartJson","endpoint","payload","res","getCartJson","createLiquidCartAdapter","items","lineIds","cart","item"],"mappings":";;AAAO,MAAMA,KAA0B;AAAA,EACrC,UAAU;AAAA,EACV,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AACf,GAEaC,KAA2B;AAAA,EACtC,gBAAgB;AAAA,EAChB,uBAAuB;AACzB;ACRA,eAAsBC,GAAyBC,GAIA;AAC7C,QAAMC,IAAM,IAAI,IAAI,qCAAqCD,EAAO,UAAU;AAC1E,EAAAC,EAAI,aAAa,IAAI,QAAQD,EAAO,IAAI;AAQxC,QAAME,IAAQ,OAND,MAAM,MAAMD,GAAK;AAAA,IAC5B,QAAQ;AAAA,IACR,QAAQD,EAAO;AAAA,IACf,SAAS,EAAE,gBAAgB,mBAAA;AAAA,EAAmB,CAC/C,GAEwB,OAAO,MAAM,MAAM,IAAI;AAChD,SAAI,CAACE,KAAQ,OAAOA,KAAS,WACpB,EAAE,IAAI,IAAO,OAAO,oBAAA,IAGtBA;AACT;ACpBA,eAAsBC,GAAkBH,GAMA;AACtC,QAAMC,IAAM,IAAI,IAAI,6BAA6BD,EAAO,UAAU;AAClE,EAAAC,EAAI,aAAa,IAAI,QAAQD,EAAO,IAAI,GACpCA,EAAO,gBACTC,EAAI,aAAa,IAAI,UAAUD,EAAO,YAAY,GAEhDA,EAAO,SACTC,EAAI,aAAa,IAAI,SAAS,GAAG;AAUnC,QAAMC,IAAQ,OAPD,MAAM,MAAMD,GAAK;AAAA,IAC5B,QAAQ;AAAA,IACR,QAAQD,EAAO;AAAA,IACf,SAAS,EAAE,gBAAgB,mBAAA;AAAA,EAAmB,CAC/C,GAGwB,OAAO,MAAM,MAAM,IAAI;AAChD,SAAI,CAACE,KAAQ,OAAOA,KAAS,WACpB,EAAE,IAAI,IAAO,OAAO,oBAAA,IAGtBA;AACT;AC7BA,eAAsBE,GAAwBJ,GAKA;AAC5C,QAAMC,IAAM,IAAI,IAAI,oCAAoCD,EAAO,UAAU;AACzE,EAAAC,EAAI,aAAa,IAAI,QAAQD,EAAO,IAAI,GACpCA,EAAO,gBACTC,EAAI,aAAa,IAAI,UAAUD,EAAO,YAAY;AASpD,QAAME,IAAQ,OAND,MAAM,MAAMD,GAAK;AAAA,IAC5B,QAAQ;AAAA,IACR,QAAQD,EAAO;AAAA,IACf,SAAS,EAAE,gBAAgB,mBAAA;AAAA,EAAmB,CAC/C,GAEwB,OAAO,MAAM,MAAM,IAAI;AAChD,SAAI,CAACE,KAAQ,OAAOA,KAAS,WACpB,EAAE,IAAI,IAAO,OAAO,oBAAA,IAGtBA;AACT;ACxBO,SAASG,GAAyBC,GAAmD;AAC1F,MAAI,CAACA,KAAWA,EAAQ,qBAAqB,GAAO,QAAO;AAG3D,MAFIA,EAAQ,oBAAoB,cAE5BA,EAAQ,0BAA0B,KAAM,QAAO,OAAO;AAE1D,QAAMC,IAAW,OAAOD,EAAQ,sBAAsB;AAEtD,SADI,CAAC,OAAO,SAASC,CAAQ,KACzBA,KAAY,KAAKD,EAAQ,qBAAqB,KAAa,OAAO,oBAC/D,KAAK,IAAI,GAAG,KAAK,MAAMC,CAAQ,CAAC;AACzC;ACZA,MAAMC,KAAwB;AAMvB,SAASC,KAAqC;AACnD,MAAI,OAAO,SAAW,OAAe,OAAO,eAAiB;AAE3D,WAAO,MAAM,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAGjF,MAAI;AACF,UAAMC,IAAW,aAAa,QAAQF,EAAqB;AAC3D,QAAIE,KAAY,OAAOA,KAAa,YAAYA,EAAS,SAAS;AAChE,aAAOA;AAIT,QAAIC;AACJ,QAAI;AAEF,YAAMC,IAAa,WAAmB;AACtC,UAAIA,KAAA,QAAAA,EAAW;AACb,QAAAD,IAAQC,EAAU,WAAA;AAAA;AAElB,cAAM,IAAI,MAAM,iCAAiC;AAAA,IAErD,QAAQ;AAEN,MAAAD,IAAQ,MAAM,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IAClF;AAEA,wBAAa,QAAQH,IAAuBG,CAAK,GAC1CA;AAAA,EACT,QAAQ;AAEN,WAAO,MAAM,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,EACjF;AACF;AAuEA,eAAsBE,GACpBC,GACAC,GACAC,GACe;AACf,MAAI,SAAO,SAAW;AAItB,QAAI;AACF,YAAMf,IAAM,IAAI,IAAIa,GAAmB,OAAO,SAAS,MAAM;AAC7D,MAAAb,EAAI,aAAa,IAAI,QAAQc,CAAI;AAEjC,YAAME,IAAW,MAAM,MAAMhB,GAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAAA;AAAA,QAElB,MAAM,KAAK,UAAUe,CAAK;AAAA;AAAA,QAE1B,WAAW;AAAA,MAAA,CACZ;AAED,MAAKC,EAAS,MACZ,QAAQ;AAAA,QACN,wDAAwDA,EAAS,MAAM;AAAA,QACvE,MAAMA,EAAS,OAAO,MAAM,MAAM,yBAAyB;AAAA,MAAA;AAAA,IAGjE,SAASC,GAAO;AAEd,cAAQ,KAAK,6CAA6CA,CAAK;AAAA,IACjE;AACF;AC1FA,MAAMC,KAAW;AAAA,EACf,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,iCAAiC;AAAA,EACjC,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,4BAA4B;AAAA,EAC5B,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,wCAAwC;AAAA,EACxC,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,kCAAkC;AAAA,EAClC,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,sCAAsC;AAAA,EACtC,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,gCAAgC;AAClC,GAEMC,KAAW;AAAA,EACf,GAAGD;AAAA,EACH,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,iCAAiC;AAAA,EACjC,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,wCAAwC;AAAA,EACxC,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,sCAAsC;AAAA,EACtC,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,gCAAgC;AAClC,GAEME,KAAW;AAAA,EACf,GAAGF;AAAA,EACH,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,iCAAiC;AAAA,EACjC,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,wCAAwC;AAAA,EACxC,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,sCAAsC;AAAA,EACtC,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,gCAAgC;AAClC,GAEMG,KAAW;AAAA,EACf,GAAGH;AAAA,EACH,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,iCAAiC;AAAA,EACjC,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,wCAAwC;AAAA,EACxC,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,sCAAsC;AAAA,EACtC,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,gCAAgC;AAClC,GAEMI,KAAsC;AAAA,EAC1C,IAAIJ;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AACN;AAEO,SAASE,GAAsBC,GAAgD;AACpF,QAAMC,IAAQ,OAAOD,KAAO,EAAE,EAAE,KAAA,EAAO,YAAA;AACvC,MAAI,CAACC,EAAO,QAAO;AACnB,QAAMC,IAAOD,EAAM,MAAM,GAAG,EAAE,CAAC,KAAK;AACpC,SAAIC,MAAS,QAAQA,MAAS,QAAQA,MAAS,QAAQA,MAAS,OAAaA,IACtE;AACT;AAEO,SAASC,GACdC,GACAC,GACAC,GACAC,GACQ;;AACR,QAAMC,KAAWD,KAAA,gBAAAA,EAAYF,SAAQI,IAAAX,GAAMM,CAAM,MAAZ,gBAAAK,EAAgBJ,OAAQX,GAAGW,CAAG,KAAKA;AACxE,SAAKC,IACE,OAAO,QAAQA,CAAI,EAAE,OAAO,CAACI,GAAM,CAACC,GAAMV,CAAK,MAC7CS,EAAK,WAAW,KAAKC,CAAI,MAAM,OAAOV,CAAK,CAAC,GAClDO,CAAQ,IAHOA;AAIpB;AAEO,SAASI,GAAqBC,GAAyBC,GAA6BV,GAAgB;AACzG,QAAMW,IAAI,OAAOF,CAAM;AACvB,MAAI,CAAC,OAAO,SAASE,CAAC,EAAG,QAAO,OAAOF,CAAM;AAE7C,MAAIC;AACF,QAAI;AACF,aAAO,IAAI,KAAK,aAAaV,KAAU,QAAW,EAAE,OAAO,YAAY,UAAUU,EAAA,CAAc,EAAE,OAAOC,CAAC;AAAA,IAC3G,QAAQ;AAAA,IAER;AAGF,SAAO,IAAIA,EAAE,QAAQ,CAAC,CAAC;AACzB;AAEO,SAASC,GAAeZ,GAAwBa,GAAe;AACpE,QAAMC,IAASD,MAAU,IAAI,QAAQ;AACrC,SAAIb,MAAW,OAAac,MAAW,QAAQ,YAAY,aACvDd,MAAW,OAAac,MAAW,QAAQ,YAAY,aACvDd,MAAW,OAAac,MAAW,QAAQ,aAAa,cACrDA,MAAW,QAAQ,YAAY;AACxC;AC7JO,MAAMC,KAAuBC,GAAgD,IAAI,GAElFC,KAAqB,iBACrBC,KAAmD,CAAA;AAEzD,SAASC,GAAsBvB,GAAgC;AAC7D,QAAMC,IAAQ,OAAOD,KAAO,EAAE,EAAE,KAAA,EAAO,YAAA;AACvC,SAAKC,KACWA,EACb,QAAQ,gBAAgB,GAAG,EAC3B,QAAQ,OAAO,EAAE,EACjB,QAAQ,OAAO,EAAE,EACjB,QAAQ,UAAU,GAAG,KACN;AACpB;AAEA,SAASuB,GAAoBC,GAA6B;AACxD,QAAMxB,IAAQ,OAAOwB,KAAQ,EAAE,EAAE,KAAA,EAAO,YAAA;AACxC,MAAI,CAACxB,EAAM,WAAWoB,EAAkB,EAAG,QAAO;AAClD,MAAIpB,MAAUoB,GAAoB,QAAO;AACzC,QAAMK,IAAS,GAAGL,EAAkB;AACpC,SAAKpB,EAAM,WAAWyB,CAAM,IACrBH,GAAsBtB,EAAM,MAAMyB,EAAO,MAAM,CAAC,IADjB;AAExC;AAGA,MAAMC,KAAmE;AAAA,EACvE,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,iBAAiB;AACnB,GAEMC,KAAuB;AAE7B,SAASC,GAAgBlB,GAAsB;AAC7C,QAAMmB,KAAKnB,KAAQ,IAAI,OAAO,QAAQ,gBAAgB,EAAE;AACxD,SAAOmB,IAAI,mBAAmBA,CAAC,EAAE,QAAQ,QAAQ,GAAG,IAAI;AAC1D;AAEA,SAASC,GAAsBC,GAAmC;;AAChE,MAAI,OAAO,WAAa,OAAe,CAAC,SAAS,KAAM;AACvD,MAAI,CAACA,GAAQ;AACX,KAAAvB,IAAA,SAAS,eAAemB,EAAoB,MAA5C,QAAAnB,EAA+C;AAC/C;AAAA,EACF;AACA,QAAMwB,KAAQD,EAAO,kBAAkB,IAAI,OAAO,QAAQ,gBAAgB,EAAE,GACtEE,KAASF,EAAO,mBAAmB,IAAI,OAAO,QAAQ,gBAAgB,EAAE,GACxEG,IAAqB,CAAA;AAC3B,EAAIF,KAAME,EAAS,KAAK,YAAYN,GAAgBI,CAAI,CAAC,GACrDC,KAASA,MAAUD,KAAME,EAAS,KAAK,YAAYN,GAAgBK,CAAK,CAAC;AAC7E,QAAMjD,IAAW,SAAS,eAAe2C,EAAoB;AAC7D,MAAIO,EAAS,WAAW,GAAG;AACzB,IAAAlD,KAAA,QAAAA,EAAU;AACV;AAAA,EACF;AACA,QAAMmD,IAAO,qCAAqCD,EAAS,KAAK,GAAG,CAAC;AACpE,MAAIlD,GAAU;AACZ,IAAIA,EAAS,aAAa,MAAM,MAAMmD,KAAMnD,EAAS,aAAa,QAAQmD,CAAI;AAC9E;AAAA,EACF;AACA,QAAMC,IAAO,SAAS,cAAc,MAAM;AAC1C,EAAAA,EAAK,KAAKT,IACVS,EAAK,MAAM,cACXA,EAAK,OAAOD,GACZ,SAAS,KAAK,YAAYC,CAAI;AAChC;AAEA,SAASC,GAAqBN,GAAmC;AAC/D,MAAI,CAACA,EAAQ;AACb,EAAAD,GAAsBC,CAAM;AAC5B,QAAMO,IAAO,SAAS;AACrB,SAAO,QAAQZ,EAAyB,EAA6C,QAAQ,CAAC,CAACtB,GAAKmC,CAAM,MAAM;AAC/G,QAAIvC,IAAQ+B,EAAO3B,CAAG;AACtB,IAAIJ,OACGI,MAAQ,oBAAoBA,MAAQ,sBAAsB,eAAe,KAAKJ,CAAK,KAAK,CAAC,QAAQ,KAAKA,EAAM,KAAA,CAAM,MACrHA,IAAQ,IAAIA,EAAM,KAAA,EAAO,QAAQ,gBAAgB,EAAE,CAAC,MAEtDsC,EAAK,MAAM,YAAYC,GAAQvC,CAAK;AAAA,EAExC,CAAC;AACH;AAEA,SAASwC,GAA0BC,GAAsE;AACvG,MAAI,OAAO,SAAW,IAAa,QAAOA;AAC1C,QAAMC,IAAW,OAAkE;AACnF,SAAIA,KAAW,OAAOA,KAAY,WAAiBA,IAC5CD;AACT;AAEA,SAASE,KAAiB;AACxB,MAAI;AAEF,UAAMzD,IAAa,WAAmB;AACtC,QAAIA,KAAA,QAAAA,EAAW,WAAY,QAAOA,EAAU,WAAA;AAAA,EAC9C,QAAQ;AAAA,EAER;AACA,SAAO,MAAM,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACjF;AAEA,SAAS0D,GAAS9B,GAAW;AAC3B,SAAK,OAAO,SAASA,CAAC,IACf,KAAK,IAAI,GAAG,KAAK,MAAMA,CAAC,CAAC,IADA;AAElC;AAEA,SAAS+B,GAAoBhE,GAAkBiE,GAAe;AAC5D,QAAMC,IAAaH,GAAS/D,CAAQ;AACpC,SAAK,OAAO,SAASiE,CAAK,IACnB,KAAK,IAAIC,GAAY,KAAK,IAAI,GAAG,KAAK,MAAMD,CAAK,CAAC,CAAC,IADtBC;AAEtC;AAEA,SAASC,GAAwBC,GAAwC;AACvE,MAAI,CAAC,MAAM,QAAQA,CAAU,KAAK,CAACA,EAAW,OAAQ;AACtD,QAAMF,IAAaE,EAChB,IAAI,CAACC,MAAc;AAClB,UAAM9C,IAAM,QAAO8C,KAAA,gBAAAA,EAAW,QAAO,EAAE,EAAE,KAAA;AACzC,WAAK9C,IACE;AAAA,MACL,KAAAA;AAAA,MACA,OAAO,QAAO8C,KAAA,gBAAAA,EAAW,UAAS,EAAE;AAAA,IAAA,IAHrB;AAAA,EAKnB,CAAC,EACA,OAAO,OAAO;AACjB,SAAOH,EAAW,SAASA,IAAa;AAC1C;AAEA,SAASI,GAAoBF,GAAwC;AACnE,QAAMF,IAAaC,GAAwBC,CAAU;AACrD,SAAKF,KAAA,QAAAA,EAAY,SACV,KAAK;AAAA,IACV,CAAC,GAAGA,CAAU,EACX,KAAK,CAACK,GAAGC,MAAMD,EAAE,IAAI,cAAcC,EAAE,GAAG,KAAKD,EAAE,MAAM,cAAcC,EAAE,KAAK,CAAC;AAAA,EAAA,IAHhD;AAKlC;AAEA,SAASC,GAAmBC,GAAuBN,GAA4D;AAC7G,SAAO;AAAA,IACL,IAAIN,GAAA;AAAA,IACJ,eAAAY;AAAA,IACA,UAAU;AAAA,IACV,YAAYP,GAAwBC,CAAU;AAAA,EAAA;AAElD;AAEA,SAASO,GAAkBC,GAAqD;AAC9E,SAAO;AAAA,IACL,OAAOA,EAAM,IAAI,CAACC,MAAA;;AAAU;AAAA,QAC1B,IAAIA,EAAK;AAAA,QACT,eAAeA,EAAK;AAAA,QACpB,UAAUd,GAASc,EAAK,YAAY,CAAC,KAAK;AAAA,QAC1C,IAAIlD,IAAAkD,EAAK,eAAL,QAAAlD,EAAiB,SAAS,EAAE,YAAYwC,GAAwBU,EAAK,UAAU,MAAM,CAAA;AAAA,MAAC;AAAA,KAC1F;AAAA,EAAA;AAEN;AAEA,SAASC,GAAyBC,GAA2E;AAC3G,SAAI,CAACA,KAAY,CAAC,MAAM,QAAQA,EAAS,KAAK,IAAU,CAAA,IACjDA,EAAS,MACb,IAAI,CAACF,MAAS;AACb,UAAMH,IAAgB,QAAOG,KAAA,gBAAAA,EAAM,kBAAiB,EAAE,EAAE,KAAA;AACxD,WAAKH,IACE;AAAA,MACL,IAAI,QAAOG,KAAA,gBAAAA,EAAM,OAAM,EAAE,EAAE,KAAA,KAAUf,GAAA;AAAA,MACrC,eAAAY;AAAA,MACA,UAAUX,IAASc,KAAA,gBAAAA,EAAM,aAAY,CAAC,KAAK;AAAA,MAC3C,YAAYV,GAAwBU,KAAA,gBAAAA,EAAM,UAAU;AAAA,IAAA,IAL3B;AAAA,EAO7B,CAAC,EACA,OAAO,OAAO;AACnB;AAEA,SAASG,GACPC,GACAC,GACA;AACA,SAAO,CAACD,KAA2B,CAACC;AACtC;AAEO,SAASC,GAAeC,GAA4B;AACzD,QAAM;AAAA,IACJ,YAAAC;AAAA,IACA,MAAA7E;AAAA,IACA,aAAA8E;AAAA,IACA,cAAAC,IAAe;AAAA,IACf,aAAAL;AAAA,IACA,eAAAM;AAAA,IACA,sBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,mBAAmBC;AAAA,IACnB,yBAAAV,IAA0B;AAAA,IAC1B,QAAQW;AAAA,IACR,UAAAC;AAAA,IACA,UAAAC;AAAA,EAAA,IACEV,GAEE9D,IAASL,GAAsB2E,EAAW,GAC1CG,IAAIC,GAAY,CAACzE,GAAyBC,MACvCH,GAAkBC,GAAQC,GAAKC,GAAMqE,EAAQ,GACnD,CAACvE,GAAQuE,EAAQ,CAAC,GAEfI,KAA0BxD,GAAsB8C,CAAY,GAC5DhF,IAAoBoF,MAA6B,GAAGN,CAAU,gCAC9Da,IAAmBlB,GAA6BC,GAAyBC,CAAW,GAEpF,CAACiB,IAAQC,CAAS,IAAIC,GAAS,EAAK,GACpC,CAACC,GAAYC,CAAa,IAAIF,GAAS,EAAK,GAC5C,CAAC1F,IAAO6F,EAAQ,IAAIH,GAAwB,IAAI,GAChD,CAACI,IAAaC,EAAc,IAAIL,GAAS,EAAK,GAC9C,CAACM,IAA+BC,EAAgC,IAAIP,GAAiC,CAAA,CAAE,GACvG,CAACQ,IAAeC,EAAqB,IAAIT,GAASJ,EAAuB,GACzE,CAACc,IAAaC,EAAc,IAAIX,GAA4B,MAChEnB,IAAc,EAAE,CAACe,EAAuB,GAAGf,EAAA,IAAgB,EAC5D,GACK,CAAC+B,IAAkBC,EAAmB,IAAIb,GAASH,CAAgB,GACnE,CAACiB,IAAoBC,EAAqB,IAAIf;AAAA,IAClD,CAACH,KAAoB,CAAChB,IAAce,KAA0B;AAAA,EAAA,GAE1D,CAACoB,IAAoBC,EAAqB,IAAIjB,GAAwB,IAAI,GAC1E,CAACkB,IAAmBC,EAAoB,IAAInB,GAAwD,IAAI,GACxG,CAACoB,IAAeC,EAAgB,IAAIrB,GAA8B,MAAM,CAAA,CAAE,GAE1EsB,KAAkBC,GAA+B,IAAI,GACrDC,KAAsBD,GAA+B,IAAI,GACzDE,KAAiBF,GAA+B,IAAI,GACpDG,KAAiBH,GAAO,CAAC,GACzBI,KAAmBJ,GAAOf,EAAa,GACvCoB,KAAiBL,GAAOb,EAAW,GACnCmB,KAAsBN,GAAOX,EAAgB,GAC7CkB,KAAmBP,GAA+D,IAAI,GACtFQ,KAAkBR,GAAsB,IAAI,GAC5CS,KAAsCT,GAAO,EAAK,GAClDU,KAAyCV,GAAsB,IAAI,GACnEW,KAAU/C,KAAiBgD,IAC3BC,KAAuBhD,KAAwBjG,IAC/CkJ,IAAgBhD,KAAuB7F,IAEvC8I,IAAqB3C,GAAY,YAAY;AACjD,QAAI,OAAOV,EAAY,oCAAqC,WAAY,QAAO;AAC/E,UAAMsD,IAAa,MAAMtD,EAAY,iCAAA;AACrC,WAAO,OAAO,QAAQsD,KAAc,EAAE,EAAE,OAA+B,CAACC,GAAK,CAACC,GAAI9I,CAAQ,MAAM;AAC9F,YAAM+I,IAAIhF,GAAS/D,CAAQ;AAC3B,aAAI+I,IAAI,MAAGF,EAAIC,CAAE,IAAIC,IACdF;AAAA,IACT,GAAG,CAAA,CAAE;AAAA,EACP,GAAG,CAACvD,CAAW,CAAC,GAEV0D,IAAwBhD,GAAY,YAAY;AACpD,UAAMiD,IAAU,EAAElB,GAAe;AACjC,IAAArB,GAAe,EAAI;AACnB,QAAI;AACF,YAAMkC,IAAa,MAAMD,EAAA;AACzB,aAAIC,KAAcK,MAAYlB,GAAe,WAC3CnB,GAAiCgC,CAAU,GAEtCA;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT,UAAA;AACE,MAAIK,MAAYlB,GAAe,WAASrB,GAAe,EAAK;AAAA,IAC9D;AAAA,EACF,GAAG,CAACiC,CAAkB,CAAC;AAEvB,EAAAO,EAAU,MAAM;AACd,IAAAlB,GAAiB,UAAUnB;AAAA,EAC7B,GAAG,CAACA,EAAa,CAAC,GAElBqC,EAAU,MAAM;AACd,IAAAjB,GAAe,UAAUlB;AAAA,EAC3B,GAAG,CAACA,EAAW,CAAC,GAEhBmC,EAAU,MAAM;AACd,IAAAhB,GAAoB,UAAUjB;AAAA,EAChC,GAAG,CAACA,EAAgB,CAAC,GAErBiC,EAAU,MAAM;AACd,IAAKF,EAAA;AAAA,EACP,GAAG,CAACA,CAAqB,CAAC;AAE1B,QAAMG,IAAkBnD,GAAY,CAACoD,MAAmB;AACtD,IAAAtC,GAAsBrE,GAAsB2G,CAAM,CAAC;AAAA,EACrD,GAAG,CAAA,CAAE,GAECC,IAAQrD,GAAY,MAAM;AAC9B,QAAIzF;AACF,UAAI;AACF,cAAM+I,IAAkBpJ,GAAA;AACxB,QAAAI,GAAWC,GAAmBC,GAAM;AAAA,UAClC,WAAW;AAAA,UACX,MAAAA;AAAA,UACA,iBAAA8I;AAAA,UACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,UACtB,eAAe;AAAA,QAAA,CAChB,EAAE,MAAM,CAACC,MAAe;AACvB,kBAAQ,KAAK,qDAAqDA,CAAU;AAAA,QAC9E,CAAC;AAAA,MACH,SAASA,GAAY;AACnB,gBAAQ,KAAK,iDAAiDA,CAAU;AAAA,MAC1E;AAEF,IAAAnD,EAAU,EAAK,GACX,OAAO,SAAW,OAAe,OAAO,SAAS,KAAK,YAAA,EAAc,WAAW7D,EAAkB,KACnG,OAAO,QAAQ,aAAa,MAAM,IAAI,OAAO,SAAS,WAAW,OAAO,SAAS,MAAM;AAAA,EAE3F,GAAG,CAAChC,GAAmBC,CAAI,CAAC,GAEtBgJ,IAAiBxD,GAAY,MAAM;AACvC,IAAAI,EAAU,CAACqD,MAAY;AACrB,UAAIA,EAAS,QAAOA;AACpB,UAAIlJ;AACF,YAAI;AACF,gBAAM+I,IAAkBpJ,GAAA;AACxB,UAAAI,GAAWC,GAAmBC,GAAM;AAAA,YAClC,WAAW;AAAA,YACX,MAAAA;AAAA,YACA,iBAAA8I;AAAA,YACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,YACtB,eAAe;AAAA,UAAA,CAChB,EAAE,MAAM,CAACC,MAAe;AACvB,oBAAQ,KAAK,qDAAqDA,CAAU;AAAA,UAC9E,CAAC;AAAA,QACH,SAASA,GAAY;AACnB,kBAAQ,KAAK,gDAAgDA,CAAU;AAAA,QACzE;AAEF,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAChJ,GAAmBC,CAAI,CAAC,GAEtBkJ,IAA4B1D,GAAY,CAACoD,GAAgB1I,MACxDA,EAAS,KAcVA,EAAS,OAAO,aAAa,MAAS,CAACuE,KACzC+B,GAAe,CAAC2C,MAAS;AACvB,QAAI,CAACA,EAAKP,CAAM,EAAG,QAAOO;AAC1B,UAAMC,IAAO,EAAE,GAAGD,EAAA;AAClB,kBAAOC,EAAKR,CAAM,GACXQ;AAAA,EACT,CAAC,GACG5B,GAAiB,YAAYoB,MAC/B5C,GAAST,EAAE,gCAAgC,CAAC,GAC5CK,EAAU,EAAK,GACX,OAAO,SAAW,OAAe,OAAO,SAAS,KAAK,YAAA,EAAc,WAAW7D,EAAkB,KACnG,OAAO,QAAQ,aAAa,MAAM,IAAI,OAAO,SAAS,WAAW,OAAO,SAAS,MAAM,IAGpF,OAGTyE,GAAe,CAAC2C,OAAU;AAAA,IACxB,GAAGA;AAAA,IACH,CAACP,CAAM,GAAG;AAAA,MACR,cAAc1I,EAAS,gBAAgB;AAAA,MACvC,QAAQA,EAAS;AAAA,MACjB,kBAAkBA,EAAS,oBAAoB,CAAA;AAAA,IAAC;AAAA,EAClD,EACA,GACEsH,GAAiB,YAAYoB,KAC/B5C,GAAS,IAAI,GAER,OAzCLQ,GAAe,CAAC2C,MAAS;AACvB,QAAI,CAACA,EAAKP,CAAM,EAAG,QAAOO;AAC1B,UAAMC,IAAO,EAAE,GAAGD,EAAA;AAClB,kBAAOC,EAAKR,CAAM,GACXQ;AAAA,EACT,CAAC,GACG,CAAC3E,KAA2B+C,GAAiB,YAAYoB,MAC3D5C,GAAS9F,EAAS,SAASqF,EAAE,4BAA4B,CAAC,GAC1DK,EAAU,EAAK,IAEV,KAgCR,CAACnB,GAAyBc,CAAC,CAAC,GAEzB8D,IAAsB7D,GAAY,CAACoD,GAAgBU,MAAqC;;AAC5F,UAAMC,IAAmBtH,GAAsB2G,CAAM;AACrD,KAAAzH,IAAAkG,GAAoB,YAApB,QAAAlG,EAA6B;AAC7B,UAAMqI,IAAK,IAAI,gBAAA;AACf,IAAAnC,GAAoB,UAAUmC,GAE1BF,KAAA,QAAAA,EAAS,YACX1C,GAAsB2C,CAAgB,GAExCvD,GAAS,IAAI,GAEb+B,GAAQ;AAAA,MACN,YAAAlD;AAAA,MACA,MAAA7E;AAAA,MACA,cAAcuJ;AAAA,MACd,QAAOD,KAAA,gBAAAA,EAAS,cAAa,MAAQ,CAAC7B,GAAe,QAAQ8B,CAAgB;AAAA,MAC7E,QAAQC,EAAG;AAAA,IAAA,CACZ,EACE,KAAK,CAACtJ,MAAa;AAClB,MAAIsJ,EAAG,OAAO,WACdN,EAA0BK,GAAkBrJ,CAAQ;AAAA,IACtD,CAAC,EACA,MAAM,CAACuJ,MAAwB;AAC9B,UAAID,EAAG,OAAO,QAAS;AACvB,YAAME,IAAUD,aAAsB,QAAQA,EAAW,UAAUlE,EAAE,4BAA4B;AACjG,MAAIiC,GAAiB,YAAY+B,KAAkBvD,GAAS0D,CAAO;AAAA,IACrE,CAAC,EACA,QAAQ,MAAM;AACb,MAAIF,EAAG,OAAO,WACd5C,GAAsB,CAACqC,MAAYA,MAAYM,IAAmB,OAAON,CAAO;AAAA,IAClF,CAAC;AAAA,EACL,GAAG,CAACpE,GAAYqE,GAA2BnB,IAAS/H,GAAMuF,CAAC,CAAC,GAEtDoE,IAAanE,GAAY,CAACoD,MAAmB;AACjD,UAAMW,IAAmBtH,GAAsB2G,CAAM,GAC/CgB,IAAcnC,GAAe,QAAQ8B,CAAgB;AAC3D,IAAAjD,GAAsBiD,CAAgB,GACtCvD,GAAS,IAAI,GACbqD,EAAoBE,GAAkB,EAAE,UAAU,CAACK,GAAa;AAAA,EAClE,GAAG,CAACP,CAAmB,CAAC,GAElBQ,IAAgBrE,GAAY,CAACoD,GAAgBkB,IAAqB,UAAU;;AAChF,UAAMP,IAAmBtH,GAAsB2G,CAAM,GAC/CgB,IAAcnC,GAAe,QAAQ8B,CAAgB;AAE3D,QAAI7D,KAAoBgC,GAAoB,WAAW,CAACkC,GAAa;AACnE,MAAA5C,GAAqB,EAAE,QAAQuC,GAAkB,QAAAO,EAAA,CAAQ;AACzD;AAAA,IACF;AAIA,QAFAxD,GAAsBiD,CAAgB,GAElC9E,GAAyB;AAC3B,MAAAuE,EAAA,GACAK,EAAoBE,GAAkB,EAAE,UAAU,CAACK,GAAa;AAChE;AAAA,IACF;AAEA,SAAIzI,IAAAyI,KAAA,gBAAAA,EAAa,WAAb,QAAAzI,EAAqB,UAAU;AACjC,MAAA6E,GAAS,IAAI,GACbgD,EAAA,GACAK,EAAoBE,GAAkB,EAAE,UAAU,GAAA,CAAO;AACzD;AAAA,IACF;AAEA,IAAAzC,GAAsByC,CAAgB,IACtCQ,IAAAzC,GAAe,YAAf,QAAAyC,EAAwB;AACxB,UAAMP,IAAK,IAAI,gBAAA;AACf,IAAAlC,GAAe,UAAUkC,GAEzBtB,EAAc;AAAA,MACZ,YAAArD;AAAA,MACA,MAAA7E;AAAA,MACA,cAAcuJ;AAAA,MACd,QAAQC,EAAG;AAAA,IAAA,CACZ,EACE,KAAK,CAACQ,MAAW;AAChB,UAAI,CAAAR,EAAG,OAAO,SAEd;AAAA,YADA1C,GAAsB,CAACmC,MAAYA,MAAYM,IAAmB,OAAON,CAAO,GAC5Ee,EAAO,MAAMA,EAAO,aAAa,IAAM;AACzC,UAAIF,MAAW,UAAU,OAAO,SAAW,OAAe5H,GAAoB,OAAO,SAAS,IAAI,MAAMqH,KACtG,OAAO,QAAQ,aAAa,MAAM,IAAI,OAAO,SAAS,WAAW,OAAO,SAAS,MAAM;AAEzF;AAAA,QACF;AACA,QAAKS,EAAO,OAIZhE,GAAS,IAAI,GACbM,GAAsBiD,CAAgB,GACtCP,EAAA,GACAK,EAAoBE,GAAkB,EAAE,UAAU,GAAA,CAAM;AAAA;AAAA,IAC1D,CAAC,EACA,MAAM,MAAM;AACX,MAAIC,EAAG,OAAO,WACd1C,GAAsB,CAACmC,MAAYA,MAAYM,IAAmB,OAAON,CAAO;AAAA,IAClF,CAAC;AAAA,EACL,GAAG;AAAA,IACDxE;AAAA,IACAI;AAAA,IACAmE;AAAA,IACAK;AAAA,IACArJ;AAAA,IACAkI;AAAA,IACAxC;AAAA,EAAA,CACD,GAEKuE,KAAOzE,GAAY,MAAM;AAC7B,IAAKgD,EAAA,GACLqB,EAAcrC,GAAiB,SAAS,KAAK;AAAA,EAC/C,GAAG,CAACqC,GAAerB,CAAqB,CAAC;AAEzC,EAAAE,EAAU,MAAM;AACd,IAAAf,GAAiB,UAAUkC;AAAA,EAC7B,GAAG,CAACA,CAAa,CAAC;AAElB,QAAMK,KAAS1E,GAAY,MAAM;AAC/B,QAAIG,IAAQ;AACV,MAAAkD,EAAA;AACA;AAAA,IACF;AACA,IAAKL,EAAA,GACLqB,EAAcrC,GAAiB,SAAS,KAAK;AAAA,EAC/C,GAAG,CAACqB,GAAOlD,IAAQkE,GAAerB,CAAqB,CAAC;AAExD,EAAAE,EAAU,MAAM;AACd,IAAApC,GAAsBrE,GAAsB8C,CAAY,CAAC;AAAA,EAC3D,GAAG,CAACA,CAAY,CAAC,GAEjB2D,EAAU,MAAM;;AACd,QAAI,CAAChD,GAAkB;AACrB,MAAAgB,GAAoB,EAAK,GACpBhC,KACH2E,EAAoB5D,IAAyB,EAAE,UAAU,GAAA,CAAM;AAEjE;AAAA,IACF;AAEA,KAAAtE,IAAAgG,GAAgB,YAAhB,QAAAhG,EAAyB;AACzB,UAAMqI,IAAK,IAAI,gBAAA;AACf,WAAArC,GAAgB,UAAUqC,GAC1B9C,GAAoB,EAAI,GAExBuB,GAAqB,EAAE,YAAApD,GAAY,MAAA7E,GAAM,QAAQwJ,EAAG,QAAQ,EACzD,KAAK,CAACtJ,MAAgD;AACrD,MAAIsJ,EAAG,OAAO,WACTtJ,EAAS,MACdsG,GAAe,CAAC2C,MAAS;AACvB,cAAMC,IAA0B,EAAE,GAAGD,EAAA;AACrC,mBAAW,CAACP,GAAQuB,CAAK,KAAK,OAAO,QAAQjK,EAAS,WAAW,CAAA,CAAE;AACjE,UAAAkJ,EAAKnH,GAAsB2G,CAAM,CAAC,IAAI;AAAA,YACpC,cAAcuB,EAAM,gBAAgB;AAAA,YACpC,QAAQA,EAAM;AAAA,YACd,kBAAkBA,EAAM,oBAAoB,CAAA;AAAA,UAAC;AAGjD,eAAOf;AAAA,MACT,CAAC;AAAA,IACH,CAAC,EACA,MAAM,MAAM;AAAA,IAEb,CAAC,EACA,QAAQ,MAAM;AACb,MAAII,EAAG,OAAO,WACd9C,GAAoB,EAAK;AAAA,IAC3B,CAAC,GAEI,MAAM8C,EAAG,MAAA;AAAA,EAClB,GAAG,CAACvB,IAAsBpD,GAAYH,GAAae,IAAyB4D,GAAqBrJ,GAAM0F,CAAgB,CAAC,GAExHgD,EAAU,MAAM;AACd,IAAIjC,MAAoB,CAACM,OACzB8C,EAAc9C,GAAkB,QAAQA,GAAkB,MAAM,GAChEC,GAAqB,IAAI;AAAA,EAC3B,GAAG,CAACP,IAAkBoD,GAAe9C,EAAiB,CAAC,GAEvD2B,EAAU,MAAM;AACd,QAAI,OAAO,SAAW,IAAa;AACnC,UAAM0B,IAAa,CAACC,IAAQ,OAAU;;AACpC,YAAMC,IAAW,OAAO,OAAO,SAAS,QAAQ,EAAE;AAClD,UAAI,CAACD,KAASC,MAAa1C,GAAgB,QAAS;AACpD,MAAAA,GAAgB,UAAU0C;AAC1B,YAAMC,IAAerI,GAAoBoI,CAAQ;AACjD,MAAKC,OACLpJ,IAAAwG,GAAiB,YAAjB,QAAAxG,EAAA,KAAAwG,IAA2B4C,GAAc;AAAA,IAC3C,GACMC,IAAmB,MAAMJ,EAAW,EAAI,GACxCK,IAAoB,MAAM;AAC9B,aAAO,WAAW,MAAML,EAAW,EAAI,GAAG,CAAC;AAAA,IAC7C;AACA,WAAAA,EAAW,EAAI,GACf,OAAO,iBAAiB,cAAcI,CAAgB,GACtD,OAAO,iBAAiB,YAAYA,CAAgB,GACpD,OAAO,iBAAiB,YAAYA,CAAgB,GACpD,OAAO,iBAAiB,SAASC,CAAiB,GAClD,SAAS,iBAAiB,oBAAoBD,CAAgB,GACvD,MAAM;AACX,aAAO,oBAAoB,cAAcA,CAAgB,GACzD,OAAO,oBAAoB,YAAYA,CAAgB,GACvD,OAAO,oBAAoB,YAAYA,CAAgB,GACvD,OAAO,oBAAoB,SAASC,CAAiB,GACrD,SAAS,oBAAoB,oBAAoBD,CAAgB;AAAA,IACnE;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAME,IAAenE,GAAYF,EAAa,KAAK,MAC7CsE,KAASD,KAAA,gBAAAA,EAAc,WAAU,MACjCE,MAAmBF,KAAA,gBAAAA,EAAc,qBAAoB1I,IACrDR,MAAekJ,KAAA,gBAAAA,EAAc,iBAAgB,MAC7CG,IAAW,CAACF,MAAWhE,OAAuBN,MAAiBQ,OAAuBR,OACtF5B,KAA2B,CAACkG,KAAUhE,MAAsB;AAElE,EAAA+B,EAAU,MAAM;AACd,UAAMoC,IAAY3H,GAA0BwH,KAAA,gBAAAA,EAAQ,aAAa;AACjE,IAAIG,QAAgCA,CAAS;AAAA,EAC/C,GAAG,CAACH,KAAA,gBAAAA,EAAQ,aAAa,CAAC,GAE1BjC,EAAU,MAAM;AACd,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMqC,IAAsB,MAAM;AAChC,YAAMD,IAAY3H,GAA0B,MAAS;AACrD,MAAI2H,QAAgCA,CAAS;AAAA,IAC/C;AACA,kBAAO,iBAAiB,iCAAiCC,CAAmB,GACrE,MAAM,OAAO,oBAAoB,iCAAiCA,CAAmB;AAAA,EAC9F,GAAG,CAAA,CAAE,GAELrC,EAAU,MAAM;AACd,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMsC,IAAM,QAKNC,IAAqB,MAAM;AAC/B,YAAMC,IAAgBF,EAAI;AAC1B,UAAI,CAACE,EAAe;AACpB,YAAMC,IAAkB,MAAM,QAAQH,EAAI,oCAAoC,IAC1EA,EAAI,uCACJ,CAAA,GACEI,IAAyBJ,EAAI,wCAAwC;AAC3E,MAAAxE,GAAe,CAAC2C,MAAA;;AAAU;AAAA,UACxB,GAAGA;AAAA,UACH,CAAC3B,GAAiB,OAAO,GAAG;AAAA,YAC1B,cAAchG,MAAgB;AAAA,YAC9B,QAAQ0J;AAAA,YACR,kBAAkBE,MACbjK,IAAAgI,EAAK3B,GAAiB,OAAO,MAA7B,gBAAArG,EAAgC,qBAAoB,KACrDgK;AAAA,UAAA;AAAA,QACN;AAAA,OACA,GAEAvE,GADEwE,IACoB5D,GAAiB,UAEjB,CAACyB,MAAYA,MAAYzB,GAAiB,UAAU,OAAOyB,CAFnC;AAAA,IAIlD;AACA,WAAI+B,EAAI,6BAA2BC,EAAA,GACnC,OAAO,iBAAiB,iCAAiCA,CAAkB,GACpE,MAAM,OAAO,oBAAoB,iCAAiCA,CAAkB;AAAA,EAC7F,GAAG,CAACzJ,EAAY,CAAC;AAEjB,QAAM6J,IAAgBC,EAAQ,MAAM;AAClC,UAAM5K,IAAM,QAAOiK,KAAA,gBAAAA,EAAQ,kBAAiB,OAAO,GAAG,GAChDlJ,IAAI,OAAO,SAASf,CAAG,IAAI,KAAK,MAAMA,CAAG,IAAI;AACnD,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKe,CAAC,CAAC;AAAA,EACrC,GAAG,CAACkJ,KAAA,gBAAAA,EAAQ,aAAa,CAAC,GAEpBY,KAA4BD,EAAQ,MACjC,IAAI;AAAA,IACTV,GAAiB,IAAI,CAACrL,MAAY;AAChC,YAAMiM,IAAYlM,GAAyBC,CAAO;AAClD,UAAI,CAAC,OAAO,SAASiM,CAAS,EAAG,QAAO,CAACjM,EAAQ,IAAIiM,CAAS;AAC9D,YAAMC,IAASlI,GAAS4C,GAA8B5G,EAAQ,EAAE,KAAK,CAAC;AACtE,aAAO,CAACA,EAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMiM,CAAS,IAAIC,CAAM,CAAC;AAAA,IACjE,CAAC;AAAA,EAAA,GAEF,CAACb,IAAkBzE,EAA6B,CAAC,GAE9CuF,IAAwBJ,EAAQ,MAC7B,IAAI;AAAA,IACTV,GACG,OAAO,CAACrL,MAAYD,GAAyBC,CAAO,IAAI,CAAC,EACzD,IAAI,CAACA,MAAYA,EAAQ,EAAE;AAAA,EAAA,GAE/B,CAACqL,EAAgB,CAAC,GAEfe,KAAcL,EAAQ,MAAM;AAChC,UAAMM,KAAQjB,KAAA,gBAAAA,EAAQ,UAAS,CAAA,GACzBkB,IAAUD,EAAM,SAAS,KAAK,IAAI,GAAGA,EAAM,IAAI,CAACE,MAASA,EAAK,aAAa,CAAC,IAAI,GAChFC,IAAoB,OAAO,SAASF,CAAO,KAAKA,IAAU,IAAIA,IAAU,GACxEG,IAAgB,QAAOrB,KAAA,gBAAAA,EAAQ,kBAAiB,OAAO,GAAG,GAC1DsB,IACJ,OAAO,SAASD,CAAa,KAAK,OAAO,UAAUA,CAAa,IAC5D,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKA,CAAa,CAAC,IACxC;AACN,WAAOC,KAAiB,OACpBF,IACA,KAAK,IAAIA,GAAmBE,CAAa;AAAA,EAC/C,GAAG,CAACtB,KAAA,gBAAAA,EAAQ,eAAeA,KAAA,gBAAAA,EAAQ,KAAK,CAAC,GAEnCuB,KAAyB1G,GAAY,CAACpB,MACnCA,EAAM,OAA6B,CAACiE,GAAKhE,MAAS;AACvD,UAAM7E,IAAW+D,GAASc,EAAK,YAAY,CAAC,KAAK;AACjD,WAAAgE,EAAIhE,EAAK,aAAa,KAAKgE,EAAIhE,EAAK,aAAa,KAAK,KAAK7E,GACpD6I;AAAA,EACT,GAAG,CAAA,CAAE,GACJ,CAAA,CAAE,GAEC8D,KAAc3G,GAAY,CAACtB,GAAuB1E,MAAqB;AAE3E,QADIyG,MACA,CAACyF,EAAsB,IAAIxH,CAAa,KACtC,CAAC2G;AAAS;AAGhB,UAAMuB,IAAeb,GAA0B,IAAIrH,CAAa,MAAM2G,IAAU,OAAO,oBAAoB,IACrGtC,IAAI/E,GAAoBhE,GAAU4M,CAAY;AACpD,IAAAlF,GAAiB,CAACiC,MAAS;AACzB,YAAMkD,IAAiBH,GAAuB/C,CAAI,GAC5CmD,IAAUD,EAAenI,CAAa,KAAK,GAC3CqI,IAAiBhE,IAAI+D,GACrBE,IAAoBrD,EAAK,QACzBsD,IACJ,OAAO,SAASL,CAAY,IACxB,KAAK,IAAI,GAAG,KAAK,MAAMA,CAAY,IAAIE,CAAO,IAC9CC,GACAG,IACJH,IAAiB,IACb,KAAK;AAAA,QACLA;AAAA,QACA,KAAK,IAAI,GAAGlB,IAAgBmB,CAAiB;AAAA,QAC7CC;AAAA,MAAA,IAEAF;AAEN,UAAIG,MAAU,EAAG,QAAOvD;AAExB,UAAIwD,IAAYxD;AAChB,UAAIuD,IAAQ;AACV,QAAAC,IAAY,CAAC,GAAGxD,GAAM,GAAG,MAAM,KAAK,EAAE,QAAQuD,EAAA,GAAS,MAAMzI,GAAmBC,CAAa,CAAC,CAAC;AAAA,WAC1F;AACL,YAAI0I,IAAoB,CAACF;AACzB,cAAMG,IAAoC,CAAA;AAC1C,iBAASC,KAAI3D,EAAK,SAAS,GAAG2D,MAAK,GAAGA,MAAK;AACzC,gBAAMzI,KAAO8E,EAAK2D,EAAC;AACnB,cAAIzI,GAAK,kBAAkBH,KAAiB0I,IAAoB,GAAG;AACjE,YAAAA;AACA;AAAA,UACF;AACA,UAAAC,EAAa,KAAKxI,EAAI;AAAA,QACxB;AACA,QAAAwI,EAAa,QAAA,GACbF,IAAYE;AAAA,MACd;AAEA,YAAME,KAAiBb,GAAuBS,CAAS,GACjDK,KAAiBR,GACjBS,IAAiBN,EAAU;AAEjC,UAAI5M;AACF,YAAI;AACF,gBAAM+I,IAAkBpJ,GAAA,GAClBwN,IAAc;AAAA,YAClB,WAAW;AAAA,YACX,MAAAlN;AAAA,YACA,iBAAA8I;AAAA,YACA,QAAQ,EAAE,GAAGuD,EAAA;AAAA,YACb,OAAO,EAAE,GAAGU,GAAA;AAAA,YACZ,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,UAAY;AAEpC,UAAAjN,GAAWC,GAAmBC,GAAMkN,CAAW,GAE3CF,OAAmB,KAAKC,KAAkB,KAC5CnN,GAAWC,GAAmBC,GAAM;AAAA,YAClC,GAAGkN;AAAA,YACH,eAAe;AAAA,UAAA,CAChB,GAECF,KAAiBrB,MAAesB,KAAkBtB,MACpD7L,GAAWC,GAAmBC,GAAM;AAAA,YAClC,GAAGkN;AAAA,YACH,eAAe;AAAA,UAAA,CAChB;AAAA,QAEL,QAAQ;AAAA,QAER;AAGF,aAAOP;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC5M,GAAmBkG,IAAayF,GAAuBQ,IAAwBrB,GAASQ,GAAeM,IAAa3L,GAAMuL,EAAyB,CAAC,GAElJ4B,KAAuB3H,GAAY,CAAC4H,MAKpC;AACJ,UAAMlJ,IAAgB,OAAOkJ,EAAM,iBAAiB,EAAE,EAAE,KAAA;AACxD,QAAI,CAAClJ,EAAe,QAAO;AAC3B,UAAMmJ,IAAepL,GAAsBmL,EAAM,gBAAgB5F,GAAiB,OAAO,GACnF8F,IAA6BD,MAAiB7F,GAAiB,SAC/D+F,IAAcD,IAA6B7F,GAAe,QAAQ4F,CAAY,IAAI3C,GAClF8C,IAA8BD,IAChC,IAAI;AAAA,MACFA,EAAY,iBACT,OAAO,CAAChO,MAAYD,GAAyBC,CAAO,IAAI,CAAC,EACzD,IAAI,CAACA,MAAYA,EAAQ,EAAE;AAAA,IAAA,IAEhC;AACJ,SACG,CAAC+N,KAA8BE,MAC7B,EAAEA,KAA+B9B,GAAuB,IAAIxH,CAAa,KACzE,CAAC2G;AAEJ,aAAO;AAGT,UAAM4C,IAAYL,EAAM,kBAAkB9I,GAAyB8I,EAAM,eAAe,IAAI,MAEtFM,IADoBxB,GAAuBuB,KAAaxG,EAAa,EACtC/C,CAAa,KAAK,GACjDyJ,KAAuB,MAAM;;AACjC,YAAMjN,IAAM,SAAOS,IAAAoM,KAAA,gBAAAA,EAAa,WAAb,gBAAApM,EAAqB,kBAAiBkK,KAAiB,OAAO,GAAG,GAC9E5J,IAAI,OAAO,SAASf,CAAG,IAAI,KAAK,MAAMA,CAAG,IAAI;AACnD,aAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKe,CAAC,CAAC;AAAA,IACrC,GAAA,GACM2K,KAAgB,MAAM;AAC1B,UAAImB,GAAa;AACf,cAAMK,IAAgBL,EAAY,iBAAiB,KAAK,CAAChO,MAAYA,EAAQ,OAAO2E,CAAa;AACjG,YAAI0J,GAAe;AACjB,gBAAMpC,IAAYlM,GAAyBsO,CAAa;AACxD,cAAI,CAAC,OAAO,SAASpC,CAAS,UAAU,OAAO;AAC/C,gBAAMC,IAASlI,GAAS4C,GAA8BjC,CAAa,KAAK,CAAC;AACzE,iBAAO,KAAK,IAAI,GAAG,KAAK,MAAMsH,CAAS,IAAIC,CAAM;AAAA,QACnD;AAAA,MACF;AACA,aAAO6B,KAA8BzC,IAAU,OAAO,oBAAoB;AAAA,IAC5E,GAAA;AAMA,QAAI,GALuB4C,KAAaxG,IAAe,SAEjC0G,MAChB,CAAC,OAAO,SAASvB,CAAY,KAAKsB,IAAa,KAAK,IAAI,GAAG,KAAK,MAAMtB,CAAY,CAAC,IAErE,QAAO;AAE3B,UAAMO,KAAY,CAAC,GAAIc,KAAaxG,IAAgBhD,GAAmBC,GAAekJ,EAAM,UAAU,CAAC;AACvG,WAAIE,MACFzF,GAAoC,UAAU,IAC9CC,GAAuC,UAAUuF,GACjD/G,GAAsB+G,CAAY,GAClCrH,GAAS,IAAI,GACbqD,EAAoBgE,GAAc,EAAE,UAAU,CAAC5F,GAAe,QAAQ4F,CAAY,GAAG,IAEvFnG,GAAiByF,EAAS,GAC1B3G,GAAS,IAAI,GACbgD,EAAA,GACO;AAAA,EACT,GAAG,CAAC7C,IAA+BuE,GAAcgB,GAAuBQ,IAAwBrB,GAASQ,GAAerC,GAAgBK,GAAqBpC,EAAa,CAAC;AAE3K,EAAAyB,EAAU,MAAM;AACd,UAAMmF,IACJ/F,GAAuC,YAAYzB,OAC/C,CAACqE,KAAgB/D,OAAuBN;AAC9C,IAAIwE,KAAWgD,KACf3G,GAAiB,CAACiC,MAAS;AACzB,YAAMwD,IAAYxD,EAAK,OAAO,CAAC9E,MAAS;AACtC,YAAI,CAACqH,EAAsB,IAAIrH,EAAK,aAAa,EAAG,QAAO;AAC3D,cAAMZ,IAAQ8H,GAA0B,IAAIlH,EAAK,aAAa,KAAK;AACnE,eAAO,CAAC,OAAO,SAASZ,CAAK,KAAKA,IAAQ;AAAA,MAC5C,CAAC;AAED,aAAIkJ,EAAU,UAAUtB,IACfsB,EAAU,WAAWxD,EAAK,SAASA,IAAOwD,IAE5CA,EAAU,MAAM,GAAGtB,CAAa;AAAA,IACzC,CAAC;AAAA,EACH,GAAG,CAAC1E,IAAoB+D,GAAcrE,IAAeqF,GAAuBb,GAASQ,GAAeE,EAAyB,CAAC,GAE9H7C,EAAU,MAAM;AACd,IACEZ,GAAuC,YAAYzB,MAChDqE,KACA/D,OAAuBN,OAE1ByB,GAAuC,UAAU;AAAA,EAErD,GAAG,CAACnB,IAAoB+D,GAAcrE,EAAa,CAAC,GAEpDqC,EAAU,MAAM;AACd,QAAIb,GAAoC,SAAS;AAC/C,MAAAA,GAAoC,UAAU;AAC9C;AAAA,IACF;AACA,IAAAX,GAAiB,CAAA,CAAE;AAAA,EACrB,GAAG,CAACb,EAAa,CAAC;AAElB,QAAMyH,KAAkBtI,GAAY,MAAM0B,GAAiB,CAAA,CAAE,GAAG,CAAA,CAAE,GAC5D6G,KAAqBvI,GAAY,YAAY;AACjD,UAAMgD,EAAA;AAAA,EACR,GAAG,CAACA,CAAqB,CAAC,GACpBwF,KAAkCxI,GAAY,CAACtB,MAA0B;AAC7E,UAAMT,IAAQ8H,GAA0B,IAAIrH,CAAa;AACzD,WAAIT,KAAS,QAAQ,CAAC,OAAO,SAASA,CAAK,IAAU,OAC9C,KAAK,IAAI,GAAG,KAAK,MAAMA,CAAK,CAAC;AAAA,EACtC,GAAG,CAAC8H,EAAyB,CAAC,GACxB0C,KAAa3C,EAAQ,MAAMY,GAAuBjF,EAAa,GAAG,CAACiF,IAAwBjF,EAAa,CAAC,GACzGiH,KAAiB5C,EAAQ,MAAMrE,GAAc,IAAI,CAAC5C,MAASA,EAAK,aAAa,GAAG,CAAC4C,EAAa,CAAC,GAE/FkH,KAAalH,GAAc,QAE3BmH,KAAY9C,EAAQ,MACpB,EAAAT,KAAW5E,MAAeH,KAC1B3F,MACA,EAACwK,KAAA,QAAAA,EAAQ,aACTwD,KAAaxC,KAEhB,CAACwC,IAAYlI,IAAa0E,KAAA,gBAAAA,EAAQ,UAAUxK,IAAO0K,GAASc,IAAa7F,CAAU,CAAC,GAEjFuI,KAAuB7I,GAAY,MAAMrB,GAAkB8C,EAAa,GAAG,CAACA,EAAa,CAAC,GAE1FqH,KAA2B9I,GAAY,CAACjB,MAAyD;AACrG,IAAA2C,GAAiB5C,GAAyBC,CAAQ,CAAC;AAAA,EACrD,GAAG,CAAA,CAAE,GAECgK,KAA+B/I,GAAY,CAACjG,MAAmC;;AACnF,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMiP,KAAgBzE,KAAA5I,IAAA5B,EAAQ,YAAR,gBAAA4B,EAAiB,WAAjB,gBAAA4I,EAAyB;AAC/C,QAAI,CAACyE,EAAe;AACpB,UAAMvP,IAAS,IAAI,gBAAA,GACbwP,KAAeC,IAAAnP,EAAQ,GAAG,MAAM,UAAU,MAA3B,gBAAAmP,EAA+B;AACpD,IAAID,KAAcxP,EAAO,IAAI,WAAWwP,CAAY,GACpDxP,EAAO,IAAI,uBAAuB,gBAAgB,GAClDA,EAAO,IAAI,uBAAuBoH,EAAa;AAC/C,QAAI;AACF,aAAO,eAAe;AAAA,QACpBtH,GAAyB;AAAA,QACzB,KAAK,UAAU;AAAA,UACb,cAAcsH;AAAA,UACd,WAAW,OAAO,SAAS;AAAA,UAC3B,UAAUgI,GAAA;AAAA,QAAqB,CAChC;AAAA,MAAA;AAAA,IAEL,QAAQ;AAAA,IAER;AACA,UAAMM,IAAS1P,EAAO,SAAA;AACtB,WAAO,SAAS,OAAO,aAAauP,CAAa,GAAGG,IAAS,IAAIA,CAAM,KAAK,EAAE;AAAA,EAChF,GAAG,CAACtI,IAAegI,EAAoB,CAAC,GAElCO,KAAsBpJ,GAAY,OAAO8D,MAA8D;;AAC3G,QAAI,CAAC8E,MAAa,CAACzD,EAAQ;AAE3B,UAAMkE,IAAWvL,GAAA,GACXwL,KAAenE,EAAO,SAAS,IAAI,OAAO,MAAM,GAAG,GAAG,GACtDoE,IAAuB,MAAMvG,EAAA,GAC7BwG,IAAqB,IAAI;AAAA,MAC7BpE,GAAiB,IAAI,CAACrL,MAAY;AAChC,cAAMiM,KAAYlM,GAAyBC,CAAO;AAClD,YAAI,CAAC,OAAO,SAASiM,EAAS,EAAG,QAAO,CAACjM,EAAQ,IAAIiM,EAAS;AAC9D,cAAMC,KAASlI,IAAUwL,KAAwB5I,IAA+B5G,EAAQ,EAAE,KAAK,CAAC;AAChG,eAAO,CAACA,EAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMiM,EAAS,IAAIC,EAAM,CAAC;AAAA,MACjE,CAAC;AAAA,IAAA,GAEGwD,wBAAuB,IAAA;AAM7B,eAAWC,KAAgBjI,IAAe;AACxC,UAAI,CAACyE,EAAsB,IAAIwD,EAAa,aAAa,EAAG;AAC5D,YAAMC,KAAYH,EAAmB,IAAIE,EAAa,aAAa,KAAK,GAClEE,KAAwB,MAAM,KAAKH,EAAiB,QAAQ,EAC/D,OAAO,CAAC5K,OAASA,GAAK,kBAAkB6K,EAAa,aAAa,EAClE,OAAO,CAACG,IAAKhL,OAASgL,KAAMhL,GAAK,UAAU,CAAC;AAC/C,UAAI,OAAO,SAAS8K,EAAS,KAAKC,MAAyBD,GAAW;AACtE,YAAMvL,KAAa;AAAA,QACjB,EAAE,KAAK9E,GAAwB,UAAU,OAAO+P,EAAA;AAAA,QAChD,EAAE,KAAK/P,GAAwB,cAAc,OAAOuH,GAAA;AAAA,QACpD,EAAE,KAAKvH,GAAwB,cAAc,OAAO,iBAAA;AAAA,QACpD,GAAIgQ,IAAc,CAAC,EAAE,KAAKhQ,GAAwB,aAAa,OAAOgQ,EAAA,CAAa,IAAI,CAAA;AAAA,QACvF,GAAInL,GAAwBuL,EAAa,UAAU,KAAK,CAAA;AAAA,MAAC,GAErDI,KAAY,GAAGJ,EAAa,aAAa,IAAIpL,GAAoBoL,EAAa,UAAU,CAAC,IACzFvP,KAAWsP,EAAiB,IAAIK,EAAS;AAC/C,MAAI3P,KACFA,GAAS,YAAY,IAErBsP,EAAiB,IAAIK,IAAW;AAAA,QAC9B,eAAeJ,EAAa;AAAA,QAC5B,UAAU;AAAA,QACV,YAAAtL;AAAA,MAAA,CACD;AAAA,IAEL;AAEA,UAAMQ,IAAQ,MAAM,KAAK6K,EAAiB,QAAQ;AAElD,QAAI,CAAC7K,EAAM,OAAQ;AAEnB,UAAMmL,IAAO,IAAI,IAAI3E,GAAiB,IAAI,CAACrL,MAAY,CAACA,EAAQ,IAAIA,CAAO,CAAU,CAAC;AACtF,QAAIiQ,IAAa;AACjB,eAAWnL,KAAQD,GAAO;AACxB,YAAMmE,KAAIlE,EAAK,YAAY;AAC3B,UAAIkE,MAAK,EAAG;AACZ,YAAMhJ,KAAUgQ,EAAK,IAAIlL,EAAK,aAAa,GACrCoL,KAAQ,OAAOlQ,MAAA,gBAAAA,GAAS,KAAK;AACnC,MAAK,OAAO,SAASkQ,EAAK,MAC1BD,KAAcC,KAAQlH;AAAA,IACxB;AACA,IAAAiH,IAAa,KAAK,MAAMA,IAAa,GAAG,IAAI;AAE5C,UAAME,IAAc,CAAC,GAAI/E,EAAO,SAAS,CAAA,CAAG,EAAE,KAAK,CAAC5G,GAAGC,OAAMD,EAAE,gBAAgBC,GAAE,aAAa;AAC9F,QAAI2L,IAAmD;AACvD,eAAW7D,KAAQ4D;AACjB,MAAIvB,MAAcrC,EAAK,kBAAe6D,IAAc7D;AAGtD,UAAM8D,IAAyBD,KAC1B,MAAM;AACL,YAAME,IAAM,OAAO,WAAWF,EAAa,eAAe;AAC1D,aAAO,OAAO,SAASE,CAAG,KAAKA,IAAM,IAAIA,IAAM;AAAA,IACjD,OACA,MAEEC,KAAkBF,IACpB,KAAK,MAAMJ,KAAc,IAAII,IAAyB,OAAO,GAAG,IAAI,MACpEJ,GACEO,KAAmBP,IAAaM,IAChCE,IAAoB5L,EAAM,IAAI,CAACC,MAASA,EAAK,aAAa,GAC1D4L,KAA8BN,KAAA,gBAAAA,EAAa,WAAU,IACrDO,MAAgB/O,KAAAwO,KAAA,gBAAAA,EAAa,UAAb,gBAAAxO,GAAoB,WAAU;AAEpD,IAAA4E,EAAc,EAAI;AAClB,QAAI;AAOF,UANIuD,KAAA,QAAAA,EAAS,WACX,MAAMxE,EAAY,oBAAoBV,CAAK,IAE3C,MAAMU,EAAY,SAASV,CAAK,GAG9BrE;AACF,YAAI;AACF,gBAAM+I,IAAkBpJ,GAAA,GAClByQ,KAAa,CAAC,EAAC7G,KAAA,QAAAA,EAAS;AAC9B,UAAAxJ,GAAWC,GAAmBC,GAAM;AAAA,YAClC,WAAW;AAAA,YACX,MAAAA;AAAA,YACA,iBAAA8I;AAAA,YACA,UAAA+F;AAAA,YACA,mBAAAmB;AAAA,YACA,YAAAR;AAAA,YACA,iBAAAM;AAAA,YACA,UAAUtO,MAAgB;AAAA,YAC1B,6BAAAyO;AAAA,YACA,eAAAC;AAAA,YACA,oBAAoBN;AAAA,YACpB,kBAAAG;AAAA,YACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,YACtB,UAAUI;AAAA,YACV,eAAeA,KAAa,iCAAiC;AAAA,UAAA,CAC9D;AAAA,QACH,QAAQ;AAAA,QAER;AAGF,MAAArC,GAAA,GACAjF,EAAA,GACKL,EAAA,IACLuB,KAAAT,KAAA,gBAAAA,EAAS,eAAT,QAAAS,GAAA,KAAAT,IACAtD,GAAS,IAAI;AAAA,IACf,SAASoK,GAAU;AACjB,YAAMC,KAAaD,aAAoB,QAAQA,EAAS,UAAU,IAC5DE,KAAe,uDAAuD,KAAKD,EAAU;AAC3F,MAAArK;AAAA,QAEMT,EADJ+K,KACM,gCACA,2BAD6B;AAAA,MACF,GAE9B9H,EAAA;AAAA,IACP,UAAA;AACE,MAAAzC,EAAc,EAAK;AAAA,IACrB;AAAA,EACF,GAAG;AAAA,IACDhG;AAAA,IACAoO;AAAA,IACAC;AAAA,IACAtJ;AAAA,IACAgJ;AAAA,IACAjF;AAAA,IACA8B;AAAA,IACAnJ;AAAA,IACA2E;AAAA,IACAE;AAAA,IACAqF;AAAA,IACAd;AAAA,IACApC;AAAA,IACAvB;AAAA,IACAjH;AAAA,IACAuF;AAAA,EAAA,CACD,GAEKgL,KAAS/K,GAAY,YAAY;AACrC,UAAMoJ,GAAoB;AAAA,MACxB,YAAY,MAAM;;AAChB,SAAAzN,IAAA2D,EAAY,eAAZ,QAAA3D,EAAA,KAAA2D;AAAA,MACF;AAAA,IAAA,CACD;AAAA,EACH,GAAG,CAACA,GAAa8J,EAAmB,CAAC,GAE/B4B,KAAoBhL,GAAY,YAAY;AAChD,UAAMoJ,GAAoB;AAAA,MACxB,UAAU;AAAA,MACV,YAAY,MAAM;;AAChB,SAAAzN,IAAA2D,EAAY,uBAAZ,QAAA3D,EAAA,KAAA2D;AAAA,MACF;AAAA,IAAA,CACD;AAAA,EACH,GAAG,CAACA,GAAa8J,EAAmB,CAAC,GAE/BjO,KAAmC2K,EAAQ,OAAO;AAAA,IACtD,QAAA3F;AAAA,IACA,MAAAsE;AAAA,IACA,eAAAJ;AAAA,IACA,OAAAhB;AAAA,IACA,QAAAqB;AAAA,IACA,eAAA7D;AAAA,IACA,iBAAAsC;AAAA,IACA,YAAAgB;AAAA,IACA,oBAAAoE;AAAA,IACA,SAAAlD;AAAA,IACA,YAAA/E;AAAA,IACA,OAAA3F;AAAA,IACA,cAAAqB;AAAA,IACA,QAAAmJ;AAAA,IACA,kBAAAC;AAAA,IACA,YAAAqD;AAAA,IACA,gBAAAC;AAAA,IACA,eAAAjH;AAAA,IACA,iCAAA+G;AAAA,IACA,aAAA7B;AAAA,IACA,sBAAAgB;AAAA,IACA,sBAAAkB;AAAA,IACA,0BAAAC;AAAA,IACA,8BAAAC;AAAA,IACA,iBAAAT;AAAA,IACA,YAAAK;AAAA,IACA,aAAAxC;AAAA,IACA,WAAAyC;AAAA,IACA,QAAAmC;AAAA,IACA,mBAAAC;AAAA,IACA,QAAA1P;AAAA,IACA,GAAAyE;AAAA,EAAA,IACE;AAAA,IACF4I;AAAA,IACAC;AAAA,IACAN;AAAA,IACAjF;AAAA,IACA8B;AAAA,IACAnJ;AAAA,IACA6E;AAAA,IACAuE;AAAA,IACAzK;AAAA,IACAwF;AAAA,IACAkF;AAAA,IACAc;AAAA,IACA1B;AAAA,IACAJ;AAAA,IACA5C;AAAA,IACAiH;AAAA,IACAD;AAAA,IACAtF;AAAA,IACAgB;AAAA,IACAoE;AAAA,IACAC;AAAA,IACA7B;AAAA,IACAgB;AAAA,IACAkB;AAAA,IACAC;AAAA,IACAC;AAAA,IACAgC;AAAA,IACAC;AAAA,IACA1K;AAAA,IACAoE;AAAA,IACApJ;AAAA,IACAyE;AAAA,EAAA,CACD;AAED,SAAO,gBAAAkL,EAAC5O,GAAqB,UAArB,EAA8B,OAAAlB,IAAe,UAAA2E,GAAA,CAAS;AAChE;AC1wCO,SAASoL,KAAmB;AACjC,QAAMC,IAAMC,GAAW/O,EAAoB;AAC3C,MAAI,CAAC8O;AACH,UAAM,IAAI,MAAM,yDAAyD;AAE3E,SAAOA;AACT;ACIO,SAASE,KAAsD;AACpE,QAAM,EAAE,QAAAlL,GAAQ,MAAAsE,GAAM,OAAApB,GAAO,QAAAqB,EAAA,IAAWwG,GAAA;AACxC,SAAO,EAAE,QAAA/K,GAAQ,MAAAsE,GAAM,OAAApB,GAAO,QAAAqB,EAAA;AAChC;;;;ACPO,SAAS4G,GAAalM,GAA0B;AACrD,QAAM,EAAE,QAAAsF,GAAQ,EAAA,IAAMwG,GAAA;AACtB,SACE,gBAAAD;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAASvG;AAAA,MACT,WAAW,CAACxH,GAAO,QAAQkC,EAAM,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAEnE,UAAAA,EAAM,YAAY,EAAE,uBAAuB;AAAA,IAAA;AAAA,EAAA;AAGlD;;;;;ACjBA,MAAImM,IAAiB;AAAA,IACnB,QAAQ,SAASxL,GAAGvB,GAAG0K,GAAIsC,GAAG;AAC5B,UAAIC,IAAIvC,IAAK1K;AACb,aAAOiN,IAAI1L,IAAIyL,IAAIhN;AAAA,IACvB;AAAA,IACE,YAAY,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AAChC,UAAIC,IAAIvC,IAAK1K;AACb,aAAOiN,KAAK1L,KAAKyL,KAAKzL,IAAIvB;AAAA,IAC9B;AAAA,IACE,aAAa,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACjC,UAAIC,IAAIvC,IAAK1K;AACb,aAAO,CAACiN,KAAK1L,KAAKyL,MAAMzL,IAAI,KAAKvB;AAAA,IACrC;AAAA,IACE,eAAe,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACnC,UAAIC,IAAIvC,IAAK1K;AACb,cAAKuB,KAAKyL,IAAI,KAAK,IACVC,IAAI,IAAI1L,IAAIA,IAAIvB,IAEhB,CAACiN,IAAI,KAAM,EAAE1L,KAAMA,IAAI,KAAK,KAAKvB;AAAA,IAE9C;AAAA,IACE,aAAa,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACjC,UAAIC,IAAIvC,IAAK1K;AACb,aAAOiN,KAAK1L,KAAKyL,KAAKzL,IAAIA,IAAIvB;AAAA,IAClC;AAAA,IACE,cAAc,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AAClC,UAAIC,IAAIvC,IAAK1K;AACb,aAAOiN,MAAM1L,IAAIA,IAAIyL,IAAI,KAAKzL,IAAIA,IAAI,KAAKvB;AAAA,IAC/C;AAAA,IACE,gBAAgB,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACpC,UAAIC,IAAIvC,IAAK1K;AACb,cAAKuB,KAAKyL,IAAI,KAAK,IACVC,IAAI,IAAI1L,IAAIA,IAAIA,IAAIvB,IAEpBiN,IAAI,MAAM1L,KAAK,KAAKA,IAAIA,IAAI,KAAKvB;AAAA,IAE9C;AAAA,IACE,aAAa,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACjC,UAAIC,IAAIvC,IAAK1K;AACb,aAAOiN,KAAK1L,KAAKyL,KAAKzL,IAAIA,IAAIA,IAAIvB;AAAA,IACtC;AAAA,IACE,cAAc,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AAClC,UAAIC,IAAIvC,IAAK1K;AACb,aAAO,CAACiN,MAAM1L,IAAIA,IAAIyL,IAAI,KAAKzL,IAAIA,IAAIA,IAAI,KAAKvB;AAAA,IACpD;AAAA,IACE,gBAAgB,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACpC,UAAIC,IAAIvC,IAAK1K;AACb,cAAKuB,KAAKyL,IAAI,KAAK,IACVC,IAAI,IAAI1L,IAAIA,IAAIA,IAAIA,IAAIvB,IAExB,CAACiN,IAAI,MAAM1L,KAAK,KAAKA,IAAIA,IAAIA,IAAI,KAAKvB;AAAA,IAEnD;AAAA,IACE,aAAa,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACjC,UAAIC,IAAIvC,IAAK1K;AACb,aAAOiN,KAAK1L,KAAKyL,KAAKzL,IAAIA,IAAIA,IAAIA,IAAIvB;AAAA,IAC1C;AAAA,IACE,cAAc,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AAClC,UAAIC,IAAIvC,IAAK1K;AACb,aAAOiN,MAAM1L,IAAIA,IAAIyL,IAAI,KAAKzL,IAAIA,IAAIA,IAAIA,IAAI,KAAKvB;AAAA,IACvD;AAAA,IACE,gBAAgB,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACpC,UAAIC,IAAIvC,IAAK1K;AACb,cAAKuB,KAAKyL,IAAI,KAAK,IACVC,IAAI,IAAI1L,IAAIA,IAAIA,IAAIA,IAAIA,IAAIvB,IAE5BiN,IAAI,MAAM1L,KAAK,KAAKA,IAAIA,IAAIA,IAAIA,IAAI,KAAKvB;AAAA,IAEtD;AAAA,IACE,YAAY,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AAChC,UAAIC,IAAIvC,IAAK1K;AACb,aAAO,CAACiN,IAAI,KAAK,IAAI1L,IAAIyL,KAAK,KAAK,KAAK,EAAE,IAAIC,IAAIjN;AAAA,IACtD;AAAA,IACE,aAAa,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACjC,UAAIC,IAAIvC,IAAK1K;AACb,aAAOiN,IAAI,KAAK,IAAI1L,IAAIyL,KAAK,KAAK,KAAK,EAAE,IAAIhN;AAAA,IACjD;AAAA,IACE,eAAe,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACnC,UAAIC,IAAIvC,IAAK1K;AACb,aAAO,CAACiN,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK1L,IAAIyL,CAAC,IAAI,KAAKhN;AAAA,IACtD;AAAA,IACE,YAAY,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AAChC,UAAIC,IAAIvC,IAAK1K;AACb,aAAQuB,KAAG,IAAKvB,IAAIiN,IAAI,KAAK,IAAI,GAAG,MAAM1L,IAAEyL,IAAI,EAAE,IAAIhN;AAAA,IAC1D;AAAA,IACE,aAAa,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACjC,UAAIC,IAAIvC,IAAK1K;AACb,aAAQuB,KAAGyL,IAAKhN,IAAEiN,IAAIA,KAAK,CAAC,KAAK,IAAI,GAAG,MAAM1L,IAAEyL,CAAC,IAAI,KAAKhN;AAAA,IAC9D;AAAA,IACE,eAAe,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACnC,UAAIC,IAAIvC,IAAK1K;AACb,aAAIuB,MAAM,IACDvB,IAELuB,MAAMyL,IACDhN,IAAIiN,KAER1L,KAAKyL,IAAI,KAAK,IACVC,IAAI,IAAI,KAAK,IAAI,GAAG,MAAM1L,IAAI,EAAE,IAAIvB,IAEpCiN,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,MAAM,EAAE1L,CAAC,IAAI,KAAKvB;AAAA,IAErD;AAAA,IACE,YAAY,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AAChC,UAAIC,IAAIvC,IAAK1K;AACb,aAAO,CAACiN,KAAK,KAAK,KAAK,KAAK1L,KAAKyL,KAAKzL,CAAC,IAAI,KAAKvB;AAAA,IACpD;AAAA,IACE,aAAa,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACjC,UAAIC,IAAIvC,IAAK1K;AACb,aAAOiN,IAAI,KAAK,KAAK,KAAK1L,IAAIA,IAAIyL,IAAI,KAAKzL,CAAC,IAAIvB;AAAA,IACpD;AAAA,IACE,eAAe,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACnC,UAAIC,IAAIvC,IAAK1K;AACb,cAAKuB,KAAKyL,IAAI,KAAK,IACV,CAACC,IAAI,KAAK,KAAK,KAAK,IAAI1L,IAAIA,CAAC,IAAI,KAAKvB,IAEtCiN,IAAI,KAAK,KAAK,KAAK,KAAK1L,KAAK,KAAKA,CAAC,IAAI,KAAKvB;AAAA,IAEzD;AAAA,IACE,eAAe,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACnC,UAAIC,IAAIvC,IAAK1K,GACTD,GAAGmN,GAAG1O;AAIV,aAHAA,IAAI,SACJ0O,IAAI,GACJnN,IAAIkN,GACA1L,MAAM,IACDvB,KACGuB,KAAKyL,OAAO,IACfhN,IAAIiN,KAERC,MACHA,IAAIF,IAAI,MAENjN,IAAI,KAAK,IAAIkN,CAAC,KAChBlN,IAAIkN,GACJzO,IAAI0O,IAAI,KAER1O,IAAI0O,KAAK,IAAI,KAAK,MAAM,KAAK,KAAKD,IAAIlN,CAAC,GAElC,EAAEA,IAAI,KAAK,IAAI,GAAG,MAAMwB,KAAK,EAAE,IAAI,KAAK,KAAKA,IAAIyL,IAAIxO,MAAM,IAAI,KAAK,MAAM0O,CAAC,KAAKlN;AAAA,IAC3F;AAAA,IACE,gBAAgB,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACpC,UAAIC,IAAIvC,IAAK1K,GACTD,GAAGmN,GAAG1O;AAIV,aAHAA,IAAI,SACJ0O,IAAI,GACJnN,IAAIkN,GACA1L,MAAM,IACDvB,KACGuB,KAAKyL,OAAO,IACfhN,IAAIiN,KAERC,MACHA,IAAIF,IAAI,MAENjN,IAAI,KAAK,IAAIkN,CAAC,KAChBlN,IAAIkN,GACJzO,IAAI0O,IAAI,KAER1O,IAAI0O,KAAK,IAAI,KAAK,MAAM,KAAK,KAAKD,IAAIlN,CAAC,GAElCA,IAAI,KAAK,IAAI,GAAG,MAAMwB,CAAC,IAAI,KAAK,KAAKA,IAAIyL,IAAIxO,MAAM,IAAI,KAAK,MAAM0O,CAAC,IAAID,IAAIjN;AAAA,IACtF;AAAA,IACE,kBAAkB,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACtC,UAAIC,IAAIvC,IAAK1K,GACTD,GAAGmN,GAAG1O;AAIV,aAHAA,IAAI,SACJ0O,IAAI,GACJnN,IAAIkN,GACA1L,MAAM,IACDvB,KACGuB,KAAKyL,IAAI,OAAO,IACnBhN,IAAIiN,KAERC,MACHA,IAAIF,KAAK,MAAM,OAEbjN,IAAI,KAAK,IAAIkN,CAAC,KAChBlN,IAAIkN,GACJzO,IAAI0O,IAAI,KAER1O,IAAI0O,KAAK,IAAI,KAAK,MAAM,KAAK,KAAKD,IAAIlN,CAAC,GAErCwB,IAAI,IACC,QAAQxB,IAAI,KAAK,IAAI,GAAG,MAAMwB,KAAK,EAAE,IAAI,KAAK,KAAKA,IAAIyL,IAAIxO,MAAM,IAAI,KAAK,MAAM0O,CAAC,KAAKlN,IAEtFD,IAAI,KAAK,IAAI,GAAG,OAAOwB,KAAK,EAAE,IAAI,KAAK,KAAKA,IAAIyL,IAAIxO,MAAM,IAAI,KAAK,MAAM0O,CAAC,IAAI,MAAMD,IAAIjN;AAAA,IAErG;AAAA,IACE,YAAY,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAGxO,GAAG;AACnC,UAAIyO,IAAIvC,IAAK1K;AACb,aAAIxB,MAAM,WACRA,IAAI,UAECyO,KAAK1L,KAAKyL,KAAKzL,MAAM/C,IAAI,KAAK+C,IAAI/C,KAAKwB;AAAA,IAClD;AAAA,IACE,aAAa,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAGxO,GAAG;AACpC,UAAIyO,IAAIvC,IAAK1K;AACb,aAAIxB,MAAM,WACRA,IAAI,UAECyO,MAAM1L,IAAIA,IAAIyL,IAAI,KAAKzL,MAAM/C,IAAI,KAAK+C,IAAI/C,KAAK,KAAKwB;AAAA,IAC/D;AAAA,IACE,eAAe,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAGxO,GAAG;AACtC,UAAIyO,IAAIvC,IAAK1K;AAIb,aAHIxB,MAAM,WACRA,IAAI,WAED+C,KAAKyL,IAAI,KAAK,IACVC,IAAI,KAAK1L,IAAIA,OAAO/C,KAAK,SAAS,KAAK+C,IAAI/C,MAAMwB,IAEjDiN,IAAI,MAAM1L,KAAK,KAAKA,OAAO/C,KAAK,SAAS,KAAK+C,IAAI/C,KAAK,KAAKwB;AAAA,IAEzE;AAAA,IACE,cAAc,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AAClC,UAAIC,IAAIvC,IAAK1K,GACT;AACJ,iBAAI+M,EAAe,cAAcC,IAAIzL,GAAG,GAAG0L,GAAGD,CAAC,GACxCC,IAAI,IAAIjN;AAAA,IACnB;AAAA,IACE,eAAe,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACnC,UAAIC,IAAIvC,IAAK1K;AACb,cAAKuB,KAAKyL,KAAK,IAAI,OACVC,KAAK,SAAS1L,IAAIA,KAAKvB,IACrBuB,IAAI,IAAI,OACV0L,KAAK,UAAU1L,KAAK,MAAM,QAAQA,IAAI,QAAQvB,IAC5CuB,IAAI,MAAM,OACZ0L,KAAK,UAAU1L,KAAK,OAAO,QAAQA,IAAI,UAAUvB,IAEjDiN,KAAK,UAAU1L,KAAK,QAAQ,QAAQA,IAAI,YAAYvB;AAAA,IAEjE;AAAA,IACE,iBAAiB,SAASuB,GAAGvB,GAAG0K,GAAIsC,GAAG;AACrC,UAAIC,IAAIvC,IAAK1K,GACT;AACJ,aAAIuB,IAAIyL,IAAI,KACV,IAAID,EAAe,aAAaxL,IAAI,GAAG,GAAG0L,GAAGD,CAAC,GACvC,IAAI,MAAMhN,MAEjB,IAAI+M,EAAe,cAAcxL,IAAI,IAAIyL,GAAG,GAAGC,GAAGD,CAAC,GAC5C,IAAI,MAAMC,IAAI,MAAMjN;AAAA,IAEjC;AAAA;AAGA,SAAAmN,KAAiBJ;;;ACpPjB,SAASK,GAAcC,GAAS;AAC5B,SAAQA,IAAU,KAAK,KAAM;AACjC;AACA,SAASC,GAAYC,GAAKC,GAAK;AAC3B,SAAOD,IAAM,KAAK,OAAM,KAAMC,IAAMD;AACxC;AACA,SAASE,GAAUF,GAAKC,GAAK;AACzB,SAAO,KAAK,MAAMD,IAAM,KAAK,OAAM,KAAMC,IAAMD,IAAM,EAAE;AAC3D;AAEA,IAAIG;AAAA,CACH,SAAUA,GAAe;AACtB,EAAAA,EAAcA,EAAc,SAAY,CAAC,IAAI,UAC7CA,EAAcA,EAAc,SAAY,CAAC,IAAI,UAC7CA,EAAcA,EAAc,QAAW,CAAC,IAAI;AAChD,GAAGA,OAAkBA,KAAgB,CAAA,EAAG;AACxC,IAAIC;AAAA,CACH,SAAUA,GAAmB;AAC1B,EAAAA,EAAkBA,EAAkB,WAAc,CAAC,IAAI,YACvDA,EAAkBA,EAAkB,WAAc,EAAE,IAAI;AAC5D,GAAGA,OAAsBA,KAAoB,CAAA,EAAG;AAChD,MAAMC,KAAqB,MAAO;AAClC,MAAMC,GAAS;AAAA,EACX,YAAYC,GAASC,GAAYC,GAAGC,GAAG;AACnC,SAAK,aAAaF;AAClB,UAAM,EAAE,QAAAG,GAAQ,kBAAAC,GAAkB,kBAAAC,EAAgB,IAAK,KAAK,WAAU;AACtE,SAAK,UAAUN,GACf,KAAK,IAAIE,GACT,KAAK,IAAIC,GACT,KAAK,IAAIX,GAAY,GAAG,EAAE,GAC1B,KAAK,IAAIA,GAAY,GAAG,EAAE,GAC1B,KAAK,SAASA,GAAY,GAAG,EAAE,GAC/B,KAAK,KACD,OAAOa,KAAqB,WACtBb,GAAY,CAACa,GAAkBA,CAAgB,IAC/Cb,GAAYa,EAAiB,KAAKA,EAAiB,GAAG,GAChE,KAAK,KACD,OAAOC,KAAqB,WACtBd,GAAY,CAACc,GAAkB,CAAC,IAChCd,GAAYc,EAAiB,KAAKA,EAAiB,GAAG,GAChE,KAAK,QAAQX,GAAU,GAAG,CAAC,GAC3B,KAAK,QAAQL,GAAcE,GAAY,GAAG,GAAG,CAAC,GAC9C,KAAK,cAAcA,GAAY,MAAM,GAAG,GACxC,KAAK,QAAQY,EAAO,KAAK,MAAM,KAAK,OAAM,IAAKA,EAAO,MAAM,CAAC,GAC7D,KAAK,UAAUZ,GAAY,GAAG,CAAC,GAC/B,KAAK,oBAAoBA,GAAY,GAAG,CAAC,IACnCK,GAAkB,WAClBA,GAAkB;AAAA,EAC5B;AAAA,EACA,OAAOU,GAAS;AACZ,UAAM,EAAE,SAAAC,GAAS,MAAAC,GAAM,UAAAC,GAAU,SAAAC,GAAS,WAAAC,EAAS,IAAK,KAAK,WAAU,GACjEC,IAAsBN,IAAUT;AACtC,SAAK,KAAK,KAAK,KAAKe,GACpB,KAAK,KAAK,KAAK,KAAKA,GACpB,KAAK,MAAML,IAAUK,GACrB,KAAK,MAAMJ,IAAOI,GAClB,KAAK,MAAMH,KAAYG,GACvB,KAAK,MAAMH,KAAYG,GACnB,KAAK,WAAW,KAChB,KAAK,sBAAsBhB,GAAkB,WAC7C,KAAK,oBAAoBA,GAAkB,WAEtC,KAAK,WAAW,MACrB,KAAK,sBAAsBA,GAAkB,aAC7C,KAAK,oBAAoBA,GAAkB;AAE/C,UAAMiB,IAAc,MAAM,KAAK,oBAAoBD;AAcnD,QAbA,KAAK,WAAWC,GAChB,KAAK,SAAS,KAAK,aACnB,KAAK,QAAQ,KAAI,GACjB,KAAK,QAAQ,UAAU,KAAK,GAAG,KAAK,CAAC,GACrC,KAAK,QAAQ,OAAO,KAAK,KAAK,GAC9B,KAAK,QAAQ,MAAM,GAAG,KAAK,OAAO,GAClC,KAAK,QAAQ,OAAO,KAAK,KAAK,GAC9B,KAAK,QAAQ,UAAS,GACtB,KAAK,QAAQ,YAAY,KAAK,OAC9B,KAAK,QAAQ,cAAc,KAAK,OAChC,KAAK,QAAQ,cAAcH,GAC3B,KAAK,QAAQ,UAAU,SACvB,KAAK,QAAQ,YAAY,GACrBC,KAAa,OAAOA,KAAc;AAClC,MAAAA,EAAU,KAAK,MAAM,KAAK,OAAO;AAAA;AAGjC,cAAQ,KAAK,OAAK;AAAA,QACd,KAAKhB,GAAc,QAAQ;AACvB,eAAK,QAAQ,UAAS,GACtB,KAAK,QAAQ,IAAI,GAAG,GAAG,KAAK,QAAQ,GAAG,IAAI,KAAK,EAAE,GAClD,KAAK,QAAQ,KAAI;AACjB;AAAA,QACJ;AAAA,QACA,KAAKA,GAAc,QAAQ;AACvB,eAAK,QAAQ,SAAS,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;AAC9D;AAAA,QACJ;AAAA,QACA,KAAKA,GAAc,OAAO;AACtB,eAAK,QAAQ,SAAS,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAClE;AAAA,QACJ;AAAA,MAChB;AAEQ,SAAK,QAAQ,UAAS,GACtB,KAAK,QAAQ,QAAO;AAAA,EACxB;AACJ;AAEA,MAAMmB,GAAkB;AAAA,EACpB,YAAYC,GAAQf,GAAY;AAC5B,SAAK,IAAI,GACT,KAAK,IAAI,GACT,KAAK,IAAI,GACT,KAAK,IAAI,GACT,KAAK,qBAAqB,GAC1B,KAAK,gBAAgB,GACrB,KAAK,YAAY,GACjB,KAAK,YAAY,CAAA,GACjB,KAAK,qBAAqB,GAC1B,KAAK,mBAAmB,CAACjF,MAAM;AAC3B,WAAK,UAAU,OAAOA,GAAG,CAAC;AAAA,IAC9B,GACA,KAAK,cAAc,MAAM;AACrB,YAAMiG,IAAezB,GAAY,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC,GAClD0B,IAAe1B,GAAY,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC;AACxD,aAAO,IAAIO,GAAS,KAAK,SAAS,KAAK,YAAYkB,GAAcC,CAAY;AAAA,IACjF,GACA,KAAK,UAAU,CAACX,MAAY;AACxB,YAAM,EAAE,QAAAS,GAAQ,SAAAhB,GAAS,oBAAAmB,GAAoB,oBAAAC,EAAkB,IAAK,MAC9D,EAAE,KAAAC,IAAK,SAAAC,GAAS,gBAAAC,IAAgB,OAAAC,IAAO,eAAAC,IAAe,eAAAC,EAAa,IAAM,KAAK,WAAU;AAC9F,UAAI,CAACL;AACD,eAAO;AAEX,YAAMM,IAAK,KAAK,UAAU,QACpBC,KAAcN,IAAUK,IAAKR;AAEnC,UAAIS,KAAcL,IAAgB;AAE9B,QAAIH,MAAuBG,OACvB,KAAK,gBAAgB,GACrB,KAAK,YAAYK,IACjB,KAAK,qBAAqBL,KAG9B,KAAK,gBAAgB,KAAK,IAAIG,GAAe,KAAK,IAAI,GAAG,KAAK,gBAAgBnB,CAAO,CAAC;AACtF,cAAMsB,IAAaJ,GAAc,KAAK,eAAe,KAAK,WAAWF,IAAgBG,CAAa,GAC5FI,IAAW,KAAK,MAAMD,IAAaD,EAAW;AACpD,iBAAS5G,KAAI,GAAGA,KAAI8G,GAAU9G;AAC1B,eAAK,UAAU,KAAK,KAAK,YAAW,CAAE;AAE1C,aAAK,sBAAsB8G;AAAA,MAC/B;AACA,MAAIN,OAEAxB,EAAQ,OAAO,mBACfA,EAAQ,YAAY,QACpBA,EAAQ,YAAY,SACpBA,EAAQ,SAAS,cAAc2B,CAAE,IAAIX,EAAO,QAAQ,IAAIA,EAAO,SAAS,EAAE;AAG9E,eAAShG,IAAI,KAAK,UAAU,SAAS,GAAGA,KAAK,GAAGA,KAAK;AACjD,cAAMoE,IAAI,KAAK,UAAUpE,CAAC;AAE1B,QAAAoE,EAAE,OAAOmB,CAAO,IAEZnB,EAAE,IAAI4B,EAAO,UACb5B,EAAE,IAAI,QACNA,EAAE,IAAI4B,EAAO,QAAQ,OACrB5B,EAAE,IAAI,UACFkC,KAAWM,MAAeL,KAE1B,KAAK,UAAUvG,CAAC,IAAI,KAAK,YAAW,IAGpC,KAAK,iBAAiBA,CAAC;AAAA,MAGnC;AACA,aAAO2G,IAAK,KAAKC,KAAcL;AAAA,IACnC,GACA,KAAK,SAASP;AACd,UAAMnC,IAAM,KAAK,OAAO,WAAW,IAAI;AACvC,QAAI,CAACA;AACD,YAAM,IAAI,MAAM,8BAA8B;AAElD,SAAK,UAAUA,GACf,KAAK,aAAaoB;AAAA,EACtB;AACJ;AAEA,MAAM8B,KAAmB;AAAA,EACrB,OAAO,OAAO,SAAW,MAAc,OAAO,aAAa;AAAA,EAC3D,QAAQ,OAAO,SAAW,MAAc,OAAO,cAAc;AAAA,EAC7D,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,QAAQ;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,EACR;AAAA,EACI,SAAS;AAAA,EACT,OAAO;AAAA,EACP,eAAeC,GAAAA;AAAAA,EACf,eAAe;AAAA,EACf,SAAS;AAAA,EACT,KAAK;AACT;AACA,MAAMC,GAAS;AAAA,EACX,YAAYjB,GAAQkB,GAAM;AACtB,SAAK,gBAAgB,GACrB,KAAK,yBAAyB,CAACA,MAAS;AACpC,YAAMC,IAA2B;AAAA,QAC7B,gBAAgB;AAAA,UACZ,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG,KAAK,OAAO;AAAA,UACf,GAAG;AAAA,QACvB;AAAA,MACA;AACY,WAAK,WAAW;AAAA,QACZ,GAAGA;AAAA,QACH,GAAGJ;AAAA,QACH,GAAGG;AAAA,MACnB,GACY,OAAO,OAAO,MAAMA,EAAK,cAAc;AAAA,IAC3C,GACA,KAAK,SAAS,CAACE,IAAY,MAAM;AAC7B,YAAM,EAAE,SAAS,EAAE,KAAAf,GAAK,oBAAAgB,GAAoB,WAAAC,KAAa,QAAAtB,GAAQ,SAAAhB,GAAO,IAAM,MAExEO,IAAU,KAAK,IAAI6B,IAAY,KAAK,eAAe,EAAE;AAE3D,UAAIE,KAAa/B,IAAU,MAAO+B,GAAW;AACzC,aAAK,QAAQ,sBAAsB,KAAK,MAAM;AAC9C;AAAA,MACJ;AACA,WAAK,gBAAgBF,KAAaE,IAAY/B,IAAU+B,IAAY,IAChEjB,MACArB,GAAQ,YAAY,SACpBA,GAAQ,UAAU,GAAG,GAAGgB,EAAO,OAAOA,EAAO,MAAM,IAEnD,KAAK,UAAU,QAAQT,CAAO,IAC9B,KAAK,QAAQ,sBAAsB,KAAK,MAAM,KAG1C8B,KACA,OAAOA,KAAuB,cAC9B,KAAK,UAAU,qBAAqB,KACpCA,EAAmB,KAAK,MAAM,IAAI,GAEtC,KAAK,SAAS,MAAM;AAAA,IAE5B,GACA,KAAK,QAAQ,MAAM;AACf,MAAI,KAAK,aAAa,KAAK,UAAU,qBAAqB,MACtD,KAAK,UAAU,qBAAqB,GACpC,KAAK,UAAU,YAAY,CAAA,GAC3B,KAAK,UAAU,qBAAqB;AAAA,IAE5C,GACA,KAAK,OAAO,MAAM;AACd,WAAK,UAAU,EAAE,KAAK,GAAK,GACvB,KAAK,UACL,qBAAqB,KAAK,KAAK,GAC/B,KAAK,QAAQ;AAAA,IAErB,GACA,KAAK,SAASrB;AACd,UAAMnC,IAAM,KAAK,OAAO,WAAW,IAAI;AACvC,QAAI,CAACA;AACD,YAAM,IAAI,MAAM,8BAA8B;AAElD,SAAK,UAAUA,GACf,KAAK,YAAY,IAAIkC,GAAkB,KAAK,QAAQ,MAAM,KAAK,OAAO,GACtE,KAAK,UAAUmB,GACf,KAAK,OAAM;AAAA,EACf;AAAA,EACA,IAAI,UAAU;AACV,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,QAAQA,GAAM;;AACd,UAAMK,KAAelT,IAAA,KAAK,aAAL,gBAAAA,EAAe,KAC9BmT,KAAmBvK,IAAA,KAAK,aAAL,gBAAAA,EAAe;AACxC,SAAK,uBAAuBiK,CAAI,GAC5B,KAAK,cACL,OAAO,OAAO,KAAK,WAAW,KAAK,QAAQ,cAAc,GACrD,OAAOA,EAAK,WAAY,aACxBA,EAAK,WACLM,MAAqB,OACrB,KAAK,UAAU,qBAAqB,KAAK,UAAU,UAAU,UAGjE,OAAON,EAAK,OAAQ,aAAaA,EAAK,OAAOK,MAAiB,MAC9D,KAAK,OAAM;AAAA,EAEnB;AACJ;AAEA,MAAME,KAAMC,GAAM,UAAS;AAC3B,MAAMC,WAA8BD,GAAM,UAAU;AAAA,EAChD,YAAY5P,GAAO;AACf,UAAMA,CAAK,GACX,KAAK,SAAS4P,GAAM,UAAS,GAC7B,KAAK,SAAS5P,EAAM,aAAa2P;AAAA,EACrC;AAAA,EACA,oBAAoB;AAChB,QAAI,KAAK,OAAO,SAAS;AACrB,YAAMP,IAAOU,GAAmB,KAAK,KAAK,EAAE,CAAC;AAC7C,WAAK,WAAW,IAAIX,GAAS,KAAK,OAAO,SAASC,CAAI;AAAA,IAC1D;AAAA,EACJ;AAAA,EACA,qBAAqB;AACjB,UAAMW,IAAkBD,GAAmB,KAAK,KAAK,EAAE,CAAC;AACxD,IAAI,KAAK,aACL,KAAK,SAAS,UAAUC;AAAA,EAEhC;AAAA,EACA,uBAAuB;AACnB,IAAI,KAAK,YACL,KAAK,SAAS,KAAI,GAEtB,KAAK,WAAW;AAAA,EACpB;AAAA,EACA,SAAS;AACL,UAAM,CAACA,GAAiBC,CAAW,IAAIF,GAAmB,KAAK,KAAK,GAC9DG,IAAe;AAAA,MACjB,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,eAAe;AAAA,MACf,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,GAAGD,EAAY;AAAA,IAC3B;AACQ,WAAQnE,EAAI,UAAU,EAAE,OAAOkE,EAAgB,OAAO,QAAQA,EAAgB,QAAQ,KAAK,KAAK,QAAQ,GAAGC,GAAa,OAAOC,GAAc;AAAA,EACjJ;AACJ;AACAJ,GAAsB,eAAe;AAAA,EACjC,GAAGZ;AACP;AACAY,GAAsB,cAAc;AACpC,SAASC,GAAmB9P,GAAO;AAC/B,QAAM+P,IAAkB,CAAA,GAClBG,IAAO,CAAA,GACPC,IAAO,CAAA,GACPC,IAAqB;AAAA,IACvB,GAAG,OAAO,KAAKnB,EAAgB;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACR,GACUoB,IAAW,CAAC,WAAW;AAC7B,aAAWC,KAAQtQ,GAAO;AACtB,UAAMuQ,IAAMvQ,EAAMsQ,CAAI;AACtB,IAAIF,EAAmB,SAASE,CAAI,IAChCP,EAAgBO,CAAI,IAAIC,IAEnBF,EAAS,SAASC,CAAI,IAC3BD,EAASC,CAAI,IAAIC,IAGjBJ,EAAKG,CAAI,IAAIC;AAAA,EAErB;AACA,SAAO,CAACR,GAAiBI,GAAMD,CAAI;AACvC;AACA,MAAMM,KAAgBZ,GAAM,WAAW,CAAC5P,GAAO2P,MAAQ9D,EAAIgE,IAAuB,EAAE,WAAWF,GAAK,GAAG3P,EAAK,CAAE,CAAC;ACnY/G;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,MAAMyQ,KAAc,CAACC,MAAWA,EAAO,QAAQ,sBAAsB,OAAO,EAAE,YAAW,GACnFC,KAAc,CAACD,MAAWA,EAAO;AAAA,EACrC;AAAA,EACA,CAACE,GAAOC,GAAIC,MAAOA,IAAKA,EAAG,YAAW,IAAKD,EAAG,YAAW;AAC3D,GACME,KAAe,CAACL,MAAW;AAC/B,QAAMM,IAAYL,GAAYD,CAAM;AACpC,SAAOM,EAAU,OAAO,CAAC,EAAE,YAAW,IAAKA,EAAU,MAAM,CAAC;AAC9D,GACMC,KAAe,IAAIC,MAAYA,EAAQ,OAAO,CAACC,GAAWC,GAAOC,MAC9D,EAAQF,KAAcA,EAAU,KAAI,MAAO,MAAME,EAAM,QAAQF,CAAS,MAAMC,CACtF,EAAE,KAAK,GAAG,EAAE,KAAI,GACXE,KAAc,CAACtR,MAAU;AAC7B,aAAWsQ,KAAQtQ;AACjB,QAAIsQ,EAAK,WAAW,OAAO,KAAKA,MAAS,UAAUA,MAAS;AAC1D,aAAO;AAGb;ACzBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,IAAIiB,KAAoB;AAAA,EACtB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAClB;ACjBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,MAAMC,KAAOC;AAAA,EACX,CAAC;AAAA,IACC,OAAAC,IAAQ;AAAA,IACR,MAAAC,IAAO;AAAA,IACP,aAAAC,IAAc;AAAA,IACd,qBAAAC;AAAA,IACA,WAAAV,IAAY;AAAA,IACZ,UAAAzQ;AAAA,IACA,UAAAoR;AAAA,IACA,GAAG3B;AAAA,EACP,GAAKR,MAAQoC;AAAA,IACT;AAAA,IACA;AAAA,MACE,KAAApC;AAAA,MACA,GAAG4B;AAAA,MACH,OAAOI;AAAA,MACP,QAAQA;AAAA,MACR,QAAQD;AAAA,MACR,aAAaG,IAAsB,OAAOD,CAAW,IAAI,KAAK,OAAOD,CAAI,IAAIC;AAAA,MAC7E,WAAWX,GAAa,UAAUE,CAAS;AAAA,MAC3C,GAAG,CAACzQ,KAAY,CAAC4Q,GAAYnB,CAAI,KAAK,EAAE,eAAe,OAAM;AAAA,MAC7D,GAAGA;AAAA,IACT;AAAA,IACI;AAAA,MACE,GAAG2B,EAAS,IAAI,CAAC,CAACE,IAAKC,CAAK,MAAMF,GAAcC,IAAKC,CAAK,CAAC;AAAA,MAC3D,GAAG,MAAM,QAAQvR,CAAQ,IAAIA,IAAW,CAACA,CAAQ;AAAA,IACvD;AAAA,EACA;AACA;ACvCA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,MAAMwR,KAAmB,CAACC,GAAUL,MAAa;AAC/C,QAAMM,IAAYX;AAAA,IAChB,CAAC,EAAE,WAAAN,GAAW,GAAGnR,EAAK,GAAI2P,MAAQoC,GAAcP,IAAM;AAAA,MACpD,KAAA7B;AAAA,MACA,UAAAmC;AAAA,MACA,WAAWb;AAAA,QACT,UAAUR,GAAYM,GAAaoB,CAAQ,CAAC,CAAC;AAAA,QAC7C,UAAUA,CAAQ;AAAA,QAClBhB;AAAA,MACR;AAAA,MACM,GAAGnR;AAAA,IACT,CAAK;AAAA,EACL;AACE,SAAAoS,EAAU,cAAcrB,GAAaoB,CAAQ,GACtCC;AACT;AC1BA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMC,KAAa,CAAC,CAAC,QAAQ,EAAE,GAAG,gBAAgB,KAAK,SAAQ,CAAE,CAAC,GAC5DC,KAAcJ,GAAiB,gBAAgBG,EAAU;ACV/D;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,KAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAC3C,GACME,KAAOL,GAAiB,QAAQG,EAAU;ACbhD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,KAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,GAAG,oBAAoB,KAAK,SAAQ,CAAE;AAAA,EACjD,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,KAAK,KAAK,SAAQ,CAAE;AAC1D,GACMG,KAASN,GAAiB,UAAUG,EAAU;ACbpD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,KAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,yCAAyC,KAAK,SAAQ,CAAE;AAAA,EACtE,CAAC,QAAQ,EAAE,GAAG,sCAAsC,KAAK,SAAQ,CAAE;AAAA,EACnE,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,SAAQ,CAAE;AAAA,EAClE,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,QAAO,CAAE;AACnE,GACMI,KAASP,GAAiB,WAAWG,EAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACL9C,SAASK,GAAoB1S,GAAiC;;AACnE,QAAM;AAAA,IACJ,QAAAe;AAAA,IACA,OAAAkD;AAAA,IACA,SAAAgC;AAAA,IACA,YAAA/E;AAAA,IACA,OAAA3F;AAAA,IACA,cAAAqB;AAAA,IACA,QAAAmJ;AAAA,IACA,kBAAAC;AAAA,IACA,YAAAqD;AAAA,IACA,gBAAAC;AAAA,IACA,iCAAAF;AAAA,IACA,aAAA7B;AAAA,IACA,8BAAAoC;AAAA,IACA,YAAAJ;AAAA,IACA,aAAAxC;AAAA,IACA,WAAAyC;AAAA,IACA,QAAAmC;AAAA,IACA,mBAAAC;AAAA,IACA,QAAA1P;AAAA,IACA,GAAAyE;AAAA,EAAA,IACEmL,GAAA,GAEE,CAAC6G,GAAcC,CAAe,IAAI3R,GAAS,EAAK,GAChD,CAAC4R,IAAaC,EAAc,IAAI7R,GAAS,EAAE,GAC3C8R,KAAiBvQ,GAAgC,IAAI,GACrDwQ,KAAYxQ,GAA2B,IAAI,GAC3CyQ,KAAqBzQ,GAA8B,IAAI,GAEvD,CAAC0Q,IAAYC,EAAa,IAAIlS,GAA4C,MAC1E,OAAO,SAAW,MAAoB,EAAE,OAAO,GAAG,QAAQ,EAAA,IACvD,EAAE,OAAO,OAAO,YAAY,QAAQ,OAAO,YAAA,CACnD,GAEK,CAACmS,IAAaC,EAAc,IAAIpS,GAAS,CAAC,GAC1C,CAACqS,IAAgBC,EAAiB,IAAItS,GAAgE,IAAI,GAC1G,CAACuS,IAAkBC,EAAmB,IAAIxS,GAAS,EAAK,GACxDyS,KAAmBlR,GAAsB,IAAI,GAC7CmR,KAA+BnR,GAAe+G,CAAU,GACxDqK,KAAmB,KAEnB,CAACC,IAAgBC,EAAiB,IAAI7S,GAAS,CAAC,GAChD,CAAC8S,IAAiBC,EAAkB,IAAI/S,GAAwB,IAAI,GACpE,CAACgT,IAAqBC,EAAsB,IAAIjT,GAAS,EAAK,GAC9DkT,KAAsB3R,GAAsB,IAAI,GAChD4R,KAAwB,MAExBC,KAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAGIC,KAAiB5N,EAAQ,MAAM;;AACnC,UAAM2F,KAAI9P,IAAAwJ,KAAA,gBAAAA,EAAQ,kBAAR,gBAAAxJ,EAAuB;AACjC,WAAI,MAAM,QAAQ8P,CAAC,KAAKA,EAAE,UAAU,IAC3BA,EAAE,MAAM,GAAG,CAAC,EAAE;AAAA,MAAI,CAACzO,GAAGsK,MAC3B,OAAOtK,KAAM,YAAYA,EAAE,KAAA,IAASA,IAAIyW,GAAwBnM,CAAC;AAAA,IAAA,IAG9D,CAAC,GAAGmM,EAAuB;AAAA,EACpC,GAAG,EAAC9X,KAAAwJ,KAAA,gBAAAA,EAAQ,kBAAR,gBAAAxJ,GAAuB,cAAc,CAAC,GAEpCgY,KAAmB,CAACxY,MAAkB;AAC1C,UAAMc,IAAI,OAAO,WAAWd,CAAK;AACjC,WAAK,OAAO,SAASc,CAAC,IACf,OAAO,KAAK,MAAMA,CAAC,CAAC,IADKd;AAAA,EAElC,GAEMyY,KAAuB,CAACC,MAA+E;AAC3G,UAAMrF,KAAQqF,KAAmB,CAAA,GAAI,OAAO,CAACC,MAAM;;AACjD,YAAMjY,KAAOF,IAAAmY,KAAA,gBAAAA,EAAG,SAAH,gBAAAnY,EAAS,QAChBR,KAAQoJ,IAAAuP,KAAA,gBAAAA,EAAG,UAAH,gBAAAvP,EAAU;AAGxB,aAFI,GAAC1I,KAAQ,CAACV,KACVU,EAAK,kBAAkB,WACvBV,EAAM,kBAAkB;AAAA,IAE9B,CAAC;AACD,WAAKqT,EAAK,SACHA,EAAK,IAAI,CAACsF,MAAM,GAAGA,EAAE,IAAI,KAAKA,EAAE,KAAK,EAAE,EAAE,KAAK,KAAK,IADjC;AAAA,EAE3B,GAEMC,KAAiB,CAAC5Y,OACfA,KAAA,gBAAAA,EAAO,OAAO,mBAAkB,iBAGnC6Y,KAAwB,CAACC,MAAyC;;AACtE,UAAMC,KAAcvY,IAAAsY,EAAE,gBAAF,gBAAAtY,EAAe;AACnC,QAAIuY,KAAe,CAACH,GAAeG,CAAW,EAAG,QAAOA;AAExD,UAAMC,KAAejL,KAAA3E,IAAA0P,EAAE,YAAF,gBAAA1P,EAAW,UAAX,gBAAA2E,EAAkB;AACvC,QAAIiL,EAAc,QAAOA;AAEzB,UAAMC,KAAeC,IAAAJ,EAAE,UAAF,gBAAAI,EAAS;AAC9B,WAAID,KAAgB,CAACL,GAAeK,CAAY,IAAUA,IAEnDF,KAAeE,KAAgBD,KAAgB;AAAA,EACxD,GAEMG,KAAsB,CAACL,MAAyC;AACpE,UAAMpY,IAAOmY,GAAsBC,CAAC,GAC9BzF,IAAOoF,GAAqBK,EAAE,eAAe;AACnD,WAAO,CAACpY,GAAM2S,CAAI,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,EAChD,GAEM+F,KAAwB,CAACN,MAAyC;;AACtE,UAAMnQ,IAAU8P,GAAqBK,EAAE,eAAe;AACtD,QAAInQ,EAAS,QAAOA;AAEpB,UAAMsQ,KAAezY,IAAAsY,EAAE,UAAF,gBAAAtY,EAAS;AAC9B,WAAIyY,KAAgB,CAACL,GAAeK,CAAY,IAAUA,IAEnDJ,GAAsBC,CAAC;AAAA,EAChC,GAEM7W,OAAQmH,KAAAY,KAAA,gBAAAA,EAAQ,UAAR,gBAAAZ,GAAe,WAAUxE,EAAE,sBAAsB,GACzDyU,IAAwB,GAAQrP,KAAA,QAAAA,EAAQ,wCAExCsP,IAAatU,KADK,EAAQgF,GAE1B,CAACuP,GAAWC,CAAY,IAAItU,GAASoU,CAAU,GAC/CG,IAAgBhT,GAAsB,IAAI,GAE1CiT,IAAc,CAAC9Y,MAAmB;AACtC,UAAME,IAAI,OAAOF,CAAM;AACvB,WAAK,OAAO,SAASE,CAAC,IAEfH,GAAqBG,GAAGD,GAAcV,EAAM,IAFnBS;AAAA,EAGlC,GAEM8J,IAAgBC,EAAQ,MAAM;AAClC,UAAM5K,IAAM,QAAOiK,KAAA,gBAAAA,EAAQ,kBAAiB,GAAG,GACzClJ,IAAI,OAAO,SAASf,CAAG,IAAI,KAAK,MAAMA,CAAG,IAAI;AACnD,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKe,CAAC,CAAC;AAAA,EACrC,GAAG,CAACkJ,KAAA,gBAAAA,EAAQ,aAAa,CAAC,GACpB2P,IAAoBnM,KAAc9C,GAClCkP,IAAmB,CAAChb,GAA4Cib,MAAyB;AAC7F,UAAM9M,IAAaO,GAAW1O,EAAQ,EAAE,KAAK;AAC7C,QAAIya,KAAyBQ,IAAe9M,GAAY;AACtD,MAAAa,GAA6BhP,CAAO;AACpC;AAAA,IACF;AACA,IAAA4M,GAAY5M,EAAQ,IAAIib,CAAY;AAAA,EACtC,GAEMC,KAASnP,EAAQ,MACd,CAAC,GAAGV,CAAgB,GAC1B,CAACA,CAAgB,CAAC,GAEf8P,KAAmBpP,EAAQ,MAAM;AACrC,UAAM/C,IAAIkP,GAAY,KAAA,EAAO,YAAA;AAC7B,QAAI,CAAClP,EAAG,QAAOkS;AAEf,UAAME,IAASpS,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,GACtCqS,IAAU,CAACnB,MAA+B;;AAC9C,YAAMoB,IAAkB,CAAA;AACxB,MAAAA,EAAM,KAAKpB,EAAE,WAAW,IACpBtY,IAAAsY,EAAE,YAAF,QAAAtY,EAAW,WAAa,KAAKsY,EAAE,QAAQ,KAAK;AAChD,iBAAWH,KAAKG,EAAE,mBAAmB,CAAA;AACnC,QAAAoB,EAAM,KAAKvB,EAAE,IAAI,GACjBuB,EAAM,KAAKvB,EAAE,KAAK;AAEpB,YAAMwB,IAAWD,EAAM,KAAK,GAAG,EAAE,YAAA;AACjC,aAAOF,EAAO,MAAM,CAACpV,MAAMuV,EAAS,SAASvV,CAAC,CAAC;AAAA,IACjD;AAEA,WAAOkV,GAAO,OAAOG,CAAO;AAAA,EAC9B,GAAG,CAACnD,IAAagD,EAAM,CAAC,GAElBM,IAAkBzP,EAAQ,MAAM;;AACpC,QAAI,EAACX,KAAA,QAAAA,EAAQ,wBAAwB,QAAO;AAC5C,UAAMpC,IAAIkP,GAAY,KAAA,EAAO,YAAA,GACvBkD,IAASpS,IAAIA,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,IAAI,CAAA,GAE9CyS,IAAgB,CAACvB,MAA+B;;AACpD,UAAI,CAACkB,EAAO,OAAQ,QAAO;AAC3B,YAAME,IAAkB,CAACpB,EAAE,WAAW;AACtC,OAAItY,IAAAsY,EAAE,YAAF,QAAAtY,EAAW,WAAa,KAAKsY,EAAE,QAAQ,KAAK;AAChD,iBAAWH,KAAKG,EAAE,mBAAmB,CAAA;AAAM,QAAAoB,EAAM,KAAKvB,EAAE,IAAI,GAAGuB,EAAM,KAAKvB,EAAE,KAAK;AACjF,YAAMwB,IAAWD,EAAM,KAAK,GAAG,EAAE,YAAA;AACjC,aAAOF,EAAO,MAAM,CAACM,MAAQH,EAAS,SAASG,CAAG,CAAC;AAAA,IACrD,GAEMC,wBAAU,IAAA;AAChB,eAAWzB,KAAKgB,IAAQ;AACtB,YAAMU,MAAYha,IAAAsY,EAAE,YAAF,gBAAAtY,EAAW,OAAM;AACnC,MAAK+Z,EAAI,IAAIC,CAAS,KACpBD,EAAI,IAAIC,GAAW,EAAE,WAAAA,GAAW,gBAAcpR,IAAA0P,EAAE,YAAF,gBAAA1P,EAAW,UAAS,IAAI,UAAU,CAAA,GAAI,kBAAkB,CAAA,GAAI;AAE5G,YAAMqR,IAAQF,EAAI,IAAIC,CAAS;AAC/B,MAAAC,EAAM,SAAS,KAAK3B,CAAC,GACjBuB,EAAcvB,CAAC,KAAG2B,EAAM,iBAAiB,KAAK3B,CAAC;AAAA,IACrD;AAEA,WAAO,MAAM,KAAKyB,EAAI,OAAA,CAAQ,EAAE,OAAO,CAACG,MAAMA,EAAE,iBAAiB,SAAS,CAAC;AAAA,EAC7E,GAAG,CAAC1Q,KAAA,gBAAAA,EAAQ,wBAAwB8P,IAAQhD,EAAW,CAAC,GAElD,CAAC6D,GAAmBC,EAAoB,IAAI1V,GAAwB,IAAI,GACxE2V,KAAYpU,GAA6B,IAAI;AAEnD,EAAAsB,EAAU,MAAM;AACd,QAAI,CAAC4S,EAAmB;AACxB,UAAMG,IAAc,CAACC,MAAkB;AACrC,MAAIF,GAAU,WAAW,CAACA,GAAU,QAAQ,SAASE,EAAE,MAAc,KACnEH,GAAqB,IAAI;AAAA,IAE7B;AACA,oBAAS,iBAAiB,aAAaE,CAAW,GAC3C,MAAM,SAAS,oBAAoB,aAAaA,CAAW;AAAA,EACpE,GAAG,CAACH,CAAiB,CAAC;AAEtB,QAAM5L,IAAcpE,EAAQ,MACnB,CAAC,IAAIX,KAAA,gBAAAA,EAAQ,UAAS,CAAA,CAAG,EAAE,KAAK,CAAC5G,GAAGC,MAAMD,EAAE,gBAAgBC,EAAE,aAAa,GACjF,CAAC2G,KAAA,gBAAAA,EAAQ,KAAK,CAAC,GAEZgR,IAAiBrQ,EAAQ,MAAM,KAAK,IAAI,GAAGK,IAAcwC,CAAU,GAAG,CAACA,GAAYxC,CAAW,CAAC,GAE/FgE,KAAcrE,EAAQ,MAAM;AAChC,QAAIsQ,IAAO;AACX,eAAW,KAAKlM;AACd,MAAIvB,KAAc,EAAE,kBAAeyN,IAAO;AAE5C,WAAOA;AAAA,EACT,GAAG,CAACzN,GAAYuB,CAAW,CAAC,GAEtBE,IAAyBtE,EAAQ,MAAM;AAC3C,QAAI,CAACqE,GAAa,QAAO;AACzB,UAAME,IAAM,OAAO,WAAWF,GAAY,eAAe;AACzD,WAAI,CAAC,OAAO,SAASE,CAAG,KAAKA,KAAO,IAAU,OACvCA;AAAA,EACT,GAAG,CAACF,EAAW,CAAC,GACVkM,KAAYnM,EAAY,CAAC,GACzBoM,KAA2B,GAAQD,MAAa1N,KAAc0N,GAAU,gBAExEE,KAAWzQ,EAAQ,MAAM;AAC7B,UAAMiE,IAAO,IAAI,IAAI3E,EAAiB,IAAI,CAAC6O,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAU,CAAC;AACpE,QAAIuC,IAAQ;AACZ,eAAW,CAACC,GAAWC,CAAG,KAAK,OAAO,QAAQjO,EAAU,GAAG;AACzD,YAAM1F,IAAI2T,KAAO;AACjB,UAAI3T,KAAK,EAAG;AACZ,YAAMkR,IAAIlK,EAAK,IAAI0M,CAAS,GACtBxM,IAAQ,OAAOgK,KAAA,gBAAAA,EAAG,KAAK;AAC7B,MAAK,OAAO,SAAShK,CAAK,MAC1BuM,KAASvM,IAAQlH;AAAA,IACnB;AAEA,WAAO,KAAK,MAAMyT,IAAQ,GAAG,IAAI;AAAA,EACnC,GAAG,CAACpR,GAAkBqD,EAAU,CAAC,GAE3BkO,KAAkB7Q,EAAQ,MAAM;AACpC,QAAI,CAACsE,EAAwB,QAAOmM;AACpC,UAAMC,IAAQD,MAAY,IAAInM,IAAyB;AACvD,WAAO,KAAK,MAAMoM,IAAQ,GAAG,IAAI;AAAA,EACnC,GAAG,CAACpM,GAAwBmM,EAAQ,CAAC,GAE/BK,KAAc9Q,EAAQ,MACrBoE,EAAY,SACV,KAAK,IAAI,GAAGA,EAAY,IAAI,CAAC2M,MAAMA,EAAE,aAAa,CAAC,IAD1B,GAE/B,CAAC3M,CAAW,CAAC,GAEV4M,KAAiBhR,EAAQ,MAAM;AACnC,UAAMiE,IAAO,IAAI,IAAI3E,EAAiB,IAAI,CAAC6O,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAU,CAAC;AACpE,WAAOvL,EACJ,IAAI,CAAC+N,MAAc1M,EAAK,IAAI0M,CAAS,CAAC,EACtC,OAAO,CAACxC,MAA8C,EAAQA,CAAE;AAAA,EACrE,GAAG,CAAC7O,GAAkBsD,CAAc,CAAC,GAE/BqO,KAAmBjR,EAAQ,MAAM;;AAErC,UAAM4P,wBAAU,IAAA;AAChB,eAAWmB,KAAK3M,GAAa;AAC3B,YAAM8M,IAAM,KAAK,IAAI,GAAGH,EAAE,gBAAgB,CAAC;AAC3C,MAAAnB,EAAI,IAAIsB,GAAK;AAAA,QACX,iBAAiBH,EAAE;AAAA,QACnB,eAAeA,EAAE;AAAA,QACjB,SAAOlb,IAAAkb,EAAE,UAAF,gBAAAlb,EAAS,WAAU,OAAOkb,EAAE,aAAa;AAAA,MAAA,CACjD;AAAA,IACH;AACA,WAAOnB;AAAA,EACT,GAAG,CAACxL,CAAW,CAAC,GAEV+M,KAAYnR,EAAQ,MAEjB,KAAK,IAAI8Q,MAAezQ,GAAa2Q,GAAe,MAAM,GAChE,CAACA,GAAe,QAAQF,IAAazQ,CAAW,CAAC,GAG9C,CAAC+Q,IAA6BC,EAA8B,IAAI9W,GAAS,EAAI,GAC7E+W,KAAwBxV,GAAOuU,CAAc;AAGnD,EAAAjT,EAAU,MAAM;AAEd,UADmBiC,KAAA,gBAAAA,EAAQ,kBAAiB,mBACzB,wBAAwB;AACzC,YAAMkS,IAAcD,GAAsB,UAAU;AAGpD,MAEED,GAFE,EAAAE,KAFclB,MAAmB,EAIC;AAAA,IAKxC;AACA,IAAAiB,GAAsB,UAAUjB;AAAA,EAClC,GAAG,CAACA,GAAgBhR,KAAA,gBAAAA,EAAQ,aAAa,CAAC;AAE1C,QAAMmS,KAAW1V,GAA8B,IAAI,GAC7C2V,KAAU3V,GAA8B,IAAI,GAC5C4V,KAAsB5V,GAA8B,IAAI,GACxD6V,KAAoB7V,GAAe+G,CAAU,GAE7C+O,KAA2B,CAACjB,MAAsB;AACtD,UAAMkB,IAAYJ,GAAQ;AAC1B,QAAI,CAACI,EAAW;AAChB,UAAMC,IAAMD,EAAU,cAA2B,sBAAsBlB,CAAS,IAAI;AACpF,QAAI,CAACmB,EAAK;AAEV,UAAMnM,IAAIkM,EAAU,sBAAA,GACdd,IAAIe,EAAI,sBAAA,GACRC,IAAU;AAEhB,QADuBhB,EAAE,OAAOpL,EAAE,MAAMoM,KAAWhB,EAAE,UAAUpL,EAAE,SAASoM,EACtD;AAEpB,UAAMC,IAAS,KAAK,IAAI,GAAGH,EAAU,eAAeA,EAAU,YAAY,GACpEI,IAAmBlB,EAAE,MAAMpL,EAAE,MAAOoL,EAAE,SAAS,GAC/CmB,IAAYL,EAAU,YAAYI,IAAkBJ,EAAU,eAAe,GAC7EM,IAAU,KAAK,IAAIH,GAAQ,KAAK,IAAI,GAAGE,CAAS,CAAC;AACvD,IAAAL,EAAU,SAAS,EAAE,KAAKM,GAAS,UAAU,UAAU;AAAA,EACzD;AAwKA,SAtKA/U,EAAU,MAAM;AACd,QAAI,CAACuR,EAAY;AACjB,UAAMyD,IAAY,CAAChC,MAAqB;AACtC,MAAIA,EAAE,QAAQ,YAAU7S,EAAA;AAAA,IAC1B;AACA,kBAAO,iBAAiB,WAAW6U,CAAS,GACrC,MAAM,OAAO,oBAAoB,WAAWA,CAAS;AAAA,EAC9D,GAAG,CAAC7U,GAAOoR,CAAU,CAAC,GAEtBvR,EAAU,MAAM;AACd,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMiV,IAAW,MAAM5F,GAAc,EAAE,OAAO,OAAO,YAAY,QAAQ,OAAO,aAAa;AAC7F,WAAA4F,EAAA,GACA,OAAO,iBAAiB,UAAUA,CAAQ,GACnC,MAAM,OAAO,oBAAoB,UAAUA,CAAQ;AAAA,EAC5D,GAAG,CAAA,CAAE,GAELjV,EAAU,MAAM;AAMd,QALI0R,EAAc,WAAW,SAC3B,OAAO,aAAaA,EAAc,OAAO,GACzCA,EAAc,UAAU,OAGtBH,GAAY;AACd,MAAAE,EAAa,EAAI;AACjB;AAAA,IACF;AAGA,IAAAC,EAAc,UAAU,OAAO,WAAW,MAAM;AAC9C,MAAAD,EAAa,EAAK,GAClBC,EAAc,UAAU;AAAA,IAC1B,GAAG,GAAG;AAAA,EACR,GAAG,CAACH,CAAU,CAAC,GAEfvR,EAAU,MACD,MAAM;AACX,IAAI0R,EAAc,WAAW,QAAM,OAAO,aAAaA,EAAc,OAAO;AAAA,EAC9E,GACC,CAAA,CAAE,GAEL1R,EAAU,MACD,MAAM;AACX,IAAI4P,GAAiB,WAAW,QAAM,OAAO,aAAaA,GAAiB,OAAO;AAAA,EACpF,GACC,CAAA,CAAE,GAEL5P,EAAU,MACD,MAAM;AACX,IAAIqQ,GAAoB,WAAW,QAAM,OAAO,aAAaA,GAAoB,OAAO;AAAA,EAC1F,GACC,CAAA,CAAE,GAELrQ,EAAU,MAAM;AAEd,QADI,CAACuR,KACD,CAAC1C,EAAc;AACnB,UAAMqG,IAAM,sBAAsB,MAAA;;AAAM,cAAAzc,IAAAwW,GAAe,YAAf,gBAAAxW,EAAwB;AAAA,KAAO;AACvE,WAAO,MAAM,qBAAqByc,CAAG;AAAA,EACvC,GAAG,CAAC3D,GAAY1C,CAAY,CAAC,GAE7B7O,EAAU,MAAM;AACd,UAAMS,IAAO8T,GAAkB;AAI/B,QAHAA,GAAkB,UAAU9O,GAGxBA,KAAchF,EAAM;AAExB,UAAMgU,IAAYH,GAAoB;AACtC,QAAI,CAACG,EAAW;AAEhB,UAAMU,IAAenO,EAAY,KAAK,CAAC2M,MAAMA,EAAE,kBAAkBlO,CAAU,GACrE2P,IAAgBpO,EAAY,KAAK,CAAC2M,MAAMA,EAAE,gBAAgBlO,CAAU,GAIpE4P,IAAYD,KAAiBD,IAAeC,EAAc,gBAAgB,IAAKA,IAAiC,OAAjB3P,IAAa;AAClH,QAAI4P,KAAa,QAAQA,IAAY,EAAG;AAExC,UAAMH,IAAM,sBAAsB,MAAM;AACtC,YAAMI,IAAKb,EAAU,cAA2B,mBAAmBY,CAAS,IAAI;AAChF,UAAI,CAACC,EAAI;AAET,YAAMC,IAAgBd,EAAU,sBAAA,GAE1Be,IADSF,EAAG,sBAAA,EACQ,QAAQC,EAAc;AAGhD,UAAIC,KAAc,EAAG;AAErB,YAAMC,IAAU,KAAK,IAAI,GAAGhB,EAAU,cAAcA,EAAU,WAAW,GACnEiB,IAAW,KAAK,IAAID,GAAS,KAAK,IAAI,GAAGhB,EAAU,aAAae,CAAU,CAAC;AACjF,MAAAf,EAAU,SAAS,EAAE,MAAMiB,GAAU,UAAU,UAAU;AAAA,IAC3D,CAAC;AAED,WAAO,MAAM,qBAAqBR,CAAG;AAAA,EACvC,GAAG,CAACzP,GAAYuB,CAAW,CAAC,GAE5BhH,EAAU,MAAM;AACd,QAAI,CAACuR,EAAY;AAEjB,UAAM9Q,IAAOoP,GAA6B;AAI1C,QAHAA,GAA6B,UAAUpK,GAGnCA,KAAchF,EAAM;AAGxB,UAAMkV,IAAU3O,EAAY,KAAK,CAAC2M,MAAMA,EAAE,kBAAkBlO,CAAU;AACtE,IAAKkQ,MAGLzF;AAAA,MACErT,EAAE,wCAAwC;AAAA,QACxC,UAAU4T,GAAiBkF,EAAQ,eAAe;AAAA,MAAA,CACnD;AAAA,IAAA,GAEH3F,GAAkB,CAAC4F,MAAMA,IAAI,CAAC,GAC9BxF,GAAuB,EAAI,GACvBC,GAAoB,WAAW,QAAM,OAAO,aAAaA,GAAoB,OAAO,GACxFA,GAAoB,UAAU,OAAO,WAAW,MAAM;AACpD,MAAAD,GAAuB,EAAK,GAC5BC,GAAoB,UAAU;AAAA,IAChC,GAAGC,EAAqB;AAAA,EAC1B,GAAG,CAAC7K,GAAY8L,GAAYvK,CAAW,CAAC,GAExChH,EAAU,MAAM;AAGd,QAFI,CAACuR,KACD,CAACpB,MACD,CAACF,GAAiB;AAGtB,UAAMiF,IAAM,sBAAsB,MAAM;;AACtC,YAAMW,IAAS1G,GAAmB,SAC5B2G,IAAOD,KAAA,gBAAAA,EAAQ,yBAGfE,KAAYtd,IAAA2b,GAAS,YAAT,gBAAA3b,EAAkB,yBAC9Bud,IAAUF,IAAOA,EAAK,OAAOA,EAAK,QAAQ,IAAIC,IAAYA,EAAU,OAAOA,EAAU,QAAQ,IAAI,OAAO,aAAa,GACrHE,IAAUH,IAAOA,EAAK,MAAMA,EAAK,SAAS,IAAIC,IAAYA,EAAU,MAAMA,EAAU,SAAS,IAAI,OAAO,cAAc,GAEtH3U,IAAS;AAAA,QACb,GAAG4U,IAAU;AAAA,QACb,GAAGC,IAAU;AAAA,QACb,GAAG;AAAA,QACH,GAAG;AAAA,MAAA;AAGL,MAAAxG,GAAkBrO,CAAM,GACxBmO,GAAe,CAACqG,MAAMA,IAAI,CAAC,GAC3BjG,GAAoB,EAAI,GAEpBC,GAAiB,WAAW,QAAM,OAAO,aAAaA,GAAiB,OAAO,GAClFA,GAAiB,UAAU,OAAO,WAAW,MAAM;AACjD,QAAAD,GAAoB,EAAK,GACzBC,GAAiB,UAAU;AAAA,MAC7B,GAAGE,EAAgB;AAAA,IACrB,CAAC;AAED,WAAO,MAAM,qBAAqBoF,CAAG;AAAA,EACvC,GAAG,CAACnF,IAAgBE,IAAiBH,IAAkBK,IAAqBoB,CAAU,CAAC,GAEvFvR,EAAU,MAAM;;AACd,IAAKuR,OACL9Y,IAAA2b,GAAS,YAAT,QAAA3b,EAAkB;AAAA,EACpB,GAAG,CAAC8Y,CAAU,CAAC,GAEVC,IAGH,gBAAA0E;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,cAAYrZ,EAAE,oBAAoB;AAAA,MAClC,WAAW,CAAC7C,EAAO,UAAUuX,IAAavX,EAAO,eAAeA,EAAO,gBAAgBkC,EAAM,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAChI,aAAa,CAAC8W,MAAM;AAClB,QAAIA,EAAE,WAAWA,EAAE,iBAAe7S,EAAA;AAAA,MACpC;AAAA,MAEC,UAAA;AAAA,QAAAuP,MAAoBF,MAAkBJ,GAAW,QAAQ,KAAKA,GAAW,SAAS,IACjF,gBAAArH;AAAA,UAACsD;AAAAA,UAAA;AAAA,YAEC,OAAO+D,GAAW;AAAA,YAClB,QAAQA,GAAW;AAAA,YACnB,gBAAAI;AAAA,YACA,QAAQgB;AAAA,YACR,SAAS;AAAA,YACT,gBAAgB;AAAA,YAChB,eAAe;AAAA,YACf,SAAS;AAAA,YACT,kBAAkB,EAAE,KAAK,KAAK,KAAK,IAAA;AAAA,YACnC,kBAAkB,EAAE,KAAK,IAAI,KAAK,EAAA;AAAA,YAClC,OAAO,EAAE,UAAU,SAAS,OAAO,GAAG,eAAe,QAAQ,QAAQ,WAAA;AAAA,UAAW;AAAA,UAX3ElB;AAAA,QAAA,IAaL;AAAA,QACJ,gBAAA4G,EAAC,WAAM,KAAK9B,IAAU,WAAW,CAACpa,EAAO,OAAOuX,IAAavX,EAAO,YAAYA,EAAO,WAAW,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,UAAU,IACtI,UAAA;AAAA,UAAAmW,MAAuBF,KACtB,gBAAAlI,EAAC,OAAA,EAAI,WAAW/N,EAAO,oBAAoB,eAAY,QACrD,UAAA,gBAAA+N,EAAC,OAAA,EAAyB,KAAKoH,IAAoB,WAAWnV,EAAO,iBAClE,UAAAiW,GAAA,GADOF,EAEV,GACF,IACE;AAAA,4BACH,UAAA,EAAO,WAAW,CAAC/V,EAAO,QAAQ6U,IAAe7U,EAAO,mBAAmB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACxG,UAAA;AAAA,YAAA,gBAAA+N;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAW/N,EAAO;AAAA,gBAClB,cAA2B6C,EAAfgS,IAAiB,2BAA8B,eAAN;AAAA,gBACrD,iBAAeA;AAAA,gBACf,SAAS,MAAM;AACb,kBAAAC,EAAgB,EAAI;AAAA,gBACtB;AAAA,gBAEA,UAAA,gBAAA/G,EAAC2G,IAAA,EAAO,MAAM,IAAI,eAAY,OAAA,CAAO;AAAA,cAAA;AAAA,YAAA;AAAA,YAGvC,gBAAAwH,EAAC,OAAA,EAAI,WAAWlc,EAAO,cACrB,UAAA;AAAA,cAAA,gBAAA+N,EAAC,OAAA,EAAI,WAAW/N,EAAO,iBAAiB,eAAa6U,GACnD,UAAA,gBAAA9G,EAAC,MAAA,EAAG,WAAW/N,EAAO,OAAQ,UAAAE,GAAA,CAAM,GACtC;AAAA,cAEA,gBAAA6N,EAAC,OAAA,EAAI,WAAW/N,EAAO,kBAAkB,eAAa,CAAC6U,GACrD,UAAA,gBAAAqH,EAAC,OAAA,EAAI,WAAWlc,EAAO,WACrB,UAAA;AAAA,gBAAA,gBAAA+N;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,KAAKkH;AAAA,oBACL,WAAWjV,EAAO;AAAA,oBAClB,MAAK;AAAA,oBACL,OAAO+U;AAAA,oBACP,aAAalS,EAAE,2BAA2B;AAAA,oBAC1C,UAAU,CAACmW,MAAMhE,GAAegE,EAAE,OAAO,KAAK;AAAA,oBAC9C,QAAQ,MAAM;AACZ,sBAAIjE,GAAY,KAAA,MAAW,QAAoB,EAAK;AAAA,oBACtD;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEDA,GAAY,SACX,gBAAAhH;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAW/N,EAAO;AAAA,oBAClB,aAAa,CAACgZ,MAAM;AAElB,sBAAAA,EAAE,eAAA;AAAA,oBACJ;AAAA,oBACA,SAAS,MAAM;;AACb,sBAAAhE,GAAe,EAAE,IACjBvW,IAAAwW,GAAe,YAAf,QAAAxW,EAAwB;AAAA,oBAC1B;AAAA,oBACA,cAAYoE,EAAE,qBAAqB;AAAA,oBAElC,YAAE,qBAAqB;AAAA,kBAAA;AAAA,gBAAA,IAExB;AAAA,cAAA,EAAA,CACN,EAAA,CACF;AAAA,YAAA,GACF;AAAA,YAEA,gBAAAkL,EAAC,UAAA,EAAO,MAAK,UAAS,SAAS5H,GAAO,UAAU/C,GAAY,WAAWpD,EAAO,aAAa,cAAY6C,EAAE,cAAc,GAAG,UAAA,IAAA,CAE1H;AAAA,UAAA,GACF;AAAA,4BAEC,OAAA,EAAI,WAAW7C,EAAO,MAAM,KAAKqa,IAC/B,UAAA;AAAA,YAAAlS,IAAU,gBAAA4F,EAAC,OAAE,WAAW/N,EAAO,OAAQ,UAAA6C,EAAE,gBAAgB,GAAE,IAAO;AAAA,YAClEpF,IAAQ,gBAAAsQ,EAAC,KAAA,EAAE,WAAW/N,EAAO,OAAQ,aAAM,IAAO;AAAA,YAEnD,gBAAA+N,EAAC,OAAA,EAAI,WAAW/N,EAAO,UACpB,UAAA,CAACmI,KAAW,CAAC1K,KAASyK,EAAiB,WAAW,sBAChD,KAAA,EAAE,WAAWlI,EAAO,YAAa,UAAA6C,EAAE,cAAc,EAAA,CAAE,IAClDwV,IACF,gBAAAtK,EAAC,MAAA,EAAG,WAAW/N,EAAO,aACnB,UAAAqY,EAAgB,IAAI,CAACK,MAAU;;AAC9B,oBAAMyD,MAAe1d,IAAAia,EAAM,SAAS,KAAK,CAAC3B;;AAAM,wBAAAtY,IAAAsY,EAAE,UAAF,gBAAAtY,EAAS;AAAA,eAAG,MAAvC,gBAAAA,EAA0C,UAAS,MAClE2d,IAAsB1D,EAAM,SAAS,SAAS,GAC9C2D,IAAezD,MAAsBF,EAAM,WAC3C4D,IAAmB5D,EAAM,SAAS,OAAO,CAAC3B,OAAOxL,GAAWwL,EAAE,EAAE,KAAK,KAAK,CAAC;AAGjF,kBAAI,CAACqF,GAAqB;AACxB,sBAAMrF,IAAI2B,EAAM,SAAS,CAAC;AAC1B,oBAAI,CAAC3B,EAAG,QAAO;AACf,sBAAMyC,IAAMjO,GAAWwL,EAAE,EAAE,KAAK,GAC1BwF,IAAcnF,GAAoBL,CAAC,GACnCyF,IAASlR,GAAgCyL,EAAE,EAAE,GAC7C0F,IAAkBD,KAAiB,OAAO,mBAC1CE,KAAYlD,KAAOiD,GACnBE,KAAgB5F,EAAE,qBAAqB,IACvC6F,IAAc,CAACD,MAAiB,CAAC/E,KAAqB,CAAC8E,IACvDG,IAAa,CAACF,MAAiBD,KAAY7Z,EAAE,0BAA0B,IAAI,MAC3Eia,IAAY,OAAO/F,EAAE,KAAK,GAC1BgG,KAAc7P,KAA0B,QAAQ,OAAO,SAASA,CAAsB,KAAKA,IAAyB,KAAK,OAAO,SAAS4P,CAAS,GAClJ1P,KAAkB2P,KAAc,KAAK,MAAMD,KAAa,IAAI5P,IAA0B,OAAO,GAAG,IAAI,MAAM,MAC1G8P,KAAuB3V,IAAA0P,EAAE,UAAF,gBAAA1P,EAAS,QAChC4V,KAAavG,GAAqBK,EAAE,eAAe,MACnDiG,KAAwBA,EAAqB,YAAA,MAAkB,kBAAkBA,IAAuB;AAC9G,yCACG,MAAA,EAAyB,WAAW,CAAChd,EAAO,YAAY2c,KAAgB3c,EAAO,oBAAoB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,oBAAkB+W,EAAE,IACvJ,UAAA;AAAA,kBAAA,gBAAAmF,EAAC,OAAA,EAAI,WAAWlc,EAAO,aACrB,UAAA;AAAA,oBAAA,gBAAA+N,EAAC,SAAI,WAAW/N,EAAO,cAAc,eAAY,QAC9C,UAAAmc,KAAA,QAAAA,EAAc,MAAM,gBAAApO,EAAC,OAAA,EAAI,WAAW/N,EAAO,iBAAiB,KAAKmc,EAAa,KAAK,KAAKA,EAAa,WAAWzD,EAAM,cAAc,SAAQ,OAAA,CAAO,IAAK,gBAAA3K,EAAC,OAAA,EAAI,WAAW/N,EAAO,sBAAuB,UAAA0Y,EAAM,aAAa,MAAM,GAAG,CAAC,EAAE,YAAA,KAAiB,KAAI,GAC7P;AAAA,oBACA,gBAAAwD,EAAC,OAAA,EAAI,WAAWlc,EAAO,aACrB,UAAA;AAAA,sBAAA,gBAAA+N,EAAC,OAAA,EAAI,WAAW/N,EAAO,aAAc,YAAM,cAAa;AAAA,sBACvDid,KAAa,gBAAAlP,EAAC,OAAA,EAAI,WAAW/N,EAAO,aAAc,cAAW,IAAS;AAAA,sBACvE,gBAAAkc,EAAC,OAAA,EAAI,WAAWlc,EAAO,iBACpB,UAAA;AAAA,wBAAA+c,KAAc,gBAAAhP,EAAC,QAAA,EAAK,WAAW/N,EAAO,kBAAmB,UAAA2X,EAAYmF,EAAU,QAAQ,CAAC,CAAC,EAAA,CAAE,IAAU;AAAA,0CACrG,QAAA,EAAK,WAAW9c,EAAO,cAAe,YAAYoN,MAAmB,OAAOA,GAAgB,QAAQ,CAAC,IAAI0P,EAAU,QAAQ,CAAC,CAAC,EAAA,CAAE;AAAA,sBAAA,EAAA,CAClI;AAAA,oBAAA,EAAA,CACF;AAAA,kBAAA,GACF;AAAA,kBACCH,KACC,gBAAA5O,EAAC,OAAA,EAAI,WAAW/N,EAAO,kBAAkB,UAAA,gBAAA+N,EAAC,QAAA,EAAK,WAAW/N,EAAO,SAAS,cAAY6C,EAAE,wBAAwB,EAAE,MAAM0Z,GAAa,GAAI,UAAA1Z,EAAE,uBAAuB,EAAA,CAAE,EAAA,CAAO,IACzK2W,KAAO,KAAKiD,KAAmB,IACjC,gBAAA1O,EAAC,OAAA,EAAI,WAAW/N,EAAO,qBAAqB,4BAAC,QAAA,EAAK,WAAWA,EAAO,kBAAmB,UAAA6C,EAAE,wBAAwB,GAAE,GAAO,IACxH2W,KAAO,IACT,gBAAAzL,EAAC,YAAO,MAAK,UAAS,SAAS,MAAM8J,EAAiBd,GAAG,CAAC,GAAG,UAAU3T,KAAc,CAACwZ,GAAa,WAAW5c,EAAO,mBAAmB,cAAY6C,EAAE,6BAA6B,EAAE,MAAM0Z,EAAA,CAAa,GACrM,UAAA1Z,EAAE,0BAA0B,EAAA,CAC/B,sBAEC,OAAA,EAAI,WAAW7C,EAAO,iBACrB,UAAA;AAAA,oBAAA,gBAAAkc,EAAC,OAAA,EAAI,WAAWlc,EAAO,aACrB,UAAA;AAAA,sBAAA,gBAAA+N,EAAC,UAAA,EAAO,MAAK,UAAS,SAAS,MAAMtE,GAAYsN,EAAE,IAAIyC,IAAM,CAAC,GAAG,UAAUpW,KAAcoW,KAAO,GAAG,WAAWxZ,EAAO,WAAW,cAAY6C,EAAE,wBAAwB,EAAE,MAAM0Z,EAAA,CAAa,GAAG,UAAA,IAAA,CAAC;AAAA,sBAC/L,gBAAAxO,EAAC,QAAA,EAAK,WAAW/N,EAAO,UAAU,cAAY6C,EAAE,wBAAwB,EAAE,MAAM0Z,GAAa,KAAA/C,EAAA,CAAK,GAAI,UAAAA,GAAI;AAAA,sBAC1G,gBAAAzL,EAAC,UAAA,EAAO,MAAK,UAAS,SAAS,MAAM8J,EAAiBd,GAAGyC,IAAM,CAAC,GAAG,UAAUpW,KAAc,CAACwZ,GAAa,WAAW5c,EAAO,WAAW,cAAY6c,IAAa,GAAGN,CAAW,IAAIM,EAAW,YAAA,CAAa,KAAKha,EAAE,wBAAwB,EAAE,MAAM0Z,EAAA,CAAa,GAAG,UAAA,IAAA,CAAC;AAAA,oBAAA,GACnQ;AAAA,oBACCM,IAAa,gBAAA9O,EAAC,OAAA,EAAI,WAAW/N,EAAO,kBAAmB,aAAW,IAAS;AAAA,kBAAA,EAAA,CAC9E;AAAA,gBAAA,EAAA,GA9BK0Y,EAAM,SAgCf;AAAA,cAEJ;AAGA,qBACE,gBAAAwD,EAAC,QAAyB,KAAKG,IAAevD,KAAY,MAAM,WAAW9Y,EAAO,oBAEhF,UAAA;AAAA,gBAAA,gBAAAkc,EAAC,SAAI,WAAWlc,EAAO,YAAY,oBAAkB0Y,EAAM,WACzD,UAAA;AAAA,kBAAA,gBAAAwD,EAAC,OAAA,EAAI,WAAWlc,EAAO,aACrB,UAAA;AAAA,oBAAA,gBAAA+N,EAAC,SAAI,WAAW/N,EAAO,cAAc,eAAY,QAC9C,UAAAmc,KAAA,QAAAA,EAAc,MAAM,gBAAApO,EAAC,OAAA,EAAI,WAAW/N,EAAO,iBAAiB,KAAKmc,EAAa,KAAK,KAAKA,EAAa,WAAWzD,EAAM,cAAc,SAAQ,OAAA,CAAO,IAAK,gBAAA3K,EAAC,OAAA,EAAI,WAAW/N,EAAO,sBAAuB,UAAA0Y,EAAM,aAAa,MAAM,GAAG,CAAC,EAAE,YAAA,KAAiB,KAAI,GAC7P;AAAA,oBACA,gBAAA3K,EAAC,OAAA,EAAI,WAAW/N,EAAO,aACrB,UAAA,gBAAA+N,EAAC,OAAA,EAAI,WAAW/N,EAAO,aAAc,UAAA0Y,EAAM,aAAA,CAAa,EAAA,CAC1D;AAAA,kBAAA,GACF;AAAA,kBACA,gBAAAwD;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAW,CAAClc,EAAO,mBAAmBA,EAAO,YAAY,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,sBACnF,iBAAeqc;AAAA,sBACf,UAAUjZ;AAAA,sBACV,aAAa,CAAC4V,MAAMA,EAAE,gBAAA;AAAA,sBACtB,SAAS,MAAMH,GAAqB,CAACpS,MAASA,MAASiS,EAAM,YAAY,OAAOA,EAAM,SAAS;AAAA,sBAE9F,UAAA;AAAA,wBAAA7V,EAAE,uBAAuB;AAAA,wBAC1B,gBAAAkL,EAACyG,MAAY,MAAM,IAAI,aAAa,KAAK,WAAW,CAACxU,EAAO,qBAAqBqc,IAAerc,EAAO,0BAA0B,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAAA,CAAG;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACpK,GACF;AAAA,gBAGCqc,KACC,gBAAAtO,EAAC,OAAA,EAAI,WAAW/N,EAAO,eACpB,UAAA0Y,EAAM,iBAAiB,IAAI,CAAC3B,MAAM;AACjC,wBAAMyF,IAASlR,GAAgCyL,EAAE,EAAE,GAC7CmG,KAAqB3R,GAAWwL,EAAE,EAAE,KAAK,KAAK,GAC9CoG,IAAYpG,EAAE,qBAAqB,IACnCqG,IAAaZ,KAAU,QAAQA,KAAU,GACzCa,KAAe,CAACH,KAAqBtF,GACrC0F,KACJla,KACG+Z,KACAC,KACAC,IAECE,IAAcJ,IAChBta,EAAE,uBAAuB,IACzBua,IACEva,EAAE,wBAAwB,IAC1Bwa,KACAxa,EAAE,0BAA0B,IAC5B,MACA2a,IAAcnG,GAAsBN,CAAC,GACrC+F,IAAY,OAAO/F,EAAE,KAAK,GAC1BgG,KAAc7P,KAA0B,QAAQ,OAAO,SAASA,CAAsB,KAAKA,IAAyB,KAAK,OAAO,SAAS4P,CAAS,GAClJ1P,KAAkB2P,KAAc,KAAK,MAAMD,KAAa,IAAI5P,IAA0B,OAAO,GAAG,IAAI,MAAM;AAChH,yBACE,gBAAAgP;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBAEC,MAAK;AAAA,sBACL,UAAUoB;AAAA,sBACV,WAAW,CAACtd,EAAO,kBAAkBkd,IAAoBld,EAAO,2BAA2B,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,sBACzH,SAAS,MAAM;AACb,4BAAI,CAACkd,GAAmB;AACtB,8BAAI5F,GAAuB;AACzB,4BAAAO,EAAiBd,GAAG,CAAC,GACrB8B,GAAqB,IAAI;AACzB;AAAA,0BACF;AACA,0BAAAhB,EAAiBd,GAAG,CAAC;AAAA,wBACvB;AACA,wBAAA8B,GAAqB,IAAI;AAAA,sBAC3B;AAAA,sBAEA,UAAA;AAAA,wBAAA,gBAAA9K,EAAC,QAAA,EAAK,WAAW/N,EAAO,oBAAqB,UAAAwd,GAAY;AAAA,wBACzD,gBAAAzP,EAAC,QAAA,EAAK,WAAW/N,EAAO,yBACrB,UAAAud,IACC,gBAAAxP,EAAC,QAAA,EAAK,WAAW/N,EAAO,sBAAuB,UAAAud,EAAA,CAAY,IAE3D,gBAAArB,EAAAuB,IAAA,EACG,UAAA;AAAA,0BAAAV,KAAc,gBAAAhP,EAAC,QAAA,EAAK,WAAW/N,EAAO,wBAAyB,UAAA2X,EAAYmF,EAAU,QAAQ,CAAC,CAAC,EAAA,CAAE,IAAU;AAAA,4CAC3G,QAAA,EAAK,WAAW9c,EAAO,oBAAqB,YAAYoN,MAAmB,OAAOA,GAAgB,QAAQ,CAAC,IAAI0P,EAAU,QAAQ,CAAC,CAAC,EAAA,CAAE;AAAA,wBAAA,EAAA,CACxI,EAAA,CAEJ;AAAA,wBACCI,sBAAqB,QAAA,EAAK,WAAWld,EAAO,oBAAoB,eAAY,QAAO,UAAA,IAAA,CAAC,IAAU;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBA3B1F+W,EAAE;AAAA,kBAAA;AAAA,gBA8Bb,CAAC,EAAA,CACH;AAAA,gBAIDuF,EAAiB,SAAS,KACzB,gBAAAvO,EAAC,OAAA,EAAI,WAAW/N,EAAO,oBACpB,UAAAsc,EAAiB,IAAI,CAACvF,MAAM;AAC3B,wBAAMyC,IAAMjO,GAAWwL,EAAE,EAAE,KAAK,GAC1BwF,IAAcnF,GAAoBL,CAAC,GACnCyF,IAASlR,GAAgCyL,EAAE,EAAE,GAC7C0F,IAAkBD,KAAiB,OAAO,mBAC1CE,KAAYlD,KAAOiD,GACnBG,KAAc7F,EAAE,qBAAqB,MAAS,CAACa,KAAqB,CAAC8E,IACrEG,IAAa9F,EAAE,qBAAqB,MAAS2F,KAAY7Z,EAAE,0BAA0B,IAAI,MACzFia,IAAY,OAAO/F,EAAE,KAAK,GAC1BgG,IAAc7P,KAA0B,QAAQ,OAAO,SAASA,CAAsB,KAAKA,IAAyB,KAAK,OAAO,SAAS4P,CAAS,GAClJ1P,KAAkB2P,IAAc,KAAK,MAAMD,KAAa,IAAI5P,IAA0B,OAAO,GAAG,IAAI,MAAM,MAC1GsQ,KAAcnG,GAAsBN,CAAC;AAC3C,2CACG,OAAA,EAAe,WAAW/W,EAAO,cAAc,oBAAkB+W,EAAE,IAClE,UAAA;AAAA,oBAAA,gBAAAmF,EAAC,OAAA,EAAI,WAAWlc,EAAO,kBACrB,UAAA;AAAA,sBAAA,gBAAA+N,EAAC,QAAA,EAAK,WAAW/N,EAAO,kBAAmB,UAAAwd,IAAY;AAAA,sBACvD,gBAAAtB,EAAC,OAAA,EAAI,WAAWlc,EAAO,iBACpB,UAAA;AAAA,wBAAA+c,IAAc,gBAAAhP,EAAC,QAAA,EAAK,WAAW/N,EAAO,kBAAmB,UAAA2X,EAAYmF,EAAU,QAAQ,CAAC,CAAC,EAAA,CAAE,IAAU;AAAA,0CACrG,QAAA,EAAK,WAAW9c,EAAO,cAAe,YAAYoN,MAAmB,OAAOA,GAAgB,QAAQ,CAAC,IAAI0P,EAAU,QAAQ,CAAC,CAAC,EAAA,CAAE;AAAA,sBAAA,EAAA,CAClI;AAAA,oBAAA,GACF;AAAA,oBACA,gBAAAZ,EAAC,OAAA,EAAI,WAAWlc,EAAO,iBACrB,UAAA;AAAA,sBAAA,gBAAAkc,EAAC,OAAA,EAAI,WAAWlc,EAAO,aACrB,UAAA;AAAA,wBAAA,gBAAA+N,EAAC,UAAA,EAAO,MAAK,UAAS,SAAS,MAAMtE,GAAYsN,EAAE,IAAIyC,IAAM,CAAC,GAAG,UAAUpW,KAAcoW,KAAO,GAAG,WAAWxZ,EAAO,WAAW,cAAY6C,EAAE,wBAAwB,EAAE,MAAM0Z,EAAA,CAAa,GAAG,UAAA,IAAA,CAAC;AAAA,wBAC/L,gBAAAxO,EAAC,QAAA,EAAK,WAAW/N,EAAO,UAAU,cAAY6C,EAAE,wBAAwB,EAAE,MAAM0Z,GAAa,KAAA/C,EAAA,CAAK,GAAI,UAAAA,GAAI;AAAA,wBAC1G,gBAAAzL,EAAC,UAAA,EAAO,MAAK,UAAS,SAAS,MAAM8J,EAAiBd,GAAGyC,IAAM,CAAC,GAAG,UAAUpW,KAAc,CAACwZ,IAAa,WAAW5c,EAAO,WAAW,cAAY6c,IAAa,GAAGN,CAAW,IAAIM,EAAW,YAAA,CAAa,KAAKha,EAAE,wBAAwB,EAAE,MAAM0Z,EAAA,CAAa,GAAG,UAAA,IAAA,CAAC;AAAA,sBAAA,GACnQ;AAAA,sBACCM,IAAa,gBAAA9O,EAAC,OAAA,EAAI,WAAW/N,EAAO,kBAAmB,aAAW,IAAS;AAAA,oBAAA,EAAA,CAC9E;AAAA,kBAAA,EAAA,GAfQ+W,EAAE,EAgBZ;AAAA,gBAEJ,CAAC,EAAA,CACH;AAAA,cAAA,EAAA,GAzHK2B,EAAM,SA2Hf;AAAA,YAEJ,CAAC,EAAA,CACH,IAEA,gBAAA3K,EAAC,MAAA,EAAG,WAAW/N,EAAO,aACnB,UAAAgY,GAAiB,IAAI,CAACjB,MAAM;;AAC3B,oBAAMyC,IAAMjO,GAAWwL,EAAE,EAAE,KAAK,GAC1B2G,IAAqB5G,GAAsBC,CAAC,GAC5C4G,IAAoBjH,GAAqBK,EAAE,eAAe,GAC1DwF,IAAcnF,GAAoBL,CAAC,GACnC6G,IAAwBtS,GAAgCyL,EAAE,EAAE,GAC5D8G,IAAkCD,KACpC,OAAO,mBAELE,IAAwBtE,KAAOqE,GAC/BE,IAAsBhH,EAAE,qBAAqB,MAAS,CAACa,KAAqB,CAACkG,GAC7EE,IACJjH,EAAE,qBAAqB,KACnB,OACA+G,IACEjb,EAAE,0BAA0B,IAC5B,MAGFob,IAAuB/Q,GACvBgR,IAAsB,OAAOnH,EAAE,KAAK,GACpCgG,KACJkB,KAAwB,QACxB,OAAO,SAASA,CAAoB,KACpCA,IAAuB,KACvB,OAAO,SAASC,CAAmB,GAC/BC,KAAwBpB,KAC1B,KAAK,MAAMmB,KAAuB,IAAID,IAAuB,OAAO,GAAG,IAAI,MAC3E;AAEJ,qBACE,gBAAA/B;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAW,CAAClc,EAAO,YAAY+W,EAAE,qBAAqB,MAAS/W,EAAO,iBAAiB,EACpF,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,kBACX,oBAAkB+W,EAAE;AAAA,kBAEpB,UAAA;AAAA,oBAAA,gBAAAmF,EAAC,OAAA,EAAI,WAAWlc,EAAO,aACrB,UAAA;AAAA,sBAAA,gBAAA+N,EAAC,OAAA,EAAI,WAAW/N,EAAO,cAAc,eAAY,QAC9C,WAAAvB,IAAAsY,EAAE,UAAF,QAAAtY,EAAS,MACR,gBAAAsP;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAW/N,EAAO;AAAA,0BAClB,KAAK+W,EAAE,MAAM;AAAA,0BACb,KAAKA,EAAE,MAAM,WAAWwF;AAAA,0BACxB,SAAQ;AAAA,wBAAA;AAAA,sBAAA,IAGV,gBAAAxO,EAAC,OAAA,EAAI,WAAW/N,EAAO,sBAAuB,YAAAmX,MAAAnL,KAAA3E,IAAA0P,EAAE,YAAF,gBAAA1P,EAAW,UAAX,gBAAA2E,EAAkB,MAAM,GAAG,OAA3B,gBAAAmL,GAA+B,kBAAiB,KAAI,GAEtG;AAAA,sBAEA,gBAAA+E,EAAC,OAAA,EAAI,WAAWlc,EAAO,aACrB,UAAA;AAAA,wBAAA,gBAAA+N,EAAC,OAAA,EAAI,WAAW/N,EAAO,aAAc,UAAA0d,GAAmB;AAAA,wBACvDC,IAAoB,gBAAA5P,EAAC,OAAA,EAAI,WAAW/N,EAAO,aAAc,aAAkB,IAAS;AAAA,wBACrF,gBAAAkc,EAAC,OAAA,EAAI,WAAWlc,EAAO,iBACpB,UAAA;AAAA,0BAAA+c,uBACE,QAAA,EAAK,WAAW/c,EAAO,kBACrB,YAAY,OAAO,SAASke,CAAmB,IAAIA,EAAoB,QAAQ,CAAC,IAAInH,EAAE,KAAK,GAC9F,IACE;AAAA,0BACJ,gBAAAhJ,EAAC,QAAA,EAAK,WAAW/N,EAAO,cACrB,UAAA2X;AAAA,4BACCwG,MAAyB,OACrBA,GAAsB,QAAQ,CAAC,IAC/B,OAAO,SAASD,CAAmB,IACjCA,EAAoB,QAAQ,CAAC,IAC7BnH,EAAE;AAAA,0BAAA,EACV,CACF;AAAA,wBAAA,EAAA,CACF;AAAA,sBAAA,EAAA,CACF;AAAA,oBAAA,GACF;AAAA,oBACCA,EAAE,qBAAqB,KACtB,gBAAAhJ,EAAC,OAAA,EAAI,WAAW/N,EAAO,kBACrB,UAAA,gBAAA+N,EAAC,QAAA,EAAK,WAAW/N,EAAO,SAAS,cAAY6C,EAAE,wBAAwB,EAAE,MAAM0Z,EAAA,CAAa,GACzF,UAAA1Z,EAAE,uBAAuB,EAAA,CAC5B,EAAA,CACF,IACE2W,KAAO,KAAKqE,KAAmC,IACjD,gBAAA9P,EAAC,OAAA,EAAI,WAAW/N,EAAO,qBACrB,UAAA,gBAAA+N,EAAC,QAAA,EAAK,WAAW/N,EAAO,kBAAkB,cAAY6C,EAAE,sCAAsC,EAAE,MAAM0Z,EAAA,CAAa,GAChH,UAAA1Z,EAAE,wBAAwB,EAAA,CAC7B,EAAA,CACF,IACE2W,KAAO,IACT,gBAAAzL;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM8J,EAAiBd,GAAG,CAAC;AAAA,wBACpC,UAAU3T,KAAc,CAAC2a;AAAA,wBACzB,WAAW/d,EAAO;AAAA,wBAClB,cAAYge,IAAmB,GAAGzB,CAAW,IAAIyB,EAAiB,aAAa,KAAKnb,EAAE,6BAA6B,EAAE,MAAM0Z,GAAa;AAAA,wBAEvI,YAAE,0BAA0B;AAAA,sBAAA;AAAA,oBAAA,IAG/B,gBAAAL,EAAC,OAAA,EAAI,WAAWlc,EAAO,iBACrB,UAAA;AAAA,sBAAA,gBAAAkc,EAAC,OAAA,EAAI,WAAWlc,EAAO,aACrB,UAAA;AAAA,wBAAA,gBAAA+N;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,MAAK;AAAA,4BACL,SAAS,MAAMtE,GAAYsN,EAAE,IAAIyC,IAAM,CAAC;AAAA,4BACxC,UAAUpW,KAAcoW,KAAO;AAAA,4BAC/B,WAAWxZ,EAAO;AAAA,4BAClB,cAAY6C,EAAE,wBAAwB,EAAE,MAAM0Z,GAAa;AAAA,4BAC5D,UAAA;AAAA,0BAAA;AAAA,wBAAA;AAAA,wBAGD,gBAAAxO,EAAC,QAAA,EAAK,WAAW/N,EAAO,UAAU,cAAY6C,EAAE,wBAAwB,EAAE,MAAM0Z,GAAa,KAAA/C,EAAA,CAAK,GAC/F,UAAAA,GACH;AAAA,wBACA,gBAAAzL;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,MAAK;AAAA,4BACL,SAAS,MAAM8J,EAAiBd,GAAGyC,IAAM,CAAC;AAAA,4BAC1C,UAAUpW,KAAc,CAAC2a;AAAA,4BACzB,WAAW/d,EAAO;AAAA,4BAClB,cAAYge,IAAmB,GAAGzB,CAAW,IAAIyB,EAAiB,aAAa,KAAKnb,EAAE,wBAAwB,EAAE,MAAM0Z,GAAa;AAAA,4BACpI,UAAA;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBAED,GACF;AAAA,sBACCyB,IAAmB,gBAAAjQ,EAAC,OAAA,EAAI,WAAW/N,EAAO,kBAAmB,aAAiB,IAAS;AAAA,oBAAA,EAAA,CAC1F;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAzFG+W,EAAE;AAAA,cAAA;AAAA,YA6Fb,CAAC,GACH,EAAA,CAEJ;AAAA,UAAA,GACF;AAAA,4BAEC,UAAA,EAAO,WAAW/W,EAAO,QAAQ,KAAKkV,IACrC,UAAA;AAAA,YAAA,gBAAAnH,EAAC,OAAA,EAAI,WAAW/N,EAAO,kBAAkB,KAAKsa,IAC5C,UAAA,gBAAAvM,EAAC,OAAA,EAAI,WAAW/N,EAAO,eAAe,cAAW,sBAC9C,UAAA,MAAM,KAAK,EAAE,QAAQ+Z,GAAA,CAAW,EAAE,IAAI,CAACqE,GAAGtE,MAAQ;;AACjD,oBAAMjd,IAAU+c,GAAeE,CAAG,GAC5BuE,IAAYxE,GAAiB,IAAIC,CAAG,GACpCwE,IAAW,EAAQzhB,GAGnB0hB,IAAc,EAAQF,GACtBG,IAAgBD,KAAe,CAACD,GAChCG,IAAeJ,IACjBxb,EAAE,6BAA6B,EAAE,UAAU4T,GAAiB4H,EAAU,eAAe,EAAA,CAAG,IACxF,MAEEK,IAAYJ,IAAWzhB,EAAS,cAAcgG,EAAE,eAAe,EAAE,MAAMiX,IAAM,GAAG;AAEtF,uCACG,OAAA,EAAc,iBAAeA,GAAK,WAAW9Z,EAAO,SACnD,UAAA;AAAA,gBAAA,gBAAA+N;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW;AAAA,sBACT/N,EAAO;AAAA,sBACPse,IAAWte,EAAO,gBAAgBA,EAAO;AAAA,sBACzCue,IAAcve,EAAO,mBAAmB;AAAA,sBACxCse,IAAWte,EAAO,mBAAmB;AAAA,oBAAA,EAEpC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,oBACX,MAAMse,IAAW,WAAW;AAAA,oBAC5B,UAAUA,IAAW,IAAI;AAAA,oBACzB,SAASA,IAAW,MAAM9D,GAAyB3d,EAAS,EAAE,IAAI;AAAA,oBAClE,WACEyhB,IACI,CAACtF,OAAM;AACP,uBAAIA,GAAE,QAAQ,WAAWA,GAAE,QAAQ,SACjCA,GAAE,eAAA,GACFwB,GAAyB3d,EAAS,EAAE;AAAA,oBAExC,IACE;AAAA,oBAEN,cAAY2hB,KAAiBC,IAAe,GAAGC,CAAS,KAAK7b,EAAE,kBAAkB,EAAE,UAAU4b,EAAA,CAAc,CAAC,MAAMC;AAAA,oBAClH,OAAOF,KAAiBC,IAAe,GAAGC,CAAS,MAAM7b,EAAE,kBAAkB,EAAE,UAAU4b,EAAA,CAAc,CAAC,KAAKC;AAAA,oBAE5G,UAAAJ,KACC7f,IAAA5B,EAAS,UAAT,QAAA4B,EAAgB,MACd,gBAAAsP;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAW/N,EAAO;AAAA,wBAClB,KAAKnD,EAAS,MAAO;AAAA,wBACrB,KAAKA,EAAS,MAAO,WAAWA,EAAS;AAAA,wBACzC,SAAQ;AAAA,sBAAA;AAAA,oBAAA,IAGV,gBAAAkR,EAAC,OAAA,EAAI,WAAW/N,EAAO,iBAAiB,eAAY,QACjD,YAAAmX,MAAAnL,KAAA3E,IAAAxK,EAAS,YAAT,gBAAAwK,EAAkB,UAAlB,gBAAA2E,EAAyB,MAAM,GAAG,OAAlC,gBAAAmL,GAAsC,kBAAiB,KAC1D,IAEAqH,KAAiBC,IACnB,gBAAA1Q,EAAC,OAAA,EAAI,WAAW/N,EAAO,qBAAsB,UAAAye,EAAA,CAAa,IAE1D,gBAAA1Q,EAAC,SAAI,WAAW/N,EAAO,aAAa,eAAY,QAAO,UAAA,IAAA,CAEvD;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAIHue,sBAAe,OAAA,EAAI,WAAWve,EAAO,mBAAoB,UAAAqe,EAAW,OAAM,IAAS;AAAA,cAAA,EAAA,GAhD5EvE,CAiDV;AAAA,YAEJ,CAAC,GACH,GACF;AAAA,YACA,gBAAA/L;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW,CAAC/N,EAAO,eAAeoZ,KAA2BpZ,EAAO,uBAAuB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,gBACzH,eAAa,CAACoZ;AAAA,gBAEd,UAAA,gBAAA8C,EAAC,SAAI,WAAWlc,EAAO,WAAW,cAAY6C,EAAE,eAAe,GAC5D,UAAA;AAAA,kBAAAqK,IACC,gBAAAa,EAAC,QAAA,EAAK,WAAW/N,EAAO,kBACrB,UAAA6C,EAAE,yBAAyB,EAAE,UAAUqK,EAAA,CAAwB,EAAA,CAClE,sBAEC,QAAA,EAAK;AAAA,kBAGR,gBAAAa,EAAC,QAAA,EACE,UAAAb,IACC,gBAAAgP,EAAAuB,IAAA,EACE,UAAA;AAAA,oBAAA,gBAAA1P,EAAC,QAAA,EAAK,WAAW/N,EAAO,iBAAkB,YAAYqZ,GAAS,QAAQ,CAAC,CAAC,EAAA,CAAE;AAAA,oBAAQ;AAAA,oBACnF,gBAAAtL,EAAC,QAAA,EAAK,WAAW/N,EAAO,gBAAiB,YAAYyZ,GAAgB,QAAQ,CAAC,CAAC,EAAA,CAAE;AAAA,kBAAA,EAAA,CACnF,IAEA,gBAAA1L,EAAC,QAAA,EAAK,WAAW/N,EAAO,gBAAiB,UAAA2X,EAAY0B,GAAS,QAAQ,CAAC,CAAC,EAAA,CAAE,EAAA,CAE9E;AAAA,gBAAA,EAAA,CACF;AAAA,cAAA;AAAA,YAAA;AAAA,aAGA,MAAM;AACN,oBAAMsF,KAAa1W,KAAA,gBAAAA,EAAQ,kBAAiB;AAC5C,qBAAI0W,MAAe,yBAGb1F,IAAiB,IAEjB,gBAAAlL,EAAC,UAAA,EAAO,MAAK,UAAS,SAASF,GAAQ,UAAU,CAACnC,IAAW,WAAW1L,EAAO,KAC5E,UAAAoD,IACGP,EAAE,mBAAmB,IACrBA,EAAE,uBAAuB,EAAE,OAAOoW,GAAgB,aAAaja,GAAeZ,IAAQ6a,CAAc,EAAA,CAAG,EAAA,CAC7G,IAKF,gBAAAiD,EAAC,OAAA,EAAI,WAAW,GAAGlc,EAAO,cAAc,IAAIga,KAA8Bha,EAAO,0BAA0B,EAAE,IAC3G,UAAA;AAAA,gBAAA,gBAAA+N;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAASF;AAAA,oBACT,UAAU,CAACnC;AAAA,oBACX,WAAW,GAAG1L,EAAO,WAAW,IAAIga,KAA8Bha,EAAO,uBAAuB,EAAE;AAAA,oBAElG,UAAA,gBAAA+N,EAAC,UAAM,UAAalL,EAAbO,IAAe,sBAAyB,0BAAN,EAAgC,CAAE;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAE7E,gBAAA2K;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAASD;AAAA,oBACT,UAAU,CAACpC;AAAA,oBACX,WAAW,GAAG1L,EAAO,YAAY,IAAIga,KAA8Bha,EAAO,wBAAwB,EAAE;AAAA,oBAEpG,UAAA,gBAAA+N,EAAC,UAAM,UAAalL,EAAbO,IAAe,0BAA6B,qBAAN,EAA2B,CAAE;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAC5E,GACF,IAIAub,MAAe,aAEf,gBAAA5Q,EAAC,UAAA,EAAO,MAAK,UAAS,SAASD,GAAmB,UAAU,CAACpC,IAAW,WAAW1L,EAAO,KACvF,UAAAoD,IACGP,EAAE,uBAAuB,IACzBoW,IAAiB,IACfpW,EAAE,uBAAuB,EAAE,OAAOoW,GAAgB,aAAaja,GAAeZ,IAAQ6a,CAAc,EAAA,CAAG,IACvGpW,EAAE,qBAAqB,GAC/B,IAMF,gBAAAkL,EAAC,UAAA,EAAO,MAAK,UAAS,SAASF,GAAQ,UAAU,CAACnC,IAAW,WAAW1L,EAAO,KAC5E,UAAAoD,IACGP,EAAE,mBAAmB,IACrBoW,IAAiB,IACfpW,EAAE,uBAAuB,EAAE,OAAOoW,GAAgB,aAAaja,GAAeZ,IAAQ6a,CAAc,EAAA,CAAG,IACvGpW,EAAE,0BAA0B,GACpC;AAAA,YAEJ,GAAA;AAAA,YAEA,gBAAAqZ,EAAC,OAAA,EAAI,WAAWlc,EAAO,WACpB,UAAA;AAAA,cAAA6C,EAAE,mBAAmB;AAAA,cAAE;AAAA,cAAC,gBAAAkL,EAAC,OAAE,MAAK,yCAAwC,QAAO,UAAS,KAAI,uBAAsB,UAAA,eAAA,CAAY;AAAA,YAAA,EAAA,CACjI;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,IA5kBmB;AA+kBzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnkCO,SAAS6Q,GAAmB1c,GAAgC;;AACjE,QAAM;AAAA,IACJ,SAAAiG;AAAA,IACA,YAAA/E;AAAA,IACA,OAAA3F;AAAA,IACA,cAAAqB;AAAA,IACA,QAAAmJ;AAAA,IACA,kBAAAC;AAAA,IACA,YAAAqD;AAAA,IACA,gBAAAC;AAAA,IACA,iCAAAF;AAAA,IACA,aAAA7B;AAAA,IACA,8BAAAoC;AAAA,IACA,YAAAJ;AAAA,IACA,aAAAxC;AAAA,IACA,WAAAyC;AAAA,IACA,QAAAmC;AAAA,IACA,mBAAAC;AAAA,IACA,QAAA1P;AAAA,IACA,GAAAyE;AAAA,EAAA,IACEmL,GAAA,GAEE;AAAA,IACJ,WAAAqF;AAAA,IACA,WAAAwL,IAAY;AAAA,IACZ,cAAAC,IAAe;AAAA,EAAA,IACb5c,GAEEuU,IAAmB,CAACxY,MAAkB;AAC1C,UAAMc,IAAI,OAAO,WAAWd,CAAK;AACjC,WAAK,OAAO,SAASc,CAAC,IACf,OAAO,KAAK,MAAMA,CAAC,CAAC,IADKd;AAAA,EAElC,GAEMyY,KAAuB,CAACC,MAA+E;AAC3G,UAAMrF,KAAQqF,KAAmB,CAAA,GAAI,OAAO,CAACC,MAAM;;AACjD,YAAMjY,KAAOF,IAAAmY,KAAA,gBAAAA,EAAG,SAAH,gBAAAnY,EAAS,QAChBR,KAAQoJ,IAAAuP,KAAA,gBAAAA,EAAG,UAAH,gBAAAvP,EAAU;AAGxB,aAFI,GAAC1I,KAAQ,CAACV,KACVU,EAAK,kBAAkB,WACvBV,EAAM,kBAAkB;AAAA,IAE9B,CAAC;AACD,WAAKqT,EAAK,SACHA,EAAK,IAAI,CAACsF,MAAM,GAAGA,EAAE,IAAI,KAAKA,EAAE,KAAK,EAAE,EAAE,KAAK,KAAK,IADjC;AAAA,EAE3B,GAEMC,KAAiB,CAAC5Y,OACfA,KAAA,gBAAAA,EAAO,OAAO,mBAAkB,iBAGnC6Y,KAAwB,CAACC,MAAyC;;AACtE,UAAMC,KAAcvY,IAAAsY,EAAE,gBAAF,gBAAAtY,EAAe;AACnC,QAAIuY,KAAe,CAACH,GAAeG,CAAW,EAAG,QAAOA;AAExD,UAAMC,KAAejL,KAAA3E,IAAA0P,EAAE,YAAF,gBAAA1P,EAAW,UAAX,gBAAA2E,EAAkB;AACvC,QAAIiL,EAAc,QAAOA;AAEzB,UAAMC,KAAeC,IAAAJ,EAAE,UAAF,gBAAAI,EAAS;AAC9B,WAAID,KAAgB,CAACL,GAAeK,CAAY,IAAUA,IAEnDF,KAAeE,KAAgBD,KAAgB;AAAA,EACxD,GAEMG,KAAsB,CAACL,MAAyC;AACpE,UAAMgI,IAAcjI,GAAsBC,CAAC,GACrCnQ,IAAU8P,GAAqBK,EAAE,eAAe;AACtD,WAAO,CAACgI,GAAanY,CAAO,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,EAC1D,GAEMyQ,KAAwB,CAACN,MAAyC;;AACtE,UAAMnQ,IAAU8P,GAAqBK,EAAE,eAAe;AACtD,QAAInQ,EAAS,QAAOA;AAEpB,UAAMsQ,KAAezY,IAAAsY,EAAE,UAAF,gBAAAtY,EAAS;AAC9B,WAAIyY,KAAgB,CAACL,GAAeK,CAAY,IAAUA,IAEnDJ,GAAsBC,CAAC;AAAA,EAChC,GAEMY,KAAc,CAAC9Y,MAAmB;AACtC,UAAME,IAAI,OAAOF,CAAM;AACvB,WAAK,OAAO,SAASE,CAAC,IACfH,GAAqBG,GAAGD,GAAcV,CAAM,IADnBS;AAAA,EAElC,GAEMmgB,KAAkBpW,EAAQ,MACvB,CAAC,GAAGV,CAAgB,GAC1B,CAACA,CAAgB,CAAC,GAEfmQ,KAAkBzP,EAAQ,MAAM;;AACpC,QAAI,EAACX,KAAA,QAAAA,EAAQ,wBAAwB,QAAO;AAC5C,UAAMuQ,wBAAU,IAAA;AAChB,eAAWzB,KAAKiI,IAAiB;AAC/B,YAAMvG,MAAYha,IAAAsY,EAAE,YAAF,gBAAAtY,EAAW,OAAM;AACnC,MAAK+Z,EAAI,IAAIC,CAAS,KACpBD,EAAI,IAAIC,GAAW,EAAE,WAAAA,GAAW,gBAAcpR,IAAA0P,EAAE,YAAF,gBAAA1P,EAAW,UAAS,IAAI,UAAU,CAAA,EAAC,CAAG,GAEtFmR,EAAI,IAAIC,CAAS,EAAG,SAAS,KAAK1B,CAAC;AAAA,IACrC;AACA,WAAO,MAAM,KAAKyB,EAAI,OAAA,CAAQ;AAAA,EAChC,GAAG,CAACvQ,KAAA,gBAAAA,EAAQ,wBAAwB+W,EAAe,CAAC,GAE9C,CAACpG,IAAmBC,EAAoB,IAAI1V,GAAwB,IAAI,GACxE2V,KAAYpU,GAA6B,IAAI;AAEnD,EAAAsB,EAAU,MAAM;AACd,QAAI,CAAC4S,GAAmB;AACxB,UAAMG,IAAc,CAACC,MAAkB;AACrC,MAAIF,GAAU,WAAW,CAACA,GAAU,QAAQ,SAASE,EAAE,MAAc,KACnEH,GAAqB,IAAI;AAAA,IAE7B;AACA,oBAAS,iBAAiB,aAAaE,CAAW,GAC3C,MAAM,SAAS,oBAAoB,aAAaA,CAAW;AAAA,EACpE,GAAG,CAACH,EAAiB,CAAC;AAEtB,QAAM5L,KAAcpE,EAAQ,MACnB,CAAC,IAAIX,KAAA,gBAAAA,EAAQ,UAAS,CAAA,CAAG,EAAE,KAAK,CAAC5G,GAAGC,MAAMD,EAAE,gBAAgBC,EAAE,aAAa,GACjF,CAAC2G,KAAA,gBAAAA,EAAQ,KAAK,CAAC,GAEZgR,KAAiBrQ,EAAQ,MAAM,KAAK,IAAI,GAAGK,KAAcwC,EAAU,GAAG,CAACA,IAAYxC,EAAW,CAAC,GAE/FgE,KAAcrE,EAAQ,MAAM;AAChC,QAAIsQ,IAAO;AACX,eAAWS,KAAK3M;AACd,MAAIvB,MAAckO,EAAE,kBAAeT,IAAOS;AAE5C,WAAOT;AAAA,EACT,GAAG,CAACzN,IAAYuB,EAAW,CAAC,GAEtBE,KAAyBtE,EAAQ,MAAM;AAC3C,QAAI,CAACqE,GAAa,QAAO;AACzB,UAAME,IAAM,OAAO,WAAWF,GAAY,eAAe;AACzD,WAAI,CAAC,OAAO,SAASE,CAAG,KAAKA,KAAO,IAAU,OACvCA;AAAA,EACT,GAAG,CAACF,EAAW,CAAC,GACVkM,KAAYnM,GAAY,CAAC,GACzBoM,KAA2B,GAAQD,MAAa1N,MAAc0N,GAAU,gBAExEE,KAAWzQ,EAAQ,MAAM;AAC7B,UAAMiE,IAAO,IAAI,IAAI3E,EAAiB,IAAI,CAAC6O,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAU,CAAC;AACpE,QAAIuC,IAAQ;AACZ,eAAW,CAACC,GAAWC,CAAG,KAAK,OAAO,QAAQjO,CAAU,GAAG;AACzD,YAAM1F,IAAI2T,KAAO;AACjB,UAAI3T,KAAK,EAAG;AACZ,YAAMkR,IAAIlK,EAAK,IAAI0M,CAAS,GACtBxM,IAAQ,OAAOgK,KAAA,gBAAAA,EAAG,KAAK;AAC7B,MAAK,OAAO,SAAShK,CAAK,MAC1BuM,KAASvM,IAAQlH;AAAA,IACnB;AACA,WAAO,KAAK,MAAMyT,IAAQ,GAAG,IAAI;AAAA,EACnC,GAAG,CAACpR,GAAkBqD,CAAU,CAAC,GAE3BkO,KAAkB7Q,EAAQ,MAAM;AACpC,QAAI,CAACsE,GAAwB,QAAOmM;AACpC,UAAMC,IAAQD,MAAY,IAAInM,KAAyB;AACvD,WAAO,KAAK,MAAMoM,IAAQ,GAAG,IAAI;AAAA,EACnC,GAAG,CAACpM,IAAwBmM,EAAQ,CAAC,GAE/BK,KAAc9Q,EAAQ,MACrBoE,GAAY,SACV,KAAK,IAAI,GAAGA,GAAY,IAAI,CAAC2M,MAAMA,EAAE,aAAa,CAAC,IAD1B,GAE/B,CAAC3M,EAAW,CAAC,GAEV4M,KAAiBhR,EAAQ,MAAM;AACnC,UAAMiE,IAAO,IAAI,IAAI3E,EAAiB,IAAI,CAAC6O,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAU,CAAC;AACpE,WAAOvL,EACJ,IAAI,CAAC+N,MAAc1M,EAAK,IAAI0M,CAAS,CAAC,EACtC,OAAO,CAACxC,MAA8C,EAAQA,CAAE;AAAA,EACrE,GAAG,CAAC7O,GAAkBsD,CAAc,CAAC,GAE/BqO,KAAmBjR,EAAQ,MAAM;;AACrC,UAAM4P,wBAAU,IAAA;AAChB,eAAWmB,KAAK3M,IAAa;AAC3B,YAAM8M,IAAM,KAAK,IAAI,GAAGH,EAAE,gBAAgB,CAAC;AAC3C,MAAAnB,EAAI,IAAIsB,GAAK;AAAA,QACX,iBAAiBH,EAAE;AAAA,QACnB,eAAeA,EAAE;AAAA,QACjB,SAAOlb,IAAAkb,EAAE,UAAF,gBAAAlb,EAAS,WAAU,OAAOkb,EAAE,aAAa;AAAA,MAAA,CACjD;AAAA,IACH;AACA,WAAOnB;AAAA,EACT,GAAG,CAACxL,EAAW,CAAC,GAEVrE,KAAgBC,EAAQ,MAAM;AAClC,UAAM5K,IAAM,QAAOiK,KAAA,gBAAAA,EAAQ,kBAAiB,GAAG,GACzClJ,IAAI,OAAO,SAASf,CAAG,IAAI,KAAK,MAAMA,CAAG,IAAI;AACnD,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKe,CAAC,CAAC;AAAA,EACrC,GAAG,CAACkJ,KAAA,gBAAAA,EAAQ,aAAa,CAAC,GAEpB/H,OAAQzB,KAAAwJ,KAAA,gBAAAA,EAAQ,UAAR,gBAAAxJ,GAAe,WAAUoE,EAAE,sBAAsB,GACzDyU,KAAwB,GAAQrP,KAAA,QAAAA,EAAQ,wCACxC4P,KAAmB,CAAChb,GAA4Cib,MAAyB;AAC7F,UAAM9M,IAAaO,EAAW1O,EAAQ,EAAE,KAAK;AAC7C,QAAIya,MAAyBQ,IAAe9M,GAAY;AACtD,MAAAa,GAA6BhP,CAAO;AACpC;AAAA,IACF;AACA,IAAA4M,EAAY5M,EAAQ,IAAIib,CAAY;AAAA,EACtC,GAEMiC,KAAYnR,EAAQ,MACjB,KAAK,IAAI8Q,MAAezQ,IAAa2Q,GAAe,MAAM,GAChE,CAACA,GAAe,QAAQF,IAAazQ,EAAW,CAAC,GAE9C2O,KAAoBnM,MAAc9C,IAElCsW,KAAcva,GAA8B,IAAI,GAChD4V,KAAsB5V,GAA8B,IAAI,GACxD6V,KAAoB7V,GAAe+G,EAAU;AAEnD,EAAAzF,EAAU,MAAM;AACd,UAAMS,IAAO8T,GAAkB;AAG/B,QAFAA,GAAkB,UAAU9O,IAExBA,MAAchF,EAAM;AAExB,UAAMgU,IAAYH,GAAoB;AACtC,QAAI,CAACG,EAAW;AAEhB,UAAMU,IAAenO,GAAY,KAAK,CAAC2M,MAAMA,EAAE,kBAAkBlO,EAAU,GACrE2P,IAAgBpO,GAAY,KAAK,CAAC2M,MAAMA,EAAE,gBAAgBlO,EAAU,GACpE4P,IAAYD,KAAiBD,IAAeC,EAAc,gBAAgB,IAAKA,IAAiC,OAAjB3P,KAAa;AAClH,QAAI4P,KAAa,QAAQA,IAAY,EAAG;AAExC,UAAMH,IAAM,sBAAsB,MAAM;AACtC,YAAMI,IAAKb,EAAU,cAA2B,mBAAmBY,CAAS,IAAI;AAChF,UAAI,CAACC,EAAI;AAET,YAAMC,IAAgBd,EAAU,sBAAA,GAE1Be,IADSF,EAAG,sBAAA,EACQ,QAAQC,EAAc;AAEhD,UAAIC,KAAc,EAAG;AAErB,YAAMC,KAAU,KAAK,IAAI,GAAGhB,EAAU,cAAcA,EAAU,WAAW,GACnEiB,KAAW,KAAK,IAAID,IAAS,KAAK,IAAI,GAAGhB,EAAU,aAAae,CAAU,CAAC;AACjF,MAAAf,EAAU,SAAS,EAAE,MAAMiB,IAAU,UAAU,UAAU;AAAA,IAC3D,CAAC;AAED,WAAO,MAAM,qBAAqBR,CAAG;AAAA,EACvC,GAAG,CAACzP,IAAYuB,EAAW,CAAC;AAC5B,QAAMwN,KAA2B,CAACjB,MAAsB;AACtD,UAAMkB,IAAYwE,GAAY;AAC9B,QAAI,CAACxE,EAAW;AAChB,UAAMC,IAAMD,EAAU,cAA2B,sBAAuBlB,CAAS,IAAK;AACtF,IAAKmB,KACLA,EAAI,eAAe,EAAE,UAAU,UAAU,OAAO,WAAW;AAAA,EAC7D;AAEA,SACE,gBAAAwB,EAAC,WAAA,EAAQ,WAAW,CAAClc,EAAO,OAAOqT,EAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,aAAWlL,GAClF,UAAA;AAAA,IAAA,gBAAA4F,EAAC,UAAA,EAAO,WAAW/N,EAAO,QACxB,UAAA,gBAAA+N,EAAC,QAAG,WAAW/N,EAAO,OAAQ,UAAAE,GAAA,CAAM,GACtC;AAAA,IAECiI,sBAAW,OAAA,EAAI,WAAWnI,EAAO,QAAS,UAAA6C,EAAE,gBAAgB,EAAA,CAAE,IAAS;AAAA,IACvEpF,IAAQ,gBAAAsQ,EAAC,OAAA,EAAI,WAAW/N,EAAO,OAAQ,aAAM,IAAS;AAAA,IAEtD6e,KAAa7R,GAAY,SACxB,gBAAAe,EAAC,OAAA,EAAI,WAAW/N,EAAO,SACrB,UAAA,gBAAAkc,EAAC,OAAA,EAAI,WAAWlc,EAAO,aACrB,UAAA;AAAA,MAAA,gBAAA+N,EAAC,OAAA,EAAI,WAAW/N,EAAO,gBACpB,gBAAM,KAAK,EAAE,QAAQ0Z,GAAA,CAAa,EAAE,IAAI,CAAC0E,GAAGtE,MAAQ;AACnD,cAAMoF,IAAYpF,IAAM,GAClBqF,IAAcnS,GAAY,KAAK,CAAC2M,MAAMA,EAAE,kBAAkBuF,CAAS,GACnE1R,IAAgB2R,IAClBtc,EAAE,6BAA6B,EAAE,UAAU4T,EAAiB0I,EAAY,eAAe,EAAA,CAAG,IAC1F;AAEJ,eACE,gBAAApR,EAAC,OAAA,EAAoB,WAAW/N,EAAO,oBACpC,UAAAwN,IAAgB,gBAAAO,EAAC,QAAA,EAAK,WAAW/N,EAAO,gBAAiB,UAAAwN,GAAc,IAAU,QAD1E0R,CAEV;AAAA,MAEJ,CAAC,EAAA,CACH;AAAA,MACA,gBAAAnR,EAAC,OAAA,EAAI,WAAW/N,EAAO,eACpB,UAAA,MAAM,KAAK,EAAE,QAAQ0Z,IAAa,EAAE,IAAI,CAAC0E,GAAGtE,MAAQ;AACnD,cAAMoF,IAAYpF,IAAM,GAClBwE,IAAW7S,MAAcyT;AAE/B,eACE,gBAAAnR;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW;AAAA,cACT/N,EAAO;AAAA,cACPse,IAAWte,EAAO,kBAAkBA,EAAO;AAAA,YAAA,EAE1C,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UAAA;AAAA,UANNkf;AAAA,QAAA;AAAA,MASX,CAAC,EAAA,CACH;AAAA,IAAA,EAAA,CACF,GACF,IACE;AAAA,IAEHJ,IACC,gBAAA5C,EAAC,OAAA,EAAI,WAAWlc,EAAO,SAAS,KAAKif,IACnC,UAAA;AAAA,MAAA,gBAAAlR,EAAC,SAAI,WAAW/N,EAAO,cAAe,UAAA6C,EAAE,qBAAqB,GAAE;AAAA,MAC/D,gBAAAkL,EAAC,OAAA,EAAI,WAAW/N,EAAO,UACpB,UAAA,CAACmI,KAAW,CAAC1K,KAASuhB,GAAgB,WAAW,sBAC/C,OAAA,EAAI,WAAWhf,EAAO,YAAa,UAAA6C,EAAE,cAAc,EAAA,CAAE,IACpDwV,KACF,gBAAAtK,EAAC,MAAA,EAAG,WAAW/N,EAAO,aACnB,UAAAqY,GAAgB,IAAI,CAACK,MAAU;;AAC9B,cAAMyD,MAAe1d,IAAAia,EAAM,SAAS,KAAK,CAAC3B;;AAAM,kBAAAtY,IAAAsY,EAAE,UAAF,gBAAAtY,EAAS;AAAA,SAAG,MAAvC,gBAAAA,EAA0C,UAAS,MAClE2d,IAAsB1D,EAAM,SAAS,SAAS,GAC9C2D,IAAezD,OAAsBF,EAAM,WAC3C4D,IAAmB5D,EAAM,SAAS,OAAO,CAAC3B,OAAOxL,EAAWwL,EAAE,EAAE,KAAK,KAAK,CAAC;AAGjF,YAAI,CAACqF,GAAqB;AACxB,gBAAMvf,IAAU6b,EAAM,SAAS,CAAC;AAChC,cAAI,CAAC7b,EAAS,QAAO;AACrB,gBAAM2c,IAAMjO,EAAW1O,EAAQ,EAAE,KAAK,GAChCmgB,KAAuB3V,IAAAxK,EAAQ,UAAR,gBAAAwK,EAAe,QACtC4V,KAAavG,GAAqB7Z,EAAQ,eAAe,MACzDmgB,KAAwBA,EAAqB,YAAA,MAAkB,kBAAkBA,IAAuB,OACxGL,KAAgB9f,EAAQ,qBAAqB,IAC7C2f,IAASlR,GAAgCzO,EAAQ,EAAE,GACnD4f,IAAkBD,KAAiB,OAAO,mBAC1CE,KAAYlD,KAAOiD,GACnBG,KAAc,CAACxZ,KAAc,CAACuZ,MAAiB,CAAC/E,MAAqB,CAAC8E,IACtEG,IAAa,CAACF,MAAiBD,KAAY7Z,EAAE,0BAA0B,IAAI;AAEjF,iBACE,gBAAAkL,EAAC,QAAyB,WAAW/N,EAAO,cAC1C,UAAA,gBAAAkc,EAAC,OAAA,EAAI,WAAWlc,EAAO,oBACrB,UAAA;AAAA,YAAA,gBAAA+N,EAAC,OAAA,EAAI,WAAW/N,EAAO,uBACpB,yBAAc,MACb,gBAAA+N,EAAC,SAAI,KAAKoO,EAAa,KAAK,KAAKA,EAAa,WAAWzD,EAAM,cAAc,OAAOyD,EAAa,SAAS,IAAI,QAAQA,EAAa,UAAU,IAAI,WAAWnc,EAAO,mBAAmB,SAAQ,QAAO,IAErM,gBAAA+N,EAAC,SAAI,WAAW/N,EAAO,2BAA4B,UAAA0Y,EAAM,aAAa,MAAM,GAAG,CAAC,EAAE,YAAA,KAAiB,KAAI,EAAA,CAE3G;AAAA,YACA,gBAAAwD,EAAC,OAAA,EAAI,WAAWlc,EAAO,kBACrB,UAAA;AAAA,cAAA,gBAAA+N,EAAC,OAAA,EAAI,WAAW/N,EAAO,mBAAoB,YAAM,cAAa;AAAA,cAC7Did,KAAa,gBAAAlP,EAAC,OAAA,EAAI,WAAW/N,EAAO,aAAc,cAAW,IAAS;AAAA,cACvE,gBAAA+N,EAAC,SAAI,WAAW/N,EAAO,cAAe,UAAA2X,GAAY9a,EAAQ,KAAK,EAAA,CAAE;AAAA,YAAA,GACnE;AAAA,YACA,gBAAAkR,EAAC,OAAA,EAAI,WAAW/N,EAAO,qBACpB,UAAA2c,KACC,gBAAA5O,EAAC,OAAA,EAAI,WAAW/N,EAAO,SAAU,UAAA6C,EAAE,uBAAuB,GAAE,IAC1D2W,KAAO,KAAKiD,KAAmB,IACjC,gBAAA1O,EAAC,OAAA,EAAI,WAAW/N,EAAO,kBAAmB,UAAA6C,EAAE,wBAAwB,EAAA,CAAE,IAEtE,gBAAAqZ,EAAC,OAAA,EAAI,WAAWlc,EAAO,gBACpB,UAAA;AAAA,cAAA6c,sBAAc,OAAA,EAAI,WAAW7c,EAAO,kBAAmB,aAAW,IAAS;AAAA,cAC5E,gBAAAkc,EAAC,OAAA,EAAI,WAAWlc,EAAO,YACpB,UAAA;AAAA,gBAAAwZ,IAAM,IACL,gBAAAzL,EAAC,UAAA,EAAO,MAAK,UAAS,WAAW/N,EAAO,UAAU,cAAY6C,EAAE,kCAAkC,EAAE,MAAMhG,EAAQ,YAAA,CAAa,GAAG,UAAUuG,GAAY,SAAS,MAAMqG,EAAY5M,EAAQ,IAAI,CAAC,GAC9L,UAAA,gBAAAkR,EAAC4G,IAAA,EAAO,MAAM,GAAA,CAAI,GACpB,IACE;AAAA,gBACJ,gBAAA5G;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW,CAAC/N,EAAO,SAAS4c,KAAc5c,EAAO,qBAAqB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,oBACpG,MAAM4c,KAAc,WAAW;AAAA,oBAC/B,UAAUA,KAAc,IAAI;AAAA,oBAC5B,cAAY/Z,EAAE,wBAAwB,EAAE,MAAMhG,EAAQ,aAAa,KAAA2c,GAAK;AAAA,oBACxE,SAASoD,KAAc,MAAM/E,GAAiBhb,GAAS2c,IAAM,CAAC,IAAI;AAAA,oBAClE,WAAWoD,KAAc,CAAC5D,MAAM;AAAE,uBAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SAAOA,EAAE,eAAA,GAAkBnB,GAAiBhb,GAAS2c,IAAM,CAAC;AAAA,oBAAK,IAAI;AAAA,oBAEzI,eAAO,IACN,gBAAAzL,EAAC,QAAA,EAAK,WAAW/N,EAAO,aAAa,eAAY,QAAO,UAAA,gBAAA+N,EAAC0G,MAAK,MAAM,IAAI,aAAa,KAAK,EAAA,CAAE,IAE5F,gBAAAyH,EAAAuB,IAAA,EACE,UAAA;AAAA,sBAAA,gBAAA1P,EAAC,QAAA,EAAK,WAAW/N,EAAO,cAAe,UAAAwZ,GAAI;AAAA,sBAC3C,gBAAAzL,EAAC,YAAO,MAAK,UAAS,WAAW/N,EAAO,cAAc,cAAY6C,EAAE,wBAAwB,EAAE,MAAMhG,EAAQ,aAAa,GAAG,UAAU,CAAC+f,IAAa,SAAS,CAAC5D,MAAM;AAAE,wBAAAA,EAAE,gBAAA,GAAmBnB,GAAiBhb,GAAS2c,IAAM,CAAC;AAAA,sBAAG,GAAG,WAAW,CAACR,MAAMA,EAAE,gBAAA,GACpP,UAAA,gBAAAjL,EAAC0G,IAAA,EAAK,MAAM,IAAI,aAAa,GAAG,EAAA,CAClC;AAAA,oBAAA,EAAA,CACF;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAEJ,EAAA,CACF;AAAA,YAAA,EAAA,CACF,EAAA,CAEJ;AAAA,UAAA,GACF,EAAA,GAnDOiE,EAAM,SAoDf;AAAA,QAEJ;AAGA,eACE,gBAAAwD,EAAC,QAAyB,KAAKG,IAAevD,KAAY,MAAM,WAAW,CAAC9Y,EAAO,cAAcqc,IAAerc,EAAO,yBAAyB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC5K,UAAA;AAAA,UAAA,gBAAAkc,EAAC,OAAA,EAAI,WAAWlc,EAAO,oBACrB,UAAA;AAAA,YAAA,gBAAA+N,EAAC,OAAA,EAAI,WAAW/N,EAAO,uBACpB,yBAAc,MACb,gBAAA+N,EAAC,SAAI,KAAKoO,EAAa,KAAK,KAAKA,EAAa,WAAWzD,EAAM,cAAc,OAAOyD,EAAa,SAAS,IAAI,QAAQA,EAAa,UAAU,IAAI,WAAWnc,EAAO,mBAAmB,SAAQ,QAAO,IAErM,gBAAA+N,EAAC,SAAI,WAAW/N,EAAO,2BAA4B,UAAA0Y,EAAM,aAAa,MAAM,GAAG,CAAC,EAAE,YAAA,KAAiB,KAAI,EAAA,CAE3G;AAAA,YACA,gBAAA3K,EAAC,OAAA,EAAI,WAAW/N,EAAO,kBACrB,UAAA,gBAAA+N,EAAC,OAAA,EAAI,WAAW/N,EAAO,mBAAoB,UAAA0Y,EAAM,aAAA,CAAa,GAChE;AAAA,YACA,gBAAA3K,EAAC,OAAA,EAAI,WAAW/N,EAAO,qBACrB,UAAA,gBAAAkc;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAW,CAAClc,EAAO,cAAcqc,IAAerc,EAAO,mBAAmB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,gBACxG,iBAAeqc;AAAA,gBACf,UAAUjZ;AAAA,gBACV,aAAa,CAAC4V,MAAMA,EAAE,gBAAA;AAAA,gBACtB,SAAS,MAAMH,GAAqB,CAACpS,MAASA,MAASiS,EAAM,YAAY,OAAOA,EAAM,SAAS;AAAA,gBAE9F,UAAA;AAAA,kBAAA7V,EAAE,uBAAuB;AAAA,kBAC1B,gBAAAkL,EAACyG,MAAY,MAAM,IAAI,aAAa,KAAK,WAAWxU,EAAO,oBAAA,CAAqB;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA,EAClF,CACF;AAAA,UAAA,GACF;AAAA,UAGCqc,KACC,gBAAAtO,EAAC,OAAA,EAAI,WAAW/N,EAAO,eACpB,UAAA0Y,EAAM,SAAS,IAAI,CAAC3B,MAAM;AACzB,kBAAMyF,IAASlR,GAAgCyL,EAAE,EAAE,GAC7CmG,KAAqB3R,EAAWwL,EAAE,EAAE,KAAK,KAAK,GAC9CoG,KAAYpG,EAAE,qBAAqB,IACnCqG,KAAaZ,KAAU,QAAQA,KAAU,GACzCa,IAAe,CAACH,KAAqBtF,IACrC0F,IACJla,KACG+Z,MACAC,MACAC,GAECE,KAAcJ,KAChBta,EAAE,uBAAuB,IACzBua,KACEva,EAAE,wBAAwB,IAC1Bwa,IACAxa,EAAE,0BAA0B,IAC5B,MACA2a,KAAcnG,GAAsBN,CAAC;AAC3C,mBACE,gBAAAmF;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,UAAUoB;AAAA,gBACV,WAAW,CAACtd,EAAO,kBAAkBkd,IAAoBld,EAAO,2BAA2B,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,gBACzH,SAAS,MAAM;AACb,sBAAI,CAACkd,GAAmB;AACtB,wBAAI5F,IAAuB;AACzB,sBAAAO,GAAiBd,GAAG,CAAC,GACrB8B,GAAqB,IAAI;AACzB;AAAA,oBACF;AACA,oBAAAhB,GAAiBd,GAAG,CAAC;AAAA,kBACvB;AACA,kBAAA8B,GAAqB,IAAI;AAAA,gBAC3B;AAAA,gBAEA,UAAA;AAAA,kBAAA,gBAAA9K,EAAC,QAAA,EAAK,WAAW/N,EAAO,oBAAqB,UAAAwd,IAAY;AAAA,kBACzD,gBAAAzP,EAAC,UAAK,WAAW/N,EAAO,oBACrB,UAAAud,MAAe5F,GAAYZ,EAAE,KAAK,EAAA,CACrC;AAAA,kBACCmG,sBAAqB,QAAA,EAAK,WAAWld,EAAO,oBAAoB,eAAY,QAAO,UAAA,IAAA,CAAC,IAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,cApB1F+W,EAAE;AAAA,YAAA;AAAA,UAuBb,CAAC,EAAA,CACH;AAAA,UAIDuF,EAAiB,SAAS,KACzB,gBAAAvO,EAAC,MAAA,EAAG,WAAW/N,EAAO,sBACnB,UAAAsc,EAAiB,IAAI,CAACvF,MAAM;AAC3B,kBAAMyC,IAAMjO,EAAWwL,EAAE,EAAE,KAAK,GAC1ByF,IAASlR,GAAgCyL,EAAE,EAAE,GAC7C0F,KAAkBD,KAAiB,OAAO,mBAC1CE,KAAYlD,KAAOiD,IACnBG,IAAc,CAACxZ,KAAc2T,EAAE,qBAAqB,MAAS,CAACa,MAAqB,CAAC8E,IACpFc,IAAcnG,GAAsBN,CAAC;AAC3C,qCACG,MAAA,EAAc,WAAW/W,EAAO,oBAAoB,oBAAkB+W,EAAE,IACvE,UAAA;AAAA,cAAA,gBAAAmF,EAAC,OAAA,EAAI,WAAWlc,EAAO,qBACrB,UAAA;AAAA,gBAAA,gBAAA+N,EAAC,QAAA,EAAK,WAAW/N,EAAO,qBAAsB,UAAAwd,GAAY;AAAA,gBAC1D,gBAAAzP,EAAC,UAAK,WAAW/N,EAAO,sBAAuB,UAAA2X,GAAYZ,EAAE,KAAK,EAAA,CAAE;AAAA,cAAA,GACtE;AAAA,cACA,gBAAAmF,EAAC,OAAA,EAAI,WAAWlc,EAAO,YACrB,UAAA;AAAA,gBAAA,gBAAA+N,EAAC,UAAA,EAAO,MAAK,UAAS,WAAW/N,EAAO,UAAU,cAAY6C,EAAE,kCAAkC,EAAE,MAAMkU,EAAE,YAAA,CAAa,GAAG,UAAU3T,GAAY,SAAS,MAAMqG,EAAYsN,EAAE,IAAI,CAAC,GAClL,UAAA,gBAAAhJ,EAAC4G,IAAA,EAAO,MAAM,GAAA,CAAI,EAAA,CACpB;AAAA,gBACA,gBAAAuH;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW,CAAClc,EAAO,SAAS4c,IAAc5c,EAAO,qBAAqB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,oBACpG,MAAM4c,IAAc,WAAW;AAAA,oBAC/B,UAAUA,IAAc,IAAI;AAAA,oBAC5B,cAAY/Z,EAAE,wBAAwB,EAAE,MAAMkU,EAAE,aAAa,KAAAyC,GAAK;AAAA,oBAClE,SAASoD,IAAc,MAAM/E,GAAiBd,GAAGyC,IAAM,CAAC,IAAI;AAAA,oBAC5D,WAAWoD,IAAc,CAAC5D,OAAM;AAAE,uBAAIA,GAAE,QAAQ,WAAWA,GAAE,QAAQ,SAAOA,GAAE,eAAA,GAAkBnB,GAAiBd,GAAGyC,IAAM,CAAC;AAAA,oBAAK,IAAI;AAAA,oBAEpI,UAAA;AAAA,sBAAA,gBAAAzL,EAAC,QAAA,EAAK,WAAW/N,EAAO,cAAe,UAAAwZ,GAAI;AAAA,sBAC3C,gBAAAzL,EAAC,YAAO,MAAK,UAAS,WAAW/N,EAAO,cAAc,cAAY6C,EAAE,wBAAwB,EAAE,MAAMkU,EAAE,aAAa,GAAG,UAAU,CAAC6F,GAAa,SAAS,CAAC5D,OAAM;AAAE,wBAAAA,GAAE,gBAAA,GAAmBnB,GAAiBd,GAAGyC,IAAM,CAAC;AAAA,sBAAG,GAAG,WAAW,CAACR,OAAMA,GAAE,gBAAA,GACxO,UAAA,gBAAAjL,EAAC0G,IAAA,EAAK,MAAM,IAAI,aAAa,GAAG,EAAA,CAClC;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACF,EAAA,CACF;AAAA,YAAA,EAAA,GAtBOsC,EAAE,EAuBX;AAAA,UAEJ,CAAC,EAAA,CACH;AAAA,QAAA,EAAA,GApHK2B,EAAM,SAsHf;AAAA,MAEJ,CAAC,EAAA,CACH,IAEA,gBAAA3K,EAAC,MAAA,EAAG,WAAW/N,EAAO,aACnB,UAAAgf,GAAgB,IAAI,CAACniB,MAAY;;AAChC,cAAM2c,IAAMjO,EAAW1O,EAAQ,EAAE,KAAK,GAChC6gB,IAAqB5G,GAAsBja,CAAO,GAClD0f,IAAcnF,GAAoBva,CAAO,GACzC+J,IAAU8P,GAAqB7Z,EAAQ,eAAe,GACtD8f,IAAgB9f,EAAQ,qBAAqB,IAC7C+gB,IAAwBtS,GAAgCzO,EAAQ,EAAE,GAClEghB,IAAkCD,KACpC,OAAO,mBAELE,IAAwBtE,KAAOqE,GAC/BE,IAAsB,CAACpB,KAAiB,CAAC/E,MAAqB,CAACkG,GAC/DsB,KAAc,CAAC9H,MAAyByG,GACxCC,KAAmB,CAACrB,KAAiBmB,IAAwBjb,EAAE,0BAA0B,IAAI;AAEnG,eACE,gBAAAqZ;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW;AAAA,cACTlc,EAAO;AAAA,cACPof,KAAcpf,EAAO,wBAAwB;AAAA,cAC7CwZ,IAAM,IAAIxZ,EAAO,qBAAqB;AAAA,cACtC2c,IAAgB3c,EAAO,oBAAoB;AAAA,YAAA,EAE1C,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,YACX,oBAAkBnD,EAAQ;AAAA,YAC1B,MAAMuiB,KAAc,WAAW;AAAA,YAC/B,UAAUA,KAAc,IAAI;AAAA,YAC5B,SACEA,KACI,MAAM;AACN,cAAAvH,GAAiBhb,GAAS2c,IAAM,CAAC;AAAA,YACnC,IACE;AAAA,YAEN,WACE4F,KACI,CAACpG,MAAM;AACP,eAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACFnB,GAAiBhb,GAAS2c,IAAM,CAAC,GACjCgB,GAAyB3d,EAAQ,EAAE;AAAA,YAEvC,IACE;AAAA,YAEN,cACE8f,IACI9Z,EAAE,wBAAwB,EAAE,MAAM0Z,EAAA,CAAa,IAC/CyB,KACE,GAAGzB,CAAW,IAAIyB,GAAiB,aAAa,KAChDnb,EAAE,6BAA6B,EAAE,MAAM0Z,GAAa;AAAA,YAG5D,UAAA;AAAA,cAAA,gBAAAxO,EAAC,SAAI,WAAW/N,EAAO,cACpB,WAAAvB,IAAA5B,EAAQ,UAAR,QAAA4B,EAAe,MACd,gBAAAsP;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAKlR,EAAQ,MAAM;AAAA,kBACnB,KAAKA,EAAQ,MAAM,WAAW0f;AAAA,kBAC9B,OAAO1f,EAAQ,MAAM,SAAS;AAAA,kBAC9B,QAAQA,EAAQ,MAAM,UAAU;AAAA,kBAChC,WAAWmD,EAAO;AAAA,kBAClB,SAAQ;AAAA,gBAAA;AAAA,cAAA,sBAGT,OAAA,EAAI,WAAWA,EAAO,sBAAuB,UAAA6C,EAAE,qBAAqB,EAAA,CAAE,EAAA,CAE3E;AAAA,cACA,gBAAAqZ,EAAC,OAAA,EAAI,WAAWlc,EAAO,gBACrB,UAAA;AAAA,gBAAA,gBAAAkc,EAAC,OAAA,EAAI,WAAWlc,EAAO,eACrB,UAAA;AAAA,kBAAA,gBAAA+N,EAAC,OAAA,EAAI,WAAW/N,EAAO,cAAe,UAAA0d,GAAmB;AAAA,kBACxD9W,IAAU,gBAAAmH,EAAC,OAAA,EAAI,WAAW/N,EAAO,aAAc,aAAQ,IAAS;AAAA,gBAAA,GACnE;AAAA,gBACA,gBAAAkc,EAAC,OAAA,EAAI,WAAWlc,EAAO,kBACrB,UAAA;AAAA,kBAAA,gBAAA+N,EAAC,SAAI,WAAW/N,EAAO,cAAe,UAAA2X,GAAY9a,EAAQ,KAAK,GAAE;AAAA,kBACjE,gBAAAkR,EAAC,SAAI,WAAW/N,EAAO,gBACpB,UAAA2c,IACC,gBAAA5O,EAAC,OAAA,EAAI,WAAW/N,EAAO,SAAS,cAAY6C,EAAE,wBAAwB,EAAE,MAAM0Z,EAAA,CAAa,GACxF,UAAA1Z,EAAE,uBAAuB,EAAA,CAC5B,IACE2W,KAAO,KAAKqE,KAAmC,sBAChD,OAAA,EAAI,WAAW7d,EAAO,kBAAkB,cAAY6C,EAAE,sCAAsC,EAAE,MAAM0Z,GAAa,GAC/G,YAAE,wBAAwB,EAAA,CAC7B,IAEA,gBAAAL,EAAC,OAAA,EAAI,WAAWlc,EAAO,gBACrB,UAAA;AAAA,oBAAA,gBAAAkc,EAAC,OAAA,EAAI,WAAWlc,EAAO,YACpB,UAAA;AAAA,sBAAAwZ,IAAM,IACL,gBAAAzL;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,WAAW/N,EAAO;AAAA,0BAClB,cAAY6C,EAAE,kCAAkC,EAAE,MAAM0Z,GAAa;AAAA,0BACrE,SAAS,CAACvD,MAAM;AACd,4BAAAA,EAAE,gBAAA,GACFvP,EAAY5M,EAAQ,IAAI,CAAC;AAAA,0BAC3B;AAAA,0BACA,WAAW,CAACmc,MAAM;AAChB,4BAAAA,EAAE,gBAAA;AAAA,0BACJ;AAAA,0BAEA,UAAA,gBAAAjL,EAAC4G,IAAA,EAAO,MAAM,GAAA,CAAI;AAAA,wBAAA;AAAA,sBAAA,IAElB;AAAA,sBACJ,gBAAA5G;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAW,CAAC/N,EAAO,SAAS+d,IAAsB/d,EAAO,qBAAqB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,0BAC5G,cAAY6C,EAAE,wBAAwB,EAAE,MAAM0Z,GAAa,KAAA/C,GAAK;AAAA,0BAChE,SAASuE,IACL,CAAC/E,MAAM;AACP,4BAAAA,EAAE,gBAAA,GACFnB,GAAiBhb,GAAS2c,IAAM,CAAC;AAAA,0BACnC,IACE;AAAA,0BACJ,WAAW,CAACR,MAAM;AAChB,4BAAAA,EAAE,gBAAA;AAAA,0BACJ;AAAA,0BACA,MAAM+E,IAAsB,WAAW;AAAA,0BACvC,UAAUA,IAAsB,IAAI;AAAA,0BAEnC,eAAO,IACN,gBAAAhQ,EAAC,QAAA,EAAK,WAAW/N,EAAO,aAAa,eAAY,QAC/C,UAAA,gBAAA+N,EAAC0G,MAAK,MAAM,IAAI,aAAa,KAAK,EAAA,CACpC,IAEA,gBAAAyH,EAAAuB,IAAA,EACE,UAAA;AAAA,4BAAA,gBAAA1P,EAAC,QAAA,EAAK,WAAW/N,EAAO,cAAe,UAAAwZ,GAAI;AAAA,4BAC3C,gBAAAzL;AAAA,8BAAC;AAAA,8BAAA;AAAA,gCACC,MAAK;AAAA,gCACL,WAAW/N,EAAO;AAAA,gCAClB,cAAY6C,EAAE,wBAAwB,EAAE,MAAM0Z,GAAa;AAAA,gCAC3D,SAAS,CAACvD,MAAM;AACd,kCAAAA,EAAE,gBAAA,GACFnB,GAAiBhb,GAAS2c,IAAM,CAAC;AAAA,gCACnC;AAAA,gCACA,WAAW,CAACR,MAAM;AAChB,kCAAAA,EAAE,gBAAA;AAAA,gCACJ;AAAA,gCACA,UAAU,CAAC+E;AAAA,gCAEX,UAAA,gBAAAhQ,EAAC0G,IAAA,EAAK,MAAM,IAAI,aAAa,EAAA,CAAG;AAAA,8BAAA;AAAA,4BAAA;AAAA,0BAClC,EAAA,CACF;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAEJ,GACF;AAAA,oBACCuJ,KAAmB,gBAAAjQ,EAAC,OAAA,EAAI,WAAW/N,EAAO,kBAAmB,cAAiB,IAAS;AAAA,kBAAA,EAAA,CAC1F,EAAA,CAEJ;AAAA,gBAAA,EAAA,CACF;AAAA,cAAA,EAAA,CACF;AAAA,YAAA;AAAA,UAAA;AAAA,UArIKnD,EAAQ;AAAA,QAAA;AAAA,MAwInB,CAAC,GACH,EAAA,CAEJ;AAAA,IAAA,EAAA,CACF,IACE;AAAA,IAEJ,gBAAAqf,EAAC,UAAA,EAAO,WAAWlc,EAAO,QACxB,UAAA;AAAA,MAAA,gBAAA+N,EAAC,OAAA,EAAI,WAAW/N,EAAO,kBAAkB,KAAKsa,IAC5C,UAAA,gBAAAvM,EAAC,OAAA,EAAI,WAAW/N,EAAO,eAAe,cAAW,sBAC9C,UAAA,MAAM,KAAK,EAAE,QAAQ+Z,GAAA,CAAW,EAAE,IAAI,CAACqE,GAAGtE,MAAQ;;AACjD,cAAMjd,IAAU+c,GAAeE,CAAG,GAC5BuE,IAAYxE,GAAiB,IAAIC,CAAG,GACpCwE,IAAW,EAAQzhB,GACnB0hB,IAAc,EAAQF,GACtBG,IAAgBD,KAAe,CAACD,GAChCG,IAAeJ,IACjBxb,EAAE,6BAA6B,EAAE,UAAU4T,EAAiB4H,EAAU,eAAe,EAAA,CAAG,IACxF,MACEK,IAAYJ,IAAWzhB,EAAS,cAAcgG,EAAE,eAAe,EAAE,MAAMiX,IAAM,GAAG;AAEtF,iCACG,OAAA,EAAc,iBAAeA,GAAK,WAAW9Z,EAAO,SACnD,UAAA;AAAA,UAAA,gBAAA+N;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,gBACT/N,EAAO;AAAA,gBACPse,IAAWte,EAAO,gBAAgBA,EAAO;AAAA,gBACzCue,IAAcve,EAAO,mBAAmB;AAAA,gBACxCse,IAAWte,EAAO,mBAAmB;AAAA,cAAA,EAEpC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,cACX,MAAMse,IAAW,WAAW;AAAA,cAC5B,UAAUA,IAAW,IAAI;AAAA,cACzB,SAASA,IAAW,MAAM9D,GAAyB3d,EAAS,EAAE,IAAI;AAAA,cAClE,WACEyhB,IACI,CAACtF,MAAM;AACP,iBAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACFwB,GAAyB3d,EAAS,EAAE;AAAA,cAExC,IACE;AAAA,cAEN,cAAY2hB,KAAiBC,IAAe,GAAGC,CAAS,KAAK7b,EAAE,kBAAkB,EAAE,UAAU4b,EAAA,CAAc,CAAC,MAAMC;AAAA,cAClH,OAAOF,KAAiBC,IAAe,GAAGC,CAAS,MAAM7b,EAAE,kBAAkB,EAAE,UAAU4b,EAAA,CAAc,CAAC,KAAKC;AAAA,cAE5G,UAAAJ,KACC7f,IAAA5B,EAAS,UAAT,QAAA4B,EAAgB,MACd,gBAAAsP;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW/N,EAAO;AAAA,kBAClB,KAAKnD,EAAS,MAAO;AAAA,kBACrB,KAAKA,EAAS,MAAO,WAAWA,EAAS;AAAA,kBACzC,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,SAAQ;AAAA,gBAAA;AAAA,cAAA,IAGV,gBAAAkR,EAAC,OAAA,EAAI,WAAW/N,EAAO,iBAAiB,eAAY,QACjD,YAAAmX,KAAAnL,MAAA3E,KAAAxK,EAAS,YAAT,gBAAAwK,GAAkB,UAAlB,gBAAA2E,GAAyB,MAAM,GAAG,OAAlC,gBAAAmL,EAAsC,kBAAiB,KAC1D,IAEAqH,KAAiBC,IACnB,gBAAA1Q,EAAC,OAAA,EAAI,WAAW/N,EAAO,qBAAsB,UAAAye,EAAA,CAAa,IAE1D,gBAAA1Q,EAAC,SAAI,WAAW/N,EAAO,aAAa,eAAY,QAAO,UAAA,IAAA,CAEvD;AAAA,YAAA;AAAA,UAAA;AAAA,UAIHue,sBAAe,OAAA,EAAI,WAAWve,EAAO,mBAAoB,UAAAqe,EAAW,OAAM,IAAS;AAAA,QAAA,EAAA,GAlD5EvE,CAmDV;AAAA,MAEJ,CAAC,GACH,GACF;AAAA,wBAEC,OAAA,EAAI,WAAW,CAAC9Z,EAAO,cAAcoZ,KAA2BpZ,EAAO,mBAAmB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACvH,UAAA,gBAAA+N;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,CAAC/N,EAAO,eAAeoZ,KAA2BpZ,EAAO,uBAAuB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,UACzH,eAAa,CAACoZ;AAAA,UAEd,UAAA,gBAAA8C,EAAC,SAAI,WAAWlc,EAAO,WAAW,cAAY6C,EAAE,eAAe,GAC5D,UAAA;AAAA,YAAAqK,KACC,gBAAAa,EAAC,QAAA,EAAK,WAAW/N,EAAO,kBAAmB,UAAA6C,EAAE,yBAAyB,EAAE,UAAUqK,GAAA,CAAwB,EAAA,CAAE,sBAE3G,QAAA,EAAK;AAAA,YAGR,gBAAAa,EAAC,QAAA,EACE,UAAAb,KACC,gBAAAgP,EAAAuB,IAAA,EACE,UAAA;AAAA,cAAA,gBAAA1P,EAAC,QAAA,EAAK,WAAW/N,EAAO,iBAAkB,aAAYqZ,GAAS,QAAQ,CAAC,CAAC,EAAA,CAAE;AAAA,cAAQ;AAAA,cACnF,gBAAAtL,EAAC,QAAA,EAAK,WAAW/N,EAAO,gBAAiB,aAAYyZ,GAAgB,QAAQ,CAAC,CAAC,EAAA,CAAE;AAAA,YAAA,EAAA,CACnF,IAEA,gBAAA1L,EAAC,QAAA,EAAK,WAAW/N,EAAO,gBAAiB,UAAA2X,GAAY0B,GAAS,QAAQ,CAAC,CAAC,EAAA,CAAE,EAAA,CAE9E;AAAA,UAAA,EAAA,CACF;AAAA,QAAA;AAAA,MAAA,GAEJ;AAAA,OAEE,MAAM;AACN,cAAMsF,KAAa1W,KAAA,gBAAAA,EAAQ,kBAAiB;AAC5C,eAAI0W,MAAe,yBACb1F,KAAiB,IAEjB,gBAAAlL,EAAC,UAAA,EAAO,MAAK,UAAS,SAASF,GAAQ,UAAU,CAACnC,GAAW,WAAW1L,EAAO,KAC5E,UAAAoD,IACGP,EAAE,mBAAmB,IACrBA,EAAE,uBAAuB,EAAE,OAAOoW,IAAgB,aAAaja,GAAeZ,GAAQ6a,EAAc,EAAA,CAAG,EAAA,CAC7G,IAKF,gBAAAiD,EAAC,OAAA,EAAI,WAAWlc,EAAO,gBACrB,UAAA;AAAA,UAAA,gBAAA+N,EAAC,UAAA,EAAO,MAAK,UAAS,SAASF,GAAQ,UAAU,CAACnC,GAAW,WAAW1L,EAAO,aAC7E,UAAA,gBAAA+N,EAAC,QAAA,EAAM,UAAalL,MAAE,sBAAyB,0BAAN,GAAkC,EAAA,CAC7E;AAAA,UACA,gBAAAkL,EAAC,YAAO,MAAK,UAAS,SAASD,IAAmB,UAAU,CAACpC,GAAW,WAAW1L,EAAO,cACxF,UAAA,gBAAA+N,EAAC,UAAM,UAAalL,EAAbO,IAAe,0BAA6B,qBAAN,EAA2B,CAAE,EAAA,CAC5E;AAAA,QAAA,GACF,IAIAub,MAAe,aAEf,gBAAA5Q,EAAC,UAAA,EAAO,MAAK,UAAS,SAASD,IAAmB,UAAU,CAACpC,GAAW,WAAW1L,EAAO,KACvF,UAAAoD,IACGP,EAAE,uBAAuB,IACzBoW,KAAiB,IACfpW,EAAE,uBAAuB,EAAE,OAAOoW,IAAgB,aAAaja,GAAeZ,GAAQ6a,EAAc,EAAA,CAAG,IACvGpW,EAAE,qBAAqB,GAC/B,IAKF,gBAAAkL,EAAC,UAAA,EAAO,MAAK,UAAS,SAASF,GAAQ,UAAU,CAACnC,GAAW,WAAW1L,EAAO,KAC5E,UAAAoD,IACGP,EAAE,mBAAmB,IACrBoW,KAAiB,IACfpW,EAAE,uBAAuB,EAAE,OAAOoW,IAAgB,aAAaja,GAAeZ,GAAQ6a,EAAc,EAAA,CAAG,IACvGpW,EAAE,0BAA0B,GACpC;AAAA,MAEJ,GAAA;AAAA,MAEA,gBAAAqZ,EAAC,OAAA,EAAI,WAAWlc,EAAO,WACpB,UAAA;AAAA,QAAA6C,EAAE,mBAAmB;AAAA,QAAG;AAAA,QACzB,gBAAAkL,EAAC,OAAE,MAAK,yCAAwC,QAAO,UAAS,KAAI,uBAAsB,UAAA,cAAA,CAE1F;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;;;;;;;;;;;;;;;;;;ACl0BA,SAASsR,GAAmBrhB,GAAgC;AAC1D,QAAMC,IAAQ,OAAOD,KAAO,EAAE,EAAE,KAAA;AAChC,MAAI,CAACC,EAAO,QAAO;AACnB,MAAIA,EAAM,WAAW,+BAA+B,EAAG,QAAOA;AAC9D,QAAMqhB,IAASrhB,EAAM,QAAQ,OAAO,EAAE;AACtC,SAAOqhB,IAAS,gCAAgCA,CAAM,KAAK;AAC7D;AAEA,SAASC,KAAsB;AAC7B,MAAI,OAAO,SAAW,IAAa,QAAO;AAC1C,QAAMxT,IAAe,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,SAAS;AAC9E,MAAIA,EAAc,QAAOsT,GAAmBtT,CAAY;AAExD,QAAMyT,IAAc,SAAS,cAAc,2BAA2B,GAChE9U,IAAQ8U,KAAA,gBAAAA,EAAa,cAAoD;AAC/E,SAAOH,IAAmB3U,KAAA,gBAAAA,EAAO,UAAS,EAAE;AAC9C;AAEA,SAAS+U,KAAmB;AAC1B,MAAI,OAAO,WAAa,IAAa,QAAO;AAC5C,QAAMD,IAAc,SAAS,cAAc,2BAA2B;AACtE,UAAOA,KAAA,gBAAAA,EAAa,cAAgC,8BAA6B;AACnF;AAEA,SAASE,KAAqB;AAC5B,QAAMC,IAAgBF,GAAA;AACtB,MAAI,CAACE,EAAe,QAAO;AAC3B,QAAM7iB,IAAW,OAAO6iB,EAAc,SAAS,GAAG;AAClD,SAAI,CAAC,OAAO,SAAS7iB,CAAQ,KAAKA,KAAY,IAAU,OACjD,KAAK,MAAMA,CAAQ;AAC5B;AAEA,SAAS8iB,GAA0B9H,GAAsB;AACvD,QAAM6H,IAAgBF,GAAA;AACtB,SAAKE,KACLA,EAAc,QAAQ,OAAO7H,CAAY,GACzC6H,EAAc,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,GAAA,CAAM,CAAC,GACjEA,EAAc,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,GAAA,CAAM,CAAC,GAC3D,MAJoB;AAK7B;AAOO,SAASE,GAAoB,EAAE,WAAAxM,GAAW,4BAAAyM,IAA6B,MAAmC;;AAC/G,QAAM,EAAE,SAAA3X,GAAS,OAAA1K,GAAO,QAAAwK,GAAQ,kBAAAC,GAAkB,cAAApJ,GAAc,QAAAV,EAAA,IAAW4P,GAAA,GACrE,CAAC+R,GAAkBC,EAAmB,IAAI7c,GAAS,EAAE,GACrD,CAAC8c,GAAiBC,EAAkB,IAAI/c,GAAwB,IAAI,GACpE,CAACgd,IAAoBC,EAAqB,IAAIjd,GAAwB,IAAI,GAC1Ekd,IACJP,KACC,OAAO,SAAW,OACjB,EACG,OAA4D;AAGnE,EAAA9Z,EAAU,MAAM;AACd,UAAMsa,IAAgB,MAAMN,GAAoBT,IAAqB;AACrE,IAAAe,EAAA,GACA,SAAS,iBAAiB,kBAAkBA,CAAa;AACzD,UAAMC,IAAQ,OAAO,YAAYD,GAAe,GAAG;AACnD,WAAO,MAAM;AACX,eAAS,oBAAoB,kBAAkBA,CAAa,GAC5D,OAAO,cAAcC,CAAK;AAAA,IAC5B;AAAA,EACF,GAAG,CAAA,CAAE,GAELva,EAAU,MAAM;AACd,UAAMwa,IAAe,MAAMN,GAAmBR,IAAoB,GAC5De,IAAsB,CAACljB,OAAiB;AAC5C,YAAMmjB,KAASnjB,GAAM;AACrB,MAAMmjB,cAAkB,oBACpBA,GAAO,SAAS,cACpBF,EAAA;AAAA,IACF;AAEA,IAAAA,EAAA,GACA,SAAS,iBAAiB,SAASC,GAAqB,EAAI,GAC5D,SAAS,iBAAiB,UAAUA,GAAqB,EAAI;AAC7D,UAAMF,KAAQ,OAAO,YAAYC,GAAc,GAAG;AAElD,WAAO,MAAM;AACX,eAAS,oBAAoB,SAASC,GAAqB,EAAI,GAC/D,SAAS,oBAAoB,UAAUA,GAAqB,EAAI,GAChE,OAAO,cAAcF,EAAK;AAAA,IAC5B;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAMrX,IAAQN;AAAA,IACZ,MAAM,CAAC,IAAIX,KAAA,gBAAAA,EAAQ,UAAS,CAAA,CAAG,EAAE,KAAK,CAAC5G,GAAGC,MAAMD,EAAE,gBAAgBC,EAAE,aAAa;AAAA,IACjF,CAAC2G,KAAA,gBAAAA,EAAQ,KAAK;AAAA,EAAA,GAGV0Y,KAAkBN,MACpB5hB,IAAAyJ,EAAiB,CAAC,MAAlB,gBAAAzJ,EAAqB,OAAM,KAC3BshB,OAAoB1Y,KAAAa,EAAiB,CAAC,MAAlB,gBAAAb,GAAqB,OAAM,IAC7CuZ,IAAgB1Y,EAAiB,KAAK,CAACrL,MAAYA,EAAQ,OAAO8jB,EAAe,KAAK;AAoB5F,SAlBA3a,EAAU,MAAM;;AACd,QAAI,CAACkD,EAAM,QAAQ;AACjB,MAAAkX,GAAsB,IAAI;AAC1B;AAAA,IACF;AACA,QAAIH,KAAmB,MAAM;AAC3B,UAAIY,IAAmC;AACvC,iBAAWzX,MAAQF;AACjB,QAAIE,GAAK,iBAAiB6W,MACxBY,IAAoBzX,GAAK;AAG7B,MAAAgX,GAAsBS,OAAqBpiB,IAAAyK,EAAM,CAAC,MAAP,gBAAAzK,EAAU,WAAU,IAAI;AACnE;AAAA,IACF;AACA,IAAA2hB,GAAsB,CAAC7Z;;AAAY,aAAAA,OAAW9H,KAAAyK,EAAM,CAAC,MAAP,gBAAAzK,GAAU,WAAU;AAAA,KAAI;AAAA,EACxE,GAAG,CAACwhB,GAAiB/W,CAAK,CAAC,IAEvBjB,KAAA,gBAAAA,EAAQ,gBAAe,oBAClB,OAIP,gBAAAiU,EAAC,WAAA,EAAQ,WAAW,CAAClc,GAAO,OAAOqT,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,aAAWlL,GAClF,UAAA;AAAA,IAAA,gBAAA4F,EAAC,MAAA,EAAG,WAAW/N,GAAO,OAAQ,uCAAQ,4BAAO,WAAU,kBAAA,CAAkB;AAAA,IACxEmI,IAAU,gBAAA4F,EAAC,OAAA,EAAI,WAAW/N,GAAO,QAAQ,uCAAyB,IAAS;AAAA,IAC3EvC,IAAQ,gBAAAsQ,EAAC,OAAA,EAAI,WAAW/N,GAAO,OAAQ,aAAM,IAAS;AAAA,IACtD,CAACmI,KAAW,CAAC1K,KAAS,CAACmjB,IACtB,gBAAA7S,EAAC,OAAA,EAAI,WAAW/N,GAAO,QAAQ,UAAA,uDAAA,CAAoD,IACjF;AAAA,IACH,CAACmI,KAAW,CAAC1K,KAASmjB,IACrB,gBAAA7S,EAAA0P,IAAA,EACE,UAAA,gBAAA1P,EAAC,OAAA,EAAI,WAAW/N,GAAO,OACpB,UAAAkJ,EAAM,IAAI,CAACE,MAAS;AACnB,YAAM0X,IAAe,OAAO,WAAW1X,EAAK,eAAe,GACrD2X,KAAW,OAAO,SAASD,CAAY,KAAKA,IAAe,IAC7D,QAAQ,KAAK,MAAMA,CAAY,CAAC,MAChC,YACEE,KAAUb,OAAuB/W,EAAK;AAE5C,aACE,gBAAA2E;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW,CAAC/N,GAAO,MAAMghB,KAAUhhB,GAAO,eAAe,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,UAErF,UAAA,gBAAAkc,EAAC,SAAA,EAAM,WAAWlc,GAAO,WACvB,UAAA;AAAA,YAAA,gBAAAkc,EAAC,OAAA,EAAI,WAAWlc,GAAO,kBACrB,UAAA;AAAA,cAAA,gBAAA+N;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW/N,GAAO;AAAA,kBAClB,MAAK;AAAA,kBACL,SAAAghB;AAAA,kBACA,MAAK;AAAA,kBACL,UAAU,MAAM;AACd,oBAAAZ,GAAsBhX,EAAK,MAAM,GACjCwW,GAA0BxW,EAAK,aAAa;AAAA,kBAC9C;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEF,gBAAA2E,EAAC,UAAK,WAAW/N,GAAO,WAAY,UAAA,OAAOoJ,EAAK,aAAa,GAAA,CAAG;AAAA,cAChE,gBAAA2E,EAAC,QAAA,EAAK,WAAW/N,GAAO,cAAe,UAAA+gB,GAAA,CAAS;AAAA,YAAA,GAClD;AAAA,YACA,gBAAAhT,EAAC,SACG,WAAA,MAAM;AACN,oBAAMkT,KAAY,OAAOL,EAAc,SAAS,GAAG;AACnD,kBAAI,CAAC,OAAO,SAASK,EAAS,EAAG,QAAO;AACxC,oBAAMC,KAAaD,KAAY7X,EAAK,eAC9B2T,KAAc,OAAO,SAAS+D,CAAY,KAAKA,IAAe,GAC9D1T,KAAkB2P,KACpBmE,MAAc,IAAKJ,IAAe,OAClCI;AAEJ,qBAAKnE,KAWH,gBAAAb,EAAC,QAAA,EAAK,WAAWlc,GAAO,UACtB,UAAA;AAAA,gBAAA,gBAAA+N,EAAC,QAAA,EAAK,WAAW/N,GAAO,UACrB,aAAqBkhB,IAAYpiB,GAAcV,CAAM,EAAA,CACxD;AAAA,gBACA,gBAAA2P,EAAC,UAAK,WAAW/N,GAAO,UACrB,UAAApB,GAAqBwO,IAAiBtO,GAAcV,CAAM,EAAA,CAC7D;AAAA,cAAA,GACF,IAhBE,gBAAA2P,EAAC,QAAA,EAAK,WAAW/N,GAAO,UACtB,UAAA,gBAAA+N,EAAC,QAAA,EAAK,WAAW/N,GAAO,UACrB,UAAApB,GAAqBsiB,IAAYpiB,GAAcV,CAAM,GACxD,GACF;AAAA,YAcN,KAAG,CACL;AAAA,UAAA,EAAA,CACF;AAAA,QAAA;AAAA,QAlDKgL,EAAK;AAAA,MAAA;AAAA,IAqDhB,CAAC,EAAA,CACH,EAAA,CACF,IACE;AAAA,EAAA,GACN;AAEJ;AC5MA,SAAS+X,GAAajgB,GAAwC;AAC5D,MAAKA,KAAA,QAAAA,EAAY;AACjB,WAAOA,EAAW,OAA+B,CAACyE,GAAKyb,OACjDA,KAAA,QAAAA,EAAM,QAAKzb,EAAIyb,EAAK,GAAG,IAAIA,EAAK,SAAS,KACtCzb,IACN,CAAA,CAAE;AACP;AAEA,SAAS0Z,GAAmB7d,GAAuB;AACjD,QAAMsR,IAAQ,WAAW,KAAKtR,CAAa;AAC3C,SAAOsR,IAAQA,EAAM,CAAC,IAAItR;AAC5B;AAEA,SAAS6f,GAAa9H,GAA+C;AACnE,MAAIA,KAAa,KAAM,QAAO;AAC9B,QAAMvb,IAAM,OAAOub,CAAS,EAAE,KAAA;AAC9B,SAAKvb,IACDA,EAAI,WAAW,+BAA+B,IAAUA,IACrD,gCAAgCA,CAAG,KAFzB;AAGnB;AAEA,SAASsjB,KAAkB;;AACzB,SAAI,OAAO,SAAW,MAAoB,SAClC7iB,IAAA,OAEL,YAFK,gBAAAA,EAEI,UAAS;AACvB;AAEA,SAAS8iB,KAAe;AACtB,QAAMC,IAAQF,GAAA;AACd,SAAKE,IAEDA,EAAM,gBAAgB,UAAgB,KACnC,SAAS,KAAKA,EAAM,QAAQ,EAAE,IAHlB;AAIrB;AAEA,SAASC,KAAqB;AAC5B,SAAI,OAAO,WAAa,MAAoB,KACrC,CAAC,CAAC,SAAS,cAAc,aAAa;AAC/C;AAEA,SAASC,KAAyB;AAChC,SAAI,CAACH,GAAA,KAAkB,CAACE,GAAA,IAA6B,MAErD,SAAS,cAAc,IAAI,YAAY,gBAAgB;AAAA,IACrD,SAAS;AAAA,IACT,QAAQ,EAAE,MAAM,GAAA;AAAA,EAAK,CACtB,CAAC,GAEK;AACT;AAOA,SAASE,KAA0B;AACjC,SAAO,SAAS,OAAA;AAClB;AAEA,eAAeC,GAAaC,GAAkBC,GAAkC;AAC9E,QAAMC,IAAM,MAAM,MAAMF,GAAU;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAAA;AAAA,IAElB,MAAM,KAAK,UAAUC,CAAO;AAAA,EAAA,CAC7B;AACD,MAAI,CAACC,EAAI,IAAI;AACX,UAAMrjB,IAAO,MAAMqjB,EAAI,OAAO,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI,MAAMrjB,KAAQ,wBAAwBqjB,EAAI,MAAM,EAAE;AAAA,EAC9D;AACA,SAAOA,EAAI,KAAA,EAAO,MAAM,MAAM,IAAI;AACpC;AAEA,eAAeC,KAAc;AAC3B,QAAMD,IAAM,MAAM,MAAM,YAAY;AAAA,IAClC,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAAA;AAAA,EAClB,CACD;AACD,MAAI,CAACA,EAAI;AACP,UAAM,IAAI,MAAM,wBAAwBA,EAAI,MAAM,EAAE;AAEtD,SAAOA,EAAI,KAAA;AACb;AAEO,SAASE,KAA6C;AAC3D,SAAO;AAAA,IACL,MAAM,SAASvgB,GAAO;AACpB,YAAMwgB,IAAQxgB,EAAM,IAAI,CAACC,OAAU;AAAA,QACjC,IAAI0d,GAAmB1d,EAAK,aAAa;AAAA,QACzC,UAAUA,EAAK;AAAA,QACf,YAAYwf,GAAaxf,EAAK,UAAU;AAAA,MAAA,EACxC;AACF,YAAMigB,GAAa,gBAAgB,EAAE,OAAAM,GAAO;AAAA,IAC9C;AAAA,IACA,MAAM,oBAAoBxgB,GAAO;AAC/B,YAAMwgB,IAAQxgB,EAAM,IAAI,CAACC,OAAU;AAAA,QACjC,IAAI0d,GAAmB1d,EAAK,aAAa;AAAA,QACzC,UAAUA,EAAK;AAAA,QACf,YAAYwf,GAAaxf,EAAK,UAAU;AAAA,MAAA,EACxC;AACF,YAAMigB,GAAa,gBAAgB,EAAE,OAAAM,GAAO;AAAA,IAC9C;AAAA,IACA,MAAM,YAAYxgB,GAAO;AACvB,iBAAWC,KAAQD;AACjB,cAAMkgB,GAAa,mBAAmB;AAAA,UACpC,IAAIjgB,EAAK;AAAA,UACT,UAAUA,EAAK;AAAA,UACf,YAAYwf,GAAaxf,EAAK,UAAU;AAAA,QAAA,CACzC;AAAA,IAEL;AAAA,IACA,MAAM,YAAYwgB,GAAS;AACzB,iBAAWvc,KAAMuc;AACf,cAAMP,GAAa,mBAAmB,EAAE,IAAAhc,GAAI,UAAU,GAAG;AAAA,IAE7D;AAAA,IACA,MAAM,mCAAmC;AACvC,YAAMwc,IAAO,MAAMJ,GAAA,GACbtc,IAAqC,CAAA;AAC3C,iBAAW2c,KAAQD,EAAK,SAAS,CAAA,GAAI;AACnC,cAAM5gB,IAAgB6f,GAAagB,EAAK,EAAE;AAC1C,YAAI,CAAC7gB,EAAe;AACpB,cAAM1E,IAAW,OAAOulB,EAAK,YAAY,CAAC;AAC1C,QAAI,CAAC,OAAO,SAASvlB,CAAQ,KAAKA,KAAY,MAC9C4I,EAAWlE,CAAa,KAAKkE,EAAWlE,CAAa,KAAK,KAAK,KAAK,MAAM1E,CAAQ;AAAA,MACpF;AACA,aAAO4I;AAAA,IACT;AAAA,IACA,aAAa;AACX,MAAIgc,QAGJ,OAAO,WAAW,MAAMC,GAAA,GAA2B,CAAC;AAAA,IACtD;AAAA,IACA,qBAAqB;AAEnB,aAAO,SAAS,OAAO;AAAA,IACzB;AAAA,EAAA;AAEJ;","x_google_ignoreList":[11,12,13,14,15,16,17,18,19,20]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/constants.ts","../src/api/fetchActiveBundleConfigs.ts","../src/api/fetchBundleConfig.ts","../src/api/fetchBundleConfigStatus.ts","../src/utils/stock.ts","../src/utils/ruleReward.ts","../src/utils/previewMode.ts","../src/utils/analytics.ts","../src/i18n.ts","../src/context/BundleProvider.tsx","../src/hooks/useBundleBuilder.ts","../src/hooks/useBundleBuilderDrawer.ts","../src/components/BundleButton.tsx","../../../node_modules/tween-functions/index.js","../../../node_modules/react-confetti/dist/react-confetti.mjs","../../../node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/lucide-react/dist/esm/icons/chevron-down.js","../../../node_modules/lucide-react/dist/esm/icons/plus.js","../../../node_modules/lucide-react/dist/esm/icons/search.js","../../../node_modules/lucide-react/dist/esm/icons/trash-2.js","../src/components/RuleRewardDisplay.tsx","../src/components/BundleBuilderDrawer.tsx","../src/components/BundleBuilderPanel.tsx","../src/components/VolumeDiscountPanel.tsx","../src/adapters/LiquidAdapter.ts"],"sourcesContent":["export const BundleLineAttributeKeys = {\n bundleId: \"_bundle_id\",\n bundleConfig: \"_bundle_config\",\n bundleSource: \"_bundle_source\",\n bundleTitle: \"_bundle_title\",\n bundleGift: \"_bundle_gift\",\n bundleGiftRule: \"_bundle_gift_rule\",\n} as const;\n\nexport const BundleSessionStorageKeys = {\n pendingActions: \"best_bundles_pending_actions\",\n redirectedBundleState: \"best_bundles_redirected_bundle_state\",\n} as const;\n","import type { PublicActiveBundleConfigsResponse } from \"../types\";\n\nexport async function fetchActiveBundleConfigs(params: {\n apiBaseUrl: string;\n shop: string;\n signal?: AbortSignal;\n}): Promise<PublicActiveBundleConfigsResponse> {\n const url = new URL(\"/api/public/bundle-configs-active\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicActiveBundleConfigsResponse;\n}\n","import type { PublicBundleConfigResponse } from \"../types\";\n\nexport async function fetchBundleConfig(params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n fresh?: boolean;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigResponse> {\n const url = new URL(\"/api/public/bundle-config\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n if (params.configHandle) {\n url.searchParams.set(\"handle\", params.configHandle);\n }\n if (params.fresh) {\n url.searchParams.set(\"fresh\", \"1\");\n }\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n // The endpoint uses 4xx/5xx for some errors; normalize to {ok:false}.\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigResponse;\n}\n","import type { PublicBundleConfigStatusResponse } from \"../types\";\n\nexport async function fetchBundleConfigStatus(params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigStatusResponse> {\n const url = new URL(\"/api/public/bundle-config-status\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n if (params.configHandle) {\n url.searchParams.set(\"handle\", params.configHandle);\n }\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigStatusResponse;\n}\n","import type { BundleEligibleVariant } from \"../types\";\n\nexport function getVariantSelectionLimit(variant: BundleEligibleVariant | null | undefined) {\n if (!variant || variant.availableForSale === false) return 0;\n if (variant.inventoryPolicy === \"CONTINUE\") return Number.POSITIVE_INFINITY;\n // Untracked inventory can surface as null/0 sellable quantity while still available for sale.\n if (variant.sellableOnlineQuantity == null) return Number.POSITIVE_INFINITY;\n\n const quantity = Number(variant.sellableOnlineQuantity);\n if (!Number.isFinite(quantity)) return Number.POSITIVE_INFINITY;\n if (quantity <= 0 && variant.availableForSale === true) return Number.POSITIVE_INFINITY;\n return Math.max(0, Math.floor(quantity));\n}\n\nexport function isVariantAtStockLimit(\n variant: BundleEligibleVariant | null | undefined,\n quantity: number,\n) {\n const limit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(limit)) return false;\n return Math.max(0, Math.floor(quantity || 0)) >= limit;\n}\n\nexport function canAddGiftVariant(\n variant: BundleEligibleVariant | null | undefined,\n inCartQty = 0,\n) {\n if (!variant || variant.availableForSale === false) return false;\n const limit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(limit)) return true;\n const normalizedInCart = Math.max(0, Math.floor(inCartQty));\n return Math.max(0, Math.floor(limit) - normalizedInCart) >= 1;\n}\n","import type { BundleDiscountRule, BundleEligibleVariant } from \"../types\";\nimport type { BundleUiMessageKey } from \"../i18n\";\n\nexport function formatPercent0dp(value: string) {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n}\n\nexport function normalizeRuleRewardType(\n rule: Pick<BundleDiscountRule, \"rewardType\" | \"freeGiftVariantIds\" | \"freeGiftVariants\">,\n): BundleDiscountRule[\"rewardType\"] {\n if (rule.rewardType === \"free_gift\") return \"free_gift\";\n if ((rule.freeGiftVariants?.length ?? 0) > 0) return \"free_gift\";\n if ((rule.freeGiftVariantIds?.length ?? 0) > 0) return \"free_gift\";\n return \"discount\";\n}\n\nexport function isFreeGiftRule(\n rule: Pick<BundleDiscountRule, \"rewardType\" | \"freeGiftVariantIds\" | \"freeGiftVariants\">,\n): boolean {\n return normalizeRuleRewardType(rule) === \"free_gift\";\n}\n\nexport function getRuleFreeGiftVariants(rule: BundleDiscountRule) {\n return rule.freeGiftVariants ?? [];\n}\n\nexport function getRuleGiftVariantById(\n rule: BundleDiscountRule,\n variantId: string,\n): BundleEligibleVariant | undefined {\n return rule.freeGiftVariants?.find((variant) => variant.id === variantId);\n}\n\nexport function getGiftProductTitles(rule: BundleDiscountRule): string[] {\n return (rule.freeGiftVariants ?? [])\n .map((variant) => variant.product?.title?.trim() || variant.displayName?.trim() || variant.title?.trim())\n .filter((title): title is string => Boolean(title));\n}\n\nexport function formatRuleRewardLabel(\n rule: BundleDiscountRule,\n t: (key: BundleUiMessageKey, values?: Record<string, string | number>) => string,\n): string {\n if (normalizeRuleRewardType(rule) === \"free_gift\") {\n const titles = getGiftProductTitles(rule);\n if (titles.length) {\n return t(\"bundle.discount.free_gift_with_products\", { products: titles.join(\", \") });\n }\n return t(\"bundle.discount.free_gift\");\n }\n\n return t(\"bundle.discount.off_label\", { discount: formatPercent0dp(rule.discountPercent) });\n}\n\nexport function formatRuleCelebrationText(\n rule: BundleDiscountRule,\n t: (key: BundleUiMessageKey, values?: Record<string, string | number>) => string,\n): string {\n if (normalizeRuleRewardType(rule) === \"free_gift\") {\n const titles = getGiftProductTitles(rule);\n if (titles.length) {\n return t(\"bundle.celebration.received_free_gift_with_products\", { products: titles.join(\", \") });\n }\n return t(\"bundle.celebration.received_free_gift\");\n }\n\n return t(\"bundle.celebration.received_discount\", {\n discount: formatPercent0dp(rule.discountPercent),\n });\n}\n","export function isBundlePreviewMode(): boolean {\n if (typeof window === \"undefined\") return false;\n const win = window as Window & {\n __BUNDLE_PREVIEW_MODE__?: boolean;\n __BUNDLE_PREVIEW_CONFIG__?: unknown;\n };\n return win.__BUNDLE_PREVIEW_MODE__ === true || Boolean(win.__BUNDLE_PREVIEW_CONFIG__);\n}\n\nexport function getBundlePreviewSnapshot() {\n if (typeof window === \"undefined\") return null;\n const win = window as Window & {\n __BUNDLE_PREVIEW_CONFIG__?: import(\"../types\").BundleConfig;\n __BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__?: import(\"../types\").BundleEligibleVariant[];\n __BUNDLE_PREVIEW_VARIANTS_LOADING__?: boolean;\n };\n const config = win.__BUNDLE_PREVIEW_CONFIG__;\n if (!config) return null;\n return {\n config,\n eligibleVariants: Array.isArray(win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__)\n ? win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__\n : [],\n previewVariantsLoading: win.__BUNDLE_PREVIEW_VARIANTS_LOADING__ === true,\n };\n}\n","const ANONYMOUS_USER_ID_KEY = \"bb_anonymous_user_id\";\n\n/**\n * Gets or creates an anonymous user ID stored in localStorage.\n * This ID persists across sessions to attribute events to the same user.\n */\nexport function getOrCreateAnonymousUserId(): string {\n if (typeof window === \"undefined\" || typeof localStorage === \"undefined\") {\n // Fallback for SSR or environments without localStorage\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n try {\n const existing = localStorage.getItem(ANONYMOUS_USER_ID_KEY);\n if (existing && typeof existing === \"string\" && existing.length > 0) {\n return existing;\n }\n\n // Generate new ID\n let newId: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) {\n newId = cryptoAny.randomUUID();\n } else {\n throw new Error(\"crypto.randomUUID not available\");\n }\n } catch {\n // Fallback UUID generation\n newId = `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n localStorage.setItem(ANONYMOUS_USER_ID_KEY, newId);\n return newId;\n } catch {\n // If localStorage fails, generate a temporary ID\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n\nexport type AnalyticsEventType =\n | \"DRAWER_OPENED\"\n | \"DRAWER_CLOSED\"\n | \"VARIANT_SELECTION_CHANGED\"\n | \"BUNDLE_ADDED_TO_BASKET\";\n\n/** Mixpanel event names used for the bundle funnel (backend maps these to Mixpanel). */\nexport type MixpanelBundleEventName =\n | \"bundle_opened\"\n | \"bundle_closed\"\n | \"bundle_started\"\n | \"bundle_completed\"\n | \"bundle_added_to_cart\"\n | \"checkout_started_with_bundle\";\n\nexport type DrawerOpenedEvent = {\n eventType: \"DRAWER_OPENED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_opened\";\n};\n\nexport type DrawerClosedEvent = {\n eventType: \"DRAWER_CLOSED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_closed\";\n};\n\nexport type VariantSelectionChangedEvent = {\n eventType: \"VARIANT_SELECTION_CHANGED\";\n shop: string;\n anonymousUserId: string;\n before: Record<string, number>; // variantId -> quantity\n after: Record<string, number>;\n timestamp: string;\n mixpanelEvent?: \"bundle_started\" | \"bundle_completed\";\n};\n\nexport type BundleAddedToBasketEvent = {\n eventType: \"BUNDLE_ADDED_TO_BASKET\";\n shop: string;\n anonymousUserId: string;\n bundleId: string;\n productVariantIds: string[];\n grossPrice: number;\n discountedPrice: number;\n currency?: string;\n discountThresholdIdentifier: string; // rule handle\n discountLabel: string;\n discountPercentage: number | null;\n discountedAmount: number;\n timestamp: string;\n checkout?: boolean;\n mixpanelEvent?: \"bundle_added_to_cart\" | \"checkout_started_with_bundle\";\n};\n\nexport type AnalyticsEvent =\n | DrawerOpenedEvent\n | DrawerClosedEvent\n | VariantSelectionChangedEvent\n | BundleAddedToBasketEvent;\n\n/**\n * Sends an analytics event to the backend API endpoint.\n * Failures are silently caught to prevent breaking bundle functionality.\n */\nexport async function trackEvent(\n analyticsEndpoint: string,\n shop: string,\n event: AnalyticsEvent,\n): Promise<void> {\n if (typeof window === \"undefined\") {\n return; // Skip in SSR\n }\n\n try {\n const url = new URL(analyticsEndpoint, window.location.origin);\n url.searchParams.set(\"shop\", shop);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(event),\n // Don't wait for response - fire and forget\n keepalive: true,\n });\n\n if (!response.ok) {\n console.warn(\n `[Bundle Analytics] Event tracking failed with status ${response.status}:`,\n await response.text().catch(() => \"Unable to read response\"),\n );\n }\n } catch (error) {\n // Log error for debugging but don't break bundle functionality\n console.warn(\"[Bundle Analytics] Failed to track event:\", error);\n }\n}\n","export type BundleUiLocale = \"en\" | \"fr\" | \"de\" | \"es\";\n\nexport type BundleUiMessageKey =\n | \"bundle.title.default\"\n | \"bundle.loading\"\n | \"bundle.empty\"\n | \"bundle.drawer.aria\"\n | \"bundle.search\"\n | \"bundle.search.expanded\"\n | \"bundle.search.placeholder\"\n | \"bundle.search.clear\"\n | \"bundle.close\"\n | \"bundle.section.discount_tiers\"\n | \"bundle.section.your_bundle\"\n | \"bundle.section.select_items\"\n | \"bundle.select.items\"\n | \"bundle.size.min\"\n | \"bundle.stock.max_reached\"\n | \"bundle.stock.max_added\"\n | \"bundle.stock.sold_out\"\n | \"bundle.item.generic\"\n | \"bundle.slot\"\n | \"bundle.unlocks\"\n | \"bundle.totals\"\n | \"bundle.discount.badge\"\n | \"bundle.discount.off_label\"\n | \"bundle.discount.free\"\n | \"bundle.discount.free_gift\"\n | \"bundle.discount.free_gift_with_products\"\n | \"bundle.celebration.received_discount\"\n | \"bundle.celebration.received_free_gift\"\n | \"bundle.celebration.received_free_gift_with_products\"\n | \"bundle.cta.adding\"\n | \"bundle.cta.processing\"\n | \"bundle.cta.checkout\"\n | \"bundle.cta.add_to_bundle\"\n | \"bundle.cta.add_to_basket\"\n | \"bundle.cta.add_more\"\n | \"bundle.powered_by\"\n | \"bundle.button.default\"\n | \"bundle.provider.inactive_error\"\n | \"bundle.provider.load_error\"\n | \"bundle.provider.stock_error\"\n | \"bundle.provider.add_error\"\n | \"bundle.a11y.add_to_bundle\"\n | \"bundle.a11y.remove_from_bundle\"\n | \"bundle.a11y.quantity\"\n | \"bundle.a11y.sold_out\"\n | \"bundle.a11y.max_available_selected\"\n | \"bundle.a11y.increase\"\n | \"bundle.a11y.decrease\"\n | \"bundle.select.variant\"\n | \"bundle.stock.sold_out_suffix\";\n\nexport type BundleUiMessages = Partial<Record<BundleUiMessageKey, string>>;\n\ntype Dict = Record<BundleUiMessageKey, string>;\n\nconst EN: Dict = {\n \"bundle.title.default\": \"Build your bundle\",\n \"bundle.loading\": \"Loading...\",\n \"bundle.empty\": \"Your selected eligible products for bundling will show here\",\n \"bundle.drawer.aria\": \"Bundle builder\",\n \"bundle.search\": \"Search\",\n \"bundle.search.expanded\": \"Search (expanded)\",\n \"bundle.search.placeholder\": \"Search\",\n \"bundle.search.clear\": \"Clear search\",\n \"bundle.close\": \"Close\",\n \"bundle.section.discount_tiers\": \"Discount tiers\",\n \"bundle.section.your_bundle\": \"Your bundle\",\n \"bundle.section.select_items\": \"Choose items\",\n \"bundle.select.items\": \"Select items\",\n \"bundle.size.min\": \"(min {{min}})\",\n \"bundle.stock.max_reached\": \"Max Reached\",\n \"bundle.stock.max_added\": \"Max Added To Cart\",\n \"bundle.stock.sold_out\": \"Sold Out\",\n \"bundle.item.generic\": \"Item\",\n \"bundle.slot\": \"Slot {{slot}}\",\n \"bundle.unlocks\": \"Unlocks {{discount}}\",\n \"bundle.totals\": \"Totals\",\n \"bundle.discount.badge\": \"{{discount}}% Discount\",\n \"bundle.discount.off_label\": \"{{discount}}% off\",\n \"bundle.discount.free\": \"Free\",\n \"bundle.discount.free_gift\": \"Free gift\",\n \"bundle.discount.free_gift_with_products\": \"Free gift: {{products}}\",\n \"bundle.celebration.received_discount\": \"You received a {{discount}}% discount!\",\n \"bundle.celebration.received_free_gift\": \"You unlocked a free gift!\",\n \"bundle.celebration.received_free_gift_with_products\": \"You unlocked a free gift: {{products}}!\",\n \"bundle.cta.adding\": \"Adding...\",\n \"bundle.cta.processing\": \"Processing...\",\n \"bundle.cta.checkout\": \"Checkout\",\n \"bundle.cta.add_to_bundle\": \"Add\",\n \"bundle.cta.add_to_basket\": \"Add to Basket\",\n \"bundle.cta.add_more\": \"Add {{count}} more {{productWord}}\",\n \"bundle.powered_by\": \"powered by\",\n \"bundle.button.default\": \"Build a bundle\",\n \"bundle.provider.inactive_error\": \"Bundle is inactive.\",\n \"bundle.provider.load_error\": \"Failed to load bundle config.\",\n \"bundle.provider.stock_error\": \"Some bundle items are no longer available in the requested quantity. Please review your selection.\",\n \"bundle.provider.add_error\": \"We couldn't add this bundle right now. Please try again.\",\n \"bundle.a11y.add_to_bundle\": \"Add {{name}} to bundle\",\n \"bundle.a11y.remove_from_bundle\": \"Remove {{name}} from bundle\",\n \"bundle.a11y.quantity\": \"{{name}} quantity {{qty}}\",\n \"bundle.a11y.sold_out\": \"{{name}} is sold out\",\n \"bundle.a11y.max_available_selected\": \"{{name}} max available selected\",\n \"bundle.a11y.increase\": \"Increase {{name}}\",\n \"bundle.a11y.decrease\": \"Decrease {{name}}\",\n \"bundle.select.variant\": \"Select\",\n \"bundle.stock.sold_out_suffix\": \"— Sold Out\",\n};\n\nconst FR: Dict = {\n ...EN,\n \"bundle.title.default\": \"Creez votre bundle\",\n \"bundle.loading\": \"Chargement...\",\n \"bundle.empty\": \"Vos produits eligibles selectionnes pour le bundle apparaitront ici\",\n \"bundle.drawer.aria\": \"Constructeur de bundle\",\n \"bundle.search\": \"Rechercher\",\n \"bundle.search.expanded\": \"Rechercher (deplie)\",\n \"bundle.search.placeholder\": \"Rechercher\",\n \"bundle.search.clear\": \"Effacer la recherche\",\n \"bundle.close\": \"Fermer\",\n \"bundle.section.discount_tiers\": \"Paliers de remise\",\n \"bundle.section.your_bundle\": \"Votre bundle\",\n \"bundle.section.select_items\": \"Choisir des articles\",\n \"bundle.select.items\": \"Selectionner des articles\",\n \"bundle.stock.max_reached\": \"Maximum atteint\",\n \"bundle.stock.max_added\": \"Maximum deja dans le panier\",\n \"bundle.stock.sold_out\": \"Rupture de stock\",\n \"bundle.totals\": \"Totaux\",\n \"bundle.discount.badge\": \"{{discount}}% de réduction\",\n \"bundle.discount.off_label\": \"{{discount}}% de réduction\",\n \"bundle.discount.free\": \"Gratuit\",\n \"bundle.discount.free_gift\": \"Cadeau gratuit\",\n \"bundle.discount.free_gift_with_products\": \"Cadeau gratuit : {{products}}\",\n \"bundle.celebration.received_free_gift\": \"Vous avez débloqué un cadeau gratuit !\",\n \"bundle.celebration.received_free_gift_with_products\": \"Vous avez débloqué un cadeau gratuit : {{products}} !\",\n \"bundle.celebration.received_discount\": \"Vous avez recu une reduction de {{discount}}% !\",\n \"bundle.cta.checkout\": \"Paiement\",\n \"bundle.cta.add_to_bundle\": \"Ajouter\",\n \"bundle.cta.add_to_basket\": \"Ajouter au panier\",\n \"bundle.cta.add_more\": \"Ajoutez encore {{count}} {{productWord}}\",\n \"bundle.powered_by\": \"propulse par\",\n \"bundle.button.default\": \"Creer un bundle\",\n \"bundle.a11y.add_to_bundle\": \"Ajouter {{name}} au bundle\",\n \"bundle.a11y.remove_from_bundle\": \"Retirer {{name}} du bundle\",\n \"bundle.a11y.quantity\": \"Quantite de {{name}} : {{qty}}\",\n \"bundle.a11y.sold_out\": \"{{name}} est en rupture de stock\",\n \"bundle.a11y.max_available_selected\": \"{{name}} quantite maximale deja selectionnee\",\n \"bundle.a11y.increase\": \"Augmenter {{name}}\",\n \"bundle.a11y.decrease\": \"Diminuer {{name}}\",\n \"bundle.select.variant\": \"Sélectionner\",\n \"bundle.stock.sold_out_suffix\": \"— Rupture de stock\",\n};\n\nconst DE: Dict = {\n ...EN,\n \"bundle.title.default\": \"Bundle erstellen\",\n \"bundle.loading\": \"Wird geladen...\",\n \"bundle.empty\": \"Ihre ausgewahlten bundelbaren Produkte werden hier angezeigt\",\n \"bundle.drawer.aria\": \"Bundle-Builder\",\n \"bundle.search\": \"Suchen\",\n \"bundle.search.expanded\": \"Suche (erweitert)\",\n \"bundle.search.placeholder\": \"Suchen\",\n \"bundle.search.clear\": \"Suche loschen\",\n \"bundle.close\": \"Schliessen\",\n \"bundle.section.discount_tiers\": \"Rabattstufen\",\n \"bundle.section.your_bundle\": \"Ihr Bundle\",\n \"bundle.section.select_items\": \"Artikel auswahlen\",\n \"bundle.select.items\": \"Artikel auswahlen\",\n \"bundle.stock.max_reached\": \"Maximum erreicht\",\n \"bundle.stock.max_added\": \"Maximum bereits im Warenkorb\",\n \"bundle.stock.sold_out\": \"Ausverkauft\",\n \"bundle.totals\": \"Summen\",\n \"bundle.discount.badge\": \"{{discount}}% Rabatt\",\n \"bundle.discount.off_label\": \"{{discount}}% Rabatt\",\n \"bundle.discount.free\": \"Gratis\",\n \"bundle.discount.free_gift\": \"Gratisgeschenk\",\n \"bundle.discount.free_gift_with_products\": \"Gratisgeschenk: {{products}}\",\n \"bundle.celebration.received_free_gift\": \"Du hast ein Gratisgeschenk freigeschaltet!\",\n \"bundle.celebration.received_free_gift_with_products\": \"Du hast ein Gratisgeschenk freigeschaltet: {{products}}!\",\n \"bundle.celebration.received_discount\": \"Sie haben {{discount}}% Rabatt erhalten!\",\n \"bundle.cta.checkout\": \"Zur Kasse\",\n \"bundle.cta.add_to_bundle\": \"Hinzufügen\",\n \"bundle.cta.add_to_basket\": \"In den Warenkorb\",\n \"bundle.cta.add_more\": \"Fuge noch {{count}} {{productWord}} hinzu\",\n \"bundle.powered_by\": \"powered by\",\n \"bundle.button.default\": \"Bundle erstellen\",\n \"bundle.a11y.add_to_bundle\": \"{{name}} zum Bundle hinzufügen\",\n \"bundle.a11y.remove_from_bundle\": \"{{name}} aus dem Bundle entfernen\",\n \"bundle.a11y.quantity\": \"{{name}} Menge {{qty}}\",\n \"bundle.a11y.sold_out\": \"{{name}} ist ausverkauft\",\n \"bundle.a11y.max_available_selected\": \"{{name}} maximale verfugbare Menge bereits ausgewahlt\",\n \"bundle.a11y.increase\": \"{{name}} erhöhen\",\n \"bundle.a11y.decrease\": \"{{name}} verringern\",\n \"bundle.select.variant\": \"Auswählen\",\n \"bundle.stock.sold_out_suffix\": \"— Ausverkauft\",\n};\n\nconst ES: Dict = {\n ...EN,\n \"bundle.title.default\": \"Crea tu bundle\",\n \"bundle.loading\": \"Cargando...\",\n \"bundle.empty\": \"Tus productos elegibles seleccionados para el bundle se mostraran aqui\",\n \"bundle.drawer.aria\": \"Constructor de bundles\",\n \"bundle.search\": \"Buscar\",\n \"bundle.search.expanded\": \"Buscar (expandido)\",\n \"bundle.search.placeholder\": \"Buscar\",\n \"bundle.search.clear\": \"Limpiar busqueda\",\n \"bundle.close\": \"Cerrar\",\n \"bundle.section.discount_tiers\": \"Niveles de descuento\",\n \"bundle.section.your_bundle\": \"Tu bundle\",\n \"bundle.section.select_items\": \"Elegir articulos\",\n \"bundle.select.items\": \"Seleccionar articulos\",\n \"bundle.stock.max_reached\": \"Maximo alcanzado\",\n \"bundle.stock.max_added\": \"Maximo agregado al carrito\",\n \"bundle.stock.sold_out\": \"Agotado\",\n \"bundle.totals\": \"Totales\",\n \"bundle.discount.badge\": \"{{discount}}% de descuento\",\n \"bundle.discount.off_label\": \"{{discount}}% de descuento\",\n \"bundle.discount.free\": \"Gratis\",\n \"bundle.discount.free_gift\": \"Regalo gratis\",\n \"bundle.discount.free_gift_with_products\": \"Regalo gratis: {{products}}\",\n \"bundle.celebration.received_free_gift\": \"¡Has desbloqueado un regalo gratis!\",\n \"bundle.celebration.received_free_gift_with_products\": \"¡Has desbloqueado un regalo gratis: {{products}}!\",\n \"bundle.celebration.received_discount\": \"Has recibido un {{discount}}% de descuento!\",\n \"bundle.cta.checkout\": \"Pagar\",\n \"bundle.cta.add_to_bundle\": \"Agregar\",\n \"bundle.cta.add_to_basket\": \"Agregar al carrito\",\n \"bundle.cta.add_more\": \"Agrega {{count}} {{productWord}} mas\",\n \"bundle.powered_by\": \"impulsado por\",\n \"bundle.button.default\": \"Crear bundle\",\n \"bundle.a11y.add_to_bundle\": \"Agregar {{name}} al bundle\",\n \"bundle.a11y.remove_from_bundle\": \"Quitar {{name}} del bundle\",\n \"bundle.a11y.quantity\": \"Cantidad de {{name}}: {{qty}}\",\n \"bundle.a11y.sold_out\": \"{{name}} esta agotado\",\n \"bundle.a11y.max_available_selected\": \"{{name}} cantidad maxima disponible ya seleccionada\",\n \"bundle.a11y.increase\": \"Aumentar {{name}}\",\n \"bundle.a11y.decrease\": \"Disminuir {{name}}\",\n \"bundle.select.variant\": \"Seleccionar\",\n \"bundle.stock.sold_out_suffix\": \"— Agotado\",\n};\n\nconst DICTS: Record<BundleUiLocale, Dict> = {\n en: EN,\n fr: FR,\n de: DE,\n es: ES,\n};\n\nexport function normalizeBundleLocale(raw: string | null | undefined): BundleUiLocale {\n const value = String(raw ?? \"\").trim().toLowerCase();\n if (!value) return \"en\";\n const base = value.split(\"-\")[0] ?? \"en\";\n if (base === \"fr\" || base === \"de\" || base === \"en\" || base === \"es\") return base;\n return \"en\";\n}\n\nexport function translateBundleUi(\n locale: BundleUiLocale,\n key: BundleUiMessageKey,\n vars?: Record<string, string | number>,\n overrides?: BundleUiMessages,\n): string {\n const template = overrides?.[key] ?? DICTS[locale]?.[key] ?? EN[key] ?? key;\n if (!vars) return template;\n return Object.entries(vars).reduce((text, [name, value]) => {\n return text.replaceAll(`{{${name}}}`, String(value));\n }, template);\n}\n\nexport function formatBundleCurrency(amount: string | number, currencyCode: string | null, locale: string) {\n const n = Number(amount);\n if (!Number.isFinite(n)) return String(amount);\n\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(locale || undefined, { style: \"currency\", currency: currencyCode }).format(n);\n } catch {\n // ignore and fall through\n }\n }\n\n return `$${n.toFixed(2)}`;\n}\n\nexport function getProductWord(locale: BundleUiLocale, count: number) {\n const plural = count === 1 ? \"one\" : \"many\";\n if (locale === \"fr\") return plural === \"one\" ? \"produit\" : \"produits\";\n if (locale === \"de\") return plural === \"one\" ? \"Produkt\" : \"Produkte\";\n if (locale === \"es\") return plural === \"one\" ? \"producto\" : \"productos\";\n return plural === \"one\" ? \"product\" : \"products\";\n}\n","import { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { fetchActiveBundleConfigs } from \"../api/fetchActiveBundleConfigs\";\nimport { fetchBundleConfig as defaultFetchBundleConfig } from \"../api/fetchBundleConfig\";\nimport { fetchBundleConfigStatus } from \"../api/fetchBundleConfigStatus\";\nimport { BundleLineAttributeKeys, BundleSessionStorageKeys } from \"../constants\";\nimport type {\n BundleCartAdapter,\n BundleConfig,\n BundleCartLineAttribute,\n BundleEligibleVariant,\n BundleSelectedLine,\n BundleSelectionSnapshot,\n PublicActiveBundleConfigsResponse,\n PublicBundleConfigResponse,\n PublicBundleConfigStatusResponse,\n StyleSettings,\n} from \"../types\";\nimport { canAddGiftVariant, getVariantSelectionLimit } from \"../utils/stock\";\nimport { getRuleGiftVariantById, normalizeRuleRewardType } from \"../utils/ruleReward\";\nimport { getBundlePreviewSnapshot, isBundlePreviewMode } from \"../utils/previewMode\";\nimport { getOrCreateAnonymousUserId, trackEvent } from \"../utils/analytics\";\nimport type { BundleUiLocale, BundleUiMessageKey, BundleUiMessages } from \"../i18n\";\nimport { normalizeBundleLocale, translateBundleUi } from \"../i18n\";\n\ntype BundleProviderData = {\n currencyCode: string | null;\n config: BundleConfig;\n eligibleVariants: BundleEligibleVariant[];\n};\n\ntype BundleProviderCacheEntry = BundleProviderData;\ntype BundleConfigCache = Record<string, BundleProviderCacheEntry>;\ntype BundleSelectionState = Record<string, number>;\ntype BundleSelectionOrder = string[];\ntype BundleSelectedLines = BundleSelectedLine[];\ntype OpenSource = \"api\" | \"hash\" | \"click\";\n\nexport type BundleProviderProps = {\n apiBaseUrl: string;\n shop: string;\n cartAdapter: BundleCartAdapter;\n configHandle?: string;\n initialData?: BundleProviderData;\n configFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n fresh?: boolean;\n signal?: AbortSignal;\n }) => Promise<PublicBundleConfigResponse>;\n activeConfigsFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n signal?: AbortSignal;\n }) => Promise<PublicActiveBundleConfigsResponse>;\n configStatusFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n }) => Promise<PublicBundleConfigStatusResponse>;\n analyticsEndpoint?: string;\n allowDrawerWhenInactive?: boolean;\n locale?: string;\n messages?: BundleUiMessages;\n children: React.ReactNode;\n};\n\nexport type BundleBuilderContextValue = {\n isOpen: boolean;\n open: () => void;\n openForHandle: (handle: string, source?: OpenSource) => void;\n close: () => void;\n toggle: () => void;\n syncCartQuantities: () => Promise<void>;\n currentHandle: string;\n setConfigHandle: (handle: string) => void;\n loadHandle: (handle: string) => void;\n\n loading: boolean;\n submitting: boolean;\n error: string | null;\n\n currencyCode: string | null;\n config: BundleConfig | null;\n eligibleVariants: BundleEligibleVariant[];\n\n selections: BundleSelectionState;\n selectionOrder: BundleSelectionOrder;\n selectedLines: BundleSelectedLines;\n getVariantMaxSelectableQuantity: (merchandiseId: string) => number | null;\n setQuantity: (merchandiseId: string, quantity: number) => void;\n addConfiguredVariant: (input: {\n merchandiseId: string;\n configHandle?: string;\n attributes?: BundleCartLineAttribute[];\n restoreSnapshot?: BundleSelectionSnapshot | null;\n }) => boolean;\n getSelectionSnapshot: () => BundleSelectionSnapshot;\n restoreSelectionSnapshot: (snapshot: BundleSelectionSnapshot | null | undefined) => void;\n redirectVariantToProductPage: (variant: BundleEligibleVariant) => void;\n clearSelections: () => void;\n\n bundleSize: number;\n minRequired: number;\n canSubmit: boolean;\n submit: () => Promise<void>;\n submitAndCheckout: () => Promise<void>;\n locale: BundleUiLocale;\n t: (key: BundleUiMessageKey, vars?: Record<string, string | number>) => string;\n};\n\nexport const BundleBuilderContext = createContext<BundleBuilderContextValue | null>(null);\n\nconst BUNDLE_DRAWER_HASH = \"#best-bundles\";\nconst EMPTY_ELIGIBLE_VARIANTS: BundleEligibleVariant[] = [];\n\nfunction normalizeBundleHandle(raw: string | null | undefined) {\n const value = String(raw ?? \"\").trim().toLowerCase();\n if (!value) return \"default\";\n const cleaned = value\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+/, \"\")\n .replace(/-+$/, \"\")\n .replace(/-{2,}/g, \"-\");\n return cleaned || \"default\";\n}\n\nfunction getBundleHashHandle(hash: string): string | null {\n const value = String(hash ?? \"\").trim().toLowerCase();\n if (!value.startsWith(BUNDLE_DRAWER_HASH)) return null;\n if (value === BUNDLE_DRAWER_HASH) return \"default\";\n const prefix = `${BUNDLE_DRAWER_HASH}:`;\n if (!value.startsWith(prefix)) return null;\n return normalizeBundleHandle(value.slice(prefix.length));\n}\n\ntype StyleSettingCssVarKey = Exclude<keyof StyleSettings, \"confettiColors\">;\nconst STYLE_SETTINGS_TO_CSS_VAR: Record<StyleSettingCssVarKey, string> = {\n primaryColor: \"--bb-cta-bg\",\n primaryHoverColor: \"--bb-cta-bg-hover\",\n primaryTextColor: \"--bb-cta-text\",\n backgroundColor: \"--bb-surface-bg\",\n backdropColor: \"--bb-backdrop-bg\",\n textColor: \"--bb-text-color\",\n titleColor: \"--bb-title-color\",\n mutedTextColor: \"--bb-muted-color\",\n borderRadius: \"--bb-panel-radius\",\n borderColor: \"--bb-border-color\",\n borderStrongColor: \"--bb-border-strong-color\",\n focusRingColor: \"--bb-focus-ring\",\n tierBorderColor: \"--bb-tier-border\",\n tierTextColor: \"--bb-tier-text\",\n tierBackgroundColor: \"--bb-tier-bg\",\n celebrationTextColor: \"--bb-celebration-text\",\n celebrationBgTop: \"--bb-celebration-bg-top\",\n celebrationBgBottom: \"--bb-celebration-bg-bottom\",\n celebrationBorderColor: \"--bb-celebration-border\",\n fontFamilyBody: \"--bb-font-family-body\",\n fontFamilyTitle: \"--bb-font-family-title\",\n};\n\nconst GOOGLE_FONTS_LINK_ID = \"bb-google-fonts\";\n\nfunction fontNameToParam(name: string): string {\n const s = (name ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n return s ? encodeURIComponent(s).replace(/%20/g, \"+\") : \"\";\n}\n\nfunction injectGoogleFontsLink(styles: StyleSettings | undefined) {\n if (typeof document === \"undefined\" || !document.head) return;\n if (!styles) {\n document.getElementById(GOOGLE_FONTS_LINK_ID)?.remove();\n return;\n }\n const body = (styles.fontFamilyBody ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const title = (styles.fontFamilyTitle ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const families: string[] = [];\n if (body) families.push(\"family=\" + fontNameToParam(body));\n if (title && title !== body) families.push(\"family=\" + fontNameToParam(title));\n const existing = document.getElementById(GOOGLE_FONTS_LINK_ID) as HTMLLinkElement | null;\n if (families.length === 0) {\n existing?.remove();\n return;\n }\n const href = `https://fonts.googleapis.com/css2?${families.join(\"&\")}&display=swap`;\n if (existing) {\n if (existing.getAttribute(\"href\") !== href) existing.setAttribute(\"href\", href);\n return;\n }\n const link = document.createElement(\"link\");\n link.id = GOOGLE_FONTS_LINK_ID;\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n}\n\nfunction injectStyleVariables(styles: StyleSettings | undefined) {\n if (!styles) return;\n injectGoogleFontsLink(styles);\n const root = document.documentElement;\n (Object.entries(STYLE_SETTINGS_TO_CSS_VAR) as Array<[StyleSettingCssVarKey, string]>).forEach(([key, cssVar]) => {\n let value = styles[key];\n if (value) {\n if ((key === \"fontFamilyBody\" || key === \"fontFamilyTitle\") && /^\\s*\\S+\\s+\\S/.test(value) && !/^[\"']/.test(value.trim())) {\n value = `\"${value.trim().replace(/^[\"']|[\"']$/g, \"\")}\"`;\n }\n root.style.setProperty(cssVar, value);\n }\n });\n}\n\nfunction getEffectiveStyleSettings(configSettings: StyleSettings | undefined): StyleSettings | undefined {\n if (typeof window === \"undefined\") return configSettings;\n const preview = (window as Window & { __BUNDLE_PREVIEW_STYLES__?: StyleSettings }).__BUNDLE_PREVIEW_STYLES__;\n if (preview && typeof preview === \"object\") return preview;\n return configSettings;\n}\n\nfunction safeRandomUUID() {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) return cryptoAny.randomUUID();\n } catch {\n // ignore\n }\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction clampQty(n: number) {\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.floor(n));\n}\n\nfunction clampToVariantLimit(quantity: number, limit: number) {\n const normalized = clampQty(quantity);\n if (!Number.isFinite(limit)) return normalized;\n return Math.min(normalized, Math.max(0, Math.floor(limit)));\n}\n\nfunction normalizeLineAttributes(attributes?: BundleCartLineAttribute[]) {\n if (!Array.isArray(attributes) || !attributes.length) return undefined;\n const normalized = attributes\n .map((attribute) => {\n const key = String(attribute?.key ?? \"\").trim();\n if (!key) return null;\n return {\n key,\n value: String(attribute?.value ?? \"\"),\n };\n })\n .filter(Boolean) as BundleCartLineAttribute[];\n return normalized.length ? normalized : undefined;\n}\n\nfunction attributesSignature(attributes?: BundleCartLineAttribute[]) {\n const normalized = normalizeLineAttributes(attributes);\n if (!normalized?.length) return \"\";\n return JSON.stringify(\n [...normalized]\n .sort((a, b) => a.key.localeCompare(b.key) || a.value.localeCompare(b.value)),\n );\n}\n\nfunction createSelectedLine(merchandiseId: string, attributes?: BundleCartLineAttribute[]): BundleSelectedLine {\n return {\n id: safeRandomUUID(),\n merchandiseId,\n quantity: 1,\n attributes: normalizeLineAttributes(attributes),\n };\n}\n\nfunction snapshotFromLines(lines: BundleSelectedLines): BundleSelectionSnapshot {\n return {\n lines: lines.map((line) => ({\n id: line.id,\n merchandiseId: line.merchandiseId,\n quantity: clampQty(line.quantity || 1) || 1,\n ...(line.attributes?.length ? { attributes: normalizeLineAttributes(line.attributes) } : {}),\n })),\n };\n}\n\nfunction restoreLinesFromSnapshot(snapshot: BundleSelectionSnapshot | null | undefined): BundleSelectedLines {\n if (!snapshot || !Array.isArray(snapshot.lines)) return [];\n return snapshot.lines\n .map((line) => {\n const merchandiseId = String(line?.merchandiseId ?? \"\").trim();\n if (!merchandiseId) return null;\n return {\n id: String(line?.id ?? \"\").trim() || safeRandomUUID(),\n merchandiseId,\n quantity: clampQty(line?.quantity || 1) || 1,\n attributes: normalizeLineAttributes(line?.attributes),\n } satisfies BundleSelectedLine;\n })\n .filter(Boolean) as BundleSelectedLines;\n}\n\nfunction shouldUseActiveConfigPreload(\n allowDrawerWhenInactive: boolean,\n initialData?: BundleProviderData,\n) {\n return !allowDrawerWhenInactive && !initialData;\n}\n\nexport function BundleProvider(props: BundleProviderProps) {\n const {\n apiBaseUrl,\n shop,\n cartAdapter,\n configHandle = \"default\",\n initialData,\n configFetcher,\n activeConfigsFetcher,\n configStatusFetcher,\n analyticsEndpoint: providedAnalyticsEndpoint,\n allowDrawerWhenInactive = false,\n locale: inputLocale,\n messages,\n children,\n } = props;\n\n const locale = normalizeBundleLocale(inputLocale);\n const t = useCallback((key: BundleUiMessageKey, vars?: Record<string, string | number>) => {\n return translateBundleUi(locale, key, vars, messages);\n }, [locale, messages]);\n\n const normalizedInitialHandle = normalizeBundleHandle(configHandle);\n const analyticsEndpoint = providedAnalyticsEndpoint ?? `${apiBaseUrl}/api/public/bundle-analytics`;\n const useActivePreload = shouldUseActiveConfigPreload(allowDrawerWhenInactive, initialData);\n\n const [isOpen, setIsOpen] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [cartSyncing, setCartSyncing] = useState(false);\n const [cartQuantitiesByMerchandiseId, setCartQuantitiesByMerchandiseId] = useState<Record<string, number>>({});\n const [currentHandle, setCurrentHandleState] = useState(normalizedInitialHandle);\n const [configCache, setConfigCache] = useState<BundleConfigCache>(() => (\n initialData ? { [normalizedInitialHandle]: initialData } : {}\n ));\n const [bootstrapLoading, setBootstrapLoading] = useState(useActivePreload);\n const [blockingHandleLoad, setBlockingHandleLoad] = useState<string | null>(\n !useActivePreload && !initialData ? normalizedInitialHandle : null,\n );\n const [statusCheckPending, setStatusCheckPending] = useState<string | null>(null);\n const [pendingOpenHandle, setPendingOpenHandle] = useState<{ handle: string; source: OpenSource } | null>(null);\n const [selectedLines, setSelectedLines] = useState<BundleSelectedLines>(() => []);\n\n const preloadAbortRef = useRef<AbortController | null>(null);\n const handleFetchAbortRef = useRef<AbortController | null>(null);\n const statusAbortRef = useRef<AbortController | null>(null);\n const cartSyncSeqRef = useRef(0);\n const currentHandleRef = useRef(currentHandle);\n const configCacheRef = useRef(configCache);\n const bootstrapLoadingRef = useRef(bootstrapLoading);\n const openForHandleRef = useRef<((handle: string, source?: OpenSource) => void) | null>(null);\n const lastSeenHashRef = useRef<string | null>(null);\n const skipSelectionResetOnHandleChangeRef = useRef(false);\n const preserveSelectionsUntilHandleLoadedRef = useRef<string | null>(null);\n const fetcher = configFetcher ?? defaultFetchBundleConfig;\n const activePreloadFetcher = activeConfigsFetcher ?? fetchActiveBundleConfigs;\n const statusFetcher = configStatusFetcher ?? fetchBundleConfigStatus;\n\n const loadCartQuantities = useCallback(async () => {\n if (typeof cartAdapter.getLineQuantitiesByMerchandiseId !== \"function\") return null;\n const quantities = await cartAdapter.getLineQuantitiesByMerchandiseId();\n return Object.entries(quantities ?? {}).reduce<Record<string, number>>((acc, [id, quantity]) => {\n const q = clampQty(quantity);\n if (q > 0) acc[id] = q;\n return acc;\n }, {});\n }, [cartAdapter]);\n\n const refreshCartQuantities = useCallback(async () => {\n const syncSeq = ++cartSyncSeqRef.current;\n setCartSyncing(true);\n try {\n const quantities = await loadCartQuantities();\n if (quantities && syncSeq === cartSyncSeqRef.current) {\n setCartQuantitiesByMerchandiseId(quantities);\n }\n return quantities;\n } catch {\n return null;\n } finally {\n if (syncSeq === cartSyncSeqRef.current) setCartSyncing(false);\n }\n }, [loadCartQuantities]);\n\n useEffect(() => {\n currentHandleRef.current = currentHandle;\n }, [currentHandle]);\n\n useEffect(() => {\n configCacheRef.current = configCache;\n }, [configCache]);\n\n useEffect(() => {\n bootstrapLoadingRef.current = bootstrapLoading;\n }, [bootstrapLoading]);\n\n useEffect(() => {\n void refreshCartQuantities();\n }, [refreshCartQuantities]);\n\n const setConfigHandle = useCallback((handle: string) => {\n setCurrentHandleState(normalizeBundleHandle(handle));\n }, []);\n\n const close = useCallback(() => {\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_CLOSED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_closed\",\n }).catch((trackError) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer closed:\", trackError);\n });\n } catch (trackError) {\n console.warn(\"[Bundle Analytics] Error in close() callback:\", trackError);\n }\n }\n setIsOpen(false);\n if (typeof window !== \"undefined\" && window.location.hash.toLowerCase().startsWith(BUNDLE_DRAWER_HASH)) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n }, [analyticsEndpoint, shop]);\n\n const openDrawerOnly = useCallback(() => {\n setIsOpen((current) => {\n if (current) return current;\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_OPENED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_opened\",\n }).catch((trackError) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer opened:\", trackError);\n });\n } catch (trackError) {\n console.warn(\"[Bundle Analytics] Error in open() callback:\", trackError);\n }\n }\n return true;\n });\n }, [analyticsEndpoint, shop]);\n\n const applyLatestConfigResponse = useCallback((handle: string, response: PublicBundleConfigResponse) => {\n const previewSnapshot = getBundlePreviewSnapshot();\n\n if (!response.ok) {\n if (previewSnapshot) {\n setConfigCache((prev) => ({\n ...prev,\n [handle]: {\n currencyCode: prev[handle]?.currencyCode ?? null,\n config: previewSnapshot.config,\n eligibleVariants: previewSnapshot.previewVariantsLoading\n ? (prev[handle]?.eligibleVariants ?? [])\n : (previewSnapshot.eligibleVariants.length > 0\n ? previewSnapshot.eligibleVariants\n : (prev[handle]?.eligibleVariants ?? [])),\n },\n }));\n if (currentHandleRef.current === handle) {\n setError(null);\n }\n return false;\n }\n\n setConfigCache((prev) => {\n if (!prev[handle]) return prev;\n const next = { ...prev };\n delete next[handle];\n return next;\n });\n if (!allowDrawerWhenInactive && currentHandleRef.current === handle) {\n setError(response.error || t(\"bundle.provider.load_error\"));\n setIsOpen(false);\n }\n return false;\n }\n\n if (response.config.isActive === false && !allowDrawerWhenInactive) {\n setConfigCache((prev) => {\n if (!prev[handle]) return prev;\n const next = { ...prev };\n delete next[handle];\n return next;\n });\n if (currentHandleRef.current === handle) {\n setError(t(\"bundle.provider.inactive_error\"));\n setIsOpen(false);\n if (typeof window !== \"undefined\" && window.location.hash.toLowerCase().startsWith(BUNDLE_DRAWER_HASH)) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n }\n return false;\n }\n\n setConfigCache((prev) => ({\n ...prev,\n [handle]: {\n currencyCode: response.currencyCode ?? prev[handle]?.currencyCode ?? null,\n config: previewSnapshot?.config ?? response.config,\n eligibleVariants: previewSnapshot\n ? (previewSnapshot.previewVariantsLoading\n ? (prev[handle]?.eligibleVariants ?? [])\n : (previewSnapshot.eligibleVariants.length > 0\n ? previewSnapshot.eligibleVariants\n : (prev[handle]?.eligibleVariants ?? response.eligibleVariants ?? [])))\n : (response.eligibleVariants ?? []),\n },\n }));\n if (currentHandleRef.current === handle) {\n setError(null);\n }\n return true;\n }, [allowDrawerWhenInactive, t]);\n\n const refreshHandleConfig = useCallback((handle: string, options?: { blocking?: boolean }) => {\n const normalizedHandle = normalizeBundleHandle(handle);\n if (isBundlePreviewMode()) {\n if (options?.blocking) {\n setBlockingHandleLoad((current) => current === normalizedHandle ? null : current);\n }\n return;\n }\n\n handleFetchAbortRef.current?.abort();\n const ac = new AbortController();\n handleFetchAbortRef.current = ac;\n\n if (options?.blocking) {\n setBlockingHandleLoad(normalizedHandle);\n }\n setError(null);\n\n fetcher({\n apiBaseUrl,\n shop,\n configHandle: normalizedHandle,\n fresh: options?.blocking === true && !configCacheRef.current[normalizedHandle],\n signal: ac.signal,\n })\n .then((response) => {\n if (ac.signal.aborted) return;\n applyLatestConfigResponse(normalizedHandle, response);\n })\n .catch((fetchError: unknown) => {\n if (ac.signal.aborted) return;\n const message = fetchError instanceof Error ? fetchError.message : t(\"bundle.provider.load_error\");\n if (currentHandleRef.current === normalizedHandle) setError(message);\n })\n .finally(() => {\n if (ac.signal.aborted) return;\n setBlockingHandleLoad((current) => current === normalizedHandle ? null : current);\n });\n }, [apiBaseUrl, applyLatestConfigResponse, fetcher, shop, t]);\n\n const loadHandle = useCallback((handle: string) => {\n const normalizedHandle = normalizeBundleHandle(handle);\n const cachedEntry = configCacheRef.current[normalizedHandle];\n setCurrentHandleState(normalizedHandle);\n setError(null);\n refreshHandleConfig(normalizedHandle, { blocking: !cachedEntry });\n }, [refreshHandleConfig]);\n\n const openForHandle = useCallback((handle: string, source: OpenSource = \"api\") => {\n const normalizedHandle = normalizeBundleHandle(handle);\n const cachedEntry = configCacheRef.current[normalizedHandle];\n\n if (useActivePreload && bootstrapLoadingRef.current && !cachedEntry) {\n setPendingOpenHandle({ handle: normalizedHandle, source });\n return;\n }\n\n setCurrentHandleState(normalizedHandle);\n\n if (allowDrawerWhenInactive) {\n openDrawerOnly();\n refreshHandleConfig(normalizedHandle, { blocking: !cachedEntry });\n return;\n }\n\n if (cachedEntry?.config?.isActive) {\n setError(null);\n openDrawerOnly();\n refreshHandleConfig(normalizedHandle, { blocking: false });\n return;\n }\n\n setStatusCheckPending(normalizedHandle);\n statusAbortRef.current?.abort();\n const ac = new AbortController();\n statusAbortRef.current = ac;\n\n statusFetcher({\n apiBaseUrl,\n shop,\n configHandle: normalizedHandle,\n signal: ac.signal,\n })\n .then((status) => {\n if (ac.signal.aborted) return;\n setStatusCheckPending((current) => current === normalizedHandle ? null : current);\n if (status.ok && status.isActive !== true) {\n if (source === \"hash\" && typeof window !== \"undefined\" && getBundleHashHandle(window.location.hash) === normalizedHandle) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n return;\n }\n if (!status.ok) {\n return;\n }\n\n setError(null);\n setCurrentHandleState(normalizedHandle);\n openDrawerOnly();\n refreshHandleConfig(normalizedHandle, { blocking: true });\n })\n .catch(() => {\n if (ac.signal.aborted) return;\n setStatusCheckPending((current) => current === normalizedHandle ? null : current);\n });\n }, [\n allowDrawerWhenInactive,\n apiBaseUrl,\n openDrawerOnly,\n refreshHandleConfig,\n shop,\n statusFetcher,\n useActivePreload,\n ]);\n\n const open = useCallback(() => {\n void refreshCartQuantities();\n openForHandle(currentHandleRef.current, \"api\");\n }, [openForHandle, refreshCartQuantities]);\n\n useEffect(() => {\n openForHandleRef.current = openForHandle;\n }, [openForHandle]);\n\n const toggle = useCallback(() => {\n if (isOpen) {\n close();\n return;\n }\n void refreshCartQuantities();\n openForHandle(currentHandleRef.current, \"api\");\n }, [close, isOpen, openForHandle, refreshCartQuantities]);\n\n useEffect(() => {\n setCurrentHandleState(normalizeBundleHandle(configHandle));\n }, [configHandle]);\n\n useEffect(() => {\n if (!useActivePreload) {\n setBootstrapLoading(false);\n if (!initialData) {\n refreshHandleConfig(normalizedInitialHandle, { blocking: true });\n }\n return;\n }\n\n preloadAbortRef.current?.abort();\n const ac = new AbortController();\n preloadAbortRef.current = ac;\n setBootstrapLoading(true);\n\n activePreloadFetcher({ apiBaseUrl, shop, signal: ac.signal })\n .then((response: PublicActiveBundleConfigsResponse) => {\n if (ac.signal.aborted) return;\n if (!response.ok) return;\n setConfigCache((prev) => {\n const next: BundleConfigCache = { ...prev };\n for (const [handle, entry] of Object.entries(response.configs ?? {})) {\n next[normalizeBundleHandle(handle)] = {\n currencyCode: entry.currencyCode ?? null,\n config: entry.config,\n eligibleVariants: entry.eligibleVariants ?? [],\n };\n }\n return next;\n });\n })\n .catch(() => {\n // Ignore preload failures; open flow falls back to status + single fetch.\n })\n .finally(() => {\n if (ac.signal.aborted) return;\n setBootstrapLoading(false);\n });\n\n return () => ac.abort();\n }, [activePreloadFetcher, apiBaseUrl, initialData, normalizedInitialHandle, refreshHandleConfig, shop, useActivePreload]);\n\n useEffect(() => {\n if (bootstrapLoading || !pendingOpenHandle) return;\n openForHandle(pendingOpenHandle.handle, pendingOpenHandle.source);\n setPendingOpenHandle(null);\n }, [bootstrapLoading, openForHandle, pendingOpenHandle]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const openIfHash = (force = false) => {\n const nextHash = String(window.location.hash ?? \"\");\n if (!force && nextHash === lastSeenHashRef.current) return;\n lastSeenHashRef.current = nextHash;\n const handleInHash = getBundleHashHandle(nextHash);\n if (!handleInHash) return;\n openForHandleRef.current?.(handleInHash, \"hash\");\n };\n const openIfHashForced = () => openIfHash(true);\n const openIfHashOnFocus = () => {\n window.setTimeout(() => openIfHash(true), 0);\n };\n openIfHash(true);\n window.addEventListener(\"hashchange\", openIfHashForced);\n window.addEventListener(\"pageshow\", openIfHashForced);\n window.addEventListener(\"popstate\", openIfHashForced);\n window.addEventListener(\"focus\", openIfHashOnFocus);\n document.addEventListener(\"visibilitychange\", openIfHashForced);\n return () => {\n window.removeEventListener(\"hashchange\", openIfHashForced);\n window.removeEventListener(\"pageshow\", openIfHashForced);\n window.removeEventListener(\"popstate\", openIfHashForced);\n window.removeEventListener(\"focus\", openIfHashOnFocus);\n document.removeEventListener(\"visibilitychange\", openIfHashForced);\n };\n }, []);\n\n const currentEntry = configCache[currentHandle] ?? null;\n const config = currentEntry?.config ?? null;\n const eligibleVariants = currentEntry?.eligibleVariants ?? EMPTY_ELIGIBLE_VARIANTS;\n const currencyCode = currentEntry?.currencyCode ?? null;\n const loading = (!config && (blockingHandleLoad === currentHandle || statusCheckPending === currentHandle))\n || (allowDrawerWhenInactive && !config && blockingHandleLoad != null);\n\n useEffect(() => {\n const effective = getEffectiveStyleSettings(config?.styleSettings);\n if (effective) injectStyleVariables(effective);\n }, [config?.styleSettings]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handlePreviewStyles = () => {\n const effective = getEffectiveStyleSettings(undefined);\n if (effective) injectStyleVariables(effective);\n };\n window.addEventListener(\"bundle-preview-styles-updated\", handlePreviewStyles);\n return () => window.removeEventListener(\"bundle-preview-styles-updated\", handlePreviewStyles);\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const win = window as Window & {\n __BUNDLE_PREVIEW_CONFIG__?: BundleConfig;\n __BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__?: BundleEligibleVariant[];\n __BUNDLE_PREVIEW_VARIANTS_LOADING__?: boolean;\n };\n const applyPreviewConfig = () => {\n const previewConfig = win.__BUNDLE_PREVIEW_CONFIG__;\n if (!previewConfig) return;\n const previewVariants = Array.isArray(win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__)\n ? win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__\n : [];\n const previewVariantsLoading = win.__BUNDLE_PREVIEW_VARIANTS_LOADING__ === true;\n setConfigCache((prev) => ({\n ...prev,\n [currentHandleRef.current]: {\n currencyCode: currencyCode ?? null,\n config: previewConfig,\n eligibleVariants: previewVariantsLoading\n ? (prev[currentHandleRef.current]?.eligibleVariants ?? [])\n : previewVariants,\n },\n }));\n if (previewVariantsLoading) {\n setBlockingHandleLoad(currentHandleRef.current);\n } else {\n setBlockingHandleLoad((current) => current === currentHandleRef.current ? null : current);\n }\n };\n if (win.__BUNDLE_PREVIEW_CONFIG__) applyPreviewConfig();\n window.addEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n return () => window.removeEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n }, [currencyCode]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? Number.NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const variantSelectionLimitById = useMemo(() => {\n return new Map(\n eligibleVariants.map((variant) => {\n const baseLimit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(baseLimit)) return [variant.id, baseLimit] as const;\n const inCart = clampQty(cartQuantitiesByMerchandiseId[variant.id] ?? 0);\n return [variant.id, Math.max(0, Math.floor(baseLimit) - inCart)] as const;\n }),\n );\n }, [eligibleVariants, cartQuantitiesByMerchandiseId]);\n\n const eligibleVariantIdsSet = useMemo(() => {\n return new Set(\n eligibleVariants\n .filter((variant) => getVariantSelectionLimit(variant) > 0)\n .map((variant) => variant.id),\n );\n }, [eligibleVariants]);\n\n const minRequired = useMemo(() => {\n const rules = config?.rules ?? [];\n const ruleMin = rules.length ? Math.min(...rules.map((rule) => rule.minBundleSize)) : 2;\n const normalizedRuleMin = Number.isFinite(ruleMin) && ruleMin > 0 ? ruleMin : 2;\n const configuredRaw = Number(config?.minBundleSize ?? Number.NaN);\n const configuredMin =\n Number.isFinite(configuredRaw) && Number.isInteger(configuredRaw)\n ? Math.max(2, Math.min(100, configuredRaw))\n : null;\n return configuredMin == null\n ? normalizedRuleMin\n : Math.min(normalizedRuleMin, configuredMin);\n }, [config?.minBundleSize, config?.rules]);\n\n const getSelectionsFromLines = useCallback((lines: BundleSelectedLines) => {\n return lines.reduce<BundleSelectionState>((acc, line) => {\n const quantity = clampQty(line.quantity || 1) || 1;\n acc[line.merchandiseId] = (acc[line.merchandiseId] ?? 0) + quantity;\n return acc;\n }, {});\n }, []);\n\n const setQuantity = useCallback((merchandiseId: string, quantity: number) => {\n if (cartSyncing) return;\n if (!eligibleVariantIdsSet.has(merchandiseId)) {\n if (!loading) return;\n }\n\n const variantLimit = variantSelectionLimitById.get(merchandiseId) ?? (loading ? Number.POSITIVE_INFINITY : 0);\n const q = clampToVariantLimit(quantity, variantLimit);\n setSelectedLines((prev) => {\n const prevSelections = getSelectionsFromLines(prev);\n const prevQty = prevSelections[merchandiseId] ?? 0;\n const requestedDelta = q - prevQty;\n const currentBundleSize = prev.length;\n const variantRemaining =\n Number.isFinite(variantLimit)\n ? Math.max(0, Math.floor(variantLimit) - prevQty)\n : requestedDelta;\n const delta =\n requestedDelta > 0\n ? Math.min(\n requestedDelta,\n Math.max(0, maxBundleSize - currentBundleSize),\n variantRemaining,\n )\n : requestedDelta;\n\n if (delta === 0) return prev;\n\n let nextLines = prev;\n if (delta > 0) {\n nextLines = [...prev, ...Array.from({ length: delta }, () => createSelectedLine(merchandiseId))];\n } else {\n let remainingToRemove = -delta;\n const keptReversed: BundleSelectedLines = [];\n for (let i = prev.length - 1; i >= 0; i--) {\n const line = prev[i];\n if (line.merchandiseId === merchandiseId && remainingToRemove > 0) {\n remainingToRemove--;\n continue;\n }\n keptReversed.push(line);\n }\n keptReversed.reverse();\n nextLines = keptReversed;\n }\n\n const nextSelections = getSelectionsFromLines(nextLines);\n const prevBundleSize = currentBundleSize;\n const nextBundleSize = nextLines.length;\n\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const basePayload = {\n eventType: \"VARIANT_SELECTION_CHANGED\" as const,\n shop,\n anonymousUserId,\n before: { ...prevSelections },\n after: { ...nextSelections },\n timestamp: new Date().toISOString(),\n };\n trackEvent(analyticsEndpoint, shop, basePayload);\n\n if (prevBundleSize === 0 && nextBundleSize >= 1) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_started\",\n });\n }\n if (prevBundleSize < minRequired && nextBundleSize >= minRequired) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_completed\",\n });\n }\n } catch {\n // Analytics should not break functionality.\n }\n }\n\n return nextLines;\n });\n }, [analyticsEndpoint, cartSyncing, eligibleVariantIdsSet, getSelectionsFromLines, loading, maxBundleSize, minRequired, shop, variantSelectionLimitById]);\n\n const addConfiguredVariant = useCallback((input: {\n merchandiseId: string;\n configHandle?: string;\n attributes?: BundleCartLineAttribute[];\n restoreSnapshot?: BundleSelectionSnapshot | null;\n }) => {\n const merchandiseId = String(input.merchandiseId ?? \"\").trim();\n if (!merchandiseId) return false;\n const targetHandle = normalizeBundleHandle(input.configHandle ?? currentHandleRef.current);\n const isTargetingDifferentHandle = targetHandle !== currentHandleRef.current;\n const targetEntry = isTargetingDifferentHandle ? configCacheRef.current[targetHandle] : currentEntry;\n const targetEligibleVariantIdsSet = targetEntry\n ? new Set(\n targetEntry.eligibleVariants\n .filter((variant) => getVariantSelectionLimit(variant) > 0)\n .map((variant) => variant.id),\n )\n : null;\n if (\n (!isTargetingDifferentHandle || targetEligibleVariantIdsSet)\n && !(targetEligibleVariantIdsSet ?? eligibleVariantIdsSet).has(merchandiseId)\n && !loading\n ) {\n return false;\n }\n\n const baseLines = input.restoreSnapshot ? restoreLinesFromSnapshot(input.restoreSnapshot) : null;\n const currentSelections = getSelectionsFromLines(baseLines ?? selectedLines);\n const currentQty = currentSelections[merchandiseId] ?? 0;\n const targetMaxBundleSize = (() => {\n const raw = Number(targetEntry?.config?.maxBundleSize ?? maxBundleSize ?? Number.NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n })();\n const variantLimit = (() => {\n if (targetEntry) {\n const targetVariant = targetEntry.eligibleVariants.find((variant) => variant.id === merchandiseId);\n if (targetVariant) {\n const baseLimit = getVariantSelectionLimit(targetVariant);\n if (!Number.isFinite(baseLimit)) return Number.POSITIVE_INFINITY;\n const inCart = clampQty(cartQuantitiesByMerchandiseId[merchandiseId] ?? 0);\n return Math.max(0, Math.floor(baseLimit) - inCart);\n }\n }\n return isTargetingDifferentHandle || loading ? Number.POSITIVE_INFINITY : 0;\n })();\n const currentBundleSize = (baseLines ?? selectedLines).length;\n const canAddAnother =\n currentBundleSize < targetMaxBundleSize\n && (!Number.isFinite(variantLimit) || currentQty < Math.max(0, Math.floor(variantLimit)));\n\n if (!canAddAnother) return false;\n\n const nextLines = [...(baseLines ?? selectedLines), createSelectedLine(merchandiseId, input.attributes)];\n if (isTargetingDifferentHandle) {\n skipSelectionResetOnHandleChangeRef.current = true;\n preserveSelectionsUntilHandleLoadedRef.current = targetHandle;\n setCurrentHandleState(targetHandle);\n setError(null);\n refreshHandleConfig(targetHandle, { blocking: !configCacheRef.current[targetHandle] });\n }\n setSelectedLines(nextLines);\n setError(null);\n openDrawerOnly();\n return true;\n }, [cartQuantitiesByMerchandiseId, currentEntry, eligibleVariantIdsSet, getSelectionsFromLines, loading, maxBundleSize, openDrawerOnly, refreshHandleConfig, selectedLines]);\n\n useEffect(() => {\n const isWaitingForPreservedHandle =\n preserveSelectionsUntilHandleLoadedRef.current === currentHandle\n && (!currentEntry || blockingHandleLoad === currentHandle);\n if (loading || isWaitingForPreservedHandle) return;\n setSelectedLines((prev) => {\n const nextLines = prev.filter((line) => {\n if (!eligibleVariantIdsSet.has(line.merchandiseId)) return false;\n const limit = variantSelectionLimitById.get(line.merchandiseId) ?? 0;\n return !Number.isFinite(limit) || limit > 0;\n });\n\n if (nextLines.length <= maxBundleSize) {\n return nextLines.length === prev.length ? prev : nextLines;\n }\n return nextLines.slice(0, maxBundleSize);\n });\n }, [blockingHandleLoad, currentEntry, currentHandle, eligibleVariantIdsSet, loading, maxBundleSize, variantSelectionLimitById]);\n\n useEffect(() => {\n if (\n preserveSelectionsUntilHandleLoadedRef.current === currentHandle\n && currentEntry\n && blockingHandleLoad !== currentHandle\n ) {\n preserveSelectionsUntilHandleLoadedRef.current = null;\n }\n }, [blockingHandleLoad, currentEntry, currentHandle]);\n\n useEffect(() => {\n if (skipSelectionResetOnHandleChangeRef.current) {\n skipSelectionResetOnHandleChangeRef.current = false;\n return;\n }\n setSelectedLines([]);\n }, [currentHandle]);\n\n const clearSelections = useCallback(() => setSelectedLines([]), []);\n const syncCartQuantities = useCallback(async () => {\n await refreshCartQuantities();\n }, [refreshCartQuantities]);\n const getVariantMaxSelectableQuantity = useCallback((merchandiseId: string) => {\n const limit = variantSelectionLimitById.get(merchandiseId);\n if (limit == null || !Number.isFinite(limit)) return null;\n return Math.max(0, Math.floor(limit));\n }, [variantSelectionLimitById]);\n const selections = useMemo(() => getSelectionsFromLines(selectedLines), [getSelectionsFromLines, selectedLines]);\n const selectionOrder = useMemo(() => selectedLines.map((line) => line.merchandiseId), [selectedLines]);\n\n const bundleSize = selectedLines.length;\n\n const canSubmit = useMemo(() => {\n if (loading || cartSyncing || submitting) return false;\n if (error) return false;\n if (!config?.isActive) return false;\n if (bundleSize < minRequired) return false;\n return true;\n }, [bundleSize, cartSyncing, config?.isActive, error, loading, minRequired, submitting]);\n\n const getSelectionSnapshot = useCallback(() => snapshotFromLines(selectedLines), [selectedLines]);\n\n const restoreSelectionSnapshot = useCallback((snapshot: BundleSelectionSnapshot | null | undefined) => {\n setSelectedLines(restoreLinesFromSnapshot(snapshot));\n }, []);\n\n const redirectVariantToProductPage = useCallback((variant: BundleEligibleVariant) => {\n if (typeof window === \"undefined\" || isBundlePreviewMode()) return;\n const productHandle = variant.product?.handle?.trim();\n if (!productHandle) return;\n const params = new URLSearchParams();\n const variantParam = variant.id.match(/\\/(\\d+)$/)?.[1];\n if (variantParam) params.set(\"variant\", variantParam);\n params.set(\"best_bundles_source\", \"bundle_builder\");\n params.set(\"best_bundles_handle\", currentHandle);\n try {\n window.sessionStorage.setItem(\n BundleSessionStorageKeys.redirectedBundleState,\n JSON.stringify({\n bundleHandle: currentHandle,\n returnUrl: window.location.href,\n snapshot: getSelectionSnapshot(),\n }),\n );\n } catch {\n // Ignore storage failures and still navigate.\n }\n const search = params.toString();\n window.location.href = `/products/${productHandle}${search ? `?${search}` : \"\"}`;\n }, [currentHandle, getSelectionSnapshot]);\n\n const performCartAddition = useCallback(async (options?: { onComplete?: () => void; checkout?: boolean }) => {\n if (!canSubmit || !config) return;\n\n const bundleId = safeRandomUUID();\n const bundleTitle = (config.title ?? \"\").trim().slice(0, 255);\n const latestCartQuantities = await refreshCartQuantities();\n const effectiveLimitById = new Map(\n eligibleVariants.map((variant) => {\n const baseLimit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(baseLimit)) return [variant.id, baseLimit] as const;\n const inCart = clampQty((latestCartQuantities ?? cartQuantitiesByMerchandiseId)[variant.id] ?? 0);\n return [variant.id, Math.max(0, Math.floor(baseLimit) - inCart)] as const;\n }),\n );\n const linesBySignature = new Map<string, {\n merchandiseId: string;\n quantity: number;\n attributes: BundleCartLineAttribute[];\n }>();\n\n for (const selectedLine of selectedLines) {\n if (!eligibleVariantIdsSet.has(selectedLine.merchandiseId)) continue;\n const remaining = effectiveLimitById.get(selectedLine.merchandiseId) ?? 0;\n const existingQtyForVariant = Array.from(linesBySignature.values())\n .filter((line) => line.merchandiseId === selectedLine.merchandiseId)\n .reduce((sum, line) => sum + line.quantity, 0);\n if (Number.isFinite(remaining) && existingQtyForVariant >= remaining) continue;\n const attributes = [\n { key: BundleLineAttributeKeys.bundleId, value: bundleId },\n { key: BundleLineAttributeKeys.bundleConfig, value: currentHandle },\n { key: BundleLineAttributeKeys.bundleSource, value: \"bundle_builder\" },\n ...(bundleTitle ? [{ key: BundleLineAttributeKeys.bundleTitle, value: bundleTitle }] : []),\n ...(normalizeLineAttributes(selectedLine.attributes) ?? []),\n ];\n const signature = `${selectedLine.merchandiseId}:${attributesSignature(selectedLine.attributes)}`;\n const existing = linesBySignature.get(signature);\n if (existing) {\n existing.quantity += 1;\n } else {\n linesBySignature.set(signature, {\n merchandiseId: selectedLine.merchandiseId,\n quantity: 1,\n attributes,\n });\n }\n }\n\n const lines = Array.from(linesBySignature.values());\n\n if (!lines.length) return;\n\n const byId = new Map(eligibleVariants.map((variant) => [variant.id, variant] as const));\n let grossPrice = 0;\n for (const line of lines) {\n const q = line.quantity ?? 0;\n if (q <= 0) continue;\n const variant = byId.get(line.merchandiseId);\n const price = Number(variant?.price);\n if (!Number.isFinite(price)) continue;\n grossPrice += price * q;\n }\n grossPrice = Math.round(grossPrice * 100) / 100;\n\n const rulesSorted = [...(config.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n let appliedRule: (typeof rulesSorted)[number] | null = null;\n for (const rule of rulesSorted) {\n if (bundleSize >= rule.minBundleSize) appliedRule = rule;\n }\n\n if (appliedRule && normalizeRuleRewardType(appliedRule) === \"free_gift\") {\n const cartQtyByMerchandiseId = latestCartQuantities ?? cartQuantitiesByMerchandiseId;\n for (const giftVariantId of appliedRule.freeGiftVariantIds) {\n if (!giftVariantId) continue;\n const giftVariant = getRuleGiftVariantById(appliedRule, giftVariantId);\n const inCartQty = clampQty(cartQtyByMerchandiseId[giftVariantId] ?? 0);\n if (!canAddGiftVariant(giftVariant, inCartQty)) continue;\n lines.push({\n merchandiseId: giftVariantId,\n quantity: 1,\n attributes: [\n { key: BundleLineAttributeKeys.bundleId, value: bundleId },\n { key: BundleLineAttributeKeys.bundleConfig, value: currentHandle },\n { key: BundleLineAttributeKeys.bundleSource, value: \"bundle_builder\" },\n { key: BundleLineAttributeKeys.bundleGift, value: \"true\" },\n { key: BundleLineAttributeKeys.bundleGiftRule, value: appliedRule.handle },\n ...(bundleTitle ? [{ key: BundleLineAttributeKeys.bundleTitle, value: bundleTitle }] : []),\n ],\n });\n }\n }\n\n const appliedDiscountPercent = appliedRule && normalizeRuleRewardType(appliedRule) !== \"free_gift\"\n ? (() => {\n const pct = Number.parseFloat(appliedRule!.discountPercent);\n return Number.isFinite(pct) && pct > 0 ? pct : null;\n })()\n : null;\n\n const discountedPrice = appliedDiscountPercent\n ? Math.round(grossPrice * (1 - appliedDiscountPercent / 100) * 100) / 100\n : grossPrice;\n const discountedAmount = grossPrice - discountedPrice;\n const productVariantIds = lines.map((line) => line.merchandiseId);\n const discountThresholdIdentifier = appliedRule?.handle ?? \"\";\n const discountLabel = appliedRule?.label?.trim() || \"\";\n\n setSubmitting(true);\n try {\n if (options?.checkout) {\n await cartAdapter.linesAddForCheckout(lines);\n } else {\n await cartAdapter.linesAdd(lines);\n }\n\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const isCheckout = !!options?.checkout;\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"BUNDLE_ADDED_TO_BASKET\",\n shop,\n anonymousUserId,\n bundleId,\n productVariantIds,\n grossPrice,\n discountedPrice,\n currency: currencyCode ?? undefined,\n discountThresholdIdentifier,\n discountLabel,\n discountPercentage: appliedDiscountPercent,\n discountedAmount,\n timestamp: new Date().toISOString(),\n checkout: isCheckout,\n mixpanelEvent: isCheckout ? \"checkout_started_with_bundle\" : \"bundle_added_to_cart\",\n });\n } catch {\n // Analytics should not break functionality.\n }\n }\n\n clearSelections();\n close();\n void refreshCartQuantities();\n options?.onComplete?.();\n setError(null);\n } catch (addError) {\n const rawMessage = addError instanceof Error ? addError.message : \"\";\n const isStockError = /stock|sold out|inventory|insufficient|available|422/i.test(rawMessage);\n setError(\n isStockError\n ? t(\"bundle.provider.stock_error\")\n : t(\"bundle.provider.add_error\"),\n );\n void refreshCartQuantities();\n } finally {\n setSubmitting(false);\n }\n }, [\n analyticsEndpoint,\n bundleSize,\n canSubmit,\n cartAdapter,\n clearSelections,\n close,\n config,\n currencyCode,\n cartQuantitiesByMerchandiseId,\n currentHandle,\n eligibleVariantIdsSet,\n eligibleVariants,\n refreshCartQuantities,\n selectedLines,\n shop,\n t,\n ]);\n\n const submit = useCallback(async () => {\n await performCartAddition({\n onComplete: () => {\n cartAdapter.openCartUI?.();\n },\n });\n }, [cartAdapter, performCartAddition]);\n\n const submitAndCheckout = useCallback(async () => {\n await performCartAddition({\n checkout: true,\n onComplete: () => {\n cartAdapter.navigateToCheckout?.();\n },\n });\n }, [cartAdapter, performCartAddition]);\n\n const value: BundleBuilderContextValue = useMemo(() => ({\n isOpen,\n open,\n openForHandle,\n close,\n toggle,\n currentHandle,\n setConfigHandle,\n loadHandle,\n syncCartQuantities,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n selectedLines,\n getVariantMaxSelectableQuantity,\n setQuantity,\n addConfiguredVariant,\n getSelectionSnapshot,\n restoreSelectionSnapshot,\n redirectVariantToProductPage,\n clearSelections,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n }), [\n bundleSize,\n canSubmit,\n clearSelections,\n close,\n config,\n currencyCode,\n currentHandle,\n eligibleVariants,\n error,\n isOpen,\n loading,\n minRequired,\n open,\n openForHandle,\n selectedLines,\n selectionOrder,\n selections,\n setConfigHandle,\n loadHandle,\n syncCartQuantities,\n getVariantMaxSelectableQuantity,\n setQuantity,\n addConfiguredVariant,\n getSelectionSnapshot,\n restoreSelectionSnapshot,\n redirectVariantToProductPage,\n submit,\n submitAndCheckout,\n submitting,\n toggle,\n locale,\n t,\n ]);\n\n return <BundleBuilderContext.Provider value={value}>{children}</BundleBuilderContext.Provider>;\n}\n","import { useContext } from \"react\";\nimport { BundleBuilderContext } from \"../context/BundleProvider\";\n\nexport function useBundleBuilder() {\n const ctx = useContext(BundleBuilderContext);\n if (!ctx) {\n throw new Error(\"useBundleBuilder must be used within <BundleProvider />\");\n }\n return ctx;\n}\n\n","import { useBundleBuilder } from \"./useBundleBuilder\";\n\nexport type BundleBuilderDrawerControls = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n};\n\n/**\n * Convenience hook for controlling the drawer (alternative to using <BundleButton />).\n * Must be used within <BundleProvider />.\n */\nexport function useBundleBuilderDrawer(): BundleBuilderDrawerControls {\n const { isOpen, open, close, toggle } = useBundleBuilder();\n return { isOpen, open, close, toggle };\n}\n\n","import React from \"react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleButton.module.css\";\n\nexport type BundleButtonProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function BundleButton(props: BundleButtonProps) {\n const { toggle, t } = useBundleBuilder();\n return (\n <button\n type=\"button\"\n onClick={toggle}\n className={[styles.button, props.className].filter(Boolean).join(\" \")}\n >\n {props.children ?? t(\"bundle.button.default\")}\n </button>\n );\n}\n","'use strict';\n\n// t: current time, b: beginning value, _c: final value, d: total duration\nvar tweenFunctions = {\n linear: function(t, b, _c, d) {\n var c = _c - b;\n return c * t / d + b;\n },\n easeInQuad: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t + b;\n },\n easeOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (t /= d) * (t - 2) + b;\n },\n easeInOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t + b;\n } else {\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n }\n },\n easeInCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t + b;\n },\n easeOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t + 1) + b;\n },\n easeInOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n },\n easeInQuart: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t + b;\n },\n easeOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n },\n easeInOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t + b;\n } else {\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n },\n easeInQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t * t + b;\n },\n easeOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n },\n easeInOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n },\n easeInSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n },\n easeOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n },\n easeInOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n },\n easeInExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n },\n easeOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n },\n easeInOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n } else {\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n },\n easeInCirc: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n },\n easeOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n },\n easeInOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n } else {\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n },\n easeInElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n },\n easeOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n },\n easeInOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d / 2) === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n } else {\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b;\n }\n },\n easeInBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n },\n easeOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n },\n easeInOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n } else {\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }\n },\n easeInBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n v = tweenFunctions.easeOutBounce(d - t, 0, c, d);\n return c - v + b;\n },\n easeOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n },\n easeInOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n if (t < d / 2) {\n v = tweenFunctions.easeInBounce(t * 2, 0, c, d);\n return v * 0.5 + b;\n } else {\n v = tweenFunctions.easeOutBounce(t * 2 - d, 0, c, d);\n return v * 0.5 + c * 0.5 + b;\n }\n }\n};\n\nmodule.exports = tweenFunctions;\n","import { jsx } from 'react/jsx-runtime';\nimport React from 'react';\nimport * as tweens from 'tween-functions';\n\nfunction degreesToRads(degrees) {\n return (degrees * Math.PI) / 180;\n}\nfunction randomRange(min, max) {\n return min + Math.random() * (max - min);\n}\nfunction randomInt(min, max) {\n return Math.floor(min + Math.random() * (max - min + 1));\n}\n\nvar ParticleShape;\n(function (ParticleShape) {\n ParticleShape[ParticleShape[\"Circle\"] = 0] = \"Circle\";\n ParticleShape[ParticleShape[\"Square\"] = 1] = \"Square\";\n ParticleShape[ParticleShape[\"Strip\"] = 2] = \"Strip\";\n})(ParticleShape || (ParticleShape = {}));\nvar RotationDirection;\n(function (RotationDirection) {\n RotationDirection[RotationDirection[\"Positive\"] = 1] = \"Positive\";\n RotationDirection[RotationDirection[\"Negative\"] = -1] = \"Negative\";\n})(RotationDirection || (RotationDirection = {}));\nconst DEFAULT_FRAME_TIME = 1000 / 60;\nclass Particle {\n constructor(context, getOptions, x, y) {\n this.getOptions = getOptions;\n const { colors, initialVelocityX, initialVelocityY } = this.getOptions();\n this.context = context;\n this.x = x;\n this.y = y;\n this.w = randomRange(5, 20);\n this.h = randomRange(5, 20);\n this.radius = randomRange(5, 10);\n this.vx =\n typeof initialVelocityX === 'number'\n ? randomRange(-initialVelocityX, initialVelocityX)\n : randomRange(initialVelocityX.min, initialVelocityX.max);\n this.vy =\n typeof initialVelocityY === 'number'\n ? randomRange(-initialVelocityY, 0)\n : randomRange(initialVelocityY.min, initialVelocityY.max);\n this.shape = randomInt(0, 2);\n this.angle = degreesToRads(randomRange(0, 360));\n this.angularSpin = randomRange(-0.2, 0.2);\n this.color = colors[Math.floor(Math.random() * colors.length)];\n this.rotateY = randomRange(0, 1);\n this.rotationDirection = randomRange(0, 1)\n ? RotationDirection.Positive\n : RotationDirection.Negative;\n }\n update(elapsed) {\n const { gravity, wind, friction, opacity, drawShape } = this.getOptions();\n const frameTimeMultiplier = elapsed / DEFAULT_FRAME_TIME;\n this.x += this.vx * frameTimeMultiplier;\n this.y += this.vy * frameTimeMultiplier;\n this.vy += gravity * frameTimeMultiplier;\n this.vx += wind * frameTimeMultiplier;\n this.vx *= friction ** frameTimeMultiplier;\n this.vy *= friction ** frameTimeMultiplier;\n if (this.rotateY >= 1 &&\n this.rotationDirection === RotationDirection.Positive) {\n this.rotationDirection = RotationDirection.Negative;\n }\n else if (this.rotateY <= -1 &&\n this.rotationDirection === RotationDirection.Negative) {\n this.rotationDirection = RotationDirection.Positive;\n }\n const rotateDelta = 0.1 * this.rotationDirection * frameTimeMultiplier;\n this.rotateY += rotateDelta;\n this.angle += this.angularSpin;\n this.context.save();\n this.context.translate(this.x, this.y);\n this.context.rotate(this.angle);\n this.context.scale(1, this.rotateY);\n this.context.rotate(this.angle);\n this.context.beginPath();\n this.context.fillStyle = this.color;\n this.context.strokeStyle = this.color;\n this.context.globalAlpha = opacity;\n this.context.lineCap = 'round';\n this.context.lineWidth = 2;\n if (drawShape && typeof drawShape === 'function') {\n drawShape.call(this, this.context);\n }\n else {\n switch (this.shape) {\n case ParticleShape.Circle: {\n this.context.beginPath();\n this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);\n this.context.fill();\n break;\n }\n case ParticleShape.Square: {\n this.context.fillRect(-this.w / 2, -this.h / 2, this.w, this.h);\n break;\n }\n case ParticleShape.Strip: {\n this.context.fillRect(-this.w / 6, -this.h / 2, this.w / 3, this.h);\n break;\n }\n }\n }\n this.context.closePath();\n this.context.restore();\n }\n}\n\nclass ParticleGenerator {\n constructor(canvas, getOptions) {\n this.x = 0;\n this.y = 0;\n this.w = 0;\n this.h = 0;\n this.lastNumberOfPieces = 0;\n this.tweenProgress = 0;\n this.tweenFrom = 0;\n this.particles = [];\n this.particlesGenerated = 0;\n this.removeParticleAt = (i) => {\n this.particles.splice(i, 1);\n };\n this.getParticle = () => {\n const newParticleX = randomRange(this.x, this.w + this.x);\n const newParticleY = randomRange(this.y, this.h + this.y);\n return new Particle(this.context, this.getOptions, newParticleX, newParticleY);\n };\n this.animate = (elapsed) => {\n const { canvas, context, particlesGenerated, lastNumberOfPieces } = this;\n const { run, recycle, numberOfPieces, debug, tweenFunction, tweenDuration, } = this.getOptions();\n if (!run) {\n return false;\n }\n const nP = this.particles.length;\n const activeCount = recycle ? nP : particlesGenerated;\n // Initial population\n if (activeCount < numberOfPieces) {\n // Use the numberOfPieces prop as a key to reset the easing timing\n if (lastNumberOfPieces !== numberOfPieces) {\n this.tweenProgress = 0;\n this.tweenFrom = activeCount;\n this.lastNumberOfPieces = numberOfPieces;\n }\n // Clamp tweenProgress between 0 and tweenDuration\n this.tweenProgress = Math.min(tweenDuration, Math.max(0, this.tweenProgress + elapsed));\n const tweenedVal = tweenFunction(this.tweenProgress, this.tweenFrom, numberOfPieces, tweenDuration);\n const numToAdd = Math.round(tweenedVal - activeCount);\n for (let i = 0; i < numToAdd; i++) {\n this.particles.push(this.getParticle());\n }\n this.particlesGenerated += numToAdd;\n }\n if (debug) {\n // Draw debug text\n context.font = '12px sans-serif';\n context.fillStyle = '#333';\n context.textAlign = 'right';\n context.fillText(`Particles: ${nP}`, canvas.width - 10, canvas.height - 20);\n }\n // Maintain the population, iterating backwards to prevent issues when removing particles\n for (let i = this.particles.length - 1; i >= 0; i--) {\n const p = this.particles[i];\n // Update each particle's position\n p.update(elapsed);\n // Prune the off-canvas particles\n if (p.y > canvas.height ||\n p.y < -100 ||\n p.x > canvas.width + 100 ||\n p.x < -100) {\n if (recycle && activeCount <= numberOfPieces) {\n // Replace the particle with a brand new one\n this.particles[i] = this.getParticle();\n }\n else {\n this.removeParticleAt(i);\n }\n }\n }\n return nP > 0 || activeCount < numberOfPieces;\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.getOptions = getOptions;\n }\n}\n\nconst confettiDefaults = {\n width: typeof window !== 'undefined' ? window.innerWidth : 300,\n height: typeof window !== 'undefined' ? window.innerHeight : 200,\n numberOfPieces: 200,\n friction: 0.99,\n wind: 0,\n gravity: 0.1,\n initialVelocityX: 4,\n initialVelocityY: 10,\n colors: [\n '#f44336',\n '#e91e63',\n '#9c27b0',\n '#673ab7',\n '#3f51b5',\n '#2196f3',\n '#03a9f4',\n '#00bcd4',\n '#009688',\n '#4CAF50',\n '#8BC34A',\n '#CDDC39',\n '#FFEB3B',\n '#FFC107',\n '#FF9800',\n '#FF5722',\n '#795548',\n ],\n opacity: 1.0,\n debug: false,\n tweenFunction: tweens.easeInOutQuad,\n tweenDuration: 5000,\n recycle: true,\n run: true,\n};\nclass Confetti {\n constructor(canvas, opts) {\n this.lastFrameTime = 0;\n this.setOptionsWithDefaults = (opts) => {\n const computedConfettiDefaults = {\n confettiSource: {\n x: 0,\n y: 0,\n w: this.canvas.width,\n h: 0,\n },\n };\n this._options = {\n ...computedConfettiDefaults,\n ...confettiDefaults,\n ...opts,\n };\n Object.assign(this, opts.confettiSource);\n };\n this.update = (timestamp = 0) => {\n const { options: { run, onConfettiComplete, frameRate }, canvas, context, } = this;\n // Cap elapsed time to 50ms to prevent large time steps\n const elapsed = Math.min(timestamp - this.lastFrameTime, 50);\n // Throttle the frame rate if set\n if (frameRate && elapsed < 1000 / frameRate) {\n this.rafId = requestAnimationFrame(this.update);\n return;\n }\n this.lastFrameTime = timestamp - (frameRate ? elapsed % frameRate : 0);\n if (run) {\n context.fillStyle = 'white';\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n if (this.generator.animate(elapsed)) {\n this.rafId = requestAnimationFrame(this.update);\n }\n else {\n if (onConfettiComplete &&\n typeof onConfettiComplete === 'function' &&\n this.generator.particlesGenerated > 0) {\n onConfettiComplete.call(this, this);\n }\n this._options.run = false;\n }\n };\n this.reset = () => {\n if (this.generator && this.generator.particlesGenerated > 0) {\n this.generator.particlesGenerated = 0;\n this.generator.particles = [];\n this.generator.lastNumberOfPieces = 0;\n }\n };\n this.stop = () => {\n this.options = { run: false };\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = undefined;\n }\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.generator = new ParticleGenerator(this.canvas, () => this.options);\n this.options = opts;\n this.update();\n }\n get options() {\n return this._options;\n }\n set options(opts) {\n const lastRunState = this._options?.run;\n const lastRecycleState = this._options?.recycle;\n this.setOptionsWithDefaults(opts);\n if (this.generator) {\n Object.assign(this.generator, this.options.confettiSource);\n if (typeof opts.recycle === 'boolean' &&\n opts.recycle &&\n lastRecycleState === false) {\n this.generator.lastNumberOfPieces = this.generator.particles.length;\n }\n }\n if (typeof opts.run === 'boolean' && opts.run && lastRunState === false) {\n this.update();\n }\n }\n}\n\nconst ref = React.createRef();\nclass ReactConfettiInternal extends React.Component {\n constructor(props) {\n super(props);\n this.canvas = React.createRef();\n this.canvas = props.canvasRef || ref;\n }\n componentDidMount() {\n if (this.canvas.current) {\n const opts = extractCanvasProps(this.props)[0];\n this.confetti = new Confetti(this.canvas.current, opts);\n }\n }\n componentDidUpdate() {\n const confettiOptions = extractCanvasProps(this.props)[0];\n if (this.confetti) {\n this.confetti.options = confettiOptions;\n }\n }\n componentWillUnmount() {\n if (this.confetti) {\n this.confetti.stop();\n }\n this.confetti = undefined;\n }\n render() {\n const [confettiOptions, passedProps] = extractCanvasProps(this.props);\n const canvasStyles = {\n zIndex: 2,\n position: 'absolute',\n pointerEvents: 'none',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n ...passedProps.style,\n };\n return (jsx(\"canvas\", { width: confettiOptions.width, height: confettiOptions.height, ref: this.canvas, ...passedProps, style: canvasStyles }));\n }\n}\nReactConfettiInternal.defaultProps = {\n ...confettiDefaults,\n};\nReactConfettiInternal.displayName = 'ReactConfetti';\nfunction extractCanvasProps(props) {\n const confettiOptions = {};\n const refs = {};\n const rest = {};\n const confettiOptionKeys = [\n ...Object.keys(confettiDefaults),\n 'confettiSource',\n 'drawShape',\n 'onConfettiComplete',\n 'frameRate',\n ];\n const refProps = ['canvasRef'];\n for (const prop in props) {\n const val = props[prop];\n if (confettiOptionKeys.includes(prop)) {\n confettiOptions[prop] = val;\n }\n else if (refProps.includes(prop)) {\n refProps[prop] = val;\n }\n else {\n rest[prop] = val;\n }\n }\n return [confettiOptions, rest, refs];\n}\nconst ReactConfetti = React.forwardRef((props, ref) => jsx(ReactConfettiInternal, { canvasRef: ref, ...props }));\n\nexport { ReactConfetti as default };\n//# sourceMappingURL=react-confetti.mjs.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","import React from \"react\";\nimport type { BundleDiscountRule } from \"../types\";\nimport type { BundleUiMessageKey } from \"../i18n\";\nimport {\n formatRuleRewardLabel,\n getRuleFreeGiftVariants,\n isFreeGiftRule,\n} from \"../utils/ruleReward\";\nimport styles from \"./RuleRewardDisplay.module.css\";\n\nexport type RuleRewardDisplayProps = {\n rule: BundleDiscountRule;\n t: (key: BundleUiMessageKey, values?: Record<string, string | number>) => string;\n imageClassName: string;\n fallbackClassName: string;\n textClassName: string;\n imageStackClassName?: string;\n centered?: boolean;\n layout?: \"box\" | \"line\";\n};\n\nfunction FreeGiftRewardLabel({\n t,\n}: {\n t: RuleRewardDisplayProps[\"t\"];\n}) {\n return (\n <span className={styles.giftRewardLabel}>\n {t(\"bundle.discount.free\")}\n </span>\n );\n}\n\nfunction FreeGiftVisual({\n rule,\n t,\n imageClassName,\n fallbackClassName,\n imageStackClassName,\n centered = false,\n layout = \"box\",\n}: RuleRewardDisplayProps) {\n const gifts = getRuleFreeGiftVariants(rule);\n const giftsWithImage = gifts.filter((gift) => gift.image?.url);\n const wrapClassName = [\n styles.giftReward,\n layout === \"line\" ? styles.giftRewardLine : null,\n centered ? styles.giftRewardCentered : null,\n ]\n .filter(Boolean)\n .join(\" \");\n\n let visual: React.ReactNode = null;\n if (giftsWithImage.length === 1) {\n const gift = giftsWithImage[0]!;\n visual = (\n <img\n className={imageClassName}\n src={gift.image!.url}\n alt={gift.image!.altText ?? gift.displayName ?? gift.title}\n loading=\"lazy\"\n />\n );\n } else if (giftsWithImage.length > 1) {\n visual = (\n <div className={[styles.giftRewardImages, imageStackClassName].filter(Boolean).join(\" \")}>\n {giftsWithImage.slice(0, 2).map((gift) => (\n <img\n key={gift.id}\n className={imageClassName}\n src={gift.image!.url}\n alt={gift.image!.altText ?? gift.displayName ?? gift.title}\n loading=\"lazy\"\n />\n ))}\n </div>\n );\n } else {\n const fallbackTitle =\n gifts[0]?.product?.title?.trim()\n || gifts[0]?.displayName?.trim()\n || gifts[0]?.title?.trim()\n || \"?\";\n visual = (\n <div className={fallbackClassName} aria-hidden=\"true\">\n {fallbackTitle.slice(0, 1).toUpperCase()}\n </div>\n );\n }\n\n return (\n <div className={wrapClassName}>\n {visual}\n <FreeGiftRewardLabel t={t} />\n </div>\n );\n}\n\nexport function RuleRewardDisplay(props: RuleRewardDisplayProps) {\n const { rule, t, textClassName, layout = \"box\" } = props;\n if (isFreeGiftRule(rule)) {\n return <FreeGiftVisual {...props} layout={layout} />;\n }\n\n return <div className={textClassName}>{formatRuleRewardLabel(rule, t)}</div>;\n}\n\nexport function RuleRewardLineLabel(props: Omit<RuleRewardDisplayProps, \"centered\" | \"imageStackClassName\">) {\n return <RuleRewardDisplay {...props} layout=\"line\" />;\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport Confetti from \"react-confetti\";\nimport { Link, Search, ChevronDown } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport { formatBundleCurrency, getProductWord } from \"../i18n\";\nimport {\n formatRuleCelebrationText,\n formatRuleRewardLabel,\n normalizeRuleRewardType,\n} from \"../utils/ruleReward\";\nimport { isBundlePreviewMode } from \"../utils/previewMode\";\nimport { RuleRewardDisplay } from \"./RuleRewardDisplay\";\nimport type { BundleDiscountRule } from \"../types\";\nimport styles from \"./BundleBuilderDrawer.module.css\";\n\nexport type BundleBuilderDrawerProps = {\n className?: string;\n};\n\nexport function BundleBuilderDrawer(props: BundleBuilderDrawerProps) {\n const {\n isOpen,\n close,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n redirectVariantToProductPage,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n } = useBundleBuilder();\n\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const footerRef = useRef<HTMLElement | null>(null);\n const celebrationChipRef = useRef<HTMLDivElement | null>(null);\n\n const [windowSize, setWindowSize] = useState<{ width: number; height: number }>(() => {\n if (typeof window === \"undefined\") return { width: 0, height: 0 };\n return { width: window.innerWidth, height: window.innerHeight };\n });\n\n const [confettiKey, setConfettiKey] = useState(0);\n const [confettiSource, setConfettiSource] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n const [isConfettiActive, setIsConfettiActive] = useState(false);\n const confettiTimerRef = useRef<number | null>(null);\n const prevBundleSizeForConfettiRef = useRef<number>(bundleSize);\n const confettiSettleMs = 7000;\n\n const [celebrationKey, setCelebrationKey] = useState(0);\n const [celebrationText, setCelebrationText] = useState<string | null>(null);\n const [isCelebrationActive, setIsCelebrationActive] = useState(false);\n const celebrationTimerRef = useRef<number | null>(null);\n const celebrationDurationMs = 2800;\n\n const DEFAULT_CONFETTI_COLORS = [\n \"#2563eb\",\n \"#3b82f6\",\n \"#60a5fa\",\n \"#93c5fd\",\n \"#bae6fd\",\n \"#e0f2fe\",\n ] as const;\n\n const confettiColors = useMemo(() => {\n const c = config?.styleSettings?.confettiColors;\n if (Array.isArray(c) && c.length >= 6) {\n return c.slice(0, 6).map((s, i) =>\n typeof s === \"string\" && s.trim() ? s : DEFAULT_CONFETTI_COLORS[i],\n );\n }\n return [...DEFAULT_CONFETTI_COLORS];\n }, [config?.styleSettings?.confettiColors]);\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n if (value.toLowerCase() === \"default title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" · \");\n };\n\n const isDefaultTitle = (value: string | null | undefined) => {\n return value?.trim().toLowerCase() === \"default title\";\n };\n\n const getVariantPrimaryName = (v: (typeof eligibleVariants)[number]) => {\n const displayName = v.displayName?.trim();\n if (displayName && !isDefaultTitle(displayName)) return displayName;\n\n const productTitle = v.product?.title?.trim();\n if (productTitle) return productTitle;\n\n const variantTitle = v.title?.trim();\n if (variantTitle && !isDefaultTitle(variantTitle)) return variantTitle;\n\n return displayName || variantTitle || productTitle || \"\";\n };\n\n const getVariantA11yLabel = (v: (typeof eligibleVariants)[number]) => {\n const name = getVariantPrimaryName(v);\n const opts = formatVariantOptions(v.selectedOptions);\n return [name, opts].filter(Boolean).join(\" — \");\n };\n\n const getVariantOptionLabel = (v: (typeof eligibleVariants)[number]) => {\n const options = formatVariantOptions(v.selectedOptions);\n if (options) return options;\n\n const variantTitle = v.title?.trim();\n if (variantTitle && !isDefaultTitle(variantTitle)) return variantTitle;\n\n return getVariantPrimaryName(v);\n };\n\n const title = config?.title?.trim() || t(\"bundle.title.default\");\n const redirectToProductPage = Boolean(config?.redirectEligibleProductsToProductPage) && !isBundlePreviewMode();\n const isReadyToRender = Boolean(config);\n const visualOpen = isOpen && isReadyToRender;\n const [isMounted, setIsMounted] = useState(visualOpen);\n const closeTimerRef = useRef<number | null>(null);\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n\n return formatBundleCurrency(n, currencyCode, locale);\n };\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n const handleVariantAdd = (variant: (typeof eligibleVariants)[number], nextQuantity: number) => {\n const currentQty = selections[variant.id] ?? 0;\n if (redirectToProductPage && nextQuantity > currentQty) {\n redirectVariantToProductPage(variant);\n return;\n }\n setQuantity(variant.id, nextQuantity);\n };\n\n const sorted = useMemo(() => {\n return [...eligibleVariants];\n }, [eligibleVariants]);\n\n const filteredVariants = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n if (!q) return sorted;\n\n const tokens = q.split(/\\s+/).filter(Boolean);\n const matches = (v: (typeof sorted)[number]) => {\n const parts: string[] = [];\n parts.push(v.displayName);\n if (v.product?.title) parts.push(v.product.title);\n for (const o of v.selectedOptions ?? []) {\n parts.push(o.name);\n parts.push(o.value);\n }\n const haystack = parts.join(\" \").toLowerCase();\n return tokens.every((t) => haystack.includes(t));\n };\n\n return sorted.filter(matches);\n }, [searchQuery, sorted]);\n\n const groupedProducts = useMemo(() => {\n if (!config?.groupVariantsByProduct) return null;\n const q = searchQuery.trim().toLowerCase();\n const tokens = q ? q.split(/\\s+/).filter(Boolean) : [];\n\n const matchesSearch = (v: (typeof sorted)[number]) => {\n if (!tokens.length) return true;\n const parts: string[] = [v.displayName];\n if (v.product?.title) parts.push(v.product.title);\n for (const o of v.selectedOptions ?? []) { parts.push(o.name); parts.push(o.value); }\n const haystack = parts.join(\" \").toLowerCase();\n return tokens.every((tok) => haystack.includes(tok));\n };\n\n const map = new Map<string, { productId: string; productTitle: string; variants: typeof sorted; filteredVariants: typeof sorted }>();\n for (const v of sorted) {\n const productId = v.product?.id ?? \"unknown\";\n if (!map.has(productId)) {\n map.set(productId, { productId, productTitle: v.product?.title ?? \"\", variants: [], filteredVariants: [] });\n }\n const group = map.get(productId)!;\n group.variants.push(v);\n if (matchesSearch(v)) group.filteredVariants.push(v);\n }\n\n return Array.from(map.values()).filter((g) => g.filteredVariants.length > 0);\n }, [config?.groupVariantsByProduct, sorted, searchQuery]);\n\n const [openProductPicker, setOpenProductPicker] = useState<string | null>(null);\n const pickerRef = useRef<HTMLLIElement | null>(null);\n\n useEffect(() => {\n if (!openProductPicker) return;\n const handleClick = (e: MouseEvent) => {\n if (pickerRef.current && !pickerRef.current.contains(e.target as Node)) {\n setOpenProductPicker(null);\n }\n };\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [openProductPicker]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule || normalizeRuleRewardType(appliedRule) === \"free_gift\") return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n // Keep cents stable for display.\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n const map = new Map<number, BundleDiscountRule>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, r);\n }\n return map;\n }, [rulesSorted]);\n\n const slotCount = useMemo(() => {\n // Placeholders show until highest tier; if user adds more, extend (scroll).\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n // Track animation state for dual button split animation\n const [isDualButtonAnimationLoaded, setIsDualButtonAnimationLoaded] = useState(true);\n const prevItemsRemainingRef = useRef(itemsRemaining);\n\n // Trigger animation when itemsRemaining changes from > 0 to 0 in add_to_cart_checkout mode\n useEffect(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n const wasPositive = prevItemsRemainingRef.current > 0;\n const isNowZero = itemsRemaining === 0;\n\n if (wasPositive && isNowZero) {\n // Trigger animation\n setIsDualButtonAnimationLoaded(false);\n } else {\n // Reset animation\n setIsDualButtonAnimationLoaded(true);\n }\n }\n prevItemsRemainingRef.current = itemsRemaining;\n }, [itemsRemaining, config?.ctaButtonMode]);\n\n const panelRef = useRef<HTMLDivElement | null>(null);\n const bodyRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = bodyRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\"${variantId}\"]`);\n if (!row) return;\n\n const c = container.getBoundingClientRect();\n const r = row.getBoundingClientRect();\n const padding = 8;\n const isFullyVisible = r.top >= c.top + padding && r.bottom <= c.bottom - padding;\n if (isFullyVisible) return;\n\n const maxTop = Math.max(0, container.scrollHeight - container.clientHeight);\n const rowCenterOffset = (r.top - c.top) + r.height / 2;\n const targetTop = container.scrollTop + rowCenterOffset - container.clientHeight / 2;\n const nextTop = Math.min(maxTop, Math.max(0, targetTop));\n container.scrollTo({ top: nextTop, behavior: \"smooth\" });\n };\n\n useEffect(() => {\n if (!visualOpen) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") close();\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [close, visualOpen]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setWindowSize({ width: window.innerWidth, height: window.innerHeight });\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n useEffect(() => {\n if (closeTimerRef.current != null) {\n window.clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n if (visualOpen) {\n setIsMounted(true);\n return;\n }\n\n // Keep mounted long enough to play exit animation.\n closeTimerRef.current = window.setTimeout(() => {\n setIsMounted(false);\n closeTimerRef.current = null;\n }, 220);\n }, [visualOpen]);\n\n useEffect(() => {\n return () => {\n if (closeTimerRef.current != null) window.clearTimeout(closeTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n if (!visualOpen) return;\n if (!isSearchOpen) return;\n const raf = requestAnimationFrame(() => searchInputRef.current?.focus());\n return () => cancelAnimationFrame(raf);\n }, [visualOpen, isSearchOpen]);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n\n // When hitting a threshold, try to reveal the NEXT threshold (aligned right) if it's off-screen to the right.\n // If no remaining thresholds, scroll the newest added item into view.\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n // Only scroll rightward when the target is off-screen to the right.\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n\n useEffect(() => {\n if (!visualOpen) return;\n\n const prev = prevBundleSizeForConfettiRef.current;\n prevBundleSizeForConfettiRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n // Trigger when crossing an exact configured threshold (e.g. 2 items, 3 items, etc.).\n const hitRule = rulesSorted.find((r) => r.minBundleSize === bundleSize);\n if (!hitRule) return;\n\n // Celebration chip (centered)\n setCelebrationText(formatRuleCelebrationText(hitRule, t));\n setCelebrationKey((k) => k + 1);\n setIsCelebrationActive(true);\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n celebrationTimerRef.current = window.setTimeout(() => {\n setIsCelebrationActive(false);\n celebrationTimerRef.current = null;\n }, celebrationDurationMs);\n }, [bundleSize, visualOpen, rulesSorted]);\n\n useEffect(() => {\n if (!visualOpen) return;\n if (!isCelebrationActive) return;\n if (!celebrationText) return;\n\n // After the chip renders, measure its rect and shoot confetti from it.\n const raf = requestAnimationFrame(() => {\n const chipEl = celebrationChipRef.current;\n const rect = chipEl?.getBoundingClientRect();\n\n // Fallback: use the drawer panel center if chip rect isn't available yet.\n const panelRect = panelRef.current?.getBoundingClientRect();\n const originX = rect ? rect.left + rect.width / 2 : panelRect ? panelRect.left + panelRect.width / 2 : window.innerWidth / 2;\n const originY = rect ? rect.top + rect.height / 2 : panelRect ? panelRect.top + panelRect.height / 2 : window.innerHeight / 2;\n\n const source = {\n x: originX - 2,\n y: originY - 2,\n w: 4,\n h: 4,\n };\n\n setConfettiSource(source);\n setConfettiKey((k) => k + 1);\n setIsConfettiActive(true);\n\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n confettiTimerRef.current = window.setTimeout(() => {\n setIsConfettiActive(false);\n confettiTimerRef.current = null;\n }, confettiSettleMs);\n });\n\n return () => cancelAnimationFrame(raf);\n }, [celebrationKey, celebrationText, confettiSettleMs, isCelebrationActive, visualOpen]);\n\n useEffect(() => {\n if (!visualOpen) return;\n panelRef.current?.focus();\n }, [visualOpen]);\n\n if (!isMounted) return null;\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t(\"bundle.drawer.aria\")}\n className={[styles.backdrop, visualOpen ? styles.backdropOpen : styles.backdropClosed, props.className].filter(Boolean).join(\" \")}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) close();\n }}\n >\n {isConfettiActive && confettiSource && windowSize.width > 0 && windowSize.height > 0 ? (\n <Confetti\n key={confettiKey}\n width={windowSize.width}\n height={windowSize.height}\n confettiSource={confettiSource}\n colors={confettiColors}\n recycle={false}\n numberOfPieces={70}\n tweenDuration={100}\n gravity={0.45}\n initialVelocityY={{ min: -10, max: -30 }}\n initialVelocityX={{ min: -6, max: 6 }}\n style={{ position: \"fixed\", inset: 0, pointerEvents: \"none\", zIndex: 2147483646 }}\n />\n ) : null}\n <aside ref={panelRef} className={[styles.panel, visualOpen ? styles.panelOpen : styles.panelClosed].filter(Boolean).join(\" \")} tabIndex={-1}>\n {isCelebrationActive && celebrationText ? (\n <div className={styles.celebrationOverlay} aria-hidden=\"true\">\n <div key={celebrationKey} ref={celebrationChipRef} className={styles.celebrationChip}>\n {celebrationText}\n </div>\n </div>\n ) : null}\n <header className={[styles.header, isSearchOpen ? styles.headerSearchOpen : null].filter(Boolean).join(\" \")}>\n <button\n type=\"button\"\n className={styles.searchIconButton}\n aria-label={isSearchOpen ? t(\"bundle.search.expanded\") : t(\"bundle.search\")}\n aria-expanded={isSearchOpen}\n onClick={() => {\n setIsSearchOpen(true);\n }}\n >\n <Search size={18} aria-hidden=\"true\" />\n </button>\n\n <div className={styles.headerCenter}>\n <div className={styles.headerTitleWrap} aria-hidden={isSearchOpen}>\n <h2 className={styles.title}>{title}</h2>\n </div>\n\n <div className={styles.headerSearchWrap} aria-hidden={!isSearchOpen}>\n <div className={styles.searchBar}>\n <input\n ref={searchInputRef}\n className={styles.searchInput}\n type=\"search\"\n value={searchQuery}\n placeholder={t(\"bundle.search.placeholder\")}\n onChange={(e) => setSearchQuery(e.target.value)}\n onBlur={() => {\n if (searchQuery.trim() === \"\") setIsSearchOpen(false);\n }}\n />\n {searchQuery.trim() ? (\n <button\n type=\"button\"\n className={styles.searchClearButton}\n onMouseDown={(e) => {\n // Prevent input blur so the bar stays open and focused.\n e.preventDefault();\n }}\n onClick={() => {\n setSearchQuery(\"\");\n searchInputRef.current?.focus();\n }}\n aria-label={t(\"bundle.search.clear\")}\n >\n {t(\"bundle.search.clear\")}\n </button>\n ) : null}\n </div>\n </div>\n </div>\n\n <button type=\"button\" onClick={close} disabled={submitting} className={styles.closeButton} aria-label={t(\"bundle.close\")}>\n ×\n </button>\n </header>\n\n <div className={styles.body} ref={bodyRef}>\n {loading ? <p className={styles.muted}>{t(\"bundle.loading\")}</p> : null}\n {error ? <p className={styles.error}>{error}</p> : null}\n\n <div className={styles.variants}>\n {!loading && !error && eligibleVariants.length === 0 ? (\n <p className={styles.emptyState}>{t(\"bundle.empty\")}</p>\n ) : groupedProducts ? (\n <ul className={styles.variantList}>\n {groupedProducts.map((group) => {\n const productImage = group.variants.find((v) => v.image?.url)?.image ?? null;\n const hasMultipleVariants = group.variants.length > 1;\n const isPickerOpen = openProductPicker === group.productId;\n const selectedVariants = group.variants.filter((v) => (selections[v.id] ?? 0) > 0);\n\n // Single-variant: render identically to flat rows\n if (!hasMultipleVariants) {\n const v = group.variants[0];\n if (!v) return null;\n const qty = selections[v.id] ?? 0;\n const variantA11y = getVariantA11yLabel(v);\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const normalizedLimit = vLimit == null ? Number.POSITIVE_INFINITY : vLimit;\n const isAtLimit = qty >= normalizedLimit;\n const isUnavailable = v.availableForSale === false;\n const canIncrease = !isUnavailable && !isAtMaxBundleSize && !isAtLimit;\n const stockLabel = !isUnavailable && isAtLimit ? t(\"bundle.stock.max_reached\") : null;\n const fallbackVariantTitle = v.title?.trim();\n const optionText = formatVariantOptions(v.selectedOptions)\n ?? (fallbackVariantTitle && fallbackVariantTitle.toLowerCase() !== \"default title\" ? fallbackVariantTitle : null);\n return (\n <li key={group.productId} className={[styles.variantRow, isUnavailable ? styles.variantRowSoldOut : null].filter(Boolean).join(\" \")} data-variant-row={v.id}>\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {productImage?.url ? <img className={styles.variantThumbImg} src={productImage.url} alt={productImage.altText ?? group.productTitle} loading=\"lazy\" /> : <div className={styles.variantThumbFallback}>{group.productTitle.slice(0, 1).toUpperCase() || \"•\"}</div>}\n </div>\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{group.productTitle}</div>\n {optionText ? <div className={styles.variantMeta}>{optionText}</div> : null}\n <div className={styles.variantPriceRow}>\n <span className={styles.variantPrice}>{formatMoney(v.price)}</span>\n </div>\n </div>\n </div>\n {isUnavailable ? (\n <div className={styles.soldOutContainer}><span className={styles.soldOut} aria-label={t(\"bundle.a11y.sold_out\", { name: variantA11y })}>{t(\"bundle.stock.sold_out\")}</span></div>\n ) : qty <= 0 && normalizedLimit <= 0 ? (\n <div className={styles.stockLimitContainer}><span className={styles.stockLimitNotice}>{t(\"bundle.stock.max_added\")}</span></div>\n ) : qty <= 0 ? (\n <button type=\"button\" onClick={() => handleVariantAdd(v, 1)} disabled={submitting || !canIncrease} className={styles.addToBundleButton} aria-label={t(\"bundle.a11y.add_to_bundle\", { name: variantA11y })}>\n {t(\"bundle.cta.add_to_bundle\")}\n </button>\n ) : (\n <div className={styles.qtyControlsWrap}>\n <div className={styles.qtyControls}>\n <button type=\"button\" onClick={() => setQuantity(v.id, qty - 1)} disabled={submitting || qty <= 0} className={styles.qtyButton} aria-label={t(\"bundle.a11y.decrease\", { name: variantA11y })}>−</button>\n <span className={styles.qtyValue} aria-label={t(\"bundle.a11y.quantity\", { name: variantA11y, qty })}>{qty}</span>\n <button type=\"button\" onClick={() => handleVariantAdd(v, qty + 1)} disabled={submitting || !canIncrease} className={styles.qtyButton} aria-label={stockLabel ? `${variantA11y} ${stockLabel.toLowerCase()}` : t(\"bundle.a11y.increase\", { name: variantA11y })}>+</button>\n </div>\n {stockLabel ? <div className={styles.stockLimitNotice}>{stockLabel}</div> : null}\n </div>\n )}\n </li>\n );\n }\n\n // Multi-variant: header + inline picker + selected sub-rows\n return (\n <li key={group.productId} ref={isPickerOpen ? pickerRef : null} className={styles.drawerProductGroup}>\n {/* Product header row */}\n <div className={styles.variantRow} data-variant-row={group.productId}>\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {productImage?.url ? <img className={styles.variantThumbImg} src={productImage.url} alt={productImage.altText ?? group.productTitle} loading=\"lazy\" /> : <div className={styles.variantThumbFallback}>{group.productTitle.slice(0, 1).toUpperCase() || \"•\"}</div>}\n </div>\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{group.productTitle}</div>\n </div>\n </div>\n <button\n type=\"button\"\n className={[styles.addToBundleButton, styles.selectButton].filter(Boolean).join(\" \")}\n aria-expanded={isPickerOpen}\n disabled={submitting}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={() => setOpenProductPicker((prev) => prev === group.productId ? null : group.productId)}\n >\n {t(\"bundle.select.variant\")}\n <ChevronDown size={13} strokeWidth={2.5} className={[styles.selectButtonChevron, isPickerOpen ? styles.selectButtonChevronOpen : null].filter(Boolean).join(\" \")} />\n </button>\n </div>\n\n {/* Inline variant picker */}\n {isPickerOpen && (\n <div className={styles.variantPicker}>\n {group.filteredVariants.map((v) => {\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const isAlreadySelected = (selections[v.id] ?? 0) > 0;\n const isSoldOut = v.availableForSale === false;\n const isMaxAdded = vLimit != null && vLimit <= 0;\n const isBundleFull = !isAlreadySelected && isAtMaxBundleSize;\n const isDisabled = (\n submitting\n || isSoldOut\n || isMaxAdded\n || isBundleFull\n );\n const statusLabel = isSoldOut\n ? t(\"bundle.stock.sold_out\")\n : isMaxAdded\n ? t(\"bundle.stock.max_added\")\n : isBundleFull\n ? t(\"bundle.stock.max_reached\")\n : null;\n const optionLabel = getVariantOptionLabel(v);\n return (\n <button\n key={v.id}\n type=\"button\"\n disabled={isDisabled}\n className={[styles.variantPickerRow, isAlreadySelected ? styles.variantPickerRowSelected : null].filter(Boolean).join(\" \")}\n onClick={() => {\n if (!isAlreadySelected) {\n if (redirectToProductPage) {\n handleVariantAdd(v, 1);\n setOpenProductPicker(null);\n return;\n }\n handleVariantAdd(v, 1);\n }\n setOpenProductPicker(null);\n }}\n >\n <span className={styles.variantPickerLabel}>{optionLabel}</span>\n <span className={styles.variantPickerPriceGroup}>\n {statusLabel ? (\n <span className={styles.variantPickerSoldOut}>{statusLabel}</span>\n ) : (\n <span className={styles.variantPickerPrice}>{formatMoney(v.price)}</span>\n )}\n </span>\n {isAlreadySelected ? <span className={styles.variantPickerCheck} aria-hidden=\"true\">✓</span> : null}\n </button>\n );\n })}\n </div>\n )}\n\n {/* Selected variant sub-rows */}\n {selectedVariants.length > 0 && (\n <div className={styles.drawerSelectedList}>\n {selectedVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const variantA11y = getVariantA11yLabel(v);\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const normalizedLimit = vLimit == null ? Number.POSITIVE_INFINITY : vLimit;\n const isAtLimit = qty >= normalizedLimit;\n const canIncrease = v.availableForSale !== false && !isAtMaxBundleSize && !isAtLimit;\n const stockLabel = v.availableForSale !== false && isAtLimit ? t(\"bundle.stock.max_reached\") : null;\n const optionLabel = getVariantOptionLabel(v);\n return (\n <div key={v.id} className={styles.drawerSubRow} data-variant-row={v.id}>\n <div className={styles.drawerSubRowInfo}>\n <span className={styles.drawerSubRowName}>{optionLabel}</span>\n <div className={styles.variantPriceRow}>\n <span className={styles.variantPrice}>{formatMoney(v.price)}</span>\n </div>\n </div>\n <div className={styles.qtyControlsWrap}>\n <div className={styles.qtyControls}>\n <button type=\"button\" onClick={() => setQuantity(v.id, qty - 1)} disabled={submitting || qty <= 0} className={styles.qtyButton} aria-label={t(\"bundle.a11y.decrease\", { name: variantA11y })}>−</button>\n <span className={styles.qtyValue} aria-label={t(\"bundle.a11y.quantity\", { name: variantA11y, qty })}>{qty}</span>\n <button type=\"button\" onClick={() => handleVariantAdd(v, qty + 1)} disabled={submitting || !canIncrease} className={styles.qtyButton} aria-label={stockLabel ? `${variantA11y} ${stockLabel.toLowerCase()}` : t(\"bundle.a11y.increase\", { name: variantA11y })}>+</button>\n </div>\n {stockLabel ? <div className={styles.stockLimitNotice}>{stockLabel}</div> : null}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n ) : (\n <ul className={styles.variantList}>\n {filteredVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const variantPrimaryName = getVariantPrimaryName(v);\n const variantOptionText = formatVariantOptions(v.selectedOptions);\n const variantA11y = getVariantA11yLabel(v);\n const variantSelectionLimit = getVariantMaxSelectableQuantity(v.id);\n const normalizedVariantSelectionLimit = variantSelectionLimit == null\n ? Number.POSITIVE_INFINITY\n : variantSelectionLimit;\n const isAtVariantStockLimit = qty >= normalizedVariantSelectionLimit;\n const canIncreaseQuantity = v.availableForSale !== false && !isAtMaxBundleSize && !isAtVariantStockLimit;\n const stockStatusLabel =\n v.availableForSale === false\n ? null\n : isAtVariantStockLimit\n ? t(\"bundle.stock.max_reached\")\n : null;\n\n return (\n <li\n key={v.id}\n className={[styles.variantRow, v.availableForSale === false && styles.variantRowSoldOut]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={v.id}\n >\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {v.image?.url ? (\n <img\n className={styles.variantThumbImg}\n src={v.image.url}\n alt={v.image.altText ?? variantA11y}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantThumbFallback}>{v.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}</div>\n )}\n </div>\n\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{variantPrimaryName}</div>\n {variantOptionText ? <div className={styles.variantMeta}>{variantOptionText}</div> : null}\n <div className={styles.variantPriceRow}>\n <span className={styles.variantPrice}>{formatMoney(v.price)}</span>\n </div>\n </div>\n </div>\n {v.availableForSale === false ? (\n <div className={styles.soldOutContainer}>\n <span className={styles.soldOut} aria-label={t(\"bundle.a11y.sold_out\", { name: variantA11y })}>\n {t(\"bundle.stock.sold_out\")}\n </span>\n </div>\n ) : qty <= 0 && normalizedVariantSelectionLimit <= 0 ? (\n <div className={styles.stockLimitContainer}>\n <span className={styles.stockLimitNotice} aria-label={t(\"bundle.a11y.max_available_selected\", { name: variantA11y })}>\n {t(\"bundle.stock.max_added\")}\n </span>\n </div>\n ) : qty <= 0 ? (\n <button\n type=\"button\"\n onClick={() => handleVariantAdd(v, 1)}\n disabled={submitting || !canIncreaseQuantity}\n className={styles.addToBundleButton}\n aria-label={stockStatusLabel ? `${variantA11y} ${stockStatusLabel.toLowerCase()}` : t(\"bundle.a11y.add_to_bundle\", { name: variantA11y })}\n >\n {t(\"bundle.cta.add_to_bundle\")}\n </button>\n ) : (\n <div className={styles.qtyControlsWrap}>\n <div className={styles.qtyControls}>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty - 1)}\n disabled={submitting || qty <= 0}\n className={styles.qtyButton}\n aria-label={t(\"bundle.a11y.decrease\", { name: variantA11y })}\n >\n −\n </button>\n <span className={styles.qtyValue} aria-label={t(\"bundle.a11y.quantity\", { name: variantA11y, qty })}>\n {qty}\n </span>\n <button\n type=\"button\"\n onClick={() => handleVariantAdd(v, qty + 1)}\n disabled={submitting || !canIncreaseQuantity}\n className={styles.qtyButton}\n aria-label={stockStatusLabel ? `${variantA11y} ${stockStatusLabel.toLowerCase()}` : t(\"bundle.a11y.increase\", { name: variantA11y })}\n >\n +\n </button>\n </div>\n {stockStatusLabel ? <div className={styles.stockLimitNotice}>{stockStatusLabel}</div> : null}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n\n <footer className={styles.footer} ref={footerRef}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n\n // Per your preference: show discount text only while it's still a placeholder (unlocked display comes later elsewhere).\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const thresholdRewardLabel = threshold\n ? formatRuleRewardLabel(threshold, t)\n : null;\n const thresholdLabel = threshold?.label?.trim() || (threshold ? `Buy ${threshold.minBundleSize}+` : \"\");\n const titleText = isFilled ? variant!.displayName : t(\"bundle.slot\", { slot: idx + 1 });\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && thresholdRewardLabel ? `${titleText}. ${t(\"bundle.unlocks\", { discount: thresholdRewardLabel })}.` : titleText}\n title={showThreshold && thresholdRewardLabel ? `${titleText} • ${t(\"bundle.unlocks\", { discount: thresholdRewardLabel })}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && threshold ? (\n <RuleRewardDisplay\n rule={threshold}\n t={t}\n imageClassName={styles.boxGiftImage}\n fallbackClassName={styles.boxGiftFallback}\n textClassName={styles.boxItemDiscountText}\n imageStackClassName={styles.boxGiftStack}\n />\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{thresholdLabel}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n <div\n className={[styles.ctaTotalsWrap, hasUnlockedFirstDiscount ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={!hasUnlockedFirstDiscount}\n >\n <div className={styles.ctaTotals} aria-label={t(\"bundle.totals\")}>\n {appliedRule && normalizeRuleRewardType(appliedRule) === \"free_gift\" ? (\n <span className={styles.ctaDiscountBadge}>\n {t(\"bundle.discount.free_gift\")}\n </span>\n ) : appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>\n {t(\"bundle.discount.badge\", { discount: appliedDiscountPercent })}\n </span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n\n {(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n // Show single button with \"Add X more\" when items remaining\n // Show both buttons side-by-side when minimum is met\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })}\n </button>\n );\n }\n\n return (\n <div className={`${styles.ctaButtonGroup} ${isDualButtonAnimationLoaded ? styles.ctaButtonGroupAnimating : \"\"}`}>\n <button\n type=\"button\"\n onClick={submit}\n disabled={!canSubmit}\n className={`${styles.ctaDualLeft} ${isDualButtonAnimationLoaded ? styles.ctaDualLeftAnimating : \"\"}`}\n >\n <span>{submitting ? t(\"bundle.cta.adding\") : t(\"bundle.cta.add_to_basket\")}</span>\n </button>\n <button\n type=\"button\"\n onClick={submitAndCheckout}\n disabled={!canSubmit}\n className={`${styles.ctaDualRight} ${isDualButtonAnimationLoaded ? styles.ctaDualRightAnimating : \"\"}`}\n >\n <span>{submitting ? t(\"bundle.cta.processing\") : t(\"bundle.cta.checkout\")}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.processing\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.checkout\")}\n </button>\n );\n }\n\n // Default: add_to_cart\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.add_to_basket\")}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n {t(\"bundle.powered_by\")} <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\"> BestBundles</a>\n </div>\n </footer>\n </aside>\n </div>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Plus, Trash2, ChevronDown } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport { formatBundleCurrency, getProductWord } from \"../i18n\";\nimport {\n formatRuleRewardLabel,\n normalizeRuleRewardType,\n} from \"../utils/ruleReward\";\nimport { isBundlePreviewMode } from \"../utils/previewMode\";\nimport { RuleRewardDisplay, RuleRewardLineLabel } from \"./RuleRewardDisplay\";\nimport type { BundleDiscountRule } from \"../types\";\nimport styles from \"./BundleBuilderPanel.module.css\";\n\nexport type BundleBuilderPanelProps = {\n className?: string;\n showRules?: boolean;\n showVariants?: boolean;\n};\n\nexport function BundleBuilderPanel(props: BundleBuilderPanelProps) {\n const {\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n redirectVariantToProductPage,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n } = useBundleBuilder();\n\n const {\n className,\n showRules = true,\n showVariants = true,\n } = props;\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n if (value.toLowerCase() === \"default title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" • \");\n };\n\n const isDefaultTitle = (value: string | null | undefined) => {\n return value?.trim().toLowerCase() === \"default title\";\n };\n\n const getVariantPrimaryName = (v: (typeof eligibleVariants)[number]) => {\n const displayName = v.displayName?.trim();\n if (displayName && !isDefaultTitle(displayName)) return displayName;\n\n const productTitle = v.product?.title?.trim();\n if (productTitle) return productTitle;\n\n const variantTitle = v.title?.trim();\n if (variantTitle && !isDefaultTitle(variantTitle)) return variantTitle;\n\n return displayName || variantTitle || productTitle || \"\";\n };\n\n const getVariantA11yLabel = (v: (typeof eligibleVariants)[number]) => {\n const primaryName = getVariantPrimaryName(v);\n const options = formatVariantOptions(v.selectedOptions);\n return [primaryName, options].filter(Boolean).join(\" — \");\n };\n\n const getVariantOptionLabel = (v: (typeof eligibleVariants)[number]) => {\n const options = formatVariantOptions(v.selectedOptions);\n if (options) return options;\n\n const variantTitle = v.title?.trim();\n if (variantTitle && !isDefaultTitle(variantTitle)) return variantTitle;\n\n return getVariantPrimaryName(v);\n };\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n return formatBundleCurrency(n, currencyCode, locale);\n };\n\n const displayVariants = useMemo(() => {\n return [...eligibleVariants];\n }, [eligibleVariants]);\n\n const groupedProducts = useMemo(() => {\n if (!config?.groupVariantsByProduct) return null;\n const map = new Map<string, { productId: string; productTitle: string; variants: typeof eligibleVariants }>();\n for (const v of displayVariants) {\n const productId = v.product?.id ?? \"unknown\";\n if (!map.has(productId)) {\n map.set(productId, { productId, productTitle: v.product?.title ?? \"\", variants: [] });\n }\n map.get(productId)!.variants.push(v);\n }\n return Array.from(map.values());\n }, [config?.groupVariantsByProduct, displayVariants]);\n\n const [openProductPicker, setOpenProductPicker] = useState<string | null>(null);\n const pickerRef = useRef<HTMLLIElement | null>(null);\n\n useEffect(() => {\n if (!openProductPicker) return;\n const handleClick = (e: MouseEvent) => {\n if (pickerRef.current && !pickerRef.current.contains(e.target as Node)) {\n setOpenProductPicker(null);\n }\n };\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [openProductPicker]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule || normalizeRuleRewardType(appliedRule) === \"free_gift\") return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n const map = new Map<number, BundleDiscountRule>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, r);\n }\n return map;\n }, [rulesSorted]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const title = config?.title?.trim() || t(\"bundle.title.default\");\n const redirectToProductPage = Boolean(config?.redirectEligibleProductsToProductPage) && !isBundlePreviewMode();\n const handleVariantAdd = (variant: (typeof eligibleVariants)[number], nextQuantity: number) => {\n const currentQty = selections[variant.id] ?? 0;\n if (redirectToProductPage && nextQuantity > currentQty) {\n redirectVariantToProductPage(variant);\n return;\n }\n setQuantity(variant.id, nextQuantity);\n };\n\n const slotCount = useMemo(() => {\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n\n const variantsRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = variantsRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\\\"${variantId}\\\"]`);\n if (!row) return;\n row.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n };\n\n return (\n <section className={[styles.panel, className].filter(Boolean).join(\" \")} aria-busy={loading}>\n <header className={styles.header}>\n <h2 className={styles.title}>{title}</h2>\n </header>\n\n {loading ? <div className={styles.status}>{t(\"bundle.loading\")}</div> : null}\n {error ? <div className={styles.error}>{error}</div> : null}\n\n {showRules && rulesSorted.length ? (\n <div className={styles.section}>\n <div className={styles.rulesVisual}>\n <div className={styles.rulesLabelsRow}>\n {Array.from({ length: maxRuleSize }).map((_, idx) => {\n const lineIndex = idx + 1;\n const ruleForLine = rulesSorted.find((r) => r.minBundleSize === lineIndex);\n\n return (\n <div key={lineIndex} className={styles.rulesLineLabelCell}>\n {ruleForLine ? (\n <RuleRewardLineLabel\n rule={ruleForLine}\n t={t}\n imageClassName={styles.rulesLineGiftImage}\n fallbackClassName={styles.rulesLineGiftFallback}\n textClassName={styles.rulesLineLabel}\n />\n ) : null}\n </div>\n );\n })}\n </div>\n <div className={styles.rulesLinesRow}>\n {Array.from({ length: maxRuleSize }).map((_, idx) => {\n const lineIndex = idx + 1;\n const isFilled = bundleSize >= lineIndex;\n\n return (\n <div\n key={lineIndex}\n className={[\n styles.rulesLine,\n isFilled ? styles.rulesLineFilled : styles.rulesLineEmpty,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n })}\n </div>\n </div>\n </div>\n ) : null}\n\n {showVariants ? (\n <div className={styles.section} ref={variantsRef}>\n <div className={styles.sectionTitle}>{t(\"bundle.select.items\")}</div>\n <div className={styles.variants}>\n {!loading && !error && displayVariants.length === 0 ? (\n <div className={styles.emptyState}>{t(\"bundle.empty\")}</div>\n ) : groupedProducts ? (\n <ul className={styles.variantList}>\n {groupedProducts.map((group) => {\n const productImage = group.variants.find((v) => v.image?.url)?.image ?? null;\n const hasMultipleVariants = group.variants.length > 1;\n const isPickerOpen = openProductPicker === group.productId;\n const selectedVariants = group.variants.filter((v) => (selections[v.id] ?? 0) > 0);\n\n // Single-variant: show qty controls directly in the header\n if (!hasMultipleVariants) {\n const variant = group.variants[0];\n if (!variant) return null;\n const qty = selections[variant.id] ?? 0;\n const fallbackVariantTitle = variant.title?.trim();\n const optionText = formatVariantOptions(variant.selectedOptions)\n ?? (fallbackVariantTitle && fallbackVariantTitle.toLowerCase() !== \"default title\" ? fallbackVariantTitle : null);\n const isUnavailable = variant.availableForSale === false;\n const vLimit = getVariantMaxSelectableQuantity(variant.id);\n const normalizedLimit = vLimit == null ? Number.POSITIVE_INFINITY : vLimit;\n const isAtLimit = qty >= normalizedLimit;\n const canIncrease = !submitting && !isUnavailable && !isAtMaxBundleSize && !isAtLimit;\n const stockLabel = !isUnavailable && isAtLimit ? t(\"bundle.stock.max_reached\") : null;\n\n return (\n <li key={group.productId} className={styles.productGroup}>\n <div className={styles.productGroupHeader}>\n <div className={styles.productGroupThumbWrap}>\n {productImage?.url ? (\n <img src={productImage.url} alt={productImage.altText ?? group.productTitle} width={productImage.width ?? 56} height={productImage.height ?? 56} className={styles.productGroupThumb} loading=\"lazy\" />\n ) : (\n <div className={styles.productGroupThumbFallback}>{group.productTitle.slice(0, 1).toUpperCase() || \"•\"}</div>\n )}\n </div>\n <div className={styles.productGroupInfo}>\n <div className={styles.productGroupTitle}>{group.productTitle}</div>\n {optionText ? <div className={styles.variantMeta}>{optionText}</div> : null}\n <div className={styles.variantPrice}>{formatMoney(variant.price)}</div>\n </div>\n <div className={styles.productGroupActions}>\n {isUnavailable ? (\n <div className={styles.soldOut}>{t(\"bundle.stock.sold_out\")}</div>\n ) : qty <= 0 && normalizedLimit <= 0 ? (\n <div className={styles.stockLimitNotice}>{t(\"bundle.stock.max_added\")}</div>\n ) : (\n <div className={styles.qtyActionsWrap}>\n {stockLabel ? <div className={styles.stockLimitNotice}>{stockLabel}</div> : null}\n <div className={styles.qtyActions}>\n {qty > 0 ? (\n <button type=\"button\" className={styles.qtyTrash} aria-label={t(\"bundle.a11y.remove_from_bundle\", { name: variant.displayName })} disabled={submitting} onClick={() => setQuantity(variant.id, 0)}>\n <Trash2 size={14} />\n </button>\n ) : null}\n <div\n className={[styles.qtyChip, canIncrease ? styles.qtyChipInteractive : null].filter(Boolean).join(\" \")}\n role={canIncrease ? \"button\" : undefined}\n tabIndex={canIncrease ? 0 : undefined}\n aria-label={t(\"bundle.a11y.quantity\", { name: variant.displayName, qty })}\n onClick={canIncrease ? () => handleVariantAdd(variant, qty + 1) : undefined}\n onKeyDown={canIncrease ? (e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); handleVariantAdd(variant, qty + 1); } } : undefined}\n >\n {qty <= 0 ? (\n <span className={styles.qtyChipPlus} aria-hidden=\"true\"><Plus size={18} strokeWidth={1.8} /></span>\n ) : (\n <>\n <span className={styles.qtyChipValue}>{qty}</span>\n <button type=\"button\" className={styles.qtyChipClear} aria-label={t(\"bundle.a11y.increase\", { name: variant.displayName })} disabled={!canIncrease} onClick={(e) => { e.stopPropagation(); handleVariantAdd(variant, qty + 1); }} onKeyDown={(e) => e.stopPropagation()}>\n <Plus size={12} strokeWidth={2} />\n </button>\n </>\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </li>\n );\n }\n\n // Multi-variant: \"Select\" button opens an inline picker; selected variants appear as sub-rows\n return (\n <li key={group.productId} ref={isPickerOpen ? pickerRef : null} className={[styles.productGroup, isPickerOpen ? styles.productGroupPickerOpen : null].filter(Boolean).join(\" \")}>\n <div className={styles.productGroupHeader}>\n <div className={styles.productGroupThumbWrap}>\n {productImage?.url ? (\n <img src={productImage.url} alt={productImage.altText ?? group.productTitle} width={productImage.width ?? 56} height={productImage.height ?? 56} className={styles.productGroupThumb} loading=\"lazy\" />\n ) : (\n <div className={styles.productGroupThumbFallback}>{group.productTitle.slice(0, 1).toUpperCase() || \"•\"}</div>\n )}\n </div>\n <div className={styles.productGroupInfo}>\n <div className={styles.productGroupTitle}>{group.productTitle}</div>\n </div>\n <div className={styles.productGroupActions}>\n <button\n type=\"button\"\n className={[styles.selectButton, isPickerOpen ? styles.selectButtonOpen : null].filter(Boolean).join(\" \")}\n aria-expanded={isPickerOpen}\n disabled={submitting}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={() => setOpenProductPicker((prev) => prev === group.productId ? null : group.productId)}\n >\n {t(\"bundle.select.variant\")}\n <ChevronDown size={13} strokeWidth={2.5} className={styles.selectButtonChevron} />\n </button>\n </div>\n </div>\n\n {/* Inline variant picker */}\n {isPickerOpen && (\n <div className={styles.variantPicker}>\n {group.variants.map((v) => {\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const isAlreadySelected = (selections[v.id] ?? 0) > 0;\n const isSoldOut = v.availableForSale === false;\n const isMaxAdded = vLimit != null && vLimit <= 0;\n const isBundleFull = !isAlreadySelected && isAtMaxBundleSize;\n const isDisabled = (\n submitting\n || isSoldOut\n || isMaxAdded\n || isBundleFull\n );\n const statusLabel = isSoldOut\n ? t(\"bundle.stock.sold_out\")\n : isMaxAdded\n ? t(\"bundle.stock.max_added\")\n : isBundleFull\n ? t(\"bundle.stock.max_reached\")\n : null;\n const optionLabel = getVariantOptionLabel(v);\n return (\n <button\n key={v.id}\n type=\"button\"\n disabled={isDisabled}\n className={[styles.variantPickerRow, isAlreadySelected ? styles.variantPickerRowSelected : null].filter(Boolean).join(\" \")}\n onClick={() => {\n if (!isAlreadySelected) {\n if (redirectToProductPage) {\n handleVariantAdd(v, 1);\n setOpenProductPicker(null);\n return;\n }\n handleVariantAdd(v, 1);\n }\n setOpenProductPicker(null);\n }}\n >\n <span className={styles.variantPickerLabel}>{optionLabel}</span>\n <span className={styles.variantPickerPrice}>\n {statusLabel ?? formatMoney(v.price)}\n </span>\n {isAlreadySelected ? <span className={styles.variantPickerCheck} aria-hidden=\"true\">✓</span> : null}\n </button>\n );\n })}\n </div>\n )}\n\n {/* Selected variants sub-rows */}\n {selectedVariants.length > 0 && (\n <ul className={styles.selectedVariantsList}>\n {selectedVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const normalizedLimit = vLimit == null ? Number.POSITIVE_INFINITY : vLimit;\n const isAtLimit = qty >= normalizedLimit;\n const canIncrease = !submitting && v.availableForSale !== false && !isAtMaxBundleSize && !isAtLimit;\n const optionLabel = getVariantOptionLabel(v);\n return (\n <li key={v.id} className={styles.selectedVariantRow} data-variant-row={v.id}>\n <div className={styles.selectedVariantInfo}>\n <span className={styles.selectedVariantName}>{optionLabel}</span>\n <span className={styles.selectedVariantPrice}>{formatMoney(v.price)}</span>\n </div>\n <div className={styles.qtyActions}>\n <button type=\"button\" className={styles.qtyTrash} aria-label={t(\"bundle.a11y.remove_from_bundle\", { name: v.displayName })} disabled={submitting} onClick={() => setQuantity(v.id, 0)}>\n <Trash2 size={14} />\n </button>\n <div\n className={[styles.qtyChip, canIncrease ? styles.qtyChipInteractive : null].filter(Boolean).join(\" \")}\n role={canIncrease ? \"button\" : undefined}\n tabIndex={canIncrease ? 0 : undefined}\n aria-label={t(\"bundle.a11y.quantity\", { name: v.displayName, qty })}\n onClick={canIncrease ? () => handleVariantAdd(v, qty + 1) : undefined}\n onKeyDown={canIncrease ? (e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); handleVariantAdd(v, qty + 1); } } : undefined}\n >\n <span className={styles.qtyChipValue}>{qty}</span>\n <button type=\"button\" className={styles.qtyChipClear} aria-label={t(\"bundle.a11y.increase\", { name: v.displayName })} disabled={!canIncrease} onClick={(e) => { e.stopPropagation(); handleVariantAdd(v, qty + 1); }} onKeyDown={(e) => e.stopPropagation()}>\n <Plus size={12} strokeWidth={2} />\n </button>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </li>\n );\n })}\n </ul>\n ) : (\n <ul className={styles.variantList}>\n {displayVariants.map((variant) => {\n const qty = selections[variant.id] ?? 0;\n const variantPrimaryName = getVariantPrimaryName(variant);\n const variantA11y = getVariantA11yLabel(variant);\n const options = formatVariantOptions(variant.selectedOptions);\n const isUnavailable = variant.availableForSale === false;\n const variantSelectionLimit = getVariantMaxSelectableQuantity(variant.id);\n const normalizedVariantSelectionLimit = variantSelectionLimit == null\n ? Number.POSITIVE_INFINITY\n : variantSelectionLimit;\n const isAtVariantStockLimit = qty >= normalizedVariantSelectionLimit;\n const canIncreaseQuantity = !isUnavailable && !isAtMaxBundleSize && !isAtVariantStockLimit;\n const isClickable = !redirectToProductPage && canIncreaseQuantity;\n const stockStatusLabel = !isUnavailable && isAtVariantStockLimit ? t(\"bundle.stock.max_reached\") : null;\n\n return (\n <li\n key={variant.id}\n className={[\n styles.variantRow,\n isClickable ? styles.variantRowInteractive : null,\n qty > 0 ? styles.variantRowSelected : null,\n isUnavailable ? styles.variantRowSoldOut : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={variant.id}\n role={isClickable ? \"button\" : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onClick={\n isClickable\n ? () => {\n handleVariantAdd(variant, qty + 1);\n }\n : undefined\n }\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleVariantAdd(variant, qty + 1);\n scrollVariantRowIntoView(variant.id);\n }\n }\n : undefined\n }\n aria-label={\n isUnavailable\n ? t(\"bundle.a11y.sold_out\", { name: variantA11y })\n : stockStatusLabel\n ? `${variantA11y} ${stockStatusLabel.toLowerCase()}`\n : t(\"bundle.a11y.add_to_bundle\", { name: variantA11y })\n }\n >\n <div className={styles.variantMedia}>\n {variant.image?.url ? (\n <img\n src={variant.image.url}\n alt={variant.image.altText ?? variantA11y}\n width={variant.image.width ?? 64}\n height={variant.image.height ?? 64}\n className={styles.variantImage}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantImageFallback}>{t(\"bundle.item.generic\")}</div>\n )}\n </div>\n <div className={styles.variantContent}>\n <div className={styles.variantHeader}>\n <div className={styles.variantTitle}>{variantPrimaryName}</div>\n {options ? <div className={styles.variantMeta}>{options}</div> : null}\n </div>\n <div className={styles.variantFooterRow}>\n <div className={styles.variantPrice}>{formatMoney(variant.price)}</div>\n <div className={styles.variantActions}>\n {isUnavailable ? (\n <div className={styles.soldOut} aria-label={t(\"bundle.a11y.sold_out\", { name: variantA11y })}>\n {t(\"bundle.stock.sold_out\")}\n </div>\n ) : qty <= 0 && normalizedVariantSelectionLimit <= 0 ? (\n <div className={styles.stockLimitNotice} aria-label={t(\"bundle.a11y.max_available_selected\", { name: variantA11y })}>\n {t(\"bundle.stock.max_added\")}\n </div>\n ) : (\n <div className={styles.qtyActionsWrap}>\n <div className={styles.qtyActions}>\n {qty > 0 ? (\n <button\n type=\"button\"\n className={styles.qtyTrash}\n aria-label={t(\"bundle.a11y.remove_from_bundle\", { name: variantA11y })}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, 0);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n >\n <Trash2 size={14} />\n </button>\n ) : null}\n <div\n className={[styles.qtyChip, canIncreaseQuantity ? styles.qtyChipInteractive : null].filter(Boolean).join(\" \")}\n aria-label={t(\"bundle.a11y.quantity\", { name: variantA11y, qty })}\n onClick={canIncreaseQuantity\n ? (e) => {\n e.stopPropagation();\n handleVariantAdd(variant, qty + 1);\n }\n : undefined}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n role={canIncreaseQuantity ? \"button\" : undefined}\n tabIndex={canIncreaseQuantity ? 0 : undefined}\n >\n {qty <= 0 ? (\n <span className={styles.qtyChipPlus} aria-hidden=\"true\">\n <Plus size={18} strokeWidth={1.8} />\n </span>\n ) : (\n <>\n <span className={styles.qtyChipValue}>{qty}</span>\n <button\n type=\"button\"\n className={styles.qtyChipClear}\n aria-label={t(\"bundle.a11y.increase\", { name: variantA11y })}\n onClick={(e) => {\n e.stopPropagation();\n handleVariantAdd(variant, qty + 1);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n disabled={!canIncreaseQuantity}\n >\n <Plus size={12} strokeWidth={2} />\n </button>\n </>\n )}\n </div>\n </div>\n {stockStatusLabel ? <div className={styles.stockLimitNotice}>{stockStatusLabel}</div> : null}\n </div>\n )}\n </div>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n ) : null}\n\n <footer className={styles.footer}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const thresholdRewardLabel = threshold\n ? formatRuleRewardLabel(threshold, t)\n : null;\n const thresholdLabel = threshold?.label?.trim() || (threshold ? `Buy ${threshold.minBundleSize}+` : \"\");\n const titleText = isFilled ? variant!.displayName : t(\"bundle.slot\", { slot: idx + 1 });\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && thresholdRewardLabel ? `${titleText}. ${t(\"bundle.unlocks\", { discount: thresholdRewardLabel })}.` : titleText}\n title={showThreshold && thresholdRewardLabel ? `${titleText} • ${t(\"bundle.unlocks\", { discount: thresholdRewardLabel })}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n width={1}\n height={1}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && threshold ? (\n <RuleRewardDisplay\n rule={threshold}\n t={t}\n imageClassName={styles.boxGiftImage}\n fallbackClassName={styles.boxGiftFallback}\n textClassName={styles.boxItemDiscountText}\n imageStackClassName={styles.boxGiftStack}\n centered\n />\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{thresholdLabel}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n\n <div className={[styles.totalsReveal, hasUnlockedFirstDiscount ? styles.totalsRevealOpen : null].filter(Boolean).join(\" \")}>\n <div\n className={[styles.ctaTotalsWrap, hasUnlockedFirstDiscount ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={!hasUnlockedFirstDiscount}\n >\n <div className={styles.ctaTotals} aria-label={t(\"bundle.totals\")}>\n {appliedRule && normalizeRuleRewardType(appliedRule) === \"free_gift\" ? (\n <span className={styles.ctaDiscountBadge}>{t(\"bundle.discount.free_gift\")}</span>\n ) : appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>{t(\"bundle.discount.badge\", { discount: appliedDiscountPercent })}</span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n </div>\n\n {(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })}\n </button>\n );\n }\n\n return (\n <div className={styles.ctaButtonGroup}>\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.ctaDualLeft}>\n <span>{submitting ? t(\"bundle.cta.adding\") : t(\"bundle.cta.add_to_basket\")}</span>\n </button>\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.ctaDualRight}>\n <span>{submitting ? t(\"bundle.cta.processing\") : t(\"bundle.cta.checkout\")}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.processing\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.checkout\")}\n </button>\n );\n }\n\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.add_to_basket\")}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n {t(\"bundle.powered_by\")}{\" \"}\n <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\">\n BestBundles\n </a>\n </div>\n </footer>\n </section>\n );\n}\n","import React, { useEffect, useMemo, useState } from \"react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport { formatBundleCurrency } from \"../i18n\";\nimport styles from \"./VolumeDiscountPanel.module.css\";\n\nfunction normalizeVariantId(raw: string | null | undefined) {\n const value = String(raw ?? \"\").trim();\n if (!value) return \"\";\n if (value.startsWith(\"gid://shopify/ProductVariant/\")) return value;\n const digits = value.replace(/\\D/g, \"\");\n return digits ? `gid://shopify/ProductVariant/${digits}` : \"\";\n}\n\nfunction getCurrentVariantId() {\n if (typeof window === \"undefined\") return \"\";\n const variantParam = new URLSearchParams(window.location.search).get(\"variant\");\n if (variantParam) return normalizeVariantId(variantParam);\n\n const productForm = document.querySelector('form[action*=\"/cart/add\"]');\n const input = productForm?.querySelector<HTMLInputElement | HTMLSelectElement>('input[name=\"id\"], select[name=\"id\"]');\n return normalizeVariantId(input?.value ?? \"\");\n}\n\nfunction getQuantityInput() {\n if (typeof document === \"undefined\") return null;\n const productForm = document.querySelector('form[action*=\"/cart/add\"]');\n return productForm?.querySelector<HTMLInputElement>('input[name=\"quantity\"]') ?? null;\n}\n\nfunction getCurrentQuantity() {\n const quantityInput = getQuantityInput();\n if (!quantityInput) return null;\n const quantity = Number(quantityInput.value ?? NaN);\n if (!Number.isFinite(quantity) || quantity <= 0) return null;\n return Math.floor(quantity);\n}\n\nfunction updateProductFormQuantity(nextQuantity: number) {\n const quantityInput = getQuantityInput();\n if (!quantityInput) return false;\n quantityInput.value = String(nextQuantity);\n quantityInput.dispatchEvent(new Event(\"input\", { bubbles: true }));\n quantityInput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return true;\n}\n\nexport type VolumeDiscountPanelProps = {\n className?: string;\n preferFirstEligibleVariant?: boolean;\n};\n\nexport function VolumeDiscountPanel({ className, preferFirstEligibleVariant = false }: VolumeDiscountPanelProps) {\n const { loading, error, config, eligibleVariants, currencyCode, locale } = useBundleBuilder();\n const [currentVariantId, setCurrentVariantId] = useState(\"\");\n const [currentQuantity, setCurrentQuantity] = useState<number | null>(null);\n const [selectedRuleHandle, setSelectedRuleHandle] = useState<string | null>(null);\n const shouldPreferFirstEligibleVariant =\n preferFirstEligibleVariant ||\n (typeof window !== \"undefined\" &&\n Boolean(\n (window as Window & { __BUNDLE_PREVIEW_CONFIG__?: unknown }).__BUNDLE_PREVIEW_CONFIG__,\n ));\n\n useEffect(() => {\n const syncVariantId = () => setCurrentVariantId(getCurrentVariantId());\n syncVariantId();\n document.addEventListener(\"variant:change\", syncVariantId);\n const timer = window.setInterval(syncVariantId, 500);\n return () => {\n document.removeEventListener(\"variant:change\", syncVariantId);\n window.clearInterval(timer);\n };\n }, []);\n\n useEffect(() => {\n const syncQuantity = () => setCurrentQuantity(getCurrentQuantity());\n const handleQuantityEvent = (event: Event) => {\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) return;\n if (target.name !== \"quantity\") return;\n syncQuantity();\n };\n\n syncQuantity();\n document.addEventListener(\"input\", handleQuantityEvent, true);\n document.addEventListener(\"change\", handleQuantityEvent, true);\n const timer = window.setInterval(syncQuantity, 500);\n\n return () => {\n document.removeEventListener(\"input\", handleQuantityEvent, true);\n document.removeEventListener(\"change\", handleQuantityEvent, true);\n window.clearInterval(timer);\n };\n }, []);\n\n const rules = useMemo(\n () => [...(config?.rules ?? [])]\n .filter((rule) => (rule.rewardType ?? \"discount\") !== \"free_gift\")\n .sort((a, b) => a.minBundleSize - b.minBundleSize),\n [config?.rules],\n );\n\n const activeVariantId = shouldPreferFirstEligibleVariant\n ? eligibleVariants[0]?.id || \"\"\n : currentVariantId || eligibleVariants[0]?.id || \"\";\n const activeVariant = eligibleVariants.find((variant) => variant.id === activeVariantId) ?? null;\n\n useEffect(() => {\n if (!rules.length) {\n setSelectedRuleHandle(null);\n return;\n }\n if (currentQuantity != null) {\n let matchedRuleHandle: string | null = null;\n for (const rule of rules) {\n if (rule.minBundleSize <= currentQuantity) {\n matchedRuleHandle = rule.handle;\n }\n }\n setSelectedRuleHandle(matchedRuleHandle ?? rules[0]?.handle ?? null);\n return;\n }\n setSelectedRuleHandle((current) => current ?? rules[0]?.handle ?? null);\n }, [currentQuantity, rules]);\n\n if (config?.bundleType !== \"volume_discount\") {\n return null;\n }\n\n return (\n <section className={[styles.panel, className].filter(Boolean).join(\" \")} aria-busy={loading}>\n <h2 className={styles.title}>{config?.title?.trim() || \"Volume discount\"}</h2>\n {loading ? <div className={styles.status}>Loading volume discounts…</div> : null}\n {error ? <div className={styles.error}>{error}</div> : null}\n {!loading && !error && !activeVariant ? (\n <div className={styles.status}>Select an eligible variant to view volume discounts.</div>\n ) : null}\n {!loading && !error && activeVariant ? (\n <>\n <div className={styles.rules}>\n {rules.map((rule) => {\n const percentValue = Number.parseFloat(rule.discountPercent);\n const subtitle = Number.isFinite(percentValue) && percentValue > 0\n ? `Save ${Math.round(percentValue)}%`\n : \"Standard\";\n const checked = selectedRuleHandle === rule.handle;\n\n return (\n <div\n key={rule.handle}\n className={[styles.rule, checked ? styles.ruleSelected : \"\"].filter(Boolean).join(\" \")}\n >\n <label className={styles.ruleLabel}>\n <div className={styles.ruleLabelContent}>\n <input\n className={styles.ruleInput}\n type=\"radio\"\n checked={checked}\n name=\"bb-volume-discount-rule\"\n onChange={() => {\n setSelectedRuleHandle(rule.handle);\n updateProductFormQuantity(rule.minBundleSize);\n }}\n />\n <span className={styles.ruleTitle}>{`Buy ${rule.minBundleSize}`}</span>\n <span className={styles.ruleSubtitle}>{subtitle}</span>\n </div>\n <div>\n {(() => {\n const unitPrice = Number(activeVariant.price ?? NaN);\n if (!Number.isFinite(unitPrice)) return null;\n const totalPrice = unitPrice * rule.minBundleSize;\n const hasDiscount = Number.isFinite(percentValue) && percentValue > 0;\n const discountedPrice = hasDiscount\n ? totalPrice * (1 - (percentValue / 100))\n : totalPrice;\n\n if (!hasDiscount) {\n return (\n <span className={styles.priceRow}>\n <span className={styles.newPrice}>\n {formatBundleCurrency(totalPrice, currencyCode, locale)}\n </span>\n </span>\n );\n }\n\n return (\n <span className={styles.priceRow}>\n <span className={styles.oldPrice}>\n {formatBundleCurrency(totalPrice, currencyCode, locale)}\n </span>\n <span className={styles.newPrice}>\n {formatBundleCurrency(discountedPrice, currencyCode, locale)}\n </span>\n </span>\n );\n })()}\n </div>\n </label>\n </div>\n );\n })}\n </div>\n </>\n ) : null}\n </section>\n );\n}\n","import type { BundleCartAdapter, BundleCartLineAttribute } from \"../types\";\n\nfunction toProperties(attributes?: BundleCartLineAttribute[]) {\n if (!attributes?.length) return undefined;\n return attributes.reduce<Record<string, string>>((acc, attr) => {\n if (attr?.key) acc[attr.key] = attr.value ?? \"\";\n return acc;\n }, {});\n}\n\nfunction normalizeVariantId(merchandiseId: string) {\n const match = /\\/(\\d+)$/.exec(merchandiseId);\n return match ? match[1] : merchandiseId;\n}\n\nfunction toVariantGid(variantId: string | number | null | undefined) {\n if (variantId == null) return null;\n const raw = String(variantId).trim();\n if (!raw) return null;\n if (raw.startsWith(\"gid://shopify/ProductVariant/\")) return raw;\n return `gid://shopify/ProductVariant/${raw}`;\n}\n\nfunction getShopifyTheme() {\n if (typeof window === \"undefined\") return null;\n return (window as Window & {\n Shopify?: { theme?: { schema_name?: string | null; name?: string | null } };\n }).Shopify?.theme ?? null;\n}\n\nfunction isSleekTheme() {\n const theme = getShopifyTheme();\n if (!theme) return false;\n\n if (theme.schema_name === \"Sleek\") return true;\n return /sleek/i.test(theme.name ?? \"\");\n}\n\nfunction hasSleekCartDrawer() {\n if (typeof document === \"undefined\") return false;\n return !!document.querySelector(\"cart-drawer\");\n}\n\nfunction tryOpenSleekCartDrawer() {\n if (!isSleekTheme() || !hasSleekCartDrawer()) return false;\n\n document.dispatchEvent(new CustomEvent(\"cart:refresh\", {\n bubbles: true,\n detail: { open: true },\n }));\n\n return true;\n}\n\n/**\n * Refreshes the page so the theme re-renders with the updated cart.\n * Liquid themes fetch cart state on load, so a full reload guarantees the cart UI\n * (drawer, icon bubble, etc.) shows the correct state after adding bundle items.\n */\nfunction reloadPageForCartUpdate() {\n window.location.reload();\n}\n\nasync function postCartJson(endpoint: string, payload: Record<string, unknown>) {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(text || `Cart request failed: ${res.status}`);\n }\n return res.json().catch(() => null);\n}\n\nasync function getCartJson() {\n const res = await fetch(\"/cart.js\", {\n method: \"GET\",\n cache: \"no-store\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n });\n if (!res.ok) {\n throw new Error(`Cart request failed: ${res.status}`);\n }\n return res.json() as Promise<{ items?: Array<{ id?: number | string | null; quantity?: number | null }> }>;\n}\n\nexport function createLiquidCartAdapter(): BundleCartAdapter {\n return {\n async linesAdd(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesAddForCheckout(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesUpdate(lines) {\n for (const line of lines) {\n await postCartJson(\"/cart/change.js\", {\n id: line.id,\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n });\n }\n },\n async linesRemove(lineIds) {\n for (const id of lineIds) {\n await postCartJson(\"/cart/change.js\", { id, quantity: 0 });\n }\n },\n async getLineQuantitiesByMerchandiseId() {\n const cart = await getCartJson();\n const quantities: Record<string, number> = {};\n for (const item of cart.items ?? []) {\n const merchandiseId = toVariantGid(item.id);\n if (!merchandiseId) continue;\n const quantity = Number(item.quantity ?? 0);\n if (!Number.isFinite(quantity) || quantity <= 0) continue;\n quantities[merchandiseId] = (quantities[merchandiseId] ?? 0) + Math.floor(quantity);\n }\n return quantities;\n },\n openCartUI() {\n if (tryOpenSleekCartDrawer()) return;\n\n // Reload the page so the theme fetches and displays the updated cart.\n window.setTimeout(() => reloadPageForCartUpdate(), 0);\n },\n navigateToCheckout() {\n // Navigate to Shopify checkout page\n window.location.href = \"/checkout\";\n },\n };\n}\n"],"names":["BundleLineAttributeKeys","BundleSessionStorageKeys","fetchActiveBundleConfigs","params","url","json","fetchBundleConfig","fetchBundleConfigStatus","getVariantSelectionLimit","variant","quantity","canAddGiftVariant","inCartQty","limit","normalizedInCart","formatPercent0dp","value","n","normalizeRuleRewardType","rule","_a","_b","isFreeGiftRule","getRuleFreeGiftVariants","getRuleGiftVariantById","variantId","getGiftProductTitles","_c","_d","title","formatRuleRewardLabel","t","titles","formatRuleCelebrationText","isBundlePreviewMode","win","getBundlePreviewSnapshot","config","ANONYMOUS_USER_ID_KEY","getOrCreateAnonymousUserId","existing","newId","cryptoAny","trackEvent","analyticsEndpoint","shop","event","response","error","EN","FR","DE","ES","DICTS","normalizeBundleLocale","raw","base","translateBundleUi","locale","key","vars","overrides","template","text","name","formatBundleCurrency","amount","currencyCode","getProductWord","count","plural","BundleBuilderContext","createContext","BUNDLE_DRAWER_HASH","EMPTY_ELIGIBLE_VARIANTS","normalizeBundleHandle","getBundleHashHandle","hash","prefix","STYLE_SETTINGS_TO_CSS_VAR","GOOGLE_FONTS_LINK_ID","fontNameToParam","s","injectGoogleFontsLink","styles","body","families","href","link","injectStyleVariables","root","cssVar","getEffectiveStyleSettings","configSettings","preview","safeRandomUUID","clampQty","clampToVariantLimit","normalized","normalizeLineAttributes","attributes","attribute","attributesSignature","a","b","createSelectedLine","merchandiseId","snapshotFromLines","lines","line","restoreLinesFromSnapshot","snapshot","shouldUseActiveConfigPreload","allowDrawerWhenInactive","initialData","BundleProvider","props","apiBaseUrl","cartAdapter","configHandle","configFetcher","activeConfigsFetcher","configStatusFetcher","providedAnalyticsEndpoint","inputLocale","messages","children","useCallback","normalizedInitialHandle","useActivePreload","isOpen","setIsOpen","useState","submitting","setSubmitting","setError","cartSyncing","setCartSyncing","cartQuantitiesByMerchandiseId","setCartQuantitiesByMerchandiseId","currentHandle","setCurrentHandleState","configCache","setConfigCache","bootstrapLoading","setBootstrapLoading","blockingHandleLoad","setBlockingHandleLoad","statusCheckPending","setStatusCheckPending","pendingOpenHandle","setPendingOpenHandle","selectedLines","setSelectedLines","preloadAbortRef","useRef","handleFetchAbortRef","statusAbortRef","cartSyncSeqRef","currentHandleRef","configCacheRef","bootstrapLoadingRef","openForHandleRef","lastSeenHashRef","skipSelectionResetOnHandleChangeRef","preserveSelectionsUntilHandleLoadedRef","fetcher","defaultFetchBundleConfig","activePreloadFetcher","statusFetcher","loadCartQuantities","quantities","acc","id","q","refreshCartQuantities","syncSeq","useEffect","setConfigHandle","handle","close","anonymousUserId","trackError","openDrawerOnly","current","applyLatestConfigResponse","previewSnapshot","prev","next","refreshHandleConfig","options","normalizedHandle","ac","fetchError","message","loadHandle","cachedEntry","openForHandle","source","status","open","toggle","entry","openIfHash","force","nextHash","handleInHash","openIfHashForced","openIfHashOnFocus","currentEntry","eligibleVariants","loading","effective","handlePreviewStyles","applyPreviewConfig","previewConfig","previewVariants","previewVariantsLoading","maxBundleSize","useMemo","variantSelectionLimitById","baseLimit","inCart","eligibleVariantIdsSet","minRequired","rules","ruleMin","normalizedRuleMin","configuredRaw","configuredMin","getSelectionsFromLines","setQuantity","variantLimit","prevSelections","prevQty","requestedDelta","currentBundleSize","variantRemaining","delta","nextLines","remainingToRemove","keptReversed","i","nextSelections","prevBundleSize","nextBundleSize","basePayload","addConfiguredVariant","input","targetHandle","isTargetingDifferentHandle","targetEntry","targetEligibleVariantIdsSet","baseLines","currentQty","targetMaxBundleSize","targetVariant","isWaitingForPreservedHandle","clearSelections","syncCartQuantities","getVariantMaxSelectableQuantity","selections","selectionOrder","bundleSize","canSubmit","getSelectionSnapshot","restoreSelectionSnapshot","redirectVariantToProductPage","productHandle","variantParam","search","performCartAddition","bundleId","bundleTitle","latestCartQuantities","effectiveLimitById","linesBySignature","selectedLine","remaining","existingQtyForVariant","sum","signature","byId","grossPrice","price","rulesSorted","appliedRule","cartQtyByMerchandiseId","giftVariantId","giftVariant","appliedDiscountPercent","pct","discountedPrice","discountedAmount","productVariantIds","discountThresholdIdentifier","discountLabel","isCheckout","addError","rawMessage","isStockError","submit","submitAndCheckout","jsx","useBundleBuilder","ctx","useContext","useBundleBuilderDrawer","BundleButton","tweenFunctions","d","c","p","tweenFunctions_1","degreesToRads","degrees","randomRange","min","max","randomInt","ParticleShape","RotationDirection","DEFAULT_FRAME_TIME","Particle","context","getOptions","x","y","colors","initialVelocityX","initialVelocityY","elapsed","gravity","wind","friction","opacity","drawShape","frameTimeMultiplier","rotateDelta","ParticleGenerator","canvas","newParticleX","newParticleY","particlesGenerated","lastNumberOfPieces","run","recycle","numberOfPieces","debug","tweenFunction","tweenDuration","nP","activeCount","tweenedVal","numToAdd","confettiDefaults","tweens.easeInOutQuad","Confetti","opts","computedConfettiDefaults","timestamp","onConfettiComplete","frameRate","lastRunState","lastRecycleState","ref","React","ReactConfettiInternal","extractCanvasProps","confettiOptions","passedProps","canvasStyles","refs","rest","confettiOptionKeys","refProps","prop","val","ReactConfetti","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","iconNode","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","ChevronDown","Plus","Search","Trash2","FreeGiftRewardLabel","FreeGiftVisual","imageClassName","fallbackClassName","imageStackClassName","centered","layout","gifts","giftsWithImage","gift","wrapClassName","visual","fallbackTitle","_e","_g","_f","jsxs","RuleRewardDisplay","textClassName","RuleRewardLineLabel","BundleBuilderDrawer","isSearchOpen","setIsSearchOpen","searchQuery","setSearchQuery","searchInputRef","footerRef","celebrationChipRef","windowSize","setWindowSize","confettiKey","setConfettiKey","confettiSource","setConfettiSource","isConfettiActive","setIsConfettiActive","confettiTimerRef","prevBundleSizeForConfettiRef","confettiSettleMs","celebrationKey","setCelebrationKey","celebrationText","setCelebrationText","isCelebrationActive","setIsCelebrationActive","celebrationTimerRef","celebrationDurationMs","DEFAULT_CONFETTI_COLORS","confettiColors","formatVariantOptions","selectedOptions","o","isDefaultTitle","getVariantPrimaryName","v","displayName","productTitle","variantTitle","getVariantA11yLabel","getVariantOptionLabel","redirectToProductPage","visualOpen","isMounted","setIsMounted","closeTimerRef","formatMoney","isAtMaxBundleSize","handleVariantAdd","nextQuantity","sorted","filteredVariants","tokens","matches","parts","haystack","groupedProducts","matchesSearch","tok","map","productId","group","g","openProductPicker","setOpenProductPicker","pickerRef","handleClick","e","itemsRemaining","best","r","firstRule","hasUnlockedFirstDiscount","subtotal","total","qty","discountedTotal","maxRuleSize","filledVariants","thresholdByIndex","idx","slotCount","isDualButtonAnimationLoaded","setIsDualButtonAnimationLoaded","prevItemsRemainingRef","wasPositive","panelRef","bodyRef","boxSummaryWindowRef","prevBundleSizeRef","scrollVariantRowIntoView","container","row","padding","maxTop","rowCenterOffset","targetTop","nextTop","onKeyDown","onResize","raf","hitThreshold","nextThreshold","targetIdx","el","containerRect","deltaRight","maxLeft","nextLeft","hitRule","k","chipEl","rect","panelRect","originX","originY","productImage","hasMultipleVariants","isPickerOpen","selectedVariants","variantA11y","vLimit","normalizedLimit","isAtLimit","isUnavailable","canIncrease","stockLabel","fallbackVariantTitle","optionText","isAlreadySelected","isSoldOut","isMaxAdded","isBundleFull","isDisabled","statusLabel","optionLabel","variantPrimaryName","variantOptionText","variantSelectionLimit","normalizedVariantSelectionLimit","isAtVariantStockLimit","canIncreaseQuantity","stockStatusLabel","_","threshold","isFilled","isThreshold","showThreshold","thresholdRewardLabel","thresholdLabel","titleText","Fragment","buttonMode","BundleBuilderPanel","showRules","showVariants","primaryName","displayVariants","variantsRef","lineIndex","ruleForLine","isClickable","normalizeVariantId","digits","getCurrentVariantId","productForm","getQuantityInput","getCurrentQuantity","quantityInput","updateProductFormQuantity","VolumeDiscountPanel","preferFirstEligibleVariant","currentVariantId","setCurrentVariantId","currentQuantity","setCurrentQuantity","selectedRuleHandle","setSelectedRuleHandle","shouldPreferFirstEligibleVariant","syncVariantId","timer","syncQuantity","handleQuantityEvent","target","activeVariantId","activeVariant","matchedRuleHandle","percentValue","subtitle","checked","unitPrice","totalPrice","hasDiscount","toProperties","attr","toVariantGid","getShopifyTheme","isSleekTheme","theme","hasSleekCartDrawer","tryOpenSleekCartDrawer","reloadPageForCartUpdate","postCartJson","endpoint","payload","res","getCartJson","createLiquidCartAdapter","items","lineIds","cart","item"],"mappings":"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","x_google_ignoreList":[13,14,15,16,17,18,19,20,21,22]}
|