{
  "version": 3,
  "sources": ["/cdn/shop/t/59/assets/ire5-theme-ops.js?ire5_v=mergegate-20260611a"],
  "sourcesContent": ["(() => {\n  const IRE5_THEME_INIT_KEY = \"__ire5ThemeWorkflowInitialized\";\n  if (window[IRE5_THEME_INIT_KEY]) return;\n  window[IRE5_THEME_INIT_KEY] = true;\n\n  const menuToggle = document.querySelector(\".menu-toggle\");\n  const mobileNav = document.querySelector(\".mobile-nav\");\n  const menuClose = document.querySelector(\".menu-close\");\n  const managedHeader = document.querySelector(\"[data-ire5-theme-header]\");\n\n  function closeMenu() {\n    if (!mobileNav || !menuToggle) return;\n    mobileNav.classList.remove(\"is-open\");\n    menuToggle.setAttribute(\"aria-expanded\", \"false\");\n  }\n\n  if (!managedHeader && menuToggle && mobileNav) {\n    menuToggle.addEventListener(\"click\", () => {\n      const isOpen = mobileNav.classList.toggle(\"is-open\");\n      menuToggle.setAttribute(\"aria-expanded\", String(isOpen));\n    });\n  }\n\n  if (!managedHeader) {\n    if (menuClose) menuClose.addEventListener(\"click\", closeMenu);\n    document.querySelectorAll(\".mobile-nav a\").forEach((link) => link.addEventListener(\"click\", closeMenu));\n  }\n\n  document.querySelectorAll(\".thumb-button\").forEach((button) => {\n    button.addEventListener(\"click\", () => {\n      const gallery = button.closest(\".shop-gallery\");\n      const mainImage = gallery?.querySelector(\".shop-main-photo img\");\n      const src = button.dataset.thumbSrc;\n      if (mainImage && src) mainImage.src = src;\n      gallery?.querySelectorAll(\".thumb-button\").forEach((item) => item.classList.remove(\"is-active\"));\n      button.classList.add(\"is-active\");\n    });\n  });\n\n  document.querySelectorAll(\"[data-product-card]\").forEach((card) => {\n    card.addEventListener(\"click\", (event) => {\n      if (event.target.closest(\"a\")) return;\n      const link = card.querySelector(\"a[href]\");\n      if (link) link.click();\n    });\n  });\n\n  const featuredProductButtons = document.querySelectorAll(\"[data-featured-product]\");\n  const featuredLink = document.querySelector(\"[data-featured-link]\");\n  const featuredImage = document.querySelector(\"[data-featured-image]\");\n  const featuredEyebrow = document.querySelector(\"[data-featured-eyebrow]\");\n  const featuredTitle = document.querySelector(\"[data-featured-title]\");\n  const featuredCopy = document.querySelector(\"[data-featured-copy]\");\n  const featuredBuy = document.querySelector(\"[data-featured-buy]\");\n  const featuredLearn = document.querySelector(\"[data-featured-learn]\");\n  const featuredMissing = document.querySelector(\"[data-featured-missing]\");\n\n  function updateFeaturedProduct(button) {\n    if (!button) return;\n    const buy = button.dataset.featuredBuyValue;\n    const learn = button.dataset.featuredLearnValue;\n    if (featuredLink && buy) {\n      featuredLink.href = buy;\n      featuredLink.setAttribute(\"aria-label\", `Buy ${button.dataset.featuredTitleValue || \"iRe5 product\"}`);\n    }\n    if (featuredImage) {\n      if (button.dataset.featuredImageValue) {\n        featuredImage.hidden = false;\n        featuredImage.src = button.dataset.featuredImageValue;\n        featuredImage.alt = button.dataset.featuredAltValue || \"\";\n        if (featuredMissing) featuredMissing.hidden = true;\n      } else {\n        featuredImage.hidden = true;\n        featuredImage.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACw=\";\n        featuredImage.alt = \"SKU image pending\";\n        if (featuredMissing) featuredMissing.hidden = false;\n      }\n    }\n    if (featuredEyebrow) featuredEyebrow.textContent = button.dataset.featuredEyebrowValue || \"\";\n    if (featuredTitle) featuredTitle.textContent = button.dataset.featuredTitleValue || \"\";\n    if (featuredCopy) featuredCopy.textContent = button.dataset.featuredCopyValue || \"\";\n    if (featuredBuy && buy) featuredBuy.href = buy;\n    if (featuredLearn && learn) featuredLearn.href = learn;\n    featuredProductButtons.forEach((item) => item.classList.toggle(\"is-active\", item === button));\n  }\n\n  featuredProductButtons.forEach((button) => {\n    button.addEventListener(\"click\", () => updateFeaturedProduct(button));\n  });\n\n  document.querySelectorAll(\"[data-scroll-target]\").forEach((button) => {\n    button.addEventListener(\"click\", () => {\n      document.querySelector(button.dataset.scrollTarget)?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n    });\n  });\n\n  /*\n   * Thread6 new test stage:\n   * Legacy fit-mega-menu tab switching is disabled with the old test-only model nav.\n  document.querySelectorAll(\"[data-fit-open-group]\").forEach((button) => {\n    button.addEventListener(\"click\", () => {\n      const target = document.getElementById(button.dataset.fitOpenGroup || \"\");\n      const shell = button.closest(\"[data-model-subnav]\");\n      if (shell) {\n        shell.querySelectorAll(\".fit-brand-group[id]\").forEach((group) => {\n          const isActive = group === target;\n          group.hidden = !isActive;\n          group.open = isActive;\n        });\n      } else if (target && target.matches(\"details\")) {\n        target.open = true;\n        target.scrollIntoView({ behavior: window.Shopify?.designMode ? \"auto\" : \"smooth\", block: \"nearest\", inline: \"start\" });\n      }\n      button.closest(\".fit-mega-rail\")?.querySelectorAll(\".fit-rail-item\").forEach((item) => item.classList.toggle(\"is-active\", item === button));\n    });\n  });\n  */\n\n  document.querySelectorAll(\"[data-collection-filter]\").forEach((filter) => {\n    const root = filter.closest(\"[data-ire5-collection]\");\n    const cards = root ? root.querySelectorAll(\"[data-collection-card]\") : [];\n    filter.addEventListener(\"change\", () => {\n      cards.forEach((card) => {\n        const hidden = filter.checked && card.dataset.preorderCard !== \"true\";\n        card.toggleAttribute(\"hidden\", hidden);\n      });\n    });\n  });\n\n  const productRoot = document.querySelector(\"[data-ire5-product-workflow]\");\n  if (!productRoot) return;\n  const isShopifyDesignMode = Boolean(window.Shopify?.designMode);\n\n  function normalizeProductLayout(root) {\n    const layout = root.querySelector(\".shop-layout\");\n    const secondary = layout?.querySelector(\":scope > .product-secondary-info\");\n    if (!layout || !secondary) return;\n    secondary.classList.add(\"container\");\n    layout.insertAdjacentElement(\"afterend\", secondary);\n  }\n\n  normalizeProductLayout(productRoot);\n\n  const showRequestMoreOnProductPage = productRoot.dataset.showRequestMoreOnProductPage === \"true\";\n\n  const parsePrice = (value) => {\n    if (value == null || String(value).trim() === \"\") return null;\n    const number = Number(value);\n    return Number.isFinite(number) ? number : null;\n  };\n\n  const money = (value) => {\n    if (value == null || !Number.isFinite(Number(value))) return \"Bind SKU\";\n    const number = Number(value) || 0;\n    return `$${number.toFixed(2)}`;\n  };\n\n  const shopifyRoute = (path) => {\n    const root = window.Shopify?.routes?.root || \"/\";\n    return `${root}${String(path || \"\").replace(/^\\/+/, \"\")}`;\n  };\n\n  const combos = {\n    case: {\n      title: \"iRe5 Invisible Storage Gen2\",\n      price: parsePrice(productRoot.dataset.casePrice),\n      msrp: parsePrice(productRoot.dataset.caseMsrp),\n      meta: \"Choose phone fit\",\n      action: \"Add Gen2 to Cart\",\n      noModel: false,\n      bundle: false,\n      accessoriesOnly: false,\n    },\n    gen1: {\n      title: \"iRe5 Gen1 Storage Case\",\n      price: parsePrice(productRoot.dataset.gen1Price),\n      msrp: parsePrice(productRoot.dataset.gen1Msrp),\n      meta: \"Choose available fit\",\n      action: \"Add Gen1 to Cart\",\n      noModel: false,\n      bundle: false,\n      accessoriesOnly: false,\n    },\n    module: {\n      title: \"iRe5 X Module\",\n      price: parsePrice(productRoot.dataset.modulePrice),\n      msrp: parsePrice(productRoot.dataset.moduleMsrp),\n      meta: \"USB-C / Lightning\",\n      action: \"Add X Module to Cart\",\n      noModel: true,\n      bundle: false,\n      accessoriesOnly: false,\n    },\n    creator: {\n      title: \"iRe5 Creator Workflow Combo\",\n      price: parsePrice(productRoot.dataset.creatorPrice),\n      msrp: parsePrice(productRoot.dataset.creatorMsrp),\n      meta: \"Bundle path\",\n      action: \"Add Creator Combo to Cart\",\n      noModel: false,\n      bundle: true,\n      accessoriesOnly: false,\n    },\n    accessories: {\n      title: productRoot.dataset.productTitle || \"iRe5 Accessories\",\n      price: 0,\n      msrp: 0,\n      meta: \"Accessory order\",\n      action: \"Add Accessories to Cart\",\n      noModel: true,\n      bundle: false,\n      accessoriesOnly: true,\n    },\n  };\n\n  const query = new URLSearchParams(window.location.search);\n  const normalizeIntentKey = (value) => String(value || \"\")\n    .toLowerCase()\n    .replace(/\\+/g, \" plus \")\n    .replace(/&/g, \" and \")\n    .replace(/[^a-z0-9]+/g, \"\");\n  const modelDiscriminators = [\"pro\", \"promax\", \"max\", \"plus\", \"ultra\", \"mini\", \"fold\", \"flip\", \"fe\", \"se\", \"air\", \"lite\", \"e\"];\n  function brandIntentKey(value) {\n    const key = normalizeIntentKey(value);\n    const aliases = {\n      galaxy: \"samsung\",\n      honor: \"honor\",\n      huawei: \"huawei\",\n      iphone: \"apple\",\n      iqoo: \"vivo\",\n      mi: \"xiaomi\",\n      moto: \"motorola\",\n      pixel: \"google\",\n      poco: \"xiaomi\",\n      redmi: \"xiaomi\",\n    };\n    return aliases[key] || key;\n  }\n  const initialModelKey = normalizeIntentKey(query.get(\"model\"));\n  const initialAddonKeys = new Set(\n    (query.get(\"addons\") || \"\")\n      .split(/[,\\s]+/)\n      .map(normalizeIntentKey)\n      .filter(Boolean)\n  );\n  const initialVariantId = String(query.get(\"variant\") || \"\");\n  const comboFromCurrentProduct = () => {\n    const activePathKey = productRoot.dataset.activePathKey || \"\";\n    if (combos[activePathKey]) return activePathKey;\n    const currentHandle = productRoot.dataset.currentProductHandle || \"\";\n    const orderedHandles = [\n      [\"module\", productRoot.dataset.moduleProductHandle],\n      [\"gen1\", productRoot.dataset.gen1ProductHandle],\n      [\"accessories\", productRoot.dataset.accessoriesProductHandle],\n      [\"creator\", productRoot.dataset.creatorProductHandle],\n      [\"case\", productRoot.dataset.caseProductHandle],\n    ];\n    const match = orderedHandles.find(([, handle]) => handle && handle === currentHandle);\n    return match?.[0] || \"\";\n  };\n\n  const configuredPhoneType = String(productRoot.querySelector(\"[data-phone-type-options]\")?.dataset.selectedPhoneType || \"iphone\").toLowerCase();\n  const initialPhoneType = String(query.get(\"phoneType\") || configuredPhoneType || \"iphone\").toLowerCase();\n  const configuredQuantityButton = productRoot.querySelector(\"[data-quantity-choice].is-selected\");\n  const configuredQuantity = Math.max(1, Number(configuredQuantityButton?.dataset.quantityChoice || 1) || 1);\n  const requestedInitialQuantity = Math.max(1, Number(query.get(\"quantity\") || configuredQuantity) || configuredQuantity);\n  const requestedInitialQuantityButton = Array.from(productRoot.querySelectorAll(\"[data-quantity-choice]\")).find((button) => (\n    Number(button.dataset.quantityChoice || 0) === requestedInitialQuantity\n  ));\n  const configuredQuantityOptionValue = requestedInitialQuantityButton?.dataset.quantityOptionValue\n    || configuredQuantityButton?.dataset.quantityOptionValue\n    || \"\";\n  const currentProductCombo = comboFromCurrentProduct();\n  const state = {\n    combo: currentProductCombo || query.get(\"combo\") || \"case\",\n    model: query.get(\"model\") || \"\",\n    phoneType: initialPhoneType || configuredPhoneType || \"iphone\",\n    care: query.get(\"care\") || \"none\",\n    quantity: requestedInitialQuantity,\n    quantityOptionValue: configuredQuantityOptionValue,\n    quantityChoiceTouched: false,\n    variantMediaTouched: false,\n    addons: new Set(),\n    addonQuantities: {},\n  };\n\n  const availableCombos = Array.from(productRoot.querySelectorAll(\"input[name='combo']\"))\n    .filter((input) => !input.disabled && !input.closest(\"[hidden]\"))\n    .map((input) => input.value)\n    .filter((value) => combos[value]);\n  if (!combos[state.combo] || (availableCombos.length && !availableCombos.includes(state.combo))) {\n    state.combo = availableCombos[0] || \"case\";\n  }\n\n  const heading = productRoot.querySelector(\"[data-product-heading]\");\n  const priceNodes = productRoot.querySelectorAll(\"[data-total-price]\");\n  const floatingTitle = productRoot.querySelector(\"[data-floating-title]\");\n  const floatingMeta = productRoot.querySelector(\"[data-floating-meta]\");\n  const floatingTotal = productRoot.querySelector(\"[data-floating-total]\");\n  const floatingCartFeedback = productRoot.querySelector(\"[data-floating-cart-feedback]\");\n  const buyNowButtons = productRoot.querySelectorAll(\"[data-buy-now]\");\n  const addCartButtons = productRoot.querySelectorAll(\"[data-add-cart]\");\n  const cartActionButtons = Array.from(new Set([...addCartButtons, ...buyNowButtons]));\n  const quantityValue = productRoot.querySelector(\"[data-quantity-value]\");\n  const cartMessage = productRoot.querySelector(\"[data-cart-message]\");\n  const dynamicCheckout = productRoot.querySelector(\"[data-ire5-dynamic-checkout]\");\n  const dynamicCheckoutForm = dynamicCheckout?.querySelector(\"[data-dynamic-checkout-form]\") || null;\n  const dynamicCheckoutVariant = dynamicCheckout?.querySelector(\"[data-dynamic-checkout-variant]\") || null;\n  const dynamicCheckoutQuantity = dynamicCheckout?.querySelector(\"[data-dynamic-checkout-quantity]\") || null;\n  const dynamicCheckoutProperties = dynamicCheckout?.querySelector(\"[data-dynamic-checkout-properties]\") || null;\n  const dynamicCheckoutDisabledLabel = dynamicCheckout?.querySelector(\"[data-dynamic-checkout-disabled-label]\") || null;\n  const dynamicCheckoutMitigation = productRoot.querySelector(\"[data-dynamic-checkout-mitigation]\");\n  /*\n   * Thread6 new test stage:\n   * Legacy hardcoded model subnav selectors are disabled. The current visible path is the Lily selector\n   * plus Shopify-derived product options.\n   *\n   * const modelSubnav = productRoot.querySelector(\"[data-model-subnav]\");\n   * const modelSubnavTitle = productRoot.querySelector(\"[data-model-subnav-title]\");\n   * const modelSubnavGrid = modelSubnav?.querySelector(\".fit-series-grid\") || null;\n   * const fallbackModelSubnavHtml = modelSubnavGrid?.innerHTML || \"\";\n   */\n  const modelSubnav = null;\n  const modelSubnavTitle = null;\n  const modelSubnavGrid = null;\n  const fallbackModelSubnavHtml = \"\";\n  const lilyModelSelector = productRoot.querySelector(\"[data-lily-model-selector]\");\n  const lilyBrandName = productRoot.querySelector(\"[data-brand-name]\");\n  const lilyBrandMenu = productRoot.querySelector(\"[data-brand-menu]\");\n  const lilyModelName = productRoot.querySelector(\"[data-model-name]\");\n  const lilyModelTags = productRoot.querySelector(\"[data-model-tags]\");\n  const lilyModelMenu = productRoot.querySelector(\"[data-model-menu]\");\n  const lilyConnector = productRoot.querySelector(\"[data-lily-connector]\");\n  const lilyModelNote = productRoot.querySelector(\"[data-lily-model-note]\");\n  const selectedModelSummary = productRoot.querySelector(\"[data-selected-model-summary]\");\n  const selectedModelNote = productRoot.querySelector(\"[data-selected-model-note]\");\n  const shippingLeadTimeNodes = productRoot.querySelectorAll(\"[data-shipping-lead-time]\");\n  const shippingLeadTimeRows = productRoot.querySelectorAll(\"[data-shipping-lead-time-row]\");\n  const ownerBenefitStacks = productRoot.querySelectorAll(\"[data-owner-benefit-assurances]\");\n  const ownerShippingAssuranceNodes = productRoot.querySelectorAll(\"[data-owner-shipping-assurance]\");\n  const ownerShippingAssuranceRows = productRoot.querySelectorAll(\"[data-owner-shipping-assurance-row]\");\n  const modelGroup = productRoot.querySelector(\".model-buy-group\");\n  const packGroup = productRoot.querySelector(\".module-pack-group\");\n  const careGroup = productRoot.querySelector(\".care-buy-group\");\n  const smartPanel = productRoot.querySelector(\".smart-device-panel\");\n  const deviceBrands = productRoot.querySelector(\"[data-device-brands]\");\n  const deviceModels = productRoot.querySelector(\"[data-device-models]\");\n  const deviceNotes = productRoot.querySelector(\"[data-device-notes]\");\n  const requestModal = productRoot.querySelector(\"[data-request-modal]\");\n  const requestBrand = productRoot.querySelector(\"[data-request-brand]\");\n  const requestNewBrand = productRoot.querySelector(\"[data-request-new-brand]\");\n  const requestModel = productRoot.querySelector(\"[data-request-model]\");\n  const requestFeedback = productRoot.querySelector(\"[data-request-feedback]\");\n  const requestConfirm = productRoot.querySelector(\"[data-confirm-request]\");\n  const customRequest = { active: false, brand: \"\", model: \"\" };\n  const smartSelection = { brand: \"\", model: \"\" };\n  const requestGate = { blocksCart: false, reason: \"\", targetUrl: \"\", brand: \"\", model: \"\" };\n  const skuBound = {\n    case: productRoot.dataset.caseSkuBound === \"true\",\n    gen1: productRoot.dataset.gen1SkuBound === \"true\",\n    module: productRoot.dataset.moduleSkuBound === \"true\",\n    creator: productRoot.dataset.creatorSkuBound === \"true\",\n    accessories: productRoot.dataset.accessoriesSkuBound === \"true\",\n  };\n  const rawImageSourceRule = productRoot.dataset.imageSourceRule || \"shopify_product\";\n  const imageSourceRule = [\"shopify_product\", \"shopify_variant\", \"placeholder\"].includes(rawImageSourceRule)\n    ? rawImageSourceRule\n    : rawImageSourceRule === \"theme_manual\" ? \"placeholder\" : \"shopify_product\";\n  const galleryMain = productRoot.querySelector(\"[data-gallery-main]\");\n  const mainGalleryImage = productRoot.querySelector(\"[data-gallery-main-image]\") || productRoot.querySelector(\".gallery-main-image\");\n  const galleryPlaceholder = productRoot.querySelector(\"[data-gallery-placeholder]\");\n  const galleryCounter = productRoot.querySelector(\"[data-gallery-counter]\");\n  const galleryThumbs = productRoot.querySelector(\"[data-gallery-thumbs]\");\n  const galleryPrev = productRoot.querySelector(\"[data-gallery-prev]\");\n  const galleryNext = productRoot.querySelector(\"[data-gallery-next]\");\n  const floatingImage = productRoot.querySelector(\"[data-floating-image]\");\n  const mainGalleryVideo = productRoot.querySelector(\"[data-gallery-main-video]\");\n  const mainGalleryEmbed = productRoot.querySelector(\"[data-gallery-main-embed]\");\n  const mainGalleryModel = productRoot.querySelector(\"[data-gallery-main-model]\");\n  const galleryMediaTemplates = productRoot.querySelector(\"[data-gallery-media-templates]\");\n  const currentPathTitle = productRoot.querySelector(\"[data-current-path-title]\");\n  const currentPathMeta = productRoot.querySelector(\"[data-current-path-meta]\");\n  const currentPathPrice = productRoot.querySelector(\"[data-current-path-price]\");\n  const totalLabel = productRoot.querySelector(\"[data-total-label]\");\n  const currentPathLinks = productRoot.querySelectorAll(\"[data-path-link]\");\n  const productPathHeading = productRoot.querySelector(\"[data-product-path-heading]\");\n  const nativeOptionsGroup = productRoot.querySelector(\"[data-native-options-group]\");\n  const nativeOptionsHeading = productRoot.querySelector(\"[data-native-options-heading]\");\n  const nativeOptionsFields = productRoot.querySelector(\"[data-native-options-fields]\");\n  const nativeOptionsMessage = productRoot.querySelector(\"[data-native-options-message]\");\n  const interfaceTypePanel = productRoot.querySelector(\"[data-interface-type-panel]\");\n  const interfaceTypeOptions = productRoot.querySelector(\"[data-interface-type-options]\");\n  const phoneTypeOptions = productRoot.querySelector(\"[data-phone-type-options]\");\n  const modulePhoneModelDisplay = productRoot.querySelector(\".x-phone-model-display span\");\n  const INITIAL_GALLERY_MEDIA_LIMIT = 6;\n  const COLLAPSED_GALLERY_MEDIA_LIMIT = INITIAL_GALLERY_MEDIA_LIMIT;\n  const galleryState = { combo: state.combo, quantity: state.quantity, variantId: \"\", index: 0, touchX: 0, expanded: false };\n  const nativeSelections = {};\n  const nativeSelectionTouches = {};\n  let lilySelectedBrand = \"\";\n  let productMediaMap = {};\n  try {\n    productMediaMap = JSON.parse(document.querySelector(\"[data-ire5-product-media-map]\")?.textContent || \"{}\");\n  } catch (error) {\n    productMediaMap = {};\n  }\n  let variantMediaMap = {};\n  try {\n    variantMediaMap = JSON.parse(document.querySelector(\"[data-ire5-variant-media-map]\")?.textContent || \"{}\");\n  } catch (error) {\n    variantMediaMap = {};\n  }\n  let productContexts = {};\n  try {\n    productContexts = JSON.parse(document.querySelector(\"[data-ire5-product-contexts]\")?.textContent || \"{}\");\n  } catch (error) {\n    productContexts = {};\n  }\n  if (usesQuantityVariantOption()) state.quantity = configuredQuantity;\n\n  function enableVariantMediaAfterUserAction(event) {\n    if (event && !event.isTrusted) return false;\n    state.variantMediaTouched = true;\n    galleryState.index = 0;\n    return true;\n  }\n\n  function resetInitialGalleryMediaMode() {\n    state.variantMediaTouched = false;\n    galleryState.index = 0;\n    galleryState.expanded = false;\n  }\n\n  function initialModelValueFromVariant(context, variant) {\n    if (!context?.options?.length || !variant?.options?.length) return \"\";\n    const index = context.options.findIndex((option) => /device|model|phone/i.test(option.name || \"\"));\n    return index >= 0 ? String(variant.options[index] || \"\") : \"\";\n  }\n\n  function applyResolvedVariantSelection(comboKey, variant) {\n    const context = activeProductContext(comboKey);\n    const resolvedVariant = context?.variants?.find((item) => String(item.id) === String(variant?.id));\n    if (!resolvedVariant?.options?.length || resolvedVariant.options.length !== context.options?.length) return false;\n\n    const quantityIndex = quantityOptionIndex(context);\n    const hasQuantityChoices = comboKey === state.combo && Boolean(productRoot.querySelector(\"[data-quantity-choice]\"));\n    const resolvedQuantity = quantityIndex >= 0\n      ? quantityFromOptionValue(resolvedVariant.options[quantityIndex])\n      : 0;\n    if (hasQuantityChoices && quantityIndex >= 0) {\n      const resolvedQuantityOptionValue = resolvedVariant.options[quantityIndex];\n      const resolvedQuantityButton = quantityChoiceButtonForOptionValue(resolvedQuantityOptionValue);\n      if (!resolvedQuantity || !resolvedQuantityButton) return false;\n      state.quantity = resolvedQuantity;\n      state.quantityOptionValue = resolvedQuantityOptionValue;\n      state.quantityChoiceTouched = true;\n    }\n\n    nativeSelections[comboKey] = resolvedVariant.options.slice();\n    if (comboKey === state.combo) {\n      const modelValue = initialModelValueFromVariant(context, resolvedVariant);\n      if (modelValue) state.model = modelValue;\n      const phoneIndex = phoneTypeOptionIndex(context);\n      const phoneValue = phoneIndex >= 0 ? normalizeIntentKey(resolvedVariant.options[phoneIndex]) : \"\";\n      if (phoneValue.includes(\"android\")) state.phoneType = \"android\";\n      else if (phoneValue.includes(\"iphone\") || phoneValue.includes(\"apple\") || phoneValue === \"ios\") state.phoneType = \"iphone\";\n    }\n    return true;\n  }\n\n  function resetVariantSelectionToShopifyDefault(comboKey = state.combo) {\n    const context = activeProductContext(comboKey);\n    delete nativeSelections[comboKey];\n    delete nativeSelectionTouches[comboKey];\n    if (comboKey === state.combo) state.quantityChoiceTouched = false;\n    return applyResolvedVariantSelection(comboKey, defaultVariantForContext(context));\n  }\n\n  let explicitInitialVariantAccepted = false;\n  if (initialVariantId) {\n    Object.entries(productContexts || {}).forEach(([key, context]) => {\n      const variant = context?.variants?.find((item) => String(item.id) === initialVariantId);\n      if (variant?.options?.length) {\n        if (key === state.combo) {\n          explicitInitialVariantAccepted = applyResolvedVariantSelection(key, variant);\n        } else nativeSelections[key] = variant.options.slice();\n      }\n    });\n  }\n  if (!explicitInitialVariantAccepted) resetVariantSelectionToShopifyDefault(state.combo);\n  if (explicitInitialVariantAccepted) {\n    state.variantMediaTouched = true;\n    galleryState.index = 0;\n  }\n\n  function formatPriceHtml(price, msrp) {\n    return `<span class=\"price-current\">${money(price)}</span>${msrp ? `<span class=\"price-msrp\"><s>${money(msrp)}</s></span>` : \"\"}`;\n  }\n\n  function inventoryNumber(value) {\n    const next = Number(value);\n    return Number.isFinite(next) ? next : null;\n  }\n\n  function isInventoryTracked(variant) {\n    return Boolean(variant?.inventoryManagement);\n  }\n\n  function canSellPastInventory(variant) {\n    return String(variant?.inventoryPolicy || \"\").toLowerCase() === \"continue\";\n  }\n\n  function inventoryInfo(variant, requestedQuantity = state.quantity) {\n    if (!variant) {\n      return {\n        className: \"is-out\",\n          label: \"No Shopify variant configured\",\n          shortLabel: \"No variant\",\n          blocksCart: true,\n          quantityInsufficient: false,\n      };\n    }\n    const tracked = isInventoryTracked(variant);\n    const continueSelling = canSellPastInventory(variant);\n    const quantity = inventoryNumber(variant.inventoryQuantity);\n    const requested = Math.max(1, Number(requestedQuantity || 1) || 1);\n    const available = Boolean(variant.available);\n\n    if (tracked && !continueSelling && quantity !== null) {\n      if (quantity <= 0 || !available) {\n        return {\n          className: \"is-out\",\n          label: \"Out of Stock\",\n          shortLabel: \"Out of Stock\",\n          blocksCart: true,\n          quantityInsufficient: false,\n        };\n      }\n      if (requested > quantity) {\n        return {\n          className: \"is-out\",\n          label: \"Not enough stock\",\n          shortLabel: \"Not enough stock\",\n          blocksCart: true,\n          quantityInsufficient: true,\n        };\n      }\n      return {\n        className: quantity <= 3 ? \"is-low\" : \"is-stock\",\n        label: \"In Stock\",\n        shortLabel: \"In Stock\",\n        blocksCart: false,\n        quantityInsufficient: false,\n      };\n    }\n\n    if (tracked && continueSelling) {\n      return {\n        className: available ? \"is-preorder\" : \"is-out\",\n        label: available ? \"Backorder enabled\" : \"Out of Stock\",\n        shortLabel: available ? \"Backorder enabled\" : \"Out of Stock\",\n        blocksCart: !available,\n        quantityInsufficient: false,\n      };\n    }\n\n    return {\n      className: available ? \"is-stock\" : \"is-out\",\n      label: available ? \"In Stock\" : \"Out of Stock\",\n      shortLabel: available ? \"In Stock\" : \"Out of Stock\",\n      blocksCart: !available,\n      quantityInsufficient: false,\n    };\n  }\n\n  function addonInputInventoryInfo(input, requestedQuantity = state.quantity) {\n    if (!input?.dataset.addonVariantId) {\n      return {\n        className: \"is-out\",\n        label: \"Bind SKU\",\n        shortLabel: \"Bind SKU\",\n        blocksCart: true,\n        quantityInsufficient: false,\n      };\n    }\n    return inventoryInfo({\n      available: input.dataset.addonAvailable === \"true\",\n      inventoryQuantity: input.dataset.addonInventoryQuantity,\n      inventoryPolicy: input.dataset.addonInventoryPolicy,\n      inventoryManagement: input.dataset.addonInventoryManagement,\n    }, requestedQuantity);\n  }\n\n  function addonQuantity(key) {\n    const quantity = Number(state.addonQuantities?.[key]);\n    return Math.max(0, Math.min(99, Number.isFinite(quantity) ? quantity : 0));\n  }\n\n  function setAddonQuantity(key, nextQuantity) {\n    if (!key) return;\n    const quantity = Math.max(0, Math.min(99, Number(nextQuantity) || 0));\n    state.addonQuantities[key] = quantity;\n    const input = productRoot.querySelector(`input[name='addon'][value=\"${CSS.escape(key)}\"]`);\n    if (quantity <= 0) {\n      state.addons.delete(key);\n      if (input) input.checked = false;\n    } else if (input?.checked) {\n      state.addons.add(key);\n    }\n  }\n\n  function isCurrentProductAddonInput(input) {\n    const currentProductHandle = productRoot.dataset.currentProductHandle || \"\";\n    return Boolean(\n      state.combo === \"accessories\"\n      && currentProductHandle\n      && input?.dataset.addonProductHandle === currentProductHandle\n    );\n  }\n\n  function syncAddonPanelVisibility() {\n    const panel = productRoot.querySelector(\".accessory-buy-group\");\n    if (!panel) return;\n    const cards = Array.from(panel.querySelectorAll(\".addon-card\"));\n    const hasVisibleCards = cards.some((card) => !card.hidden);\n    panel.hidden = !hasVisibleCards;\n    panel.classList.toggle(\"is-empty\", !hasVisibleCards);\n  }\n\n  function selectedAddonStockIssue() {\n    for (const key of state.addons) {\n      if (addonQuantity(key) < 1) continue;\n      const input = productRoot.querySelector(`input[name='addon'][value=\"${CSS.escape(key)}\"]`);\n      if (isCurrentProductAddonInput(input)) continue;\n      const stock = addonInputInventoryInfo(input, addonQuantity(key));\n      if (stock.blocksCart) return { key, stock };\n    }\n    return null;\n  }\n\n  function colorSwatchStyle(value) {\n    const raw = String(value || \"\").toLowerCase();\n    const chineseColors = [\n      [/\\u9ed1/, \"#111111\"],\n      [/\\u767d/, \"#ffffff\"],\n      [/\\u900f\\u660e/, \"linear-gradient(135deg,#ffffff 0 45%,#d9dde5 45% 55%,#ffffff 55% 100%)\"],\n      [/\\u6a59|\\u6854/, \"#f15a24\"],\n      [/\\u7070/, \"#8b95a1\"],\n      [/\\u7c89/, \"#f3a6b6\"],\n      [/\\u84dd/, \"#3b82f6\"],\n      [/\\u7ea2/, \"#ef4444\"],\n      [/\\u7eff/, \"#22c55e\"],\n      [/\\u7d2b/, \"#8b5cf6\"],\n      [/\\u94f6/, \"#c7cdd6\"],\n    ];\n    const chineseMatch = chineseColors.find(([pattern]) => pattern.test(raw));\n    if (chineseMatch) return chineseMatch[1];\n    const key = normalizeIntentKey(value);\n    const colors = {\n      black: \"#111111\",\n      white: \"#ffffff\",\n      clear: \"linear-gradient(135deg,#ffffff 0 45%,#d9dde5 45% 55%,#ffffff 55% 100%)\",\n      transparent: \"linear-gradient(135deg,#ffffff 0 45%,#d9dde5 45% 55%,#ffffff 55% 100%)\",\n      orange: \"#f15a24\",\n      grey: \"#8b95a1\",\n      gray: \"#8b95a1\",\n      pink: \"#f3a6b6\",\n      blue: \"#3b82f6\",\n      red: \"#ef4444\",\n      green: \"#22c55e\",\n      purple: \"#8b5cf6\",\n      silver: \"#c7cdd6\",\n      natural: \"#d8c7aa\",\n    };\n    return colors[key] || \"#f3f4f6\";\n  }\n\n  function isColorOption(option) {\n    return /color|colour|\\u989c\\u8272/i.test(option?.name || \"\");\n  }\n\n  function normalizeCartAddError(message) {\n    const text = String(message || \"\").trim();\n    if (/only\\s+\\d+\\s+item|due to availability|not enough|sold out|out of stock|unavailable/i.test(text)) {\n      return text.toLowerCase().includes(\"not enough stock\") ? text : `Not enough stock. ${text}`;\n    }\n    return text || \"Could not add to cart. Please check this product variant in Shopify.\";\n  }\n\n  function directAccessoryProductContext(comboKey = state.combo) {\n    if (comboKey === \"accessories\") {\n      const currentContext = productContexts?.current;\n      const currentHandle = productRoot.dataset.currentProductHandle || \"\";\n      if (currentContext && typeof currentContext === \"object\" && currentContext.handle && currentContext.handle === currentHandle) {\n        return currentContext;\n      }\n    }\n    return null;\n  }\n\n  function isDirectAccessoryProductPath(comboKey = state.combo) {\n    return Boolean(directAccessoryProductContext(comboKey));\n  }\n\n  function activeProductContext(comboKey = state.combo) {\n    const directAccessoryContext = directAccessoryProductContext(comboKey);\n    if (directAccessoryContext) return directAccessoryContext;\n    const context = productContexts?.[comboKey];\n    return context && typeof context === \"object\" ? context : null;\n  }\n\n  function defaultVariantForContext(context) {\n    if (!context?.variants?.length) return null;\n    return context.variants.find((variant) => String(variant.id) === String(context.selectedVariantId))\n      || context.variants.find((variant) => variant.available)\n      || context.variants[0];\n  }\n\n  const VARIANT_GENERATION_UNKNOWN = \"UNKNOWN / UNCLASSIFIED\";\n\n  function variantGenerationFromSku(sku) {\n    if (typeof sku !== \"string\" || sku.length === 0) return VARIANT_GENERATION_UNKNOWN;\n    if (sku.startsWith(\"IR5-G1-\")) return \"Gen1\";\n    if (sku.startsWith(\"IR5-G2-\")) return \"Gen2\";\n    return VARIANT_GENERATION_UNKNOWN;\n  }\n\n  function selectedVariantGeneration(comboKey = state.combo) {\n    return variantGenerationFromSku(selectedNativeVariant(comboKey)?.sku);\n  }\n\n  function shippingLeadTimeForContext(context = activeProductContext()) {\n    const source = \"product.metafields.ire5.shipping_lead_time\";\n    const productId = context?.id == null ? \"\" : String(context.id);\n    const field = context?.shippingLeadTime;\n    if (!field || typeof field !== \"object\" || field.present !== true) {\n      return {\n        source,\n        productId,\n        state: \"missing\",\n        value: \"\",\n        releaseGate: \"blocked\",\n        diagnostic: \"Release blocked: Product metafield ire5.shipping_lead_time is missing.\",\n      };\n    }\n    if (\n      field.type !== \"single_line_text_field\"\n      || typeof field.value !== \"string\"\n      || /[\\r\\n]/.test(field.value)\n    ) {\n      return {\n        source,\n        productId,\n        state: \"invalid\",\n        value: \"\",\n        releaseGate: \"blocked\",\n        diagnostic: \"Release blocked: Product metafield ire5.shipping_lead_time must be single_line_text_field with a string value.\",\n      };\n    }\n    const value = field.value.trim();\n    if (!value) {\n      return {\n        source,\n        productId,\n        state: \"blank\",\n        value: \"\",\n        releaseGate: \"blocked\",\n        diagnostic: \"Release blocked: Product metafield ire5.shipping_lead_time is blank.\",\n      };\n    }\n    return {\n      source,\n      productId,\n      state: \"valid\",\n      value,\n      releaseGate: \"pass\",\n      diagnostic: \"Product metafield ire5.shipping_lead_time is valid.\",\n    };\n  }\n\n  function ownerShippingAssuranceForValue(value) {\n    if (value === \"Ships within 1\u20137 business days.\" || value === \"Ships within 1-7 business days.\") {\n      return \"In stock: estimated to ship within 1\u20137 business days.\";\n    }\n    if (value === \"Pre-order: estimated to ship within 30\u201385 days.\" || value === \"Pre-order: estimated to ship within 30-85 days.\") {\n      return \"Pre-order: estimated to ship within 30\u201385 days.\";\n    }\n    return \"\";\n  }\n\n  function ensureNativeSelections(comboKey = state.combo) {\n    const context = activeProductContext(comboKey);\n    if (!context?.options?.length) return [];\n    const current = nativeSelections[comboKey] || [];\n    const seedVariant = defaultVariantForContext(context);\n    const phoneIndex = comboKey === state.combo ? phoneTypeOptionIndex(context) : -1;\n    const quantityIndex = comboKey === state.combo ? quantityOptionIndex(context) : -1;\n    const next = context.options.map((option, index) => {\n      if (index === phoneIndex && phoneTypeOptions) {\n        const phoneMatch = matchingOptionValue(option, state.phoneType);\n        if (phoneMatch) return phoneMatch;\n      }\n      if (index === quantityIndex && productRoot.querySelector(\"[data-quantity-choice]\")) {\n        const quantityMatch = matchingQuantityOptionValue(option, state.quantity, state.quantityOptionValue);\n        if (quantityMatch) return quantityMatch;\n        const fromVariant = seedVariant?.options?.[index];\n        if (!state.quantityChoiceTouched && fromVariant && option.values?.includes(fromVariant)) return fromVariant;\n      }\n      const existing = current[index];\n      if (existing && option.values?.includes(existing)) return existing;\n      const selected = option.selectedValue;\n      if (selected && option.values?.includes(selected)) return selected;\n      const fromVariant = seedVariant?.options?.[index];\n      if (fromVariant && option.values?.includes(fromVariant)) return fromVariant;\n      return option.values?.[0] || \"\";\n    });\n    nativeSelections[comboKey] = next;\n    return next;\n  }\n\n  function markNativeOptionTouched(comboKey, index) {\n    if (!comboKey || index < 0) return;\n    if (!nativeSelectionTouches[comboKey]) nativeSelectionTouches[comboKey] = new Set();\n    nativeSelectionTouches[comboKey].add(index);\n  }\n\n  function nativeOptionWasTouched(comboKey, index) {\n    return Boolean(index >= 0 && nativeSelectionTouches[comboKey]?.has(index));\n  }\n\n  function moduleInterfaceCompatibleWithPhone(value, comboKey = state.combo) {\n    if (comboKey !== \"module\" || state.combo !== \"module\") return true;\n    const phoneTypeKey = normalizeIntentKey(state.phoneType);\n    const interfaceKey = normalizeIntentKey(value);\n    return !phoneTypeKey.includes(\"android\")\n      || (!interfaceKey.includes(\"lightning\") && !interfaceKey.includes(\"lighting\"));\n  }\n\n  function selectedNativeVariant(comboKey = state.combo) {\n    const context = activeProductContext(comboKey);\n    if (!context?.variants?.length) return null;\n    const selections = ensureNativeSelections(comboKey);\n    const exact = context.variants.find((variant) => (\n      Array.isArray(variant.options)\n      && variant.options.length === selections.length\n      && variant.options.every((option, index) => option === selections[index])\n    ));\n    if (exact) {\n      const optionIndex = interfaceOptionIndex(context);\n      if (optionIndex >= 0 && !moduleInterfaceCompatibleWithPhone(exact.options?.[optionIndex], comboKey)) return null;\n      return exact;\n    }\n    return context.hasOnlyDefaultVariant ? defaultVariantForContext(context) : null;\n  }\n\n  function nativeOptionIndex(context, pattern = /device|model|phone/i) {\n    if (!context?.options?.length) return -1;\n    return context.options.findIndex((option) => pattern.test(option.name || \"\"));\n  }\n\n  function interfaceOptionIndex(context) {\n    if (!context?.options?.length) return -1;\n    const direct = context.options.findIndex((option) => /interface|connector|port/i.test(option.name || \"\"));\n    if (direct >= 0) return direct;\n    return context.options.findIndex((option) => (\n      option.values?.some((value) => /type[\\s-]*c|usb[\\s-]*c|lightning/i.test(String(value || \"\")))\n    ));\n  }\n\n  function isPhoneTypeOption(option) {\n    const name = normalizeIntentKey(option?.name);\n    if (name === \"phonetype\" || name === \"devicetype\" || name === \"platform\" || name === \"phoneplatform\") return true;\n    if (name !== \"selectdevice\" && name !== \"device\") return false;\n    const broadPhoneTypeValues = new Set([\"iphone\", \"foriphone\", \"ios\", \"apple\", \"android\", \"forandroid\", \"androiddevice\", \"forandroiddevice\"]);\n    const values = Array.isArray(option?.values) ? option.values : [];\n    return values.length > 1 && values.every((value) => broadPhoneTypeValues.has(normalizeIntentKey(value)));\n  }\n\n  function isQuantityOption(option) {\n    const rawName = String(option?.name || \"\").toLowerCase();\n    const name = normalizeIntentKey(option?.name);\n    return name === \"quantity\"\n      || name === \"qty\"\n      || name === \"packquantity\"\n      || name === \"pack\"\n      || name === \"packsize\"\n      || name === \"pcs\"\n      || name === \"piece\"\n      || name === \"pieces\"\n      || /\\u6570\\u91cf|\\u4ef6\\u6570|\\u5957\\u6570|\\u4efd\\u6570/.test(rawName);\n  }\n\n  function phoneTypeOptionIndex(context) {\n    if (!context?.options?.length) return -1;\n    return context.options.findIndex((option) => isPhoneTypeOption(option));\n  }\n\n  function quantityFromOptionValue(value) {\n    // Quantity values must be a bare number or an explicit pack label.\n    // Do not treat digits embedded in product/model names (for example iRe5)\n    // as quantity signals, otherwise a real Shopify Model option is hidden.\n    const match = String(value || \"\").trim().match(/^(\\d+)\\s*(?:pc|pcs|piece|pieces|pack|packs|set|sets)?$/i);\n    return match ? Number(match[1]) : 0;\n  }\n\n  function quantityChoiceNumbers() {\n    return Array.from(productRoot.querySelectorAll(\"[data-quantity-choice]\"))\n      .map((button) => Number(button.dataset.quantityChoice || 0))\n      .filter((value) => Number.isFinite(value) && value > 0);\n  }\n\n  function optionLooksLikeQuantity(option) {\n    const values = Array.isArray(option?.values) ? option.values : [];\n    if (!values.length) return false;\n    const choiceNumbers = new Set(quantityChoiceNumbers());\n    if (!choiceNumbers.size) return false;\n    const valueNumbers = values.map((value) => quantityFromOptionValue(value)).filter((value) => value > 0);\n    if (!valueNumbers.length) return false;\n    const matchedChoices = valueNumbers.filter((value) => choiceNumbers.has(value));\n    if (matchedChoices.length >= Math.min(choiceNumbers.size, 2)) return true;\n    return values.every((value) => /\\b\\d+\\s*(pc|pcs|piece|pieces|pack|packs|set|sets)\\b/i.test(String(value || \"\")));\n  }\n\n  function quantityOptionIndex(context) {\n    if (!context?.options?.length) return -1;\n    const namedIndex = context.options.findIndex((option) => isQuantityOption(option));\n    if (namedIndex >= 0) return namedIndex;\n    return context.options.findIndex((option) => optionLooksLikeQuantity(option));\n  }\n\n  function matchingQuantityOptionValue(option, quantity, exactValue = \"\") {\n    if (exactValue && option?.values?.includes(exactValue)) return exactValue;\n    const requested = Math.max(1, Number(quantity || 1) || 1);\n    const candidates = [\n      String(requested),\n      `${requested} PC`,\n      `${requested} PCS`,\n      `${requested} pcs`,\n      `${requested} pack`,\n      `${requested} packs`,\n    ];\n    for (const candidate of candidates) {\n      const match = matchingOptionValue(option, candidate);\n      if (match) return match;\n    }\n    return option?.values?.find((value) => quantityFromOptionValue(value) === requested) || \"\";\n  }\n\n  function usesQuantityVariantOption(comboKey = state.combo) {\n    const context = activeProductContext(comboKey);\n    return Boolean(context?.options?.length && productRoot.querySelector(\"[data-quantity-choice]\") && quantityOptionIndex(context) >= 0);\n  }\n\n  function quantitySelectionPending(comboKey = state.combo) {\n    return comboKey === state.combo && usesQuantityVariantOption(comboKey) && !state.quantityChoiceTouched;\n  }\n\n  function primaryCommerceQuantity(comboKey = state.combo) {\n    return usesQuantityVariantOption(comboKey) ? 1 : state.quantity;\n  }\n\n  function customManagedNativeOptionIndex(context, index) {\n    if (!context?.options?.[index]) return false;\n    if (phoneTypeOptions && index === phoneTypeOptionIndex(context)) return true;\n    if (productRoot.querySelector(\"[data-quantity-choice]\") && index === quantityOptionIndex(context)) return true;\n    return false;\n  }\n\n  function isBundleOption(option) {\n    return /bundle/i.test(option?.name || \"\");\n  }\n\n  function casePathUsesAutoInterface(comboKey = state.combo) {\n    return comboKey === \"case\" || comboKey === \"gen1\";\n  }\n\n  function inferredInterfaceForModel(modelLabel) {\n    const label = String(modelLabel || \"\");\n    const iphone = label.match(/iphone[\\s-]*(\\d+)/i);\n    if (iphone) return Number(iphone[1]) >= 15 ? \"Type-C\" : \"Lightning\";\n    if (/android|galaxy|samsung|pixel|oneplus|sony|nothing|motorola/i.test(label)) return \"Type-C\";\n    return \"\";\n  }\n\n  function matchingOptionValue(option, desiredValue) {\n    const desired = normalizeIntentKey(desiredValue);\n    if (!desired || !option?.values?.length) return \"\";\n    return option.values.find((value) => normalizeIntentKey(value) === desired)\n      || option.values.find((value) => {\n        const key = normalizeIntentKey(value);\n        return key.includes(desired) || desired.includes(key);\n      })\n      || \"\";\n  }\n\n  function interfaceOptionLabel(value) {\n    const key = normalizeIntentKey(value);\n    if (key.includes(\"typec\") || key.includes(\"usbc\")) return \"Type-C\";\n    if (key.includes(\"lightning\") || key.includes(\"lighting\")) return \"Lightning\";\n    return String(value || \"\");\n  }\n\n  function resolvedInterfaceForModel(modelLabel, comboKey = state.combo) {\n    if (!casePathUsesAutoInterface(comboKey)) return { index: -1, value: \"\", inferred: \"\" };\n    const context = activeProductContext(comboKey);\n    const index = interfaceOptionIndex(context);\n    const inferred = inferredInterfaceForModel(modelLabel);\n    if (index < 0 || !inferred) return { index, value: \"\", inferred };\n    return {\n      index,\n      inferred,\n      value: matchingOptionValue(context.options[index], inferred),\n    };\n  }\n\n  function autoSelectInterfaceFromModel(modelLabel, comboKey = state.combo) {\n    const resolved = resolvedInterfaceForModel(modelLabel, comboKey);\n    if (resolved.index < 0 || !resolved.value) return \"\";\n    const selections = ensureNativeSelections(comboKey);\n    selections[resolved.index] = resolved.value;\n    nativeSelections[comboKey] = selections;\n    return resolved.value;\n  }\n\n  function caseModelCanDriveInterface(comboKey = state.combo) {\n    const context = activeProductContext(comboKey);\n    const modelLabel = selectedExplicitModelValue(comboKey);\n    return Boolean(\n      modelLabel\n      && nativeOptionIndex(context) < 0\n      && resolvedInterfaceForModel(modelLabel, comboKey).value\n    );\n  }\n\n  function comboRequiresModel(comboKey = state.combo) {\n    const combo = combos[comboKey];\n    return Boolean(combo && !combo.noModel && !combo.accessoriesOnly);\n  }\n\n  function selectedNativeDeviceLabel(comboKey = state.combo, explicitOnly = false) {\n    const context = activeProductContext(comboKey);\n    const index = nativeOptionIndex(context);\n    if (index < 0) return \"\";\n    if (explicitOnly && !nativeOptionWasTouched(comboKey, index)) return \"\";\n    return ensureNativeSelections(comboKey)[index] || \"\";\n  }\n\n  function selectedExplicitModelValue(comboKey = state.combo) {\n    if (comboKey === state.combo) {\n      if (customRequest.active) return customRequest.model || \"\";\n      if (smartSelection.model) return smartSelection.model;\n      if (state.model) return state.model;\n    }\n    return selectedNativeDeviceLabel(comboKey, true);\n  }\n\n  function casePathNeedsExplicitModel(comboKey = state.combo) {\n    if (!casePathUsesAutoInterface(comboKey) || !comboRequiresModel(comboKey) || customRequest.active) return false;\n    if (selectedExplicitModelValue(comboKey)) return false;\n    return !selectedVariantSatisfiesCasePath(comboKey);\n  }\n\n  function selectedVariantSatisfiesCasePath(comboKey = state.combo) {\n    const context = activeProductContext(comboKey);\n    const variant = selectedNativeVariant(comboKey);\n    return Boolean(context && variant?.id);\n  }\n\n  function nativeSelectionsAsProperties(comboKey = state.combo) {\n    const context = activeProductContext(comboKey);\n    if (!context?.options?.length) return {};\n    const selections = ensureNativeSelections(comboKey);\n    return context.options.reduce((props, option, index) => {\n      if (selections[index]) props[`_${option.name || `Option ${index + 1}`}`] = selections[index];\n      return props;\n    }, {});\n  }\n\n  function productPathLabel(comboKey = state.combo) {\n    const labels = {\n      case: \"Storage Case\",\n      gen1: \"Gen1 Storage Case\",\n      module: \"X Module\",\n      creator: \"Creator Combo\",\n      accessories: \"Accessories\",\n    };\n    return labels[comboKey] || combos[comboKey]?.title || comboKey;\n  }\n\n  function addonCommerceKey(input, fallbackKey = \"\") {\n    return String(input?.dataset.addonCommerceKey || input?.dataset.addonProductHandle || fallbackKey || \"\").trim();\n  }\n\n  function addonCommerceTitle(input, fallbackKey = \"\") {\n    return String(input?.dataset.addonCommerceTitle || addonCommerceKey(input, fallbackKey) || fallbackKey || \"\").trim();\n  }\n\n  function selectedAddonCommerceLabels() {\n    return Array.from(state.addons).map((key) => {\n      const input = productRoot.querySelector(`input[name='addon'][value=\"${CSS.escape(key)}\"]`);\n      if (isCurrentProductAddonInput(input)) return \"\";\n      return addonCommerceKey(input, key) || key;\n    }).filter(Boolean);\n  }\n\n  function selectedAddonRequestCount() {\n    let count = 0;\n    state.addons.forEach((key) => {\n      if (addonQuantity(key) < 1) return;\n      const input = productRoot.querySelector(`input[name='addon'][value=\"${CSS.escape(key)}\"]`);\n      if (isCurrentProductAddonInput(input)) return;\n      count += 1;\n    });\n    return count;\n  }\n\n  function lineItemPropertiesForCheckout(combo) {\n    const props = {\n      \"iRe5 path\": productPathLabel(state.combo),\n      \"_iRe5 order structure\": state.combo,\n    };\n\n    if (!combo.noModel) {\n      const model = selectedModelLabel();\n      if (model) props[\"Phone model\"] = model;\n    }\n\n    const selectedAddonLabels = selectedAddonCommerceLabels();\n    if (selectedAddonLabels.length) props[\"_iRe5 selected add-ons\"] = selectedAddonLabels.join(\", \");\n    Object.assign(props, nativeSelectionsAsProperties());\n    return props;\n  }\n\n  function syncDynamicCheckoutProperties(properties, enabled) {\n    if (!dynamicCheckoutProperties) return;\n    dynamicCheckoutProperties.replaceChildren();\n    if (!enabled) return;\n    Object.entries(properties || {}).forEach(([key, value]) => {\n      if (!key || value == null || String(value) === \"\") return;\n      const input = document.createElement(\"input\");\n      input.type = \"hidden\";\n      input.name = `properties[${key}]`;\n      input.value = String(value);\n      dynamicCheckoutProperties.append(input);\n    });\n  }\n\n  function dynamicCheckoutUiState({ eligible, mitigated, variantId }) {\n    const hasVariant = Boolean(String(variantId || \"\"));\n    const ready = Boolean(eligible && hasVariant);\n    const mitigationActive = Boolean(mitigated && hasVariant);\n    return { ready, mitigationActive, visible: ready };\n  }\n\n  function syncDynamicCheckout({ eligible, mitigated, variantId, quantity, properties }) {\n    if (!dynamicCheckout || !dynamicCheckoutForm || !dynamicCheckoutVariant || !dynamicCheckoutQuantity) return;\n    const nextVariantId = String(variantId || \"\");\n    const nextQuantity = Math.max(1, Number(quantity || 1) || 1);\n    const { ready, mitigationActive, visible } = dynamicCheckoutUiState({\n      eligible,\n      mitigated,\n      variantId: nextVariantId,\n    });\n    const variantChanged = dynamicCheckoutVariant.value !== nextVariantId;\n    const quantityChanged = dynamicCheckoutQuantity.value !== String(nextQuantity);\n\n    dynamicCheckout.hidden = !visible;\n    dynamicCheckout.setAttribute(\"aria-hidden\", visible ? \"false\" : \"true\");\n    dynamicCheckout.setAttribute(\"aria-disabled\", mitigationActive ? \"true\" : \"false\");\n    dynamicCheckout.classList.toggle(\"is-mitigation-disabled\", mitigationActive);\n    if (mitigationActive) {\n      dynamicCheckout.setAttribute(\"role\", \"button\");\n      dynamicCheckout.setAttribute(\"aria-label\", \"Buy with Shop is unavailable while accessories are selected. Use Add to Cart to purchase all selected items together.\");\n    } else {\n      dynamicCheckout.removeAttribute(\"role\");\n      dynamicCheckout.removeAttribute(\"aria-label\");\n    }\n    dynamicCheckoutForm.inert = !ready;\n    dynamicCheckoutForm.setAttribute(\"aria-disabled\", ready ? \"false\" : \"true\");\n    dynamicCheckoutForm.dataset.checkoutReady = ready ? \"true\" : \"false\";\n    dynamicCheckoutVariant.value = nextVariantId;\n    dynamicCheckoutQuantity.value = String(nextQuantity);\n    dynamicCheckoutVariant.disabled = !visible;\n    dynamicCheckoutQuantity.disabled = !visible;\n    syncDynamicCheckoutProperties(properties, visible);\n    if (dynamicCheckoutDisabledLabel) dynamicCheckoutDisabledLabel.hidden = !mitigationActive;\n    if (dynamicCheckoutMitigation) dynamicCheckoutMitigation.hidden = !mitigationActive;\n\n    if (ready && (variantChanged || quantityChanged)) {\n      dynamicCheckoutVariant.dispatchEvent(new Event(\"change\", { bubbles: true }));\n    }\n  }\n\n  function variantsForOptionValueWithinSelections(context, optionIndex, value, selections) {\n    if (!context?.variants?.length) return [];\n    return context.variants.filter((variant) => (\n      variant.options?.[optionIndex] === value\n      && variant.options.every((optionValue, index) => (\n        index === optionIndex || !selections[index] || optionValue === selections[index]\n      ))\n    ));\n  }\n\n  function moduleInterfaceValueState(context, optionIndex, value, selections) {\n    const variants = variantsForOptionValueWithinSelections(context, optionIndex, value, selections);\n    const compatible = moduleInterfaceCompatibleWithPhone(value);\n    const valid = compatible && variants.length > 0;\n    return {\n      variants,\n      compatible,\n      valid,\n      available: valid && variants.some((variant) => !inventoryInfo(variant).blocksCart),\n    };\n  }\n\n  function enforceModuleInterfaceSelection() {\n    if (state.combo !== \"module\") return;\n    const context = activeProductContext();\n    const optionIndex = interfaceOptionIndex(context);\n    const values = context?.options?.[optionIndex]?.values || [];\n    if (optionIndex < 0 || !values.length) return;\n    const selections = ensureNativeSelections();\n    const current = moduleInterfaceValueState(context, optionIndex, selections[optionIndex], selections);\n    if (current.valid) return;\n    const candidates = values.map((value) => ({\n      value,\n      state: moduleInterfaceValueState(context, optionIndex, value, selections),\n    }));\n    const next = candidates.find((candidate) => candidate.state.available)\n      || candidates.find((candidate) => candidate.state.valid);\n    if (!next) return;\n    selections[optionIndex] = next.value;\n    nativeSelections[state.combo] = selections;\n  }\n\n  function variantsForOptionValue(context, optionIndex, value) {\n    if (!context?.variants?.length) return [];\n    return context.variants.filter((variant) => variant.options?.[optionIndex] === value);\n  }\n\n  function modelStatusForVariants(variants) {\n    const stockStates = variants.map((variant) => inventoryInfo(variant, 1));\n    if (stockStates.some((stock) => stock.className === \"is-stock\" || stock.className === \"is-low\")) {\n      return { className: \"is-stock\", label: \"In stock\" };\n    }\n    if (stockStates.some((stock) => stock.className === \"is-preorder\")) {\n      return { className: \"is-preorder\", label: \"Pre-order\" };\n    }\n    if (stockStates.some((stock) => stock.className === \"is-out\")) {\n      return { className: \"is-out\", label: \"Out of stock\" };\n    }\n    return { className: \"is-request\", label: \"Request path\" };\n  }\n\n  function syncComboMetaFromProductContexts() {\n    Object.keys(combos).forEach((key) => {\n      const context = activeProductContext(key);\n      if (!context) return;\n      const variant = selectedNativeVariant(key) || defaultVariantForContext(context);\n      if (context.title) combos[key].title = context.title;\n      if (variant?.price != null) combos[key].price = Number(variant.price);\n      combos[key].msrp = variant?.compareAtPrice != null ? Number(variant.compareAtPrice) : null;\n      const card = productRoot.querySelector(`input[name='combo'][value=\"${CSS.escape(key)}\"]`)?.closest(\".option-card\");\n      const titleNode = card?.querySelector(\".option-copy strong\");\n      const priceNode = card?.querySelector(\".option-price\");\n      if (titleNode && context.title) {\n        titleNode.textContent = titleNode.dataset.pathShortTitle || context.title;\n        titleNode.title = context.title;\n      }\n      if (priceNode) {\n        priceNode.innerHTML = variant?.price != null\n          ? formatPriceHtml(Number(variant.price), variant?.compareAtPrice != null ? Number(variant.compareAtPrice) : null)\n          : `<span class=\"price-current\">Bind SKU</span>`;\n      }\n    });\n  }\n\n  function setNativeDeviceSelection(modelLabel, comboKey = state.combo) {\n    const context = activeProductContext(comboKey);\n    const index = nativeOptionIndex(context);\n    if (index < 0) return false;\n    const target = normalizeIntentKey(modelLabel);\n    const option = context.options[index];\n    const match = option.values?.find((value) => {\n      const valueKey = normalizeIntentKey(value);\n      return valueKey === target || valueKey.includes(target) || target.includes(valueKey);\n    });\n    if (!match) return false;\n    const selections = ensureNativeSelections(comboKey);\n    selections[index] = match;\n    nativeSelections[comboKey] = selections;\n    markNativeOptionTouched(comboKey, index);\n    return true;\n  }\n\n  function inferDeviceBrand(modelLabel) {\n    const label = String(modelLabel || \"\");\n    if (/iphone|ipad|apple/i.test(label)) return \"Apple\";\n    if (/galaxy|samsung/i.test(label)) return \"Samsung\";\n    if (/pixel|google/i.test(label)) return \"Google\";\n    if (/oneplus/i.test(label)) return \"OnePlus\";\n    if (/redmi|poco|xiaomi|\\bmi\\s/i.test(label)) return \"Xiaomi\";\n    if (/iqoo|vivo/i.test(label)) return \"vivo\";\n    if (/oppo|reno|find\\s*x/i.test(label)) return \"OPPO\";\n    if (/honor|magic/i.test(label)) return \"HONOR\";\n    if (/huawei|mate|pura/i.test(label)) return \"Huawei\";\n    if (/sony/i.test(label)) return \"Sony\";\n    if (/nothing/i.test(label)) return \"Nothing\";\n    if (/moto|motorola|razr/i.test(label)) return \"Motorola\";\n    return \"Phone\";\n  }\n\n  function isReliableLilyPhoneModelOption(option) {\n    if (!/device|model|phone/i.test(String(option?.name || \"\"))) return false;\n    const values = Array.isArray(option?.values) ? option.values.filter((value) => String(value || \"\").trim()) : [];\n    return Boolean(values.length && values.every((value) => inferDeviceBrand(value) !== \"Phone\"));\n  }\n\n  function lilyModelOptionIndex(context) {\n    if (!context?.options?.length) return -1;\n    return context.options.findIndex((option) => isReliableLilyPhoneModelOption(option));\n  }\n\n  function productBoundFitLabel(context) {\n    const title = String(\n      context?.title\n      || productRoot.dataset.productTitle\n      || combos[state.combo]?.title\n      || \"Current Shopify product\"\n    ).trim();\n    const brand = inferDeviceBrand(title);\n    const isProductBrandFallback = brand === \"Phone\";\n    const brandLabel = isProductBrandFallback ? \"iRe5\" : brand;\n    const model = brand === \"Phone\"\n      ? title\n      : title.replace(new RegExp(`^\\\\s*${brand}\\\\s*[-:\u2013\u2014]?\\\\s*`, \"i\"), \"\").trim() || title;\n    return { brand: brandLabel, model, title, isProductBrandFallback };\n  }\n\n  function lilyModelContext() {\n    const context = activeProductContext();\n    const index = lilyModelOptionIndex(context);\n    const option = index >= 0 ? context?.options?.[index] : null;\n    return { context, index, option };\n  }\n\n  function shouldShowLilyModelSelector(context = activeProductContext()) {\n    return Boolean(\n      lilyModelSelector\n      && context\n      && state.combo !== \"module\"\n      && state.combo !== \"accessories\"\n      && lilyModelOptionIndex(context) >= 0\n    );\n  }\n\n  function lilyModelEntries() {\n    const { context, index, option } = lilyModelContext();\n    if (!context || index < 0 || !option?.values?.length) return [];\n    return option.values.map((value) => {\n      const variants = variantsForOptionValue(context, index, value);\n      const status = modelStatusForVariants(variants);\n      const connectorInfo = resolvedInterfaceForModel(value, state.combo);\n      const connector = connectorInfo.value || connectorInfo.inferred || \"Auto\";\n      return {\n        brand: inferDeviceBrand(value),\n        model: value,\n        status,\n        connector,\n      };\n    });\n  }\n\n  function closeLilyMenus() {\n    lilyBrandMenu?.classList.remove(\"is-open\");\n    lilyModelMenu?.classList.remove(\"is-open\");\n    productRoot.querySelector(\"[data-toggle-brand]\")?.setAttribute(\"aria-expanded\", \"false\");\n    productRoot.querySelector(\"[data-toggle-model]\")?.setAttribute(\"aria-expanded\", \"false\");\n  }\n\n  function syncLilyModelSelector() {\n    if (!lilyModelSelector) return;\n    const { context, index } = lilyModelContext();\n    const show = shouldShowLilyModelSelector(context);\n    lilyModelSelector.hidden = !show;\n    productRoot.classList.toggle(\"lily-model-selector-active\", show);\n    if (!show) {\n      closeLilyMenus();\n      return;\n    }\n\n    const entries = lilyModelEntries();\n    const selections = ensureNativeSelections();\n    const interfaceIndex = interfaceOptionIndex(context);\n    const selectedInterface = interfaceIndex >= 0 ? selections[interfaceIndex] || \"\" : \"\";\n    if (!entries.length) {\n      const lockedFit = productBoundFitLabel(context);\n      const stock = selectedNativeVariant() ? inventoryInfo(selectedNativeVariant()).label : \"\";\n      lilySelectedBrand = lockedFit.brand;\n      if (lilyBrandName) lilyBrandName.textContent = lilySelectedBrand;\n      if (lilyModelName) lilyModelName.textContent = lockedFit.model;\n      if (lilyModelTags) lilyModelTags.innerHTML = `<span class=\"lily-mini-tag\">Current product</span>`;\n      if (lilyConnector) lilyConnector.textContent = selectedInterface || \"Auto\";\n      if (lilyModelNote) lilyModelNote.textContent = `This product is sold with its current configured fit. ${stock || \"Use Request More for missing models.\"}`;\n      if (lilyBrandMenu) lilyBrandMenu.innerHTML = `<div class=\"lily-menu-empty\"><strong>${escapeHtml(lockedFit.brand)}</strong><br><small>Current product</small></div>`;\n      if (lilyModelMenu) lilyModelMenu.innerHTML = `<div class=\"lily-menu-empty\"><strong>${escapeHtml(lockedFit.model)}</strong><br><small>${escapeHtml(lockedFit.title)}</small></div>`;\n      return;\n    }\n    const selectedModel = index >= 0 ? selections[index] || selectedModelValue() : selectedModelValue();\n    const selectedEntry = entries.find((entry) => entry.model === selectedModel) || null;\n    const selectedBrand = lilySelectedBrand || selectedEntry?.brand || entries[0]?.brand || inferDeviceBrand(selectedModel) || \"Brand\";\n    lilySelectedBrand = selectedBrand;\n    const brandEntries = Array.from(new Map(entries.map((entry) => [entry.brand, entry])).values());\n    const visibleEntries = entries.filter((entry) => entry.brand === lilySelectedBrand);\n    const fallbackNote = index >= 0\n      ? \"Choose your phone model. USB-C / Lightning follows the selected model for storage cases.\"\n      : \"This product uses its configured fit. Use Request More for missing models.\";\n    const selectedStatus = selectedEntry?.status?.label || (selectedModel ? inventoryInfo(selectedNativeVariant()).shortLabel : \"Select\");\n    const selectedConnector = selectedEntry?.connector || (selectedModel ? resolvedInterfaceForModel(selectedModel, state.combo).label : \"Auto\");\n\n    if (lilyBrandName) lilyBrandName.textContent = lilySelectedBrand;\n    if (lilyModelName) lilyModelName.textContent = selectedModel || \"Choose model\";\n    if (lilyModelTags) {\n      lilyModelTags.innerHTML = selectedModel\n        ? `<span class=\"lily-mini-tag\">${escapeHtml(selectedStatus)}</span>`\n        : `<span class=\"lily-mini-tag\">Select</span>`;\n    }\n    if (lilyConnector) lilyConnector.textContent = selectedConnector || \"Auto\";\n    if (lilyModelNote) {\n      const stock = selectedNativeVariant() ? inventoryInfo(selectedNativeVariant()).label : \"\";\n      lilyModelNote.textContent = selectedModel\n        ? `${selectedModel}: ${selectedConnector || \"Auto\"} connector. ${stock || fallbackNote}`\n        : fallbackNote;\n    }\n    if (lilyBrandMenu) {\n      lilyBrandMenu.innerHTML = brandEntries.length\n        ? brandEntries.map((entry) => {\n          const count = entries.filter((item) => item.brand === entry.brand).length;\n          return `<button type=\"button\" class=\"lily-menu-option${entry.brand === lilySelectedBrand ? \" is-active\" : \"\"}\" data-lily-brand=\"${escapeHtml(entry.brand)}\">\n            <strong>${escapeHtml(entry.brand)}</strong>\n            <small>${count} ${count === 1 ? \"fit\" : \"fits\"}</small>\n          </button>`;\n        }).join(\"\")\n        : `<div class=\"lily-menu-empty\">No phone model option</div>`;\n    }\n    if (lilyModelMenu) {\n      lilyModelMenu.innerHTML = visibleEntries.length\n        ? visibleEntries.map((entry) => `<button type=\"button\" class=\"lily-menu-option${entry.model === selectedModel ? \" is-active\" : \"\"}\" data-lily-model-value=\"${escapeHtml(entry.model)}\">\n          <strong>${escapeHtml(entry.model)}</strong>\n          <small>${escapeHtml(entry.connector)} / ${escapeHtml(entry.status.label)}</small>\n        </button>`).join(\"\")\n        : `<div class=\"lily-menu-empty\">No supported model for this brand</div>`;\n    }\n  }\n\n  function hasUnmappedSmartDevice(comboKey = state.combo) {\n    const combo = combos[comboKey];\n    return Boolean(\n      comboKey === state.combo\n      && smartSelection.model\n      && !customRequest.active\n      && !caseModelCanDriveInterface(comboKey)\n      && !combo?.noModel\n      && !combo?.accessoriesOnly\n    );\n  }\n\n  function renderNativeOptions() {\n    if (!nativeOptionsGroup || !nativeOptionsFields) return;\n    const context = activeProductContext();\n    const options = context?.options || [];\n    const usefulOptions = options.filter((option) => option.values?.length && !(context.hasOnlyDefaultVariant && option.values.length === 1));\n    const hasColorOption = options.some((option) => isColorOption(option));\n    const showColorUnavailable = Boolean(context && state.combo !== \"accessories\" && !hasColorOption);\n    if (!context || (!usefulOptions.length && !showColorUnavailable)) {\n      nativeOptionsGroup.hidden = true;\n      nativeOptionsFields.innerHTML = \"\";\n      if (interfaceTypePanel) interfaceTypePanel.hidden = true;\n      if (interfaceTypeOptions) interfaceTypeOptions.innerHTML = \"\";\n      return;\n    }\n    const selections = ensureNativeSelections();\n    const autoInterfaceIndex = interfaceOptionIndex(context);\n    const interfacePanelActive = Boolean(\n      state.combo === \"module\"\n      && interfaceTypePanel\n      && interfaceTypeOptions\n      && autoInterfaceIndex >= 0\n      && context.options?.[autoInterfaceIndex]?.values?.length\n    );\n    const modelIndex = nativeOptionIndex(context);\n    const lilyModelIndex = lilyModelOptionIndex(context);\n    const lilyManagesModel = shouldShowLilyModelSelector(context) && lilyModelIndex >= 0;\n    const selectedCaseModel = selectedModelValue();\n    const autoInterfaceLocked = Boolean(casePathUsesAutoInterface() && autoInterfaceIndex >= 0);\n    const autoInterfaceValue = autoInterfaceLocked\n      ? (selectedCaseModel ? autoSelectInterfaceFromModel(selectedCaseModel) : selections[autoInterfaceIndex] || \"\")\n      : \"\";\n    const variant = selectedNativeVariant();\n    const lacksModelOption = comboRequiresModel() && modelIndex < 0;\n    const modelDrivenInterface = Boolean(casePathUsesAutoInterface() && selectedCaseModel && autoInterfaceValue);\n    // Internal gate note: distinguish a manually clicked model from a current Shopify variant default.\n    const currentVariantDrivesInterface = Boolean(autoInterfaceLocked && !selectedCaseModel && autoInterfaceValue && variant);\n    const awaitingAutoModel = Boolean(autoInterfaceLocked && !autoInterfaceValue && comboRequiresModel() && !customRequest.active && !selectedVariantSatisfiesCasePath());\n    if (interfaceTypePanel && interfaceTypeOptions) {\n      interfaceTypePanel.hidden = !interfacePanelActive;\n      interfaceTypeOptions.innerHTML = \"\";\n      if (interfacePanelActive) {\n        const option = context.options[autoInterfaceIndex];\n        interfaceTypeOptions.setAttribute(\"role\", \"radiogroup\");\n        interfaceTypeOptions.setAttribute(\"aria-label\", option.name || \"Interface Type\");\n        interfaceTypeOptions.innerHTML = option.values.map((value) => {\n          const selected = value === selections[autoInterfaceIndex];\n          const optionState = moduleInterfaceValueState(context, autoInterfaceIndex, value, selections);\n          return `<button type=\"button\" role=\"radio\" class=\"native-interface-choice${selected ? \" is-selected\" : \"\"}${optionState.available ? \"\" : \" is-unavailable\"}\" data-native-option-index=\"${autoInterfaceIndex}\" data-native-option-value=\"${escapeHtml(value)}\" aria-checked=\"${selected ? \"true\" : \"false\"}\" aria-pressed=\"${selected ? \"true\" : \"false\"}\" aria-disabled=\"${optionState.valid ? \"false\" : \"true\"}\"${optionState.valid ? \"\" : \" disabled\"}>\n            ${escapeHtml(interfaceOptionLabel(value))}\n          </button>`;\n        }).join(\"\");\n      }\n    }\n    nativeOptionsGroup.hidden = false;\n    if (nativeOptionsHeading) nativeOptionsHeading.textContent = modelDrivenInterface || currentVariantDrivesInterface ? \"Auto-selected\" : \"Product options\";\n    const colorUnavailableField = showColorUnavailable && state.combo !== \"module\" ? `\n      <div class=\"native-option-field native-color-field is-na\">\n        <label>Color</label>\n        <div class=\"native-color-swatches\" role=\"group\" aria-label=\"Color\">\n          <span class=\"native-color-swatch is-na\" aria-disabled=\"true\">\n            <span class=\"swatch-chip\" style=\"--swatch-color: repeating-linear-gradient(135deg,#f3f4f6 0 6px,#e5e7eb 6px 12px)\"></span>\n            <span>N/A</span>\n          </span>\n        </div>\n        <small class=\"native-option-auto-note\">No color option is configured for this product.</small>\n      </div>\n    ` : \"\";\n    const optionEntries = options.map((option, index) => ({ option, index }));\n    if (state.combo === \"module\") {\n      optionEntries.sort((a, b) => {\n        const aName = String(a.option?.name || \"\").toLowerCase();\n        const bName = String(b.option?.name || \"\").toLowerCase();\n        const aRank = aName.includes(\"bundle\") ? 0 : a.index === autoInterfaceIndex ? 1 : 2;\n        const bRank = bName.includes(\"bundle\") ? 0 : b.index === autoInterfaceIndex ? 1 : 2;\n        return aRank - bRank || a.index - b.index;\n      });\n    }\n    nativeOptionsFields.innerHTML = colorUnavailableField + optionEntries.map(({ option, index }) => {\n      if (!option.values?.length) return \"\";\n      if (state.combo === \"module\" && isBundleOption(option)) return \"\";\n      if (state.combo === \"module\" && option.values.length === 1) return \"\";\n      if (interfacePanelActive && index === autoInterfaceIndex) return \"\";\n      if (lilyManagesModel && index === lilyModelIndex) return \"\";\n      if (customManagedNativeOptionIndex(context, index)) return \"\";\n      const selectId = `ire5-native-option-${index}`;\n      const lockedByModel = Boolean(autoInterfaceLocked && index === autoInterfaceIndex);\n      const colorOption = isColorOption(option);\n      const moduleInterfaceOption = false;\n      const autoSelectedInterface = autoInterfaceValue || selections[index] || \"\";\n      if (lockedByModel && !autoInterfaceValue) {\n        return `\n          <div class=\"native-option-field is-auto-locked\">\n            <label>${escapeHtml(option.name || `Option ${index + 1}`)} (auto)</label>\n            <div class=\"native-readonly-value\" aria-disabled=\"true\">Choose phone model first</div>\n            <small class=\"native-option-auto-note\">USB-C / Lightning follows the selected phone model for storage cases.</small>\n          </div>\n        `;\n      }\n      if (moduleInterfaceOption) {\n        return `\n          <div class=\"native-option-field native-interface-field is-auto-locked\">\n            <label>${escapeHtml(option.name || \"Interface Type\")}</label>\n            <div class=\"native-readonly-value native-interface-auto-value\" aria-disabled=\"true\">\n              <span>${escapeHtml(autoSelectedInterface || \"Auto\")}</span>\n            </div>\n            <small class=\"native-option-auto-note\">Selected from Phone Model. No manual step needed.</small>\n          </div>\n        `;\n      }\n      if (colorOption && !lockedByModel) {\n        return `\n          <div class=\"native-option-field native-color-field\">\n            <label>${escapeHtml(option.name || `Option ${index + 1}`)}</label>\n            <div class=\"native-color-swatches\" role=\"radiogroup\" aria-label=\"${escapeHtml(option.name || \"Color\")}\">\n              ${option.values.map((value) => {\n                const selected = value === selections[index];\n                const related = variantsForOptionValueWithinSelections(context, index, value, selections);\n                const available = related.some((item) => !inventoryInfo(item).blocksCart);\n                return `<button type=\"button\" class=\"native-color-swatch${selected ? \" is-selected\" : \"\"}${available ? \"\" : \" is-unavailable\"}\" data-native-option-index=\"${index}\" data-native-option-value=\"${escapeHtml(value)}\" aria-pressed=\"${selected ? \"true\" : \"false\"}\">\n                  <span class=\"swatch-chip\" style=\"--swatch-color: ${escapeHtml(colorSwatchStyle(value))}\"></span>\n                  <span>${escapeHtml(value)}</span>\n                  ${available ? \"\" : `<small>Out</small>`}\n                </button>`;\n              }).join(\"\")}\n            </div>\n          </div>\n        `;\n      }\n      return `\n        <div class=\"native-option-field${lockedByModel ? \" is-auto-locked\" : \"\"}\">\n          <label for=\"${selectId}\">${escapeHtml(option.name || `Option ${index + 1}`)}${lockedByModel ? \" (auto)\" : \"\"}</label>\n          <select id=\"${selectId}\" data-native-option-index=\"${index}\"${lockedByModel ? \" disabled\" : \"\"}>\n            ${option.values.map((value) => `<option value=\"${escapeHtml(value)}\"${value === selections[index] ? \" selected\" : \"\"}>${escapeHtml(value)}</option>`).join(\"\")}\n          </select>\n          ${lockedByModel ? `<small class=\"native-option-auto-note\">${selectedCaseModel ? `Selected for ${escapeHtml(selectedCaseModel)}.` : \"Selected from the current product option.\"}</small>` : \"\"}\n        </div>\n      `;\n    }).join(\"\");\n    const bindNativeOptionValueButtons = (container) => {\n      container?.querySelectorAll(\"[data-native-option-value]\").forEach((button) => {\n        button.addEventListener(\"click\", (event) => {\n          if (button.disabled || button.getAttribute(\"aria-disabled\") === \"true\") return;\n          const index = Number(button.dataset.nativeOptionIndex || 0);\n          const next = ensureNativeSelections();\n          if (state.combo === \"module\" && index === interfaceOptionIndex(activeProductContext())) {\n            const optionState = moduleInterfaceValueState(activeProductContext(), index, button.dataset.nativeOptionValue || \"\", next);\n            if (!optionState.valid) return;\n          }\n          next[index] = button.dataset.nativeOptionValue || \"\";\n          nativeSelections[state.combo] = next;\n          markNativeOptionTouched(state.combo, index);\n          customRequest.active = false;\n          smartSelection.brand = \"\";\n          smartSelection.model = \"\";\n          clearRequestGate();\n          state.model = selectedNativeDeviceLabel(state.combo, true) || state.model;\n          enableVariantMediaAfterUserAction(event);\n          updateProductUi();\n        });\n      });\n    };\n    if (!nativeOptionsFields.innerHTML.trim()) {\n      bindNativeOptionValueButtons(interfaceTypeOptions);\n      nativeOptionsGroup.hidden = true;\n      if (nativeOptionsMessage) nativeOptionsMessage.textContent = \"\";\n      return;\n    }\n    nativeOptionsFields.querySelectorAll(\"select[data-native-option-index]\").forEach((select) => {\n      select.addEventListener(\"change\", (event) => {\n        const index = Number(select.dataset.nativeOptionIndex || 0);\n        const next = ensureNativeSelections();\n        next[index] = select.value;\n        nativeSelections[state.combo] = next;\n        markNativeOptionTouched(state.combo, index);\n        customRequest.active = false;\n        smartSelection.brand = \"\";\n        smartSelection.model = \"\";\n        clearRequestGate();\n        state.model = selectedNativeDeviceLabel(state.combo, true) || state.model;\n        enableVariantMediaAfterUserAction(event);\n        updateProductUi();\n      });\n    });\n    [nativeOptionsFields, interfaceTypeOptions].forEach(bindNativeOptionValueButtons);\n    if (nativeOptionsMessage) {\n      nativeOptionsMessage.classList.toggle(\"is-warning\", !variant || !variant.available);\n      nativeOptionsMessage.textContent = variant?.available ? \"In stock\" : \"Sold out\";\n    }\n  }\n\n  function addonTotal() {\n    let total = 0;\n    state.addons.forEach((key) => {\n      const input = productRoot.querySelector(`input[name='addon'][value=\"${CSS.escape(key)}\"]`);\n      if (isCurrentProductAddonInput(input)) return;\n      total += Number(input?.dataset.addonPrice || 0) * addonQuantity(key);\n    });\n    return total;\n  }\n\n  function addonMsrpTotal() {\n    let total = 0;\n    state.addons.forEach((key) => {\n      const input = productRoot.querySelector(`input[name='addon'][value=\"${CSS.escape(key)}\"]`);\n      if (isCurrentProductAddonInput(input)) return;\n      const addonPrice = Number(input?.dataset.addonPrice || 0);\n      const addonCompareAtPrice = Number(input?.dataset.addonCompareAtPrice || addonPrice || 0);\n      total += addonCompareAtPrice * addonQuantity(key);\n    });\n    return total;\n  }\n\n  function carePrice() {\n    const input = productRoot.querySelector(\"input[name='care']:checked\");\n    return Number(input?.dataset.carePrice || 0);\n  }\n\n  function comboSubtotal(variantOverride = null) {\n    const variant = variantOverride || selectedNativeVariant();\n    const quantity = primaryCommerceQuantity();\n    if (variant?.price != null) return Number(variant.price) * quantity;\n    return combos[state.combo].price != null ? combos[state.combo].price * quantity : 0;\n  }\n\n  function comboMsrpSubtotal(variantOverride = null) {\n    const variant = variantOverride || selectedNativeVariant();\n    const quantity = primaryCommerceQuantity();\n    if (state.combo === \"accessories\") {\n      if (variant?.compareAtPrice != null) return Number(variant.compareAtPrice) * quantity;\n      return combos[state.combo].msrp != null ? combos[state.combo].msrp * quantity : 0;\n    }\n    if (variant?.compareAtPrice != null) return Number(variant.compareAtPrice) * quantity;\n    return combos[state.combo].msrp != null ? combos[state.combo].msrp * quantity : 0;\n  }\n\n  function total(variantOverride = null) {\n    if (state.combo === \"accessories\") return comboSubtotal(variantOverride) + addonTotal();\n    return comboSubtotal(variantOverride) + addonTotal() + carePrice() * primaryCommerceQuantity();\n  }\n\n  function selectedModelLabel() {\n    if (customRequest.active) return `${customRequest.brand} ${customRequest.model}`.trim();\n    if (smartSelection.model) return smartSelection.model;\n    const nativeDevice = selectedNativeDeviceLabel(state.combo, true) || selectedNativeDeviceLabel(state.combo, false);\n    if (nativeDevice) return nativeDevice;\n    return state.model || \"\";\n  }\n\n  function updateSelectedCards() {\n    productRoot.querySelectorAll(\".option-card, .model-card, .care-card, .addon-card, .pack-card\").forEach((card) => {\n      const input = card.querySelector(\"input\");\n      card.classList.toggle(\"is-selected\", Boolean(input?.checked));\n    });\n  }\n\n  function selectedOptionCard() {\n    return productRoot.querySelector(`input[name='combo'][value=\"${CSS.escape(state.combo)}\"]`)?.closest(\".option-card\") || null;\n  }\n\n  function syncGalleryThumbs() {\n    productRoot.querySelectorAll(\".thumb-item\").forEach((item) => {\n      item.classList.toggle(\"is-active\", Number(item.dataset.galleryIndex || -1) === galleryState.index);\n    });\n  }\n\n  function scrollActiveGalleryThumb(behavior = \"smooth\") {\n    if (!galleryThumbs) return;\n    const activeThumb = galleryThumbs.querySelector(`.thumb-item[data-gallery-index=\"${galleryState.index}\"]`);\n    if (!activeThumb) return;\n    const railRect = galleryThumbs.getBoundingClientRect();\n    const thumbRect = activeThumb.getBoundingClientRect();\n    const centeredLeft = thumbRect.left\n      - railRect.left\n      + galleryThumbs.scrollLeft\n      - (galleryThumbs.clientWidth - thumbRect.width) / 2;\n    galleryThumbs.scrollTo({ left: Math.max(0, centeredLeft), behavior });\n  }\n\n  function visibleGalleryThumbs() {\n    if (!galleryThumbs) return [];\n    const railRect = galleryThumbs.getBoundingClientRect();\n    return Array.from(galleryThumbs.querySelectorAll(\".thumb-item[data-gallery-index]\")).filter((thumb) => {\n      const rect = thumb.getBoundingClientRect();\n      return rect.right > railRect.left + 1 && rect.left < railRect.right - 1;\n    });\n  }\n\n  function galleryThumbEdgeTarget(button) {\n    if (!galleryThumbs || !button) return null;\n    const thumbs = Array.from(galleryThumbs.querySelectorAll(\".thumb-item[data-gallery-index]\"));\n    if (thumbs.length < 2) return null;\n    const visible = visibleGalleryThumbs();\n    if (!visible.length) return null;\n    const index = thumbs.indexOf(button);\n    if (index < 0) return null;\n    if (button === visible[visible.length - 1] && index < thumbs.length - 1) {\n      return thumbs[index + 1];\n    }\n    if (button === visible[0] && index > 0) {\n      return thumbs[Math.max(0, index - visible.length)];\n    }\n    return null;\n  }\n\n  function scrollGalleryThumbRailTo(target) {\n    if (!galleryThumbs || !target) return;\n    requestAnimationFrame(() => {\n      const railRect = galleryThumbs.getBoundingClientRect();\n      const targetRect = target.getBoundingClientRect();\n      const left = targetRect.left - railRect.left + galleryThumbs.scrollLeft;\n      galleryThumbs.scrollTo({ left: Math.max(0, left), behavior: \"smooth\" });\n    });\n  }\n\n  function selectedModelValue() {\n    return selectedExplicitModelValue() || selectedNativeDeviceLabel(state.combo, false);\n  }\n\n  /*\n   * Thread6 new test stage:\n   * Legacy fit-menu-shell rendering and fallback model grouping are test-only and commented out.\n   * Keep for source reference only; do not render or bind it in the current Lily Front test path.\n   *\n  function activeFitGroupIdLegacy() {\n    return modelSubnav?.querySelector(\"[data-fit-open-group].is-active\")?.dataset.fitOpenGroup || \"apple-phone-cases\";\n  }\n\n  function showFitGroupLegacy(groupId) {\n    if (!modelSubnav || !groupId) return;\n    let matched = false;\n    modelSubnav.querySelectorAll(\".fit-brand-group[id]\").forEach((group) => {\n      const isActive = group.id === groupId;\n      group.hidden = !isActive;\n      group.open = isActive;\n      matched = matched || isActive;\n    });\n    modelSubnav.querySelectorAll(\"[data-fit-open-group]\").forEach((button) => {\n      const isActive = button.dataset.fitOpenGroup === groupId;\n      button.classList.toggle(\"is-active\", isActive);\n      if (isActive) button.setAttribute(\"aria-current\", \"true\");\n      else button.removeAttribute(\"aria-current\");\n    });\n    if (matched && modelSubnavTitle) {\n      const activeLabel = modelSubnav.querySelector(`[data-fit-open-group=\"${CSS.escape(groupId)}\"]`)?.textContent?.trim();\n      modelSubnavTitle.textContent = activeLabel || \"Phone model\";\n    }\n  }\n\n  function syncModelSubnavLegacy() {\n    if (!modelSubnav) return;\n    const context = activeProductContext();\n    const modelIndex = nativeOptionIndex(context);\n    const modelOption = modelIndex >= 0 ? context.options[modelIndex] : null;\n    const show = Boolean(state.combo === \"case\" || state.combo === \"gen1\" || state.combo === \"creator\");\n    const hasNativeModelOption = Boolean(modelOption?.values?.length);\n    modelSubnav.hidden = !show;\n    modelSubnav.classList.toggle(\"is-visible\", show);\n    modelSubnav.classList.toggle(\"is-request-only\", show && !hasNativeModelOption);\n    modelSubnav.classList.toggle(\"is-shopify-model-list\", show && hasNativeModelOption);\n    if (!show) return;\n    if (modelSubnavTitle) modelSubnavTitle.textContent = hasNativeModelOption ? modelOption.name : \"Phone model\";\n    const grid = modelSubnavGrid || modelSubnav.querySelector(\".fit-series-grid\");\n    const generationKey = hasNativeModelOption ? `${state.combo}:${modelOption.name}:${modelOption.values.join(\"|\")}` : \"\";\n    if (grid && !hasNativeModelOption && grid.dataset.generatedFrom) {\n      grid.innerHTML = fallbackModelSubnavHtml;\n      grid.dataset.generatedFrom = \"\";\n    }\n    if (grid && hasNativeModelOption && grid.dataset.generatedFrom !== generationKey) {\n      const groups = modelOption.values.reduce((acc, value) => {\n        const label = String(value || \"\");\n        let group = \"Other\";\n        const iphone = label.match(/iPhone\\s*(\\d+)/i);\n        if (iphone) group = `iPhone ${iphone[1]}`;\n        else if (/galaxy|samsung/i.test(label)) group = \"Samsung Galaxy\";\n        else if (/pixel|google/i.test(label)) group = \"Google Pixel\";\n        else if (/oneplus|sony|nothing|motorola/i.test(label)) group = \"More phones\";\n        if (!acc[group]) acc[group] = [];\n        acc[group].push(value);\n        return acc;\n      }, {});\n      grid.dataset.generatedFrom = generationKey;\n      grid.innerHTML = Object.entries(groups).map(([group, values]) => `\n        <details class=\"fit-brand-group\" open>\n          <summary><span>${escapeHtml(group)}</span><small>${escapeHtml(modelOption.name)}</small></summary>\n          <div class=\"fit-brand-grid fit-brand-grid-compact\">\n            ${values.map((value) => {\n              const related = variantsForOptionValue(context, modelIndex, value);\n              const status = modelStatusForVariants(related);\n              return `<button class=\"fit-model-link\" type=\"button\" data-native-model-value=\"${escapeHtml(value)}\"><span>${escapeHtml(value)}</span><small class=\"fit-model-status ${status.className}\">${status.label}</small></button>`;\n            }).join(\"\")}\n          </div>\n        </details>\n      `).join(\"\");\n    }\n    if (grid && !hasNativeModelOption) {\n      grid.querySelectorAll(\"[data-model-label] .fit-model-status\").forEach((status) => {\n        status.textContent = \"Request path\";\n        status.className = \"fit-model-status is-request\";\n      });\n      showFitGroup(activeFitGroupId());\n    } else {\n      modelSubnav.querySelectorAll(\".fit-brand-group[id]\").forEach((group) => {\n        group.hidden = false;\n        group.open = true;\n      });\n    }\n    const selected = selectedModelValue();\n    const selectedButton = Array.from(modelSubnav.querySelectorAll(\"[data-native-model-value], [data-model-label]\")).find((button) => (\n      button.dataset.nativeModelValue === selected\n      || button.dataset.modelLabel === selected\n      || button.dataset.modelTarget === state.model\n    ));\n    const selectedLabel = selected || \"Choose model\";\n    const nativeVariant = selectedNativeVariant();\n    const selectedStatus = selectedButton?.querySelector(\".fit-model-status\")?.textContent?.trim() || (nativeVariant?.available ? \"In stock\" : \"Pre-order\");\n    const selectedNote = /in stock/i.test(selectedStatus)\n      ? \"In stock\"\n      : /out of stock|sold out/i.test(selectedStatus)\n        ? \"Out of stock / not enough inventory\"\n      : /request|counts/i.test(selectedStatus)\n        ? \"Request path / Owner review required\"\n      : /moq/i.test(selectedStatus)\n        ? \"MOQ preorder path / Owner ledger pending\"\n        : \"Pre-order / Owner ledger pending\";\n    modelSubnav.querySelectorAll(\"[data-native-model-value]\").forEach((button) => {\n      button.classList.toggle(\"is-active\", button.dataset.nativeModelValue === selected);\n    });\n    modelSubnav.querySelectorAll(\"[data-model-label]\").forEach((button) => {\n      button.classList.toggle(\"is-active\", button.dataset.modelLabel === selected || button.dataset.modelTarget === state.model);\n    });\n    if (selectedModelSummary) selectedModelSummary.textContent = selectedLabel;\n    if (selectedModelNote) selectedModelNote.textContent = selectedNote;\n  }\n  */\n\n  function syncComboQueryParam() {\n    if (!window.history?.replaceState) return;\n    const nextUrl = new URL(window.location.href);\n    nextUrl.searchParams.set(\"combo\", state.combo);\n    const variant = selectedNativeVariant();\n    if (variant?.id && state.variantMediaTouched) nextUrl.searchParams.set(\"variant\", variant.id);\n    else nextUrl.searchParams.delete(\"variant\");\n    window.history.replaceState({}, \"\", nextUrl);\n  }\n\n  function escapeHtml(value) {\n    return String(value || \"\").replace(/[&<>\"']/g, (char) => ({\n      \"&\": \"&amp;\",\n      \"<\": \"&lt;\",\n      \">\": \"&gt;\",\n      '\"': \"&quot;\",\n      \"'\": \"&#039;\",\n    })[char]);\n  }\n\n  function selectedQuantityChoiceButton() {\n    return quantityChoiceButtonForOptionValue(state.quantityOptionValue)\n      || Array.from(productRoot.querySelectorAll(\"[data-quantity-choice]\")).find((button) => (\n        Number(button.dataset.quantityChoice || 0) === state.quantity\n      ))\n      || null;\n  }\n\n  function quantityChoiceButtonForOptionValue(optionValue) {\n    if (!optionValue) return null;\n    return Array.from(productRoot.querySelectorAll(\"[data-quantity-choice]\")).find((button) => (\n      button.dataset.quantityOptionValue === optionValue\n    )) || null;\n  }\n\n  function quantityMediaForCurrentSelection(comboKey = state.combo) {\n    if (comboKey !== state.combo) return null;\n    if (quantitySelectionPending(comboKey)) return null;\n    const button = selectedQuantityChoiceButton();\n    const src = button?.dataset.quantityMediaSrc || \"\";\n    if (!src) return null;\n    return {\n      type: \"image\",\n      src,\n      thumb: button.dataset.quantityMediaThumb || src,\n      alt: button.dataset.quantityMediaAlt || button.textContent.trim() || \"iRe5 quantity product photo\",\n      quantityMedia: true,\n    };\n  }\n\n  function prependQuantityMedia(items, comboKey = state.combo) {\n    const quantityMedia = quantityMediaForCurrentSelection(comboKey);\n    if (!quantityMedia) return items;\n    const quantitySrc = quantityMedia.src || quantityMedia.thumb;\n    const dedupedItems = items.filter((item) => {\n      const itemSrc = item?.src || item?.thumb || \"\";\n      return itemSrc !== quantitySrc;\n    });\n    return [quantityMedia, ...dedupedItems];\n  }\n\n  function quantityMediaOnly(comboKey = state.combo) {\n    const quantityMedia = quantityMediaForCurrentSelection(comboKey);\n    return quantityMedia ? [quantityMedia] : [];\n  }\n\n  function appendQuantityMedia(items, comboKey = state.combo) {\n    const quantityMedia = quantityMediaForCurrentSelection(comboKey);\n    if (!quantityMedia) return items;\n    const quantitySrc = quantityMedia.src || quantityMedia.thumb;\n    const dedupedItems = items.filter((item) => {\n      const itemSrc = item?.src || item?.thumb || \"\";\n      return itemSrc !== quantitySrc;\n    });\n    return [...dedupedItems, quantityMedia];\n  }\n\n  function productGalleryItems(comboKey = state.combo, context = activeProductContext(comboKey)) {\n    const contextItems = Array.isArray(context?.media) ? context.media : [];\n    const legacyItems = Array.isArray(productMediaMap[comboKey]) ? productMediaMap[comboKey] : [];\n    return (contextItems.length ? contextItems : legacyItems).filter((item) => item && (item.src || item.thumb));\n  }\n\n  function mediaVariantIds(item) {\n    return Array.isArray(item?.variantIds)\n      ? item.variantIds.map((id) => String(id)).filter(Boolean)\n      : [];\n  }\n\n  function initialProductLevelGalleryItems(items) {\n    const imageLeadIndex = items.findIndex((item) => item?.type === \"image\" && !mediaVariantIds(item).length);\n    const leadIndex = imageLeadIndex >= 0\n      ? imageLeadIndex\n      : items.findIndex((item) => !mediaVariantIds(item).length);\n    if (leadIndex <= 0) return items;\n    return [items[leadIndex], ...items.slice(0, leadIndex), ...items.slice(leadIndex + 1)];\n  }\n\n  function mediaMatchesVariant(item, variant) {\n    const ids = mediaVariantIds(item);\n    if (!ids.length) return true;\n    return Boolean(variant?.id && ids.includes(String(variant.id)));\n  }\n\n  function variantScopedGalleryItems(items, variant) {\n    if (!variant?.id) return items;\n    return items.filter((item) => mediaMatchesVariant(item, variant));\n  }\n\n  function productLevelGalleryItems(items) {\n    return items.filter((item) => !mediaVariantIds(item).length);\n  }\n\n  function prependSelectedVariantMedia(items, media) {\n    if (!media || !(media.src || media.thumb)) return items;\n    const mediaId = media.id != null ? String(media.id) : \"\";\n    const mediaSrc = media.src || \"\";\n    const mediaThumb = media.thumb || \"\";\n    const dedupedItems = items.filter((item) => {\n      const itemId = item?.id != null ? String(item.id) : \"\";\n      const itemSrc = item?.src || \"\";\n      const itemThumb = item?.thumb || \"\";\n      if (mediaId && itemId === mediaId) return false;\n      return itemSrc !== mediaSrc && itemSrc !== mediaThumb && itemThumb !== mediaSrc && itemThumb !== mediaThumb;\n    });\n    return [media, ...dedupedItems];\n  }\n\n  function collapsedInitialGalleryItems(items) {\n    if (galleryState.expanded || items.length <= INITIAL_GALLERY_MEDIA_LIMIT) return items;\n    return items.slice(0, COLLAPSED_GALLERY_MEDIA_LIMIT);\n  }\n\n  function galleryHasMoreItems(comboKey = state.combo) {\n    return !galleryState.expanded && fullGalleryItemsForCombo(comboKey).length > INITIAL_GALLERY_MEDIA_LIMIT;\n  }\n\n  function selectedGalleryVariantId(comboKey = state.combo) {\n    const variant = selectedNativeVariant(comboKey);\n    return variant?.id ? String(variant.id) : \"\";\n  }\n\n  function selectedVariantMediaForGallery(variant) {\n    if (variant?.featuredMedia?.src || variant?.featuredMedia?.thumb) return variant.featuredMedia;\n    const variantId = variant?.id || resolvePrimaryVariantId();\n    const src = variantId ? variantMediaMap[variantId] : \"\";\n    if (!src) return null;\n    return {\n      type: \"image\",\n      src,\n      thumb: src,\n      alt: variant?.title || selectedOptionCard()?.dataset.optionAlt || \"iRe5 Shopify variant photo\",\n    };\n  }\n\n  function fullGalleryItemsForCombo(comboKey = state.combo) {\n    const currentAccessoryContext = comboKey === \"accessories\" ? activeProductContext(comboKey) : null;\n    if (!skuBound[comboKey] && !currentAccessoryContext) return [];\n    if (imageSourceRule === \"placeholder\") return [];\n    if (hasUnmappedSmartDevice(comboKey)) return [];\n    const context = activeProductContext(comboKey);\n    const productItems = productGalleryItems(comboKey, context);\n    if (quantitySelectionPending(comboKey)) {\n      return initialProductLevelGalleryItems(productLevelGalleryItems(productItems));\n    }\n    const variant = selectedNativeVariant(comboKey);\n    if (context?.variants?.length && !variant) return [];\n\n    const quantityVariantMediaActive = imageSourceRule === \"shopify_variant\"\n      && comboKey === state.combo\n      && state.quantityChoiceTouched;\n\n    if (imageSourceRule === \"shopify_variant\") {\n      const baseProductItems = initialProductLevelGalleryItems(productLevelGalleryItems(productItems));\n      const selectedVariantMedia = selectedVariantMediaForGallery(variant);\n      let variantFirstItems = selectedVariantMedia\n        ? prependSelectedVariantMedia(baseProductItems, selectedVariantMedia)\n        : baseProductItems;\n      if (!state.variantMediaTouched) {\n        variantFirstItems = initialProductLevelGalleryItems(variantFirstItems);\n      }\n      if (quantityVariantMediaActive && !selectedVariantMedia) {\n        variantFirstItems = appendQuantityMedia(variantFirstItems, comboKey);\n      }\n      return variantFirstItems.length ? variantFirstItems : [];\n    }\n\n    const items = productItems;\n    if (items.length) return prependQuantityMedia(items, comboKey);\n    return variant?.featuredMedia?.src ? prependQuantityMedia([variant.featuredMedia], comboKey) : quantityMediaOnly(comboKey);\n  }\n\n  function galleryItemsForCombo(comboKey = state.combo) {\n    return collapsedInitialGalleryItems(fullGalleryItemsForCombo(comboKey));\n  }\n\n  function renderGalleryThumbs(items, hasMore = false) {\n    if (!galleryThumbs) return;\n    if (!items.length) {\n      galleryThumbs.innerHTML = '<button class=\"thumb-item is-missing is-active\" type=\"button\" disabled><span>Add SKU image +</span><small>Required</small></button>';\n      return;\n    }\n    const mediaButtons = items.map((item, index) => {\n      const mediaClass = item.type === \"video\" || item.type === \"external_video\"\n        ? \" thumb-item-video\"\n        : item.type === \"model\" ? \" thumb-item-model\" : \"\";\n      return `\n      <button class=\"thumb-item${mediaClass}${index === galleryState.index ? \" is-active\" : \"\"}\" type=\"button\" data-gallery-index=\"${index}\" aria-label=\"Show SKU media ${index + 1}\">\n        ${item.thumb || item.src ? `<img src=\"${escapeHtml(item.thumb || item.src)}\" alt=\"${escapeHtml(item.alt || \"iRe5 SKU product media\")}\" loading=\"lazy\">` : \"<span>Media</span>\"}\n      </button>\n    `;\n    }).join(\"\");\n    const viewMoreButton = hasMore\n      ? '<button class=\"thumb-item thumb-item-view-more\" type=\"button\" data-gallery-view-more aria-label=\"View more SKU media\"><span>View more</span><small>More media</small></button>'\n      : \"\";\n    galleryThumbs.innerHTML = mediaButtons + viewMoreButton;\n  }\n\n  function productMediaForCartLine(comboKey = state.combo) {\n    const context = activeProductContext(comboKey);\n    const contextItems = Array.isArray(context?.media) ? context.media : [];\n    const legacyItems = Array.isArray(productMediaMap[comboKey]) ? productMediaMap[comboKey] : [];\n    const items = (contextItems.length ? contextItems : legacyItems).filter((item) => item && (item.thumb || item.src));\n    return items.find((item) => item.type === \"image\" && (item.thumb || item.src)) || items[0] || null;\n  }\n\n  function floatingMediaForCurrentSelection() {\n    if (imageSourceRule === \"placeholder\" || hasUnmappedSmartDevice()) return null;\n    const variant = selectedNativeVariant();\n    if (variant?.featuredMedia?.thumb || variant?.featuredMedia?.src) return variant.featuredMedia;\n    const variantId = variant?.id || resolvePrimaryVariantId();\n    const mappedSrc = variantId ? variantMediaMap[variantId] : \"\";\n    if (mappedSrc) {\n      return {\n        type: \"image\",\n        src: mappedSrc,\n        thumb: mappedSrc,\n        alt: variant?.title || selectedOptionCard()?.dataset.optionAlt || \"iRe5 Shopify variant photo\",\n      };\n    }\n    const productMedia = productMediaForCartLine();\n    return productMedia || null;\n  }\n\n  function syncFloatingImage() {\n    if (!floatingImage) return;\n    const media = floatingMediaForCurrentSelection();\n    if (media?.thumb || media?.src) {\n      floatingImage.hidden = false;\n      floatingImage.src = media.thumb || media.src;\n      floatingImage.alt = media.alt || selectedOptionCard()?.dataset.optionAlt || \"iRe5 Shopify variant photo\";\n    } else {\n      floatingImage.hidden = true;\n      floatingImage.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACw=\";\n    }\n  }\n\n  function setGalleryIndex(index, suppliedItems, options = {}) {\n    const items = suppliedItems || galleryItemsForCombo();\n    const hasItems = items.length > 0;\n    galleryState.index = hasItems ? Math.max(0, Math.min(index, items.length - 1)) : 0;\n    const current = hasItems ? items[galleryState.index] : null;\n\n    if (mainGalleryImage) {\n      mainGalleryImage.hidden = true;\n      mainGalleryImage.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACw=\";\n    }\n    if (mainGalleryVideo) {\n      mainGalleryVideo.hidden = true;\n      mainGalleryVideo.removeAttribute(\"src\");\n      mainGalleryVideo.removeAttribute(\"poster\");\n    }\n    if (mainGalleryEmbed) {\n      mainGalleryEmbed.hidden = true;\n      mainGalleryEmbed.removeAttribute(\"src\");\n    }\n    if (mainGalleryModel) {\n      mainGalleryModel.hidden = true;\n      mainGalleryModel.innerHTML = \"\";\n    }\n    if (current?.src && current.type === \"video\" && mainGalleryVideo) {\n      mainGalleryVideo.hidden = false;\n      mainGalleryVideo.src = current.src;\n      if (current.thumb) mainGalleryVideo.poster = current.thumb;\n      mainGalleryVideo.load();\n    } else if (current?.src && current.type === \"external_video\" && mainGalleryEmbed) {\n      mainGalleryEmbed.hidden = false;\n      mainGalleryEmbed.src = current.src;\n    } else if (current?.type === \"model\" && mainGalleryModel) {\n      const modelTemplate = current.id != null && galleryMediaTemplates\n        ? Array.from(galleryMediaTemplates.querySelectorAll(\"[data-gallery-media-template]\")).find((template) => String(template.dataset.galleryMediaTemplate) === String(current.id))\n        : null;\n      if (modelTemplate?.content) {\n        mainGalleryModel.hidden = false;\n        mainGalleryModel.appendChild(modelTemplate.content.cloneNode(true));\n      } else if (mainGalleryImage && (current?.src || current?.thumb)) {\n        mainGalleryImage.hidden = false;\n        mainGalleryImage.src = current.src || current.thumb;\n        mainGalleryImage.alt = current.alt || selectedOptionCard()?.dataset.optionAlt || \"iRe5 SKU product photo\";\n      }\n    } else if (mainGalleryImage) {\n      if (current?.src || current?.thumb) {\n        mainGalleryImage.hidden = false;\n        mainGalleryImage.src = current.src || current.thumb;\n        mainGalleryImage.alt = current.alt || selectedOptionCard()?.dataset.optionAlt || \"iRe5 SKU product photo\";\n      }\n    }\n    if (galleryPlaceholder) {\n      galleryPlaceholder.hidden = hasItems;\n      galleryPlaceholder.classList.toggle(\"is-hidden\", hasItems);\n    }\n    if (galleryCounter) {\n      galleryCounter.hidden = !hasItems;\n      galleryCounter.textContent = hasItems ? `${galleryState.index + 1}/${items.length}` : \"\";\n    }\n    if (galleryPrev) galleryPrev.hidden = items.length < 2;\n    if (galleryNext) galleryNext.hidden = items.length < 2;\n    syncFloatingImage();\n    syncGalleryThumbs();\n    if (options.scrollThumb !== false) scrollActiveGalleryThumb();\n  }\n\n  function stepGallery(direction) {\n    const items = galleryItemsForCombo();\n    if (items.length < 2) return;\n    const next = (galleryState.index + direction + items.length) % items.length;\n    setGalleryIndex(next, items);\n  }\n\n  function syncSkuMedia() {\n    const comboChanged = galleryState.combo !== state.combo;\n    const nextVariantId = selectedGalleryVariantId();\n    const variantChanged = galleryState.variantId !== nextVariantId;\n    galleryState.combo = state.combo;\n    galleryState.quantity = state.quantity;\n    galleryState.variantId = nextVariantId;\n    if (comboChanged || variantChanged) {\n      galleryState.index = 0;\n      galleryState.expanded = false;\n    }\n    const items = galleryItemsForCombo();\n    if (galleryState.index >= items.length) galleryState.index = 0;\n    renderGalleryThumbs(items, galleryHasMoreItems());\n    setGalleryIndex(galleryState.index, items);\n  }\n\n  function syncAddonStockCards() {\n    productRoot.querySelectorAll(\"input[name='addon']\").forEach((input) => {\n      const stock = addonInputInventoryInfo(input, addonQuantity(input.value));\n      const card = input.closest(\".addon-card\");\n      const isCurrentProductAddon = isCurrentProductAddonInput(input);\n      card?.toggleAttribute(\"hidden\", isCurrentProductAddon);\n      if (isCurrentProductAddon) {\n        input.checked = false;\n        state.addons.delete(input.value);\n        state.addonQuantities[input.value] = 0;\n        return;\n      }\n      const stockNode = card?.querySelector(\"[data-addon-stock]\");\n      card?.classList.toggle(\"is-stock\", stock.className === \"is-stock\");\n      card?.classList.toggle(\"is-low-stock\", stock.className === \"is-low\");\n      card?.classList.toggle(\"is-preorder\", stock.className === \"is-preorder\");\n      card?.classList.toggle(\"is-unavailable\", stock.blocksCart);\n      if (stockNode) {\n        stockNode.textContent = stock.label;\n        stockNode.className = `addon-stock ${stock.className}`;\n      }\n      if (input.dataset.addonVariantId) input.disabled = stock.blocksCart && !state.addons.has(input.value);\n      card?.querySelectorAll(\"[data-addon-qty]\").forEach((button) => {\n        const delta = Number(button.dataset.addonQtyDelta || 0);\n        button.disabled = Boolean((input.disabled && !input.checked) || (delta < 0 && addonQuantity(input.value) <= 0));\n      });\n      if (stock.blocksCart && !stock.quantityInsufficient && state.addons.has(input.value)) {\n        input.checked = false;\n        state.addons.delete(input.value);\n      }\n    });\n    syncAddonPanelVisibility();\n  }\n\n  function updateProductUi() {\n    const combo = combos[state.combo];\n    const isModule = combo.noModel && state.combo === \"module\";\n    const isGen1 = state.combo === \"gen1\";\n    const isAccessories = combo.accessoriesOnly;\n    const explicitModel = selectedModelValue();\n    const needsExplicitModel = Boolean(!isModule && !isAccessories && casePathNeedsExplicitModel());\n    const modelDrivenInterface = Boolean(!isModule && !isAccessories && explicitModel && autoSelectInterfaceFromModel(explicitModel));\n    const quantityPending = quantitySelectionPending();\n    enforceModuleInterfaceSelection();\n    const nativeVariant = selectedNativeVariant();\n    const pendingDirectAccessoryVariant = isAccessories && quantityPending && isDirectAccessoryProductPath()\n      ? defaultVariantForContext(activeProductContext())\n      : null;\n    const pricingVariant = nativeVariant || pendingDirectAccessoryVariant;\n    const variantGeneration = selectedVariantGeneration();\n    syncComboMetaFromProductContexts();\n    const primarySubtotal = comboSubtotal(pricingVariant);\n    const currentTotal = total(pricingVariant);\n    const msrp = comboMsrpSubtotal(pricingVariant);\n    const primaryStock = inventoryInfo(nativeVariant, primaryCommerceQuantity());\n    syncAddonStockCards();\n    const addonIssue = selectedAddonStockIssue();\n    const missingAccessoryPrimary = Boolean(isAccessories && !quantityPending && !resolvePrimaryVariantId());\n    const hasPrimaryPrice = Boolean(\n      pricingVariant?.price != null\n      || (!isAccessories && combo.price != null)\n    );\n\n    document.body.classList.toggle(\"module-order-active\", isModule);\n    document.body.classList.toggle(\"gen1-order-active\", isGen1);\n    document.body.classList.toggle(\"accessories-order-active\", isAccessories);\n    productRoot.classList.toggle(\"module-order-active\", isModule);\n    productRoot.classList.toggle(\"gen1-order-active\", isGen1);\n    productRoot.classList.toggle(\"accessories-order-active\", isAccessories);\n    productRoot.dataset.selectedVariantGeneration = variantGeneration;\n    productRoot.dataset.selectedVariantGenerationSource = \"variant.sku\";\n    if (heading) heading.textContent = combo.title;\n    if (floatingTitle) floatingTitle.textContent = combo.title;\n    if (productPathHeading) productPathHeading.textContent = isModule ? \"Bundle\" : \"Selected product\";\n    const stockMeta = addonIssue ? addonIssue.stock.shortLabel : (nativeVariant ? primaryStock.shortLabel : \"\");\n    const requestLocked = requestBlocksCart();\n    if (floatingMeta) floatingMeta.textContent = stockMeta ? `${combo.meta} / ${stockMeta}` : combo.meta;\n    if (floatingTotal) floatingTotal.textContent = hasPrimaryPrice ? money(currentTotal) : \"Bind SKU\";\n    if (totalLabel) {\n      totalLabel.textContent = state.addons.size ? \"Total with add-ons\" : \"Total\";\n      const totalRow = totalLabel.parentElement;\n      if (totalRow) totalRow.style.display = state.addons.size ? \"flex\" : \"\";\n    }\n    if (currentPathTitle) currentPathTitle.textContent = combo.title;\n    if (currentPathMeta) currentPathMeta.textContent = stockMeta ? `${combo.meta} / ${stockMeta}` : combo.meta;\n    if (currentPathPrice) currentPathPrice.textContent = hasPrimaryPrice ? money(comboSubtotal()) : \"Bind SKU\";\n    currentPathLinks.forEach((link) => {\n      const isActive = link.dataset.pathLink === state.combo;\n      link.classList.toggle(\"is-active\", isActive);\n      if (isActive) link.setAttribute(\"aria-current\", \"page\");\n      else link.removeAttribute(\"aria-current\");\n    });\n    if (quantityValue) quantityValue.textContent = state.quantity;\n    productRoot.querySelectorAll(\"[data-quantity-choice]\").forEach((button) => {\n      const selected = !quantityPending && (\n        state.quantityOptionValue\n          ? button.dataset.quantityOptionValue === state.quantityOptionValue\n          : Number(button.dataset.quantityChoice || 0) === state.quantity\n      );\n      button.classList.toggle(\"is-selected\", selected);\n      button.setAttribute(\"aria-pressed\", selected ? \"true\" : \"false\");\n    });\n    if (phoneTypeOptions) phoneTypeOptions.dataset.selectedPhoneType = state.phoneType;\n    productRoot.querySelectorAll(\"[data-phone-type-choice]\").forEach((button) => {\n      const selected = button.dataset.phoneTypeChoice === state.phoneType;\n      button.classList.toggle(\"is-selected\", selected);\n      button.setAttribute(\"aria-pressed\", selected ? \"true\" : \"false\");\n    });\n    productRoot.querySelectorAll(\"[data-addon-qty-value]\").forEach((node) => {\n      node.textContent = addonQuantity(node.dataset.addonQtyValue);\n    });\n    if (modelGroup) modelGroup.hidden = true;\n    if (packGroup) packGroup.hidden = true;\n    if (careGroup) careGroup.hidden = isAccessories;\n    const totalMsrp = msrp && carePrice() === 0 ? msrp + addonMsrpTotal() : null;\n    priceNodes.forEach((node) => {\n      const isOrderTotal = Boolean(node.closest(\".buy-actions-panel\"));\n      const displayedPrice = isOrderTotal ? currentTotal : primarySubtotal;\n      const displayedMsrp = isOrderTotal ? totalMsrp : msrp;\n      node.innerHTML = hasPrimaryPrice\n        ? formatPriceHtml(displayedPrice, displayedMsrp)\n        : `<span class=\"price-current\">Bind SKU product</span>`;\n    });\n\n    const activeContext = activeProductContext();\n    const shippingLeadTimeResult = shippingLeadTimeForContext(activeContext);\n    const shippingLeadTime = shippingLeadTimeResult.value;\n    const ownerShippingAssurance = ownerShippingAssuranceForValue(shippingLeadTime);\n    const ownerBenefitProductId = String(activeContext?.id || \"\");\n    let ownerBenefitsEnabled = false;\n    ownerBenefitStacks.forEach((stack) => {\n      const approvedIds = String(stack.dataset.ownerBenefitProductIds || \"\").split(\",\").filter(Boolean);\n      const stackEnabled = approvedIds.includes(ownerBenefitProductId);\n      stack.hidden = !stackEnabled;\n      ownerBenefitsEnabled = ownerBenefitsEnabled || stackEnabled;\n    });\n    ownerShippingAssuranceNodes.forEach((node) => {\n      node.textContent = ownerShippingAssurance;\n    });\n    ownerShippingAssuranceRows.forEach((row) => {\n      row.hidden = !ownerBenefitsEnabled || !ownerShippingAssurance;\n    });\n    if (isShopifyDesignMode) {\n      productRoot.dataset.shippingLeadTimeSource = shippingLeadTimeResult.source;\n      productRoot.dataset.shippingLeadTimeState = shippingLeadTimeResult.state;\n      productRoot.dataset.shippingLeadTimeReleaseGate = shippingLeadTimeResult.releaseGate;\n      productRoot.dataset.shippingLeadTimeDiagnostic = shippingLeadTimeResult.diagnostic;\n      productRoot.dataset.shippingLeadTimeProductId = shippingLeadTimeResult.productId;\n      productRoot.classList.toggle(\"shipping-lead-time-missing\", shippingLeadTimeResult.state !== \"valid\");\n      productRoot.classList.toggle(\"shipping-lead-time-release-blocked\", shippingLeadTimeResult.releaseGate === \"blocked\");\n    }\n    shippingLeadTimeNodes.forEach((node) => {\n      node.textContent = shippingLeadTime;\n    });\n    shippingLeadTimeRows.forEach((row) => {\n      row.hidden = !shippingLeadTime;\n    });\n    if (floatingMeta) {\n      floatingMeta.textContent = shippingLeadTime;\n      floatingMeta.hidden = !shippingLeadTime;\n    }\n    if (currentPathMeta) {\n      currentPathMeta.textContent = shippingLeadTime;\n      currentPathMeta.hidden = !shippingLeadTime;\n    }\n    const smartUnmatched = Boolean(smartSelection.model && !customRequest.active && !isModule && !isAccessories && !modelDrivenInterface);\n    const needsSkuBinding = Boolean(state.combo !== \"accessories\" && !skuBound[state.combo] && !customRequest.active);\n    const nativeBlocked = needsExplicitModel || smartUnmatched || Boolean(\n      activeContext\n      && !customRequest.active\n      && !quantityPending\n      && (!nativeVariant || nativeVariant.available === false || primaryStock.blocksCart)\n    );\n    const disabled = requestLocked || needsSkuBinding || missingAccessoryPrimary || Boolean(addonIssue) || nativeBlocked;\n    addCartButtons.forEach((button) => { button.disabled = disabled; });\n    buyNowButtons.forEach((button) => {\n      button.disabled = disabled;\n      button.textContent = requestLocked\n        ? requestGate.targetUrl\n          ? \"Go to matched product\"\n          : \"Finish model review\"\n        : needsSkuBinding\n        ? \"Bind SKU product\"\n        : missingAccessoryPrimary\n        ? \"Bind SKU product\"\n        : addonIssue\n        ? \"Not enough stock\"\n        : needsExplicitModel\n          ? \"Choose phone model\"\n        : smartUnmatched\n          ? \"Use Request Model\"\n          : quantityPending\n            ? \"Choose Quantity\"\n          : nativeBlocked\n            ? \"Not enough stock\"\n            : \"Add to Cart\";\n    });\n\n    const addonMitigationActive = selectedAddonRequestCount() > 0;\n    const dynamicCheckoutBaseEligible = !disabled\n      && !quantityPending\n      && !customRequest.active\n      && carePrice() <= 0;\n    syncDynamicCheckout({\n      eligible: dynamicCheckoutBaseEligible && !addonMitigationActive,\n      mitigated: dynamicCheckoutBaseEligible && addonMitigationActive,\n      variantId: resolvePrimaryVariantId(),\n      quantity: primaryCommerceQuantity(),\n      properties: lineItemPropertiesForCheckout(combo),\n    });\n\n    syncLilyModelSelector();\n    renderNativeOptions();\n    updateSelectedCards();\n    syncGalleryThumbs();\n    syncSkuMedia();\n    syncComboQueryParam();\n  }\n\n  function resolvePrimaryVariantId() {\n    if (customRequest.active) return \"\";\n    const nativeVariant = selectedNativeVariant();\n    if (nativeVariant?.id) return nativeVariant.id;\n    return \"\";\n  }\n\n  function selectedCareLabel() {\n    const input = productRoot.querySelector(\"input[name='care']:checked\");\n    return input?.closest(\".care-card\")?.querySelector(\"strong\")?.textContent?.trim() || \"\";\n  }\n\n  function refreshCartCount() {\n    return fetch(shopifyRoute(\"cart.js\"), { headers: { Accept: \"application/json\" } })\n      .then((response) => response.ok ? response.json() : null)\n      .then((cart) => {\n        if (!cart) return null;\n        document.querySelectorAll(\".cart-dot, .cart-count-bubble span[aria-hidden='true']\").forEach((node) => {\n          node.textContent = String(cart.item_count || 0);\n        });\n        return cart;\n      })\n      .catch(() => null);\n  }\n\n  const addCartButtonLabels = new WeakMap();\n  let addCartFeedbackTimer = null;\n\n  function rememberAddCartButtonLabels() {\n    cartActionButtons.forEach((button) => {\n      if (!addCartButtonLabels.has(button)) addCartButtonLabels.set(button, button.textContent);\n    });\n  }\n\n  function hideFloatingCartFeedback() {\n    if (!floatingCartFeedback) return;\n    floatingCartFeedback.hidden = true;\n    floatingCartFeedback.closest(\"[data-floating-product]\")?.classList.remove(\"has-cart-feedback\");\n  }\n\n  function restoreAddCartButtons() {\n    if (addCartFeedbackTimer) {\n      window.clearTimeout(addCartFeedbackTimer);\n      addCartFeedbackTimer = null;\n    }\n    cartActionButtons.forEach((button) => {\n      button.classList.remove(\"is-cart-pending\", \"is-cart-success\");\n      if (!button.matches(\"[data-buy-now]\")) button.textContent = addCartButtonLabels.get(button) || \"Add to Cart\";\n    });\n    hideFloatingCartFeedback();\n    updateProductUi();\n  }\n\n  function setAddCartPending() {\n    rememberAddCartButtonLabels();\n    if (addCartFeedbackTimer) {\n      window.clearTimeout(addCartFeedbackTimer);\n      addCartFeedbackTimer = null;\n    }\n    hideFloatingCartFeedback();\n    cartActionButtons.forEach((button) => {\n      button.classList.remove(\"is-cart-success\");\n      button.classList.add(\"is-cart-pending\");\n      button.disabled = true;\n      button.textContent = \"Adding...\";\n    });\n  }\n\n  function showCartSuccessFeedback() {\n    if (cartMessage) cartMessage.innerHTML = `Added to cart. <a href=\"${shopifyRoute(\"cart\")}\">View cart</a>`;\n    if (floatingCartFeedback) {\n      floatingCartFeedback.href = shopifyRoute(\"cart\");\n      floatingCartFeedback.hidden = false;\n      floatingCartFeedback.closest(\"[data-floating-product]\")?.classList.add(\"has-cart-feedback\");\n    }\n    updateProductUi();\n    cartActionButtons.forEach((button) => {\n      button.classList.remove(\"is-cart-pending\");\n      button.classList.add(\"is-cart-success\");\n      button.textContent = \"Added\";\n    });\n    addCartFeedbackTimer = window.setTimeout(restoreAddCartButtons, 4200);\n  }\n\n  function cartDrawerSections() {\n    const cartDrawer = document.querySelector(\"cart-drawer\");\n    if (!cartDrawer?.getSectionsToRender) return null;\n    return {\n      drawer: cartDrawer,\n      sections: cartDrawer.getSectionsToRender().map((section) => section.id),\n    };\n  }\n\n  async function refreshCartDrawerFromShopify() {\n    const drawerRequest = cartDrawerSections();\n    if (!drawerRequest) return null;\n    const root = window.Shopify?.routes?.root || \"/\";\n    const normalizedRoot = root.endsWith(\"/\") ? root : `${root}/`;\n    const sectionQuery = drawerRequest.sections.map((section) => encodeURIComponent(section)).join(\",\");\n    const [sectionsResponse, cartResponse] = await Promise.all([\n      fetch(`${normalizedRoot}?sections=${sectionQuery}`, { headers: { Accept: \"application/json\" } }),\n      fetch(shopifyRoute(\"cart.js\"), { headers: { Accept: \"application/json\" } }),\n    ]);\n    if (!sectionsResponse.ok || !cartResponse.ok) return null;\n    const sections = await sectionsResponse.json().catch(() => null);\n    const cart = await cartResponse.json().catch(() => null);\n    if (!sections || !cart) return null;\n    document.querySelectorAll(\".cart-dot, .cart-count-bubble span[aria-hidden='true']\").forEach((node) => {\n      node.textContent = String(cart.item_count || 0);\n    });\n    return { ...cart, sections };\n  }\n\n  function forceOpenCartDrawer(cartDrawer) {\n    if (!cartDrawer) return false;\n    cartDrawer.classList.remove(\"is-empty\");\n    if (cartDrawer.open) {\n      cartDrawer.open();\n    } else {\n      cartDrawer.classList.add(\"animate\", \"active\");\n      document.body.classList.add(\"overflow-hidden\");\n    }\n    return true;\n  }\n\n  function openCartDrawer(parsedState) {\n    const cartDrawer = document.querySelector(\"cart-drawer\");\n    if (!cartDrawer) return false;\n    if (parsedState?.sections && cartDrawer.renderContents) {\n      try {\n        cartDrawer.renderContents(parsedState);\n        return true;\n      } catch (error) {\n        console.warn(\"iRe5 cart drawer render failed; opening existing drawer instead.\", error);\n        return forceOpenCartDrawer(cartDrawer);\n      }\n    }\n    if (forceOpenCartDrawer(cartDrawer)) {\n      return true;\n    }\n    return false;\n  }\n\n  async function openCurrentCartDrawer(parsedState) {\n    try {\n      const currentState = await refreshCartDrawerFromShopify();\n      if (currentState?.sections) return openCartDrawer(currentState);\n    } catch (error) {\n      console.warn(\"iRe5 current cart refresh failed; falling back to add response.\", error);\n    }\n    return openCartDrawer(parsedState);\n  }\n\n  function selectedAccessoryItems() {\n    const items = [];\n    state.addons.forEach((key) => {\n      const input = productRoot.querySelector(`input[name='addon'][value=\"${CSS.escape(key)}\"]`);\n      if (isCurrentProductAddonInput(input)) return;\n      const variantId = input?.dataset.addonVariantId;\n      const quantity = addonQuantity(key);\n      if (quantity < 1) return;\n      if (variantId) {\n        const commerceKey = addonCommerceKey(input, key);\n        const commerceTitle = addonCommerceTitle(input, key);\n        const properties = { \"_iRe5 accessory path\": commerceKey || key };\n        if (commerceTitle) properties[\"_iRe5 accessory product\"] = commerceTitle;\n        if (key && commerceKey && key !== commerceKey) properties[\"_iRe5 accessory slot\"] = key;\n        items.push({\n          id: Number(variantId),\n          quantity,\n          properties,\n        });\n      }\n    });\n    return items;\n  }\n\n  async function addToCart(redirectToCheckout) {\n    const combo = combos[state.combo];\n    if (quantitySelectionPending()) {\n      if (cartMessage) cartMessage.textContent = \"Choose Quantity before adding to cart.\";\n      productRoot.querySelector(\"[data-quantity-choice]\")?.focus();\n      return;\n    }\n    if (state.combo !== \"accessories\" && !skuBound[state.combo]) {\n      if (cartMessage) cartMessage.textContent = \"This path needs a SKU product selected in Theme Editor before cart testing.\";\n      return;\n    }\n    const activeContext = activeProductContext();\n    const nativeVariant = selectedNativeVariant();\n    const primaryStock = inventoryInfo(nativeVariant, primaryCommerceQuantity());\n    const addonIssue = selectedAddonStockIssue();\n    if (requestBlocksCart()) {\n      const message = requestBlockMessage();\n      if (cartMessage) cartMessage.textContent = message;\n      if (requestGate.targetUrl) {\n        window.location.href = requestGate.targetUrl;\n      } else if (!requestModalIsOpen()) {\n        openRequestModelInline();\n      }\n      return;\n    }\n    if (casePathNeedsExplicitModel()) {\n      if (cartMessage) cartMessage.textContent = \"Choose a phone model first. USB-C / Lightning will follow the selected model automatically.\";\n      productRoot.querySelector(\"[data-lily-model-selector]\")?.scrollIntoView({ behavior: window.Shopify?.designMode ? \"auto\" : \"smooth\", block: \"center\" });\n      return;\n    }\n    if (customRequest.active) {\n      if (cartMessage) cartMessage.textContent = \"Request Model is an Owner review path. It does not add to cart until a real Shopify variant is approved.\";\n      openRequestModelInline();\n      return;\n    }\n    if (smartSelection.model && !customRequest.active && state.combo !== \"module\" && state.combo !== \"accessories\" && !caseModelCanDriveInterface()) {\n      if (cartMessage) cartMessage.textContent = `${smartSelection.model} is not mapped to a Shopify variant yet. Send Request Model for Owner review.`;\n      openRequestModelInline();\n      return;\n    }\n    if (activeContext && !customRequest.active && (!nativeVariant || nativeVariant.available === false || primaryStock.blocksCart)) {\n      if (cartMessage) cartMessage.textContent = !nativeVariant\n        ? \"This selected option is not configured as a Shopify variant.\"\n        : `Not enough stock. ${primaryStock.label}`;\n      return;\n    }\n    if (addonIssue) {\n      if (cartMessage) cartMessage.textContent = `Not enough stock. ${addonIssue.stock.label}`;\n      return;\n    }\n    if (carePrice() > 0) {\n      if (cartMessage) cartMessage.textContent = \"iRe5 Care needs a Shopify warranty variant or app before checkout.\";\n      return;\n    }\n    const properties = lineItemPropertiesForCheckout(combo);\n    if (carePrice() > 0) properties[\"iRe5 Care\"] = selectedCareLabel();\n    const items = selectedAccessoryItems();\n    const primaryVariantId = resolvePrimaryVariantId();\n\n    if (!primaryVariantId) {\n      if (cartMessage) cartMessage.textContent = \"This Shopify path needs a mapped variant ID before checkout.\";\n      return;\n    }\n    items.unshift({\n      id: Number(primaryVariantId),\n      quantity: primaryCommerceQuantity(),\n      properties,\n    });\n\n    const requestedAddonCount = selectedAddonRequestCount();\n    const selectedAddonLineCount = Math.max(0, items.length - 1);\n    if (requestedAddonCount && selectedAddonLineCount < requestedAddonCount) {\n      if (cartMessage) cartMessage.textContent = \"Selected accessories need SKU products and Shopify variant IDs before checkout.\";\n      return;\n    }\n\n    setAddCartPending();\n    const drawerRequest = cartDrawerSections();\n    const cartBody = { items };\n    if (drawerRequest) {\n      cartBody.sections = drawerRequest.sections;\n      cartBody.sections_url = window.location.pathname;\n      drawerRequest.drawer.setActiveElement?.(document.activeElement);\n    }\n    let parsedState = null;\n    try {\n      const response = await fetch(shopifyRoute(\"cart/add.js\"), {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n        body: JSON.stringify(cartBody),\n      });\n      parsedState = await response.json().catch(() => null);\n      if (!response.ok) {\n        throw new Error(parsedState?.description || parsedState?.message || \"Cart add failed\");\n      }\n      await refreshCartCount();\n    } catch (error) {\n      restoreAddCartButtons();\n      if (cartMessage) cartMessage.textContent = normalizeCartAddError(error?.message);\n      return;\n    }\n\n    if (redirectToCheckout) {\n      window.location.href = shopifyRoute(\"checkout\");\n      return;\n    }\n\n    showCartSuccessFeedback();\n    const drawerOpened = await openCurrentCartDrawer(parsedState);\n    if (!drawerOpened && cartMessage) {\n      cartMessage.innerHTML = `Added to cart. <a href=\"${shopifyRoute(\"cart\")}\">View cart</a> <a href=\"${shopifyRoute(\"checkout\")}\">Checkout</a>`;\n    }\n  }\n\n  productRoot.querySelectorAll(\"input[name='combo']\").forEach((input) => {\n    input.checked = input.value === state.combo;\n    input.addEventListener(\"change\", () => {\n      state.combo = input.value;\n      resetVariantSelectionToShopifyDefault(state.combo);\n      resetInitialGalleryMediaMode();\n      clearRequestGate();\n      updateProductUi();\n    });\n  });\n\n  productRoot.querySelectorAll(\"input[name='model']\").forEach((input) => {\n    if (initialModelKey && normalizeIntentKey(input.value) === initialModelKey) {\n      input.checked = true;\n      state.model = input.value;\n    }\n    input.addEventListener(\"change\", (event) => {\n      state.model = input.value;\n      customRequest.active = false;\n      smartSelection.brand = \"\";\n      smartSelection.model = \"\";\n      clearRequestGate();\n      enableVariantMediaAfterUserAction(event);\n      updateProductUi();\n    });\n  });\n\n  /*\n   * Thread6 new test stage:\n   * The hardcoded fallback model buttons were test data. Lily selector and Shopify options own\n   * model selection now, while Request More opens the review intake path.\n   *\n  function selectFallbackModelButtonLegacy(button) {\n    const modelValue = button.dataset.modelTarget || \"\";\n    const input = modelValue ? productRoot.querySelector(`input[name='model'][value=\"${CSS.escape(modelValue)}\"]`) : null;\n    if (input) {\n      input.checked = true;\n      state.model = input.value;\n    } else if (modelValue) {\n      state.model = modelValue;\n    }\n    const modelLabel = button.dataset.modelLabel || modelValue;\n    const matchedNative = setNativeDeviceSelection(modelLabel);\n    customRequest.active = false;\n    smartSelection.brand = matchedNative ? \"\" : inferDeviceBrand(modelLabel);\n    smartSelection.model = matchedNative ? \"\" : modelLabel;\n    if (![\"case\", \"gen1\", \"creator\"].includes(state.combo)) {\n      state.combo = \"case\";\n      state.quantityChoiceTouched = false;\n      const comboInput = productRoot.querySelector(\"input[name='combo'][value='case']\");\n      if (comboInput) comboInput.checked = true;\n    }\n    updateProductUi();\n  }\n\n  productRoot.querySelectorAll(\"[data-model-target]\").forEach((button) => {\n    if (button.closest(\"[data-model-subnav]\")) return;\n    button.addEventListener(\"click\", () => {\n      selectFallbackModelButton(button);\n      const statusTarget = productRoot.querySelector(\".buy-panel\");\n      statusTarget?.scrollIntoView({ behavior: window.Shopify?.designMode ? \"auto\" : \"smooth\", block: \"center\" });\n    });\n  });\n\n  modelSubnav?.addEventListener(\"click\", (event) => {\n    const groupButton = event.target.closest(\"[data-fit-open-group]\");\n    if (groupButton) {\n      event.preventDefault();\n      showFitGroup(groupButton.dataset.fitOpenGroup);\n      return;\n    }\n    const requestButton = event.target.closest(\"[data-model-request-more]\");\n    if (requestButton) {\n      openRequestModelInline();\n      return;\n    }\n    const fallbackButton = event.target.closest(\"[data-model-target]\");\n    if (fallbackButton) {\n      selectFallbackModelButton(fallbackButton);\n      productRoot.querySelector(\".buy-panel\")?.scrollIntoView({ behavior: window.Shopify?.designMode ? \"auto\" : \"smooth\", block: \"center\" });\n      return;\n    }\n    const button = event.target.closest(\"[data-native-model-value]\");\n    if (!button) return;\n    const modelValue = button.dataset.nativeModelValue || \"\";\n    const context = activeProductContext();\n    const index = nativeOptionIndex(context);\n    if (index >= 0 && modelValue) {\n      const selections = ensureNativeSelections();\n      selections[index] = modelValue;\n      nativeSelections[state.combo] = selections;\n      markNativeOptionTouched(state.combo, index);\n      state.model = modelValue;\n      customRequest.active = false;\n      smartSelection.brand = \"\";\n      smartSelection.model = \"\";\n      updateProductUi();\n      productRoot.querySelector(\".buy-panel\")?.scrollIntoView({ behavior: window.Shopify?.designMode ? \"auto\" : \"smooth\", block: \"center\" });\n    }\n  });\n  */\n\n  lilyModelSelector?.addEventListener(\"click\", (event) => {\n    const brandToggle = event.target.closest(\"[data-toggle-brand]\");\n    if (brandToggle) {\n      event.preventDefault();\n      const nextOpen = !lilyBrandMenu?.classList.contains(\"is-open\");\n      lilyModelMenu?.classList.remove(\"is-open\");\n      lilyBrandMenu?.classList.toggle(\"is-open\", nextOpen);\n      brandToggle.setAttribute(\"aria-expanded\", nextOpen ? \"true\" : \"false\");\n      productRoot.querySelector(\"[data-toggle-model]\")?.setAttribute(\"aria-expanded\", \"false\");\n      return;\n    }\n\n    const modelToggle = event.target.closest(\"[data-toggle-model]\");\n    if (modelToggle) {\n      event.preventDefault();\n      const nextOpen = !lilyModelMenu?.classList.contains(\"is-open\");\n      lilyBrandMenu?.classList.remove(\"is-open\");\n      lilyModelMenu?.classList.toggle(\"is-open\", nextOpen);\n      modelToggle.setAttribute(\"aria-expanded\", nextOpen ? \"true\" : \"false\");\n      productRoot.querySelector(\"[data-toggle-brand]\")?.setAttribute(\"aria-expanded\", \"false\");\n      return;\n    }\n\n    const brandButton = event.target.closest(\"[data-lily-brand]\");\n    if (brandButton) {\n      event.preventDefault();\n      lilySelectedBrand = brandButton.dataset.lilyBrand || \"\";\n      lilyBrandMenu?.classList.remove(\"is-open\");\n      lilyModelMenu?.classList.add(\"is-open\");\n      productRoot.querySelector(\"[data-toggle-brand]\")?.setAttribute(\"aria-expanded\", \"false\");\n      productRoot.querySelector(\"[data-toggle-model]\")?.setAttribute(\"aria-expanded\", \"true\");\n      syncLilyModelSelector();\n      return;\n    }\n\n    const modelButton = event.target.closest(\"[data-lily-model-value]\");\n    if (modelButton) {\n      event.preventDefault();\n      const modelValue = modelButton.dataset.lilyModelValue || \"\";\n      const { context, index } = lilyModelContext();\n      if (context && index >= 0 && modelValue) {\n        const selections = ensureNativeSelections();\n        selections[index] = modelValue;\n        nativeSelections[state.combo] = selections;\n        markNativeOptionTouched(state.combo, index);\n        state.model = modelValue;\n        customRequest.active = false;\n        smartSelection.brand = \"\";\n        smartSelection.model = \"\";\n        closeLilyMenus();\n        enableVariantMediaAfterUserAction(event);\n        updateProductUi();\n      }\n    }\n  });\n\n  productRoot.querySelectorAll(\"[data-model-request-more]\").forEach((button) => {\n    button.addEventListener(\"click\", () => {\n      if (!showRequestMoreOnProductPage) return;\n      openRequestModelInline();\n    });\n  });\n\n  phoneTypeOptions?.addEventListener(\"click\", (event) => {\n    const button = event.target.closest(\"[data-phone-type-choice]\");\n    if (!button) return;\n    event.preventDefault();\n    const nextPhoneType = button.dataset.phoneTypeChoice || \"\";\n    if (!nextPhoneType) return;\n    state.phoneType = nextPhoneType;\n    enableVariantMediaAfterUserAction(event);\n    updateProductUi();\n  });\n\n  productRoot.querySelectorAll(\"input[name='addon']\").forEach((input) => {\n    if (isCurrentProductAddonInput(input)) {\n      input.checked = false;\n      setAddonQuantity(input.value, 0);\n    } else if (initialAddonKeys.has(normalizeIntentKey(input.value))) {\n      input.checked = true;\n      state.addons.add(input.value);\n      setAddonQuantity(input.value, Math.max(1, addonQuantity(input.value)));\n    }\n    input.addEventListener(\"change\", () => {\n      if (input.checked) {\n        setAddonQuantity(input.value, Math.max(1, addonQuantity(input.value)));\n        state.addons.add(input.value);\n      } else {\n        setAddonQuantity(input.value, 0);\n      }\n      updateProductUi();\n    });\n  });\n\n  productRoot.querySelectorAll(\"input[name='care']\").forEach((input) => {\n    input.checked = input.value === state.care;\n    input.addEventListener(\"change\", () => {\n      state.care = input.value;\n      updateProductUi();\n    });\n  });\n\n  productRoot.querySelectorAll(\"[data-quantity]\").forEach((button) => button.addEventListener(\"click\", (event) => {\n    if (usesQuantityVariantOption() && !event.isTrusted) return;\n    state.quantity = button.dataset.quantity === \"increase\" ? state.quantity + 1 : Math.max(1, state.quantity - 1);\n    state.quantityOptionValue = Array.from(productRoot.querySelectorAll(\"[data-quantity-choice]\")).find((choice) => (\n      Number(choice.dataset.quantityChoice || 0) === state.quantity\n    ))?.dataset.quantityOptionValue || \"\";\n    if (event.isTrusted) {\n      state.quantityChoiceTouched = true;\n      enableVariantMediaAfterUserAction(event);\n    }\n    updateProductUi();\n  }));\n  productRoot.querySelectorAll(\"[data-quantity-choice]\").forEach((button) => button.addEventListener(\"click\", (event) => {\n    if (usesQuantityVariantOption() && !event.isTrusted) return;\n    const nextQuantity = Number(button.dataset.quantityChoice || 1);\n    if (!Number.isFinite(nextQuantity) || nextQuantity < 1) return;\n    state.quantity = nextQuantity;\n    state.quantityOptionValue = button.dataset.quantityOptionValue || \"\";\n    if (event.isTrusted) {\n      state.quantityChoiceTouched = true;\n      enableVariantMediaAfterUserAction(event);\n    }\n    updateProductUi();\n  }));\n\n  productRoot.querySelectorAll(\"[data-addon-qty]\").forEach((button) => button.addEventListener(\"click\", (event) => {\n    event.preventDefault();\n    event.stopPropagation();\n    const key = button.dataset.addonQty || \"\";\n    const delta = Number(button.dataset.addonQtyDelta || 0);\n    setAddonQuantity(key, addonQuantity(key) + delta);\n    const input = productRoot.querySelector(`input[name='addon'][value=\"${CSS.escape(key)}\"]`);\n    if (input && !input.checked && delta > 0 && !input.disabled) {\n      input.checked = true;\n      state.addons.add(input.value);\n    }\n    updateProductUi();\n  }));\n\n  galleryThumbs?.addEventListener(\"click\", (event) => {\n    const viewMoreButton = event.target.closest(\"[data-gallery-view-more]\");\n    if (viewMoreButton) {\n      galleryState.expanded = true;\n      const items = galleryItemsForCombo();\n      renderGalleryThumbs(items, galleryHasMoreItems());\n      setGalleryIndex(galleryState.index, items);\n      return;\n    }\n    const button = event.target.closest(\"[data-gallery-index]\");\n    if (!button) return;\n    const edgeTarget = galleryThumbEdgeTarget(button);\n    setGalleryIndex(Number(button.dataset.galleryIndex || 0), undefined, { scrollThumb: !edgeTarget });\n    scrollGalleryThumbRailTo(edgeTarget);\n  });\n\n  galleryPrev?.addEventListener(\"click\", () => stepGallery(-1));\n  galleryNext?.addEventListener(\"click\", () => stepGallery(1));\n  galleryMain?.addEventListener(\"pointerdown\", (event) => {\n    galleryState.touchX = event.clientX;\n  });\n  galleryMain?.addEventListener(\"pointerup\", (event) => {\n    const delta = event.clientX - galleryState.touchX;\n    if (Math.abs(delta) > 48) stepGallery(delta > 0 ? -1 : 1);\n  });\n\n  const deviceData = {\n    apple: {\n      heading: \"iPhone\",\n      models: [\"iPhone 17 Pro Max\", \"iPhone 17 Pro\", \"iPhone 17\", \"iPhone 17 Air\", \"iPhone 16 Pro Max\", \"iPhone 16 Pro\", \"iPhone 16\", \"iPhone 15 Pro Max\", \"iPhone 15 Pro\", \"iPhone 15 Plus\", \"iPhone 15\"],\n      noteTitle: \"Apple devices\",\n      note: \"All iPhone 12-17 models are supported through in-stock or preorder production paths.\",\n    },\n    samsung: {\n      heading: \"Samsung\",\n      models: [\"Galaxy S25 Ultra\", \"Galaxy S25\", \"Galaxy Z Fold\", \"Galaxy Z Flip\"],\n      noteTitle: \"Samsung phones\",\n      note: \"Use Request Model if your exact Galaxy model is not listed.\",\n    },\n    google: {\n      heading: \"Google\",\n      models: [\"Pixel 10 Pro\", \"Pixel 10\", \"Pixel 9 Pro\", \"Pixel 9\"],\n      noteTitle: \"Pixel workflow\",\n      note: \"Pixel requests count toward Android creator workflow demand.\",\n    },\n    gaming: {\n      heading: \"Gaming | VR\",\n      models: [\"ROG Phone\", \"RedMagic\", \"Viture\", \"XREAL\"],\n      noteTitle: \"Gaming and VR\",\n      note: \"Request your exact device for creator rig compatibility planning.\",\n    },\n    more: {\n      heading: \"More brands\",\n      models: [\"OnePlus\", \"Sony\", \"Nothing\", \"Motorola\"],\n      noteTitle: \"More phone creators\",\n      note: \"Add a custom brand if your phone brand is missing.\",\n    },\n    accessories: {\n      heading: \"Accessories\",\n      models: [\"1TB microSD Card\", \"Pocket SSD Cable Kit\", \"Creator Mount Set\"],\n      noteTitle: \"Accessory workflow\",\n      note: \"Accessories can be ordered without selecting a phone case model.\",\n    },\n  };\n\n  function renderDeviceBrand(key) {\n    if (!deviceModels || !deviceNotes || !smartPanel) return;\n    smartPanel.classList.remove(\"is-collapsed\");\n    deviceBrands?.querySelectorAll(\"button\").forEach((button) => button.classList.toggle(\"is-active\", button.dataset.deviceBrand === key));\n\n    if (key === \"request\") {\n      if (!showRequestMoreOnProductPage) {\n        deviceModels.hidden = true;\n        deviceNotes.hidden = true;\n        return;\n      }\n      deviceModels.hidden = false;\n      deviceNotes.hidden = false;\n      deviceModels.innerHTML = `\n        <h3>Request Model</h3>\n        <p>Open the request dialog. It will keep the current context as a draft and send the request to Owner review.</p>\n        <button class=\"request-submit-button button button-primary\" type=\"button\" data-request-more>Open Request More</button>\n      `;\n      deviceNotes.innerHTML = `<h3>Second entry</h3><p>This lower Smart Device area is only a secondary entry. The same Request More dialog opens from here.</p>`;\n      return;\n    }\n\n    const data = deviceData[key] || deviceData.apple;\n    const requestMoreLink = showRequestMoreOnProductPage\n      ? `<button class=\"request-more-link\" type=\"button\" data-request-more>Request more</button>`\n      : \"\";\n    const requestMoreNote = showRequestMoreOnProductPage\n      ? `<button class=\"request-more-note\" type=\"button\" data-request-more>Request more</button>`\n      : \"\";\n    deviceModels.hidden = false;\n    deviceNotes.hidden = false;\n    deviceModels.innerHTML = `<h3>${data.heading}</h3>${data.models.map((item) => `<button type=\"button\" data-inline-model=\"${item}\" data-inline-brand=\"${data.heading}\">${item}</button>`).join(\"\")}${requestMoreLink}`;\n    deviceNotes.innerHTML = `<h3>${data.noteTitle}</h3><p>${data.note}</p>${requestMoreNote}`;\n  }\n\n  function openRequestModelInline() {\n    if (!showRequestMoreOnProductPage) return;\n    openRequestModelModal();\n  }\n\n  function requestDefaultBrand() {\n    const directModel = selectedModelValue() || smartSelection.model || \"\";\n    const directBrand = inferDeviceBrand(directModel);\n    if (directBrand && directBrand !== \"Phone\") return directBrand;\n    const lockedFit = productBoundFitLabel(activeProductContext());\n    return lockedFit.brand && !lockedFit.isProductBrandFallback ? lockedFit.brand : \"\";\n  }\n\n  function requestDraftModel() {\n    return selectedModelValue() || smartSelection.model || \"\";\n  }\n\n  function setRequestFeedback(title, body) {\n    if (!requestFeedback) return;\n    requestFeedback.innerHTML = `<strong>${escapeHtml(title)}</strong><span>${escapeHtml(body)}</span>`;\n  }\n\n  function openRequestModelModal() {\n    if (!showRequestMoreOnProductPage) return;\n    clearRequestGate();\n    const brand = requestDefaultBrand() || \"Apple\";\n    const model = requestDraftModel();\n    if (requestBrand) {\n      const option = Array.from(requestBrand.options).find((item) => item.value.toLowerCase() === brand.toLowerCase());\n      requestBrand.value = option ? option.value : \"Other\";\n    }\n    if (requestNewBrand) {\n      requestNewBrand.value = requestBrand?.value === \"Other\" && brand ? brand : \"\";\n    }\n    if (requestModel) requestModel.value = model;\n    /*\n    if (ownerResult?.ok === false) {\n      setRequestFeedback(\n        \"Owner queue unavailable\",\n        `${brand} ${model} was not saved. ${ownerResult.message || \"Try again later.\"}`,\n      );\n    } else if (ownerResult?.duplicate) {\n      setRequestFeedback(\n        \"Duplicate request merged\",\n        `${brand} ${model} is already in the Owner request queue. No cart, paid_count, or SKU release is created.`,\n      );\n    } else {\n      setRequestFeedback(\n        \"Waiting for Owner review\",\n        `${brand} ${model} is saved in the Owner request queue. No cart, paid_count, or SKU release is created.`,\n      );\n    }\n    */\n    if (requestConfirm) {\n      requestConfirm.disabled = true;\n      requestConfirm.dataset.requestAction = \"\";\n      requestConfirm.dataset.requestKind = \"\";\n      requestConfirm.dataset.requestModel = \"\";\n      requestConfirm.textContent = \"Confirm model\";\n    }\n    setRequestFeedback(\n      \"Waiting for input\",\n      \"Enter brand and model. The original customer input will be kept for audit.\",\n    );\n    if (!requestModal) {\n      renderDeviceBrand(\"request\");\n      smartPanel?.scrollIntoView({ behavior: window.Shopify?.designMode ? \"auto\" : \"smooth\", block: \"center\" });\n      updateProductUi();\n      return;\n    }\n    requestModal.hidden = false;\n    document.documentElement.classList.add(\"ire5-request-modal-open\");\n    updateProductUi();\n    window.requestAnimationFrame(() => {\n      if (!requestModel?.value) requestModel?.focus();\n      else requestModel?.select();\n    });\n  }\n\n  function closeRequestModelModal() {\n    if (!requestModal) return;\n    requestModal.hidden = true;\n    document.documentElement.classList.remove(\"ire5-request-modal-open\");\n    updateProductUi();\n  }\n\n  function currentRequestBrand() {\n    const selected = requestBrand?.value || \"\";\n    const custom = requestNewBrand?.value.trim() || \"\";\n    return selected === \"Other\" ? custom : selected || custom;\n  }\n\n  function setRequestGate({ reason = \"\", targetUrl = \"\", brand = \"\", model = \"\" } = {}) {\n    requestGate.blocksCart = true;\n    requestGate.reason = reason;\n    requestGate.targetUrl = targetUrl;\n    requestGate.brand = brand;\n    requestGate.model = model;\n  }\n\n  function clearRequestGate() {\n    requestGate.blocksCart = false;\n    requestGate.reason = \"\";\n    requestGate.targetUrl = \"\";\n    requestGate.brand = \"\";\n    requestGate.model = \"\";\n  }\n\n  function requestModalIsOpen() {\n    return Boolean(requestModal && !requestModal.hidden);\n  }\n\n  function requestBlocksCart() {\n    return requestGate.blocksCart || requestModalIsOpen();\n  }\n\n  function requestBlockMessage() {\n    if (requestGate.targetUrl) return \"This model belongs to another Shopify product. Go to the matched product page before adding to cart.\";\n    return requestGate.reason || \"Finish Request More review before adding this product to cart.\";\n  }\n\n  async function submitOwnerRequest(brand, model) {\n    const endpoint = productRoot.dataset.ownerRequestEndpoint || \"\";\n    if (!endpoint) {\n      return { ok: false, message: \"Owner request endpoint is not configured.\" };\n    }\n    const body = new URLSearchParams({\n      brand,\n      model,\n      rawBrand: brand,\n      rawModel: model,\n      normalizedBrand: brand,\n      normalizedModel: model,\n      shopDomain: window.Shopify?.shop || window.location.hostname,\n      productHandle: productRoot.dataset.currentProductHandle || \"\",\n      productTitle: productRoot.dataset.productTitle || \"\",\n      variantId: \"\",\n      customerLocale: navigator.language || \"\",\n    });\n    const response = await fetch(endpoint, {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n        Accept: \"application/json\",\n      },\n      body,\n    });\n    const payload = await response.json().catch(() => ({}));\n    if (!response.ok || payload.ok === false) {\n      return { ok: false, message: payload.message || payload.error || \"Owner request failed.\" };\n    }\n    return payload;\n  }\n\n  function requestModelMatchesLabel(input, label) {\n    const inputKey = normalizeIntentKey(input);\n    const labelKey = normalizeIntentKey(label);\n    return Boolean(inputKey && labelKey && labelKey === inputKey);\n  }\n\n  function hasModelDiscriminatorRemainder(fullKey, partKey) {\n    const index = fullKey.indexOf(partKey);\n    if (index < 0) return true;\n    const after = fullKey.slice(index + partKey.length);\n    if (!after) return false;\n    return modelDiscriminators.some((suffix) => after === suffix || after.startsWith(suffix));\n  }\n\n  function requestBrandMatchesModel(brand, modelLabel) {\n    const brandKey = brandIntentKey(brand);\n    const inferred = inferDeviceBrand(modelLabel);\n    if (!brandKey || inferred === \"Phone\") return true;\n    return brandIntentKey(inferred) === brandKey;\n  }\n\n  function storefrontVariantId(value) {\n    const text = String(value || \"\").trim();\n    if (!text) return \"\";\n    const gidMatch = text.match(/ProductVariant\\/(\\d+)/i);\n    if (gidMatch) return gidMatch[1];\n    const numericMatch = text.match(/^\\d+$/);\n    return numericMatch ? numericMatch[0] : \"\";\n  }\n\n  function ownerMappedProductUrl(model) {\n    const handle = String(model?.shopifyProductHandle || \"\").trim();\n    const rawUrl = String(model?.shopifyProductUrl || \"\").trim() || (handle ? `/products/${handle}` : \"\");\n    if (!rawUrl) return \"\";\n    const variantId = storefrontVariantId(model?.shopifyVariantId);\n    const url = new URL(rawUrl, window.location.origin);\n    if (variantId) url.searchParams.set(\"variant\", variantId);\n    const previewThemeId = new URLSearchParams(window.location.search).get(\"preview_theme_id\");\n    if (previewThemeId && !url.searchParams.has(\"preview_theme_id\")) {\n      url.searchParams.set(\"preview_theme_id\", previewThemeId);\n    }\n    return `${url.pathname}${url.search}${url.hash}`;\n  }\n\n  function findSupportedRequestModel(brand, model) {\n    const context = activeProductContext();\n    if (!context) return null;\n    const modelIndex = nativeOptionIndex(context);\n    if (modelIndex >= 0) {\n      const option = context.options?.[modelIndex];\n      const match = option?.values?.find((value) => (\n        requestModelMatchesLabel(model, value)\n        && requestBrandMatchesModel(brand, value)\n      ));\n      if (match) {\n        const variants = variantsForOptionValue(context, modelIndex, match);\n        const variantWithSku = variants.find((variant) => variant.sku);\n        const variantWithId = variants.find((variant) => variant.id);\n        return {\n          kind: \"option\",\n          model: match,\n          variants,\n          hasSku: Boolean(variantWithSku),\n          hasVariantId: Boolean(variantWithId),\n        };\n      }\n    }\n\n    const lockedFit = productBoundFitLabel(context);\n    const variant = selectedNativeVariant() || context.variants?.[0] || null;\n    if (\n      variant?.id\n      && requestBrandMatchesModel(brand, lockedFit.model)\n      && (\n        requestModelMatchesLabel(model, lockedFit.model)\n        || requestModelMatchesLabel(model, lockedFit.title)\n      )\n    ) {\n      return {\n        kind: \"current-product\",\n        model: lockedFit.model,\n        variants: [variant],\n        hasSku: Boolean(variant.sku),\n        hasVariantId: true,\n      };\n    }\n\n    return null;\n  }\n\n  function currentProductVariantUrl(variant) {\n    if (!variant?.id) return \"\";\n    const url = new URL(window.location.href);\n    url.searchParams.set(\"combo\", state.combo);\n    url.searchParams.set(\"variant\", variant.id);\n    return `${url.pathname}${url.search}${url.hash}`;\n  }\n\n  function preferredVariantForRequestMatch(match) {\n    if (!match?.variants?.length) return null;\n    const context = activeProductContext();\n    const modelIndex = nativeOptionIndex(context);\n    const selections = ensureNativeSelections(state.combo);\n    return match.variants.find((variant) => (\n      variant.id\n      && variant.sku\n      && variant.options?.every((value, index) => (\n        index === modelIndex || !selections[index] || selections[index] === value\n      ))\n    ))\n      || match.variants.find((variant) => variant.id && variant.sku)\n      || match.variants.find((variant) => variant.id)\n      || null;\n  }\n\n  function applyVariantSelections(variant) {\n    if (!variant?.options?.length) return;\n    nativeSelections[state.combo] = variant.options.slice();\n    const context = activeProductContext();\n    context?.options?.forEach((option, index) => {\n      if (variant.options[index]) markNativeOptionTouched(state.combo, index);\n    });\n  }\n\n  function useSupportedRequestModel(match, options = {}) {\n    if (!match) return;\n    if (match.kind === \"option\") {\n      const targetVariant = preferredVariantForRequestMatch(match);\n      if (targetVariant) applyVariantSelections(targetVariant);\n      const selected = targetVariant ? true : setNativeDeviceSelection(match.model);\n      if (selected) {\n        state.model = match.model;\n        customRequest.active = false;\n        smartSelection.brand = \"\";\n        smartSelection.model = \"\";\n        clearRequestGate();\n        closeRequestModelModal();\n        enableVariantMediaAfterUserAction();\n        updateProductUi();\n        if (cartMessage) cartMessage.textContent = `${match.model} is already available. Continue with the selected Shopify variant.`;\n        if (options.navigate) {\n          const variant = targetVariant || selectedNativeVariant() || match.variants.find((item) => item.id) || null;\n          const targetUrl = currentProductVariantUrl(variant);\n          if (targetUrl) window.location.href = targetUrl;\n        }\n      }\n      return;\n    }\n    closeRequestModelModal();\n    clearRequestGate();\n    updateProductUi();\n    if (cartMessage) cartMessage.textContent = `${match.model} is already covered by this Shopify product. Continue with the current variant.`;\n  }\n\n  async function identifyRequestMore() {\n    const brand = currentRequestBrand().trim();\n    const model = requestModel?.value.trim() || \"\";\n    if (!brand || !model) {\n      setRequestFeedback(\n        \"Waiting for input\",\n        \"Please enter the phone brand and exact model before review.\",\n      );\n      if (requestConfirm) {\n        requestConfirm.disabled = true;\n        requestConfirm.dataset.requestAction = \"\";\n        requestConfirm.dataset.requestKind = \"\";\n        requestConfirm.dataset.requestModel = \"\";\n        requestConfirm.textContent = \"Confirm model\";\n      }\n      return;\n    }\n    const supported = findSupportedRequestModel(brand, model);\n    if (supported?.hasSku && supported.hasVariantId) {\n      clearRequestGate();\n      setRequestFeedback(\n        \"Existing Shopify model found\",\n        `${supported.model} already has a Shopify variant and item code. Use the existing model path instead of Request More.`,\n      );\n      if (requestConfirm) {\n        requestConfirm.disabled = false;\n        requestConfirm.dataset.requestAction = \"use-existing\";\n        requestConfirm.dataset.requestKind = supported.kind;\n        requestConfirm.dataset.requestModel = supported.model;\n        requestConfirm.textContent = \"Use existing model\";\n      }\n      window.setTimeout(() => {\n        useSupportedRequestModel(supported, { navigate: true });\n      }, 250);\n      return;\n    }\n    if (supported?.hasVariantId && !supported.hasSku) {\n      setRequestGate({\n        reason: `${supported.model} exists in Shopify, but the selected specific spec has no item code yet.`,\n        brand,\n        model,\n      });\n      setRequestFeedback(\n        \"Model exists, item code missing\",\n        `${supported.model} exists in Shopify variants, but its specific spec item code is missing. Ask operations to finish SKU/item-code cleanup before purchase.`,\n      );\n      if (requestConfirm) {\n        requestConfirm.disabled = true;\n        requestConfirm.dataset.requestAction = \"\";\n        requestConfirm.dataset.requestKind = \"\";\n        requestConfirm.dataset.requestModel = \"\";\n        requestConfirm.textContent = \"Confirm model\";\n      }\n      updateProductUi();\n      return;\n    }\n    setRequestFeedback(\n      \"Saving request\",\n      \"Sending this missing model to Owner review. This will not add to cart.\",\n    );\n    let ownerResult;\n    try {\n      ownerResult = await submitOwnerRequest(brand, model);\n    } catch (error) {\n      ownerResult = {\n        ok: false,\n        message: error instanceof Error ? error.message : String(error),\n      };\n    }\n    if (ownerResult?.ok === false) {\n      setRequestGate({\n        reason: `${brand} ${model} could not be checked by Owner App yet.`,\n        brand,\n        model,\n      });\n      setRequestFeedback(\n        \"Owner queue unavailable\",\n        `${brand} ${model} was not saved. ${ownerResult.message || \"Try again later.\"}`,\n      );\n      if (requestConfirm) {\n        requestConfirm.disabled = true;\n        requestConfirm.dataset.requestAction = \"\";\n        requestConfirm.dataset.requestKind = \"\";\n        requestConfirm.dataset.requestModel = \"\";\n        requestConfirm.textContent = \"Confirm model\";\n      }\n      updateProductUi();\n      return;\n    }\n    if (ownerResult?.classification === \"existing_model_mapped\") {\n      const existing = ownerResult.existingModel || {};\n      const mappedUrl = ownerMappedProductUrl(existing);\n      setRequestGate({\n        reason: `${existing.brand || brand} ${existing.model || model} is mapped to another Shopify product page.`,\n        targetUrl: mappedUrl,\n        brand: existing.brand || brand,\n        model: existing.model || model,\n      });\n      setRequestFeedback(\n        \"Existing Owner model found\",\n        `${existing.brand || brand} ${existing.model || model} already has a Shopify variant. Redirecting to the matched product page; no new request was created.`,\n      );\n      if (requestConfirm) {\n        requestConfirm.disabled = !mappedUrl;\n        requestConfirm.dataset.requestAction = mappedUrl ? \"go-owner-mapped\" : \"\";\n        requestConfirm.dataset.requestKind = \"owner-mapped\";\n        requestConfirm.dataset.requestModel = \"\";\n        requestConfirm.dataset.requestUrl = mappedUrl;\n        requestConfirm.textContent = \"Confirm model\";\n      }\n      if (requestConfirm && mappedUrl) requestConfirm.textContent = \"Go to product / Buy\";\n      if (cartMessage) cartMessage.textContent = `Owner App found an existing mapped model: ${existing.brand || brand} ${existing.model || model}.`;\n      updateProductUi();\n      if (mappedUrl) {\n        window.setTimeout(() => {\n          if (requestGate.targetUrl === mappedUrl) window.location.href = mappedUrl;\n        }, 350);\n      }\n      return;\n    }\n    if (ownerResult?.classification === \"existing_model_unreleased\") {\n      const existing = ownerResult.existingModel || {};\n      setRequestGate({\n        reason: `${existing.brand || brand} ${existing.model || model} is not purchase-ready yet.`,\n        brand: existing.brand || brand,\n        model: existing.model || model,\n      });\n      setRequestFeedback(\n        \"Existing model not released\",\n        `${existing.brand || brand} ${existing.model || model} has an Owner App Shopify mapping, but it is still not released for a purchase CTA. Owner review is required before the product path opens.`,\n      );\n      if (requestConfirm) {\n        requestConfirm.disabled = true;\n        requestConfirm.dataset.requestAction = \"\";\n        requestConfirm.dataset.requestKind = \"\";\n        requestConfirm.dataset.requestModel = \"\";\n        requestConfirm.dataset.requestUrl = \"\";\n        requestConfirm.textContent = \"Confirm model\";\n      }\n      if (cartMessage) cartMessage.textContent = `Owner App has not released ${existing.brand || brand} ${existing.model || model} for purchase yet.`;\n      updateProductUi();\n      return;\n    }\n    if (ownerResult?.classification === \"existing_model_unmapped\") {\n      const existing = ownerResult.existingModel || {};\n      setRequestGate({\n        reason: `${existing.brand || brand} ${existing.model || model} is in Owner review and has no Shopify variant mapping yet.`,\n        brand: existing.brand || brand,\n        model: existing.model || model,\n      });\n      setRequestFeedback(\n        \"Known model demand merged\",\n        `${existing.brand || brand} ${existing.model || model} is already in the Owner model library but has no Shopify variant mapping yet. Demand was sent to Owner review.`,\n      );\n    } else if (ownerResult?.classification === \"duplicate_request\" || ownerResult?.duplicate) {\n      setRequestGate({\n        reason: `${brand} ${model} is already in the Owner review queue.`,\n        brand,\n        model,\n      });\n      setRequestFeedback(\n        \"Duplicate request merged\",\n        `${brand} ${model} is already in the Owner request queue. Duplicate demand was merged; no cart, paid_count, or SKU release is created.`,\n      );\n    } else {\n      setRequestGate({\n        reason: `${brand} ${model} was sent to Owner review and is not purchase-ready yet.`,\n        brand,\n        model,\n      });\n      setRequestFeedback(\n        \"Waiting for Owner review\",\n        `${brand} ${model} is saved as a review request shell. No cart, paid_count, or SKU release is created.`,\n      );\n    }\n    customRequest.active = false;\n    customRequest.brand = \"\";\n    customRequest.model = \"\";\n    smartSelection.brand = \"\";\n    smartSelection.model = \"\";\n    if (requestConfirm) {\n      requestConfirm.disabled = true;\n      requestConfirm.dataset.requestAction = \"\";\n      requestConfirm.dataset.requestKind = \"\";\n      requestConfirm.dataset.requestModel = \"\";\n      requestConfirm.textContent = \"Confirm model\";\n    }\n    if (cartMessage) cartMessage.textContent = `Request Model review only: ${brand} ${model}. No add-to-cart until approved.`;\n    updateProductUi();\n  }\n\n  deviceBrands?.addEventListener(\"click\", (event) => {\n    const button = event.target.closest(\"[data-device-brand]\");\n    if (!button) return;\n    if (button.dataset.deviceBrand === \"request\") {\n      if (!showRequestMoreOnProductPage) return;\n      openRequestModelModal();\n      return;\n    }\n    renderDeviceBrand(button.dataset.deviceBrand);\n  });\n\n  deviceModels?.addEventListener(\"click\", (event) => {\n    const requestMore = event.target.closest(\"[data-request-more]\");\n    if (requestMore) {\n      if (!showRequestMoreOnProductPage) return;\n      openRequestModelInline();\n      return;\n    }\n\n    const requestSubmit = event.target.closest(\"[data-inline-request-submit]\");\n    if (requestSubmit) {\n      const brand = productRoot.querySelector(\"[data-inline-request-brand]\")?.value.trim();\n      const model = productRoot.querySelector(\"[data-inline-request-model]\")?.value.trim();\n      const message = productRoot.querySelector(\"[data-request-review-message]\");\n      if (!brand || !model) {\n        if (message) message.textContent = \"Enter the raw brand and exact model before Owner review.\";\n        return;\n      }\n      if (brand && model) {\n        customRequest.active = false;\n        customRequest.brand = \"\";\n        customRequest.model = \"\";\n        smartSelection.brand = \"\";\n        smartSelection.model = \"\";\n        setRequestGate({\n          reason: `${brand} ${model} is a review request and is not purchase-ready yet.`,\n          brand,\n          model,\n        });\n        if (message) message.textContent = `Request captured for Owner review: ${brand} ${model}. Owner App endpoint pending; no cart or paid_count is created.`;\n        if (cartMessage) cartMessage.textContent = `Request Model review only: ${brand} ${model}. No add-to-cart until approved.`;\n        updateProductUi();\n      }\n      return;\n    }\n    const modelButton = event.target.closest(\"[data-inline-model]\");\n    if (modelButton) {\n      customRequest.active = false;\n      clearRequestGate();\n      smartSelection.brand = modelButton.dataset.inlineBrand || \"Smart device\";\n      smartSelection.model = modelButton.dataset.inlineModel || \"\";\n      if (state.combo === \"module\" || state.combo === \"accessories\") {\n        state.combo = \"case\";\n        resetVariantSelectionToShopifyDefault(state.combo);\n      }\n      const matchedNative = setNativeDeviceSelection(smartSelection.model);\n      if (matchedNative) {\n        smartSelection.brand = \"\";\n        smartSelection.model = \"\";\n      }\n      const comboInput = productRoot.querySelector(`input[name='combo'][value=\"${CSS.escape(state.combo)}\"]`);\n      if (comboInput) comboInput.checked = true;\n      if (cartMessage) cartMessage.textContent = `${smartSelection.model} selected as a workflow reference.`;\n      enableVariantMediaAfterUserAction(event);\n      updateProductUi();\n    }\n  });\n\n  deviceNotes?.addEventListener(\"click\", (event) => {\n    if (event.target.closest(\"[data-request-more]\") && showRequestMoreOnProductPage) openRequestModelInline();\n  });\n\n  requestModal?.addEventListener(\"click\", (event) => {\n    if (event.target.closest(\"[data-close-request]\")) {\n      closeRequestModelModal();\n      return;\n    }\n    if (event.target.closest(\"[data-identify-request]\")) {\n      identifyRequestMore();\n      return;\n    }\n    if (event.target.closest(\"[data-confirm-request]\")) {\n      if (requestConfirm?.dataset.requestAction === \"use-existing\") {\n        useSupportedRequestModel({\n          kind: requestConfirm.dataset.requestKind || \"option\",\n          model: requestConfirm.dataset.requestModel || requestModel?.value.trim() || \"\",\n        });\n        return;\n      }\n      if (requestConfirm?.dataset.requestAction === \"go-owner-mapped\") {\n        const mappedUrl = requestConfirm.dataset.requestUrl || \"\";\n        if (mappedUrl) window.location.href = mappedUrl;\n        return;\n      }\n      setRequestFeedback(\n        \"Owner approval required\",\n        \"Confirm model is disabled until Owner App maps this request to a real Shopify variant.\",\n      );\n    }\n  });\n\n  requestBrand?.addEventListener(\"change\", () => {\n    if (!requestNewBrand) return;\n    if (requestBrand.value === \"Other\") requestNewBrand.focus();\n    else requestNewBrand.value = \"\";\n  });\n\n  requestModal?.addEventListener(\"keydown\", (event) => {\n    if (event.key === \"Escape\") closeRequestModelModal();\n  });\n\n  if (initialModelKey === \"request\") {\n    openRequestModelModal();\n  } else {\n    smartPanel?.classList.add(\"is-collapsed\");\n    if (deviceModels) {\n      deviceModels.hidden = true;\n      deviceModels.innerHTML = \"\";\n    }\n    if (deviceNotes) {\n      deviceNotes.hidden = true;\n      deviceNotes.innerHTML = \"\";\n    }\n  }\n\n  const floatingProduct = productRoot.querySelector(\"[data-floating-product]\");\n  const primaryCartAction = productRoot.querySelector(\".buy-actions-panel [data-buy-now]\");\n\n  function syncFloatingProductVisibility() {\n    if (!floatingProduct || !primaryCartAction) return;\n    const rect = primaryCartAction.getBoundingClientRect();\n    const primaryActionIsVisible = rect.width > 0\n      && rect.height > 0\n      && rect.bottom > 0\n      && rect.top < window.innerHeight;\n    const primaryActionIsBelowViewport = rect.top >= window.innerHeight;\n    const shouldHide = primaryActionIsVisible || primaryActionIsBelowViewport;\n    floatingProduct.hidden = shouldHide;\n    floatingProduct.setAttribute(\"aria-hidden\", shouldHide ? \"true\" : \"false\");\n  }\n\n  function clampFloating(x, y) {\n    if (!floatingProduct) return { x, y };\n    const rect = floatingProduct.getBoundingClientRect();\n    return {\n      x: Math.min(Math.max(12, x), window.innerWidth - rect.width - 12),\n      y: Math.min(Math.max(72, y), window.innerHeight - rect.height - 12),\n    };\n  }\n  function setFloating(x, y, persist) {\n    if (!floatingProduct) return;\n    const next = clampFloating(x, y);\n    floatingProduct.style.setProperty(\"--floating-x\", `${next.x}px`);\n    floatingProduct.style.setProperty(\"--floating-y\", `${next.y}px`);\n    floatingProduct.classList.add(\"is-positioned\");\n    if (persist) localStorage.setItem(\"ire5FloatingProductPosition\", JSON.stringify(next));\n  }\n  if (floatingProduct) {\n    syncFloatingProductVisibility();\n    if (primaryCartAction && \"IntersectionObserver\" in window) {\n      const primaryCartObserver = new IntersectionObserver(syncFloatingProductVisibility, {\n        threshold: [0, 0.01],\n      });\n      primaryCartObserver.observe(primaryCartAction);\n    }\n    let pressTimer = null;\n    let dragging = false;\n    let offsetX = 0;\n    let offsetY = 0;\n    const saved = JSON.parse(localStorage.getItem(\"ire5FloatingProductPosition\") || \"null\");\n    if (saved) setFloating(saved.x, saved.y, false);\n    const start = (event) => {\n      if (event.target.closest(\"button\")) return;\n      const point = event.touches ? event.touches[0] : event;\n      const rect = floatingProduct.getBoundingClientRect();\n      offsetX = point.clientX - rect.left;\n      offsetY = point.clientY - rect.top;\n      pressTimer = window.setTimeout(() => {\n        dragging = true;\n        floatingProduct.classList.add(\"is-dragging\");\n        setFloating(rect.left, rect.top, false);\n      }, 250);\n    };\n    const move = (event) => {\n      if (!dragging) return;\n      event.preventDefault();\n      const point = event.touches ? event.touches[0] : event;\n      setFloating(point.clientX - offsetX, point.clientY - offsetY, false);\n    };\n    const end = () => {\n      window.clearTimeout(pressTimer);\n      if (dragging) {\n        const rect = floatingProduct.getBoundingClientRect();\n        setFloating(rect.left, rect.top, true);\n      }\n      dragging = false;\n      floatingProduct.classList.remove(\"is-dragging\");\n    };\n    floatingProduct.addEventListener(\"mousedown\", start);\n    floatingProduct.addEventListener(\"touchstart\", start, { passive: true });\n    window.addEventListener(\"mousemove\", move);\n    window.addEventListener(\"touchmove\", move, { passive: false });\n    window.addEventListener(\"mouseup\", end);\n    window.addEventListener(\"touchend\", end);\n    window.addEventListener(\"resize\", () => {\n      syncFloatingProductVisibility();\n      if (!floatingProduct.classList.contains(\"is-positioned\")) return;\n      const rect = floatingProduct.getBoundingClientRect();\n      setFloating(rect.left, rect.top, true);\n    });\n  }\n\n  addCartButtons.forEach((button) => button.addEventListener(\"click\", (event) => {\n    event.preventDefault();\n    addToCart(false);\n  }));\n  buyNowButtons.forEach((button) => button.addEventListener(\"click\", (event) => {\n    event.preventDefault();\n    addToCart(false);\n  }));\n  syncComboMetaFromProductContexts();\n  updateProductUi();\n})();\n"],
  "mappings": "CAAC,IAAM,CACL,MAAM,oBAAsB,iCAC5B,GAAI,OAAO,mBAAmB,EAAG,OACjC,OAAO,mBAAmB,EAAI,GAE9B,MAAM,WAAa,SAAS,cAAc,cAAc,EAClD,UAAY,SAAS,cAAc,aAAa,EAChD,UAAY,SAAS,cAAc,aAAa,EAChD,cAAgB,SAAS,cAAc,0BAA0B,EAEvE,SAAS,WAAY,CACf,CAAC,WAAa,CAAC,aACnB,UAAU,UAAU,OAAO,SAAS,EACpC,WAAW,aAAa,gBAAiB,OAAO,EAClD,CAEI,CAAC,eAAiB,YAAc,WAClC,WAAW,iBAAiB,QAAS,IAAM,CACzC,MAAM,OAAS,UAAU,UAAU,OAAO,SAAS,EACnD,WAAW,aAAa,gBAAiB,OAAO,MAAM,CAAC,CACzD,CAAC,EAGE,gBACC,WAAW,UAAU,iBAAiB,QAAS,SAAS,EAC5D,SAAS,iBAAiB,eAAe,EAAE,QAAS,MAAS,KAAK,iBAAiB,QAAS,SAAS,CAAC,GAGxG,SAAS,iBAAiB,eAAe,EAAE,QAAS,QAAW,CAC7D,OAAO,iBAAiB,QAAS,IAAM,CACrC,MAAM,QAAU,OAAO,QAAQ,eAAe,EACxC,UAAY,SAAS,cAAc,sBAAsB,EACzD,IAAM,OAAO,QAAQ,SACvB,WAAa,MAAK,UAAU,IAAM,KACtC,SAAS,iBAAiB,eAAe,EAAE,QAAS,MAAS,KAAK,UAAU,OAAO,WAAW,CAAC,EAC/F,OAAO,UAAU,IAAI,WAAW,CAClC,CAAC,CACH,CAAC,EAED,SAAS,iBAAiB,qBAAqB,EAAE,QAAS,MAAS,CACjE,KAAK,iBAAiB,QAAU,OAAU,CACxC,GAAI,MAAM,OAAO,QAAQ,GAAG,EAAG,OAC/B,MAAM,KAAO,KAAK,cAAc,SAAS,EACrC,MAAM,KAAK,MAAM,CACvB,CAAC,CACH,CAAC,EAED,MAAM,uBAAyB,SAAS,iBAAiB,yBAAyB,EAC5E,aAAe,SAAS,cAAc,sBAAsB,EAC5D,cAAgB,SAAS,cAAc,uBAAuB,EAC9D,gBAAkB,SAAS,cAAc,yBAAyB,EAClE,cAAgB,SAAS,cAAc,uBAAuB,EAC9D,aAAe,SAAS,cAAc,sBAAsB,EAC5D,YAAc,SAAS,cAAc,qBAAqB,EAC1D,cAAgB,SAAS,cAAc,uBAAuB,EAC9D,gBAAkB,SAAS,cAAc,yBAAyB,EAExE,SAAS,sBAAsB,OAAQ,CACrC,GAAI,CAAC,OAAQ,OACb,MAAM,IAAM,OAAO,QAAQ,iBACrB,MAAQ,OAAO,QAAQ,mBACzB,cAAgB,MAClB,aAAa,KAAO,IACpB,aAAa,aAAa,aAAc,OAAO,OAAO,QAAQ,oBAAsB,cAAc,EAAE,GAElG,gBACE,OAAO,QAAQ,oBACjB,cAAc,OAAS,GACvB,cAAc,IAAM,OAAO,QAAQ,mBACnC,cAAc,IAAM,OAAO,QAAQ,kBAAoB,GACnD,kBAAiB,gBAAgB,OAAS,MAE9C,cAAc,OAAS,GACvB,cAAc,IAAM,6CACpB,cAAc,IAAM,oBAChB,kBAAiB,gBAAgB,OAAS,MAG9C,kBAAiB,gBAAgB,YAAc,OAAO,QAAQ,sBAAwB,IACtF,gBAAe,cAAc,YAAc,OAAO,QAAQ,oBAAsB,IAChF,eAAc,aAAa,YAAc,OAAO,QAAQ,mBAAqB,IAC7E,aAAe,MAAK,YAAY,KAAO,KACvC,eAAiB,QAAO,cAAc,KAAO,OACjD,uBAAuB,QAAS,MAAS,KAAK,UAAU,OAAO,YAAa,OAAS,MAAM,CAAC,CAC9F,CAEA,uBAAuB,QAAS,QAAW,CACzC,OAAO,iBAAiB,QAAS,IAAM,sBAAsB,MAAM,CAAC,CACtE,CAAC,EAED,SAAS,iBAAiB,sBAAsB,EAAE,QAAS,QAAW,CACpE,OAAO,iBAAiB,QAAS,IAAM,CACrC,SAAS,cAAc,OAAO,QAAQ,YAAY,GAAG,eAAe,CAAE,SAAU,SAAU,MAAO,OAAQ,CAAC,CAC5G,CAAC,CACH,CAAC,EAwBD,SAAS,iBAAiB,0BAA0B,EAAE,QAAS,QAAW,CACxE,MAAM,KAAO,OAAO,QAAQ,wBAAwB,EAC9C,MAAQ,KAAO,KAAK,iBAAiB,wBAAwB,EAAI,CAAC,EACxE,OAAO,iBAAiB,SAAU,IAAM,CACtC,MAAM,QAAS,MAAS,CACtB,MAAM,OAAS,OAAO,SAAW,KAAK,QAAQ,eAAiB,OAC/D,KAAK,gBAAgB,SAAU,MAAM,CACvC,CAAC,CACH,CAAC,CACH,CAAC,EAED,MAAM,YAAc,SAAS,cAAc,8BAA8B,EACzE,GAAI,CAAC,YAAa,OAClB,MAAM,oBAAsB,EAAQ,OAAO,SAAS,WAEpD,SAAS,uBAAuB,KAAM,CACpC,MAAM,OAAS,KAAK,cAAc,cAAc,EAC1C,UAAY,QAAQ,cAAc,kCAAkC,EACtE,CAAC,QAAU,CAAC,YAChB,UAAU,UAAU,IAAI,WAAW,EACnC,OAAO,sBAAsB,WAAY,SAAS,EACpD,CAEA,uBAAuB,WAAW,EAElC,MAAM,6BAA+B,YAAY,QAAQ,+BAAiC,OAEpF,WAAc,OAAU,CAC5B,GAAI,OAAS,MAAQ,OAAO,KAAK,EAAE,KAAK,IAAM,GAAI,OAAO,KACzD,MAAM,OAAS,OAAO,KAAK,EAC3B,OAAO,OAAO,SAAS,MAAM,EAAI,OAAS,IAC5C,EAEM,MAAS,OACT,OAAS,MAAQ,CAAC,OAAO,SAAS,OAAO,KAAK,CAAC,EAAU,WAEtD,KADQ,OAAO,KAAK,GAAK,GACd,QAAQ,CAAC,CAAC,GAGxB,aAAgB,MAEb,GADM,OAAO,SAAS,QAAQ,MAAQ,GAC/B,GAAG,OAAO,MAAQ,EAAE,EAAE,QAAQ,OAAQ,EAAE,CAAC,GAGnD,OAAS,CACb,KAAM,CACJ,MAAO,8BACP,MAAO,WAAW,YAAY,QAAQ,SAAS,EAC/C,KAAM,WAAW,YAAY,QAAQ,QAAQ,EAC7C,KAAM,mBACN,OAAQ,mBACR,QAAS,GACT,OAAQ,GACR,gBAAiB,EACnB,EACA,KAAM,CACJ,MAAO,yBACP,MAAO,WAAW,YAAY,QAAQ,SAAS,EAC/C,KAAM,WAAW,YAAY,QAAQ,QAAQ,EAC7C,KAAM,uBACN,OAAQ,mBACR,QAAS,GACT,OAAQ,GACR,gBAAiB,EACnB,EACA,OAAQ,CACN,MAAO,gBACP,MAAO,WAAW,YAAY,QAAQ,WAAW,EACjD,KAAM,WAAW,YAAY,QAAQ,UAAU,EAC/C,KAAM,oBACN,OAAQ,uBACR,QAAS,GACT,OAAQ,GACR,gBAAiB,EACnB,EACA,QAAS,CACP,MAAO,8BACP,MAAO,WAAW,YAAY,QAAQ,YAAY,EAClD,KAAM,WAAW,YAAY,QAAQ,WAAW,EAChD,KAAM,cACN,OAAQ,4BACR,QAAS,GACT,OAAQ,GACR,gBAAiB,EACnB,EACA,YAAa,CACX,MAAO,YAAY,QAAQ,cAAgB,mBAC3C,MAAO,EACP,KAAM,EACN,KAAM,kBACN,OAAQ,0BACR,QAAS,GACT,OAAQ,GACR,gBAAiB,EACnB,CACF,EAEM,MAAQ,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAClD,mBAAsB,OAAU,OAAO,OAAS,EAAE,EACrD,YAAY,EACZ,QAAQ,MAAO,QAAQ,EACvB,QAAQ,KAAM,OAAO,EACrB,QAAQ,cAAe,EAAE,EACtB,oBAAsB,CAAC,MAAO,SAAU,MAAO,OAAQ,QAAS,OAAQ,OAAQ,OAAQ,KAAM,KAAM,MAAO,OAAQ,GAAG,EAC5H,SAAS,eAAe,MAAO,CAC7B,MAAM,IAAM,mBAAmB,KAAK,EAapC,MAZgB,CACd,OAAQ,UACR,MAAO,QACP,OAAQ,SACR,OAAQ,QACR,KAAM,OACN,GAAI,SACJ,KAAM,WACN,MAAO,SACP,KAAM,SACN,MAAO,QACT,EACe,GAAG,GAAK,GACzB,CACA,MAAM,gBAAkB,mBAAmB,MAAM,IAAI,OAAO,CAAC,EACvD,iBAAmB,IAAI,KAC1B,MAAM,IAAI,QAAQ,GAAK,IACrB,MAAM,QAAQ,EACd,IAAI,kBAAkB,EACtB,OAAO,OAAO,CACnB,EACM,iBAAmB,OAAO,MAAM,IAAI,SAAS,GAAK,EAAE,EACpD,wBAA0B,IAAM,CACpC,MAAM,cAAgB,YAAY,QAAQ,eAAiB,GAC3D,GAAI,OAAO,aAAa,EAAG,OAAO,cAClC,MAAM,cAAgB,YAAY,QAAQ,sBAAwB,GASlE,MARuB,CACrB,CAAC,SAAU,YAAY,QAAQ,mBAAmB,EAClD,CAAC,OAAQ,YAAY,QAAQ,iBAAiB,EAC9C,CAAC,cAAe,YAAY,QAAQ,wBAAwB,EAC5D,CAAC,UAAW,YAAY,QAAQ,oBAAoB,EACpD,CAAC,OAAQ,YAAY,QAAQ,iBAAiB,CAChD,EAC6B,KAAK,CAAC,CAAC,CAAE,MAAM,IAAM,QAAU,SAAW,aAAa,IACrE,CAAC,GAAK,EACvB,EAEM,oBAAsB,OAAO,YAAY,cAAc,2BAA2B,GAAG,QAAQ,mBAAqB,QAAQ,EAAE,YAAY,EACxI,iBAAmB,OAAO,MAAM,IAAI,WAAW,GAAK,qBAAuB,QAAQ,EAAE,YAAY,EACjG,yBAA2B,YAAY,cAAc,oCAAoC,EACzF,mBAAqB,KAAK,IAAI,EAAG,OAAO,0BAA0B,QAAQ,gBAAkB,CAAC,GAAK,CAAC,EACnG,yBAA2B,KAAK,IAAI,EAAG,OAAO,MAAM,IAAI,UAAU,GAAK,kBAAkB,GAAK,kBAAkB,EAIhH,8BAHiC,MAAM,KAAK,YAAY,iBAAiB,wBAAwB,CAAC,EAAE,KAAM,QAC9G,OAAO,OAAO,QAAQ,gBAAkB,CAAC,IAAM,wBAChD,GACqE,QAAQ,qBACzE,0BAA0B,QAAQ,qBAClC,GAEC,MAAQ,CACZ,MAF0B,wBAAwB,GAEpB,MAAM,IAAI,OAAO,GAAK,OACpD,MAAO,MAAM,IAAI,OAAO,GAAK,GAC7B,UAAW,kBAAoB,qBAAuB,SACtD,KAAM,MAAM,IAAI,MAAM,GAAK,OAC3B,SAAU,yBACV,oBAAqB,8BACrB,sBAAuB,GACvB,oBAAqB,GACrB,OAAQ,IAAI,IACZ,gBAAiB,CAAC,CACpB,EAEM,gBAAkB,MAAM,KAAK,YAAY,iBAAiB,qBAAqB,CAAC,EACnF,OAAQ,OAAU,CAAC,MAAM,UAAY,CAAC,MAAM,QAAQ,UAAU,CAAC,EAC/D,IAAK,OAAU,MAAM,KAAK,EAC1B,OAAQ,OAAU,OAAO,KAAK,CAAC,GAC9B,CAAC,OAAO,MAAM,KAAK,GAAM,gBAAgB,QAAU,CAAC,gBAAgB,SAAS,MAAM,KAAK,KAC1F,MAAM,MAAQ,gBAAgB,CAAC,GAAK,QAGtC,MAAM,QAAU,YAAY,cAAc,wBAAwB,EAC5D,WAAa,YAAY,iBAAiB,oBAAoB,EAC9D,cAAgB,YAAY,cAAc,uBAAuB,EACjE,aAAe,YAAY,cAAc,sBAAsB,EAC/D,cAAgB,YAAY,cAAc,uBAAuB,EACjE,qBAAuB,YAAY,cAAc,+BAA+B,EAChF,cAAgB,YAAY,iBAAiB,gBAAgB,EAC7D,eAAiB,YAAY,iBAAiB,iBAAiB,EAC/D,kBAAoB,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,eAAgB,GAAG,aAAa,CAAC,CAAC,EAC7E,cAAgB,YAAY,cAAc,uBAAuB,EACjE,YAAc,YAAY,cAAc,qBAAqB,EAC7D,gBAAkB,YAAY,cAAc,8BAA8B,EAC1E,oBAAsB,iBAAiB,cAAc,8BAA8B,GAAK,KACxF,uBAAyB,iBAAiB,cAAc,iCAAiC,GAAK,KAC9F,wBAA0B,iBAAiB,cAAc,kCAAkC,GAAK,KAChG,0BAA4B,iBAAiB,cAAc,oCAAoC,GAAK,KACpG,6BAA+B,iBAAiB,cAAc,wCAAwC,GAAK,KAC3G,0BAA4B,YAAY,cAAc,oCAAoC,EAW1F,YAAc,KACd,iBAAmB,KACnB,gBAAkB,KAClB,wBAA0B,GAC1B,kBAAoB,YAAY,cAAc,4BAA4B,EAC1E,cAAgB,YAAY,cAAc,mBAAmB,EAC7D,cAAgB,YAAY,cAAc,mBAAmB,EAC7D,cAAgB,YAAY,cAAc,mBAAmB,EAC7D,cAAgB,YAAY,cAAc,mBAAmB,EAC7D,cAAgB,YAAY,cAAc,mBAAmB,EAC7D,cAAgB,YAAY,cAAc,uBAAuB,EACjE,cAAgB,YAAY,cAAc,wBAAwB,EAClE,qBAAuB,YAAY,cAAc,+BAA+B,EAChF,kBAAoB,YAAY,cAAc,4BAA4B,EAC1E,sBAAwB,YAAY,iBAAiB,2BAA2B,EAChF,qBAAuB,YAAY,iBAAiB,+BAA+B,EACnF,mBAAqB,YAAY,iBAAiB,iCAAiC,EACnF,4BAA8B,YAAY,iBAAiB,iCAAiC,EAC5F,2BAA6B,YAAY,iBAAiB,qCAAqC,EAC/F,WAAa,YAAY,cAAc,kBAAkB,EACzD,UAAY,YAAY,cAAc,oBAAoB,EAC1D,UAAY,YAAY,cAAc,iBAAiB,EACvD,WAAa,YAAY,cAAc,qBAAqB,EAC5D,aAAe,YAAY,cAAc,sBAAsB,EAC/D,aAAe,YAAY,cAAc,sBAAsB,EAC/D,YAAc,YAAY,cAAc,qBAAqB,EAC7D,aAAe,YAAY,cAAc,sBAAsB,EAC/D,aAAe,YAAY,cAAc,sBAAsB,EAC/D,gBAAkB,YAAY,cAAc,0BAA0B,EACtE,aAAe,YAAY,cAAc,sBAAsB,EAC/D,gBAAkB,YAAY,cAAc,yBAAyB,EACrE,eAAiB,YAAY,cAAc,wBAAwB,EACnE,cAAgB,CAAE,OAAQ,GAAO,MAAO,GAAI,MAAO,EAAG,EACtD,eAAiB,CAAE,MAAO,GAAI,MAAO,EAAG,EACxC,YAAc,CAAE,WAAY,GAAO,OAAQ,GAAI,UAAW,GAAI,MAAO,GAAI,MAAO,EAAG,EACnF,SAAW,CACf,KAAM,YAAY,QAAQ,eAAiB,OAC3C,KAAM,YAAY,QAAQ,eAAiB,OAC3C,OAAQ,YAAY,QAAQ,iBAAmB,OAC/C,QAAS,YAAY,QAAQ,kBAAoB,OACjD,YAAa,YAAY,QAAQ,sBAAwB,MAC3D,EACM,mBAAqB,YAAY,QAAQ,iBAAmB,kBAC5D,gBAAkB,CAAC,kBAAmB,kBAAmB,aAAa,EAAE,SAAS,kBAAkB,EACrG,mBACA,qBAAuB,eAAiB,cAAgB,kBACtD,YAAc,YAAY,cAAc,qBAAqB,EAC7D,iBAAmB,YAAY,cAAc,2BAA2B,GAAK,YAAY,cAAc,qBAAqB,EAC5H,mBAAqB,YAAY,cAAc,4BAA4B,EAC3E,eAAiB,YAAY,cAAc,wBAAwB,EACnE,cAAgB,YAAY,cAAc,uBAAuB,EACjE,YAAc,YAAY,cAAc,qBAAqB,EAC7D,YAAc,YAAY,cAAc,qBAAqB,EAC7D,cAAgB,YAAY,cAAc,uBAAuB,EACjE,iBAAmB,YAAY,cAAc,2BAA2B,EACxE,iBAAmB,YAAY,cAAc,2BAA2B,EACxE,iBAAmB,YAAY,cAAc,2BAA2B,EACxE,sBAAwB,YAAY,cAAc,gCAAgC,EAClF,iBAAmB,YAAY,cAAc,2BAA2B,EACxE,gBAAkB,YAAY,cAAc,0BAA0B,EACtE,iBAAmB,YAAY,cAAc,2BAA2B,EACxE,WAAa,YAAY,cAAc,oBAAoB,EAC3D,iBAAmB,YAAY,iBAAiB,kBAAkB,EAClE,mBAAqB,YAAY,cAAc,6BAA6B,EAC5E,mBAAqB,YAAY,cAAc,6BAA6B,EAC5E,qBAAuB,YAAY,cAAc,+BAA+B,EAChF,oBAAsB,YAAY,cAAc,8BAA8B,EAC9E,qBAAuB,YAAY,cAAc,+BAA+B,EAChF,mBAAqB,YAAY,cAAc,6BAA6B,EAC5E,qBAAuB,YAAY,cAAc,+BAA+B,EAChF,iBAAmB,YAAY,cAAc,2BAA2B,EACxE,wBAA0B,YAAY,cAAc,6BAA6B,EACjF,4BAA8B,EAC9B,8BAAgC,4BAChC,aAAe,CAAE,MAAO,MAAM,MAAO,SAAU,MAAM,SAAU,UAAW,GAAI,MAAO,EAAG,OAAQ,EAAG,SAAU,EAAM,EACnH,iBAAmB,CAAC,EACpB,uBAAyB,CAAC,EAChC,IAAI,kBAAoB,GACpB,gBAAkB,CAAC,EACvB,GAAI,CACF,gBAAkB,KAAK,MAAM,SAAS,cAAc,+BAA+B,GAAG,aAAe,IAAI,CAC3G,MAAgB,CACd,gBAAkB,CAAC,CACrB,CACA,IAAI,gBAAkB,CAAC,EACvB,GAAI,CACF,gBAAkB,KAAK,MAAM,SAAS,cAAc,+BAA+B,GAAG,aAAe,IAAI,CAC3G,MAAgB,CACd,gBAAkB,CAAC,CACrB,CACA,IAAI,gBAAkB,CAAC,EACvB,GAAI,CACF,gBAAkB,KAAK,MAAM,SAAS,cAAc,8BAA8B,GAAG,aAAe,IAAI,CAC1G,MAAgB,CACd,gBAAkB,CAAC,CACrB,CACI,0BAA0B,IAAG,MAAM,SAAW,oBAElD,SAAS,kCAAkC,MAAO,CAChD,OAAI,OAAS,CAAC,MAAM,UAAkB,IACtC,MAAM,oBAAsB,GAC5B,aAAa,MAAQ,EACd,GACT,CAEA,SAAS,8BAA+B,CACtC,MAAM,oBAAsB,GAC5B,aAAa,MAAQ,EACrB,aAAa,SAAW,EAC1B,CAEA,SAAS,6BAA6B,QAAS,QAAS,CACtD,GAAI,CAAC,SAAS,SAAS,QAAU,CAAC,SAAS,SAAS,OAAQ,MAAO,GACnE,MAAM,MAAQ,QAAQ,QAAQ,UAAW,QAAW,sBAAsB,KAAK,OAAO,MAAQ,EAAE,CAAC,EACjG,OAAO,OAAS,EAAI,OAAO,QAAQ,QAAQ,KAAK,GAAK,EAAE,EAAI,EAC7D,CAEA,SAAS,8BAA8B,SAAU,QAAS,CACxD,MAAM,QAAU,qBAAqB,QAAQ,EACvC,gBAAkB,SAAS,UAAU,KAAM,MAAS,OAAO,KAAK,EAAE,IAAM,OAAO,SAAS,EAAE,CAAC,EACjG,GAAI,CAAC,iBAAiB,SAAS,QAAU,gBAAgB,QAAQ,SAAW,QAAQ,SAAS,OAAQ,MAAO,GAE5G,MAAM,cAAgB,oBAAoB,OAAO,EAC3C,mBAAqB,WAAa,MAAM,OAAS,EAAQ,YAAY,cAAc,wBAAwB,EAC3G,iBAAmB,eAAiB,EACtC,wBAAwB,gBAAgB,QAAQ,aAAa,CAAC,EAC9D,EACJ,GAAI,oBAAsB,eAAiB,EAAG,CAC5C,MAAM,4BAA8B,gBAAgB,QAAQ,aAAa,EACnE,uBAAyB,mCAAmC,2BAA2B,EAC7F,GAAI,CAAC,kBAAoB,CAAC,uBAAwB,MAAO,GACzD,MAAM,SAAW,iBACjB,MAAM,oBAAsB,4BAC5B,MAAM,sBAAwB,EAChC,CAGA,GADA,iBAAiB,QAAQ,EAAI,gBAAgB,QAAQ,MAAM,EACvD,WAAa,MAAM,MAAO,CAC5B,MAAM,WAAa,6BAA6B,QAAS,eAAe,EACpE,aAAY,MAAM,MAAQ,YAC9B,MAAM,WAAa,qBAAqB,OAAO,EACzC,WAAa,YAAc,EAAI,mBAAmB,gBAAgB,QAAQ,UAAU,CAAC,EAAI,GAC3F,WAAW,SAAS,SAAS,EAAG,MAAM,UAAY,WAC7C,WAAW,SAAS,QAAQ,GAAK,WAAW,SAAS,OAAO,GAAK,aAAe,SAAO,MAAM,UAAY,SACpH,CACA,MAAO,EACT,CAEA,SAAS,sCAAsC,SAAW,MAAM,MAAO,CACrE,MAAM,QAAU,qBAAqB,QAAQ,EAC7C,cAAO,iBAAiB,QAAQ,EAChC,OAAO,uBAAuB,QAAQ,EAClC,WAAa,MAAM,QAAO,MAAM,sBAAwB,IACrD,8BAA8B,SAAU,yBAAyB,OAAO,CAAC,CAClF,CAEA,IAAI,+BAAiC,GACjC,kBACF,OAAO,QAAQ,iBAAmB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAK,OAAO,IAAM,CAChE,MAAM,QAAU,SAAS,UAAU,KAAM,MAAS,OAAO,KAAK,EAAE,IAAM,gBAAgB,EAClF,SAAS,SAAS,SAChB,MAAQ,MAAM,MAChB,+BAAiC,8BAA8B,IAAK,OAAO,EACtE,iBAAiB,GAAG,EAAI,QAAQ,QAAQ,MAAM,EAEzD,CAAC,EAEE,gCAAgC,sCAAsC,MAAM,KAAK,EAClF,iCACF,MAAM,oBAAsB,GAC5B,aAAa,MAAQ,GAGvB,SAAS,gBAAgB,MAAO,KAAM,CACpC,MAAO,+BAA+B,MAAM,KAAK,CAAC,UAAU,KAAO,+BAA+B,MAAM,IAAI,CAAC,cAAgB,EAAE,EACjI,CAEA,SAAS,gBAAgB,MAAO,CAC9B,MAAM,KAAO,OAAO,KAAK,EACzB,OAAO,OAAO,SAAS,IAAI,EAAI,KAAO,IACxC,CAEA,SAAS,mBAAmB,QAAS,CACnC,MAAO,EAAQ,SAAS,mBAC1B,CAEA,SAAS,qBAAqB,QAAS,CACrC,OAAO,OAAO,SAAS,iBAAmB,EAAE,EAAE,YAAY,IAAM,UAClE,CAEA,SAAS,cAAc,QAAS,kBAAoB,MAAM,SAAU,CAClE,GAAI,CAAC,QACH,MAAO,CACL,UAAW,SACT,MAAO,gCACP,WAAY,aACZ,WAAY,GACZ,qBAAsB,EAC1B,EAEF,MAAM,QAAU,mBAAmB,OAAO,EACpC,gBAAkB,qBAAqB,OAAO,EAC9C,SAAW,gBAAgB,QAAQ,iBAAiB,EACpD,UAAY,KAAK,IAAI,EAAG,OAAO,mBAAqB,CAAC,GAAK,CAAC,EAC3D,UAAY,EAAQ,QAAQ,UAElC,OAAI,SAAW,CAAC,iBAAmB,WAAa,KAC1C,UAAY,GAAK,CAAC,UACb,CACL,UAAW,SACX,MAAO,eACP,WAAY,eACZ,WAAY,GACZ,qBAAsB,EACxB,EAEE,UAAY,SACP,CACL,UAAW,SACX,MAAO,mBACP,WAAY,mBACZ,WAAY,GACZ,qBAAsB,EACxB,EAEK,CACL,UAAW,UAAY,EAAI,SAAW,WACtC,MAAO,WACP,WAAY,WACZ,WAAY,GACZ,qBAAsB,EACxB,EAGE,SAAW,gBACN,CACL,UAAW,UAAY,cAAgB,SACvC,MAAO,UAAY,oBAAsB,eACzC,WAAY,UAAY,oBAAsB,eAC9C,WAAY,CAAC,UACb,qBAAsB,EACxB,EAGK,CACL,UAAW,UAAY,WAAa,SACpC,MAAO,UAAY,WAAa,eAChC,WAAY,UAAY,WAAa,eACrC,WAAY,CAAC,UACb,qBAAsB,EACxB,CACF,CAEA,SAAS,wBAAwB,MAAO,kBAAoB,MAAM,SAAU,CAC1E,OAAK,OAAO,QAAQ,eASb,cAAc,CACnB,UAAW,MAAM,QAAQ,iBAAmB,OAC5C,kBAAmB,MAAM,QAAQ,uBACjC,gBAAiB,MAAM,QAAQ,qBAC/B,oBAAqB,MAAM,QAAQ,wBACrC,EAAG,iBAAiB,EAbX,CACL,UAAW,SACX,MAAO,WACP,WAAY,WACZ,WAAY,GACZ,qBAAsB,EACxB,CAQJ,CAEA,SAAS,cAAc,IAAK,CAC1B,MAAM,SAAW,OAAO,MAAM,kBAAkB,GAAG,CAAC,EACpD,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,OAAO,SAAS,QAAQ,EAAI,SAAW,CAAC,CAAC,CAC3E,CAEA,SAAS,iBAAiB,IAAK,aAAc,CAC3C,GAAI,CAAC,IAAK,OACV,MAAM,SAAW,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,OAAO,YAAY,GAAK,CAAC,CAAC,EACpE,MAAM,gBAAgB,GAAG,EAAI,SAC7B,MAAM,MAAQ,YAAY,cAAc,8BAA8B,IAAI,OAAO,GAAG,CAAC,IAAI,EACrF,UAAY,GACd,MAAM,OAAO,OAAO,GAAG,EACnB,QAAO,MAAM,QAAU,KAClB,OAAO,SAChB,MAAM,OAAO,IAAI,GAAG,CAExB,CAEA,SAAS,2BAA2B,MAAO,CACzC,MAAM,qBAAuB,YAAY,QAAQ,sBAAwB,GACzE,MAAO,GACL,MAAM,QAAU,eACb,sBACA,OAAO,QAAQ,qBAAuB,qBAE7C,CAEA,SAAS,0BAA2B,CAClC,MAAM,MAAQ,YAAY,cAAc,sBAAsB,EAC9D,GAAI,CAAC,MAAO,OAEZ,MAAM,gBADQ,MAAM,KAAK,MAAM,iBAAiB,aAAa,CAAC,EAChC,KAAM,MAAS,CAAC,KAAK,MAAM,EACzD,MAAM,OAAS,CAAC,gBAChB,MAAM,UAAU,OAAO,WAAY,CAAC,eAAe,CACrD,CAEA,SAAS,yBAA0B,CACjC,UAAW,OAAO,MAAM,OAAQ,CAC9B,GAAI,cAAc,GAAG,EAAI,EAAG,SAC5B,MAAM,MAAQ,YAAY,cAAc,8BAA8B,IAAI,OAAO,GAAG,CAAC,IAAI,EACzF,GAAI,2BAA2B,KAAK,EAAG,SACvC,MAAM,MAAQ,wBAAwB,MAAO,cAAc,GAAG,CAAC,EAC/D,GAAI,MAAM,WAAY,MAAO,CAAE,IAAK,KAAM,CAC5C,CACA,OAAO,IACT,CAEA,SAAS,iBAAiB,MAAO,CAC/B,MAAM,IAAM,OAAO,OAAS,EAAE,EAAE,YAAY,EActC,aAbgB,CACpB,CAAC,SAAU,SAAS,EACpB,CAAC,SAAU,SAAS,EACpB,CAAC,eAAgB,wEAAwE,EACzF,CAAC,gBAAiB,SAAS,EAC3B,CAAC,SAAU,SAAS,EACpB,CAAC,SAAU,SAAS,EACpB,CAAC,SAAU,SAAS,EACpB,CAAC,SAAU,SAAS,EACpB,CAAC,SAAU,SAAS,EACpB,CAAC,SAAU,SAAS,EACpB,CAAC,SAAU,SAAS,CACtB,EACmC,KAAK,CAAC,CAAC,OAAO,IAAM,QAAQ,KAAK,GAAG,CAAC,EACxE,GAAI,aAAc,OAAO,aAAa,CAAC,EACvC,MAAM,IAAM,mBAAmB,KAAK,EAiBpC,MAhBe,CACb,MAAO,UACP,MAAO,UACP,MAAO,yEACP,YAAa,yEACb,OAAQ,UACR,KAAM,UACN,KAAM,UACN,KAAM,UACN,KAAM,UACN,IAAK,UACL,MAAO,UACP,OAAQ,UACR,OAAQ,UACR,QAAS,SACX,EACc,GAAG,GAAK,SACxB,CAEA,SAAS,cAAc,OAAQ,CAC7B,MAAO,6BAA6B,KAAK,QAAQ,MAAQ,EAAE,CAC7D,CAEA,SAAS,sBAAsB,QAAS,CACtC,MAAM,KAAO,OAAO,SAAW,EAAE,EAAE,KAAK,EACxC,MAAI,sFAAsF,KAAK,IAAI,EAC1F,KAAK,YAAY,EAAE,SAAS,kBAAkB,EAAI,KAAO,qBAAqB,IAAI,GAEpF,MAAQ,sEACjB,CAEA,SAAS,8BAA8B,SAAW,MAAM,MAAO,CAC7D,GAAI,WAAa,cAAe,CAC9B,MAAM,eAAiB,iBAAiB,QAClC,cAAgB,YAAY,QAAQ,sBAAwB,GAClE,GAAI,gBAAkB,OAAO,gBAAmB,UAAY,eAAe,QAAU,eAAe,SAAW,cAC7G,OAAO,cAEX,CACA,OAAO,IACT,CAEA,SAAS,6BAA6B,SAAW,MAAM,MAAO,CAC5D,MAAO,EAAQ,8BAA8B,QAAQ,CACvD,CAEA,SAAS,qBAAqB,SAAW,MAAM,MAAO,CACpD,MAAM,uBAAyB,8BAA8B,QAAQ,EACrE,GAAI,uBAAwB,OAAO,uBACnC,MAAM,QAAU,kBAAkB,QAAQ,EAC1C,OAAO,SAAW,OAAO,SAAY,SAAW,QAAU,IAC5D,CAEA,SAAS,yBAAyB,QAAS,CACzC,OAAK,SAAS,UAAU,OACjB,QAAQ,SAAS,KAAM,SAAY,OAAO,QAAQ,EAAE,IAAM,OAAO,QAAQ,iBAAiB,CAAC,GAC7F,QAAQ,SAAS,KAAM,SAAY,QAAQ,SAAS,GACpD,QAAQ,SAAS,CAAC,EAHgB,IAIzC,CAEA,MAAM,2BAA6B,yBAEnC,SAAS,yBAAyB,IAAK,CACrC,OAAI,OAAO,KAAQ,UAAY,IAAI,SAAW,EAAU,2BACpD,IAAI,WAAW,SAAS,EAAU,OAClC,IAAI,WAAW,SAAS,EAAU,OAC/B,0BACT,CAEA,SAAS,0BAA0B,SAAW,MAAM,MAAO,CACzD,OAAO,yBAAyB,sBAAsB,QAAQ,GAAG,GAAG,CACtE,CAEA,SAAS,2BAA2B,QAAU,qBAAqB,EAAG,CACpE,MAAM,OAAS,6CACT,UAAY,SAAS,IAAM,KAAO,GAAK,OAAO,QAAQ,EAAE,EACxD,MAAQ,SAAS,iBACvB,GAAI,CAAC,OAAS,OAAO,OAAU,UAAY,MAAM,UAAY,GAC3D,MAAO,CACL,OACA,UACA,MAAO,UACP,MAAO,GACP,YAAa,UACb,WAAY,wEACd,EAEF,GACE,MAAM,OAAS,0BACZ,OAAO,MAAM,OAAU,UACvB,SAAS,KAAK,MAAM,KAAK,EAE5B,MAAO,CACL,OACA,UACA,MAAO,UACP,MAAO,GACP,YAAa,UACb,WAAY,gHACd,EAEF,MAAM,MAAQ,MAAM,MAAM,KAAK,EAC/B,OAAK,MAUE,CACL,OACA,UACA,MAAO,QACP,MACA,YAAa,OACb,WAAY,qDACd,EAhBS,CACL,OACA,UACA,MAAO,QACP,MAAO,GACP,YAAa,UACb,WAAY,sEACd,CAUJ,CAEA,SAAS,+BAA+B,MAAO,CAC7C,OAAI,QAAU,wCAAqC,QAAU,kCACpD,6DAEL,QAAU,wDAAqD,QAAU,kDACpE,uDAEF,EACT,CAEA,SAAS,uBAAuB,SAAW,MAAM,MAAO,CACtD,MAAM,QAAU,qBAAqB,QAAQ,EAC7C,GAAI,CAAC,SAAS,SAAS,OAAQ,MAAO,CAAC,EACvC,MAAM,QAAU,iBAAiB,QAAQ,GAAK,CAAC,EACzC,YAAc,yBAAyB,OAAO,EAC9C,WAAa,WAAa,MAAM,MAAQ,qBAAqB,OAAO,EAAI,GACxE,cAAgB,WAAa,MAAM,MAAQ,oBAAoB,OAAO,EAAI,GAC1E,KAAO,QAAQ,QAAQ,IAAI,CAAC,OAAQ,QAAU,CAClD,GAAI,QAAU,YAAc,iBAAkB,CAC5C,MAAM,WAAa,oBAAoB,OAAQ,MAAM,SAAS,EAC9D,GAAI,WAAY,OAAO,UACzB,CACA,GAAI,QAAU,eAAiB,YAAY,cAAc,wBAAwB,EAAG,CAClF,MAAM,cAAgB,4BAA4B,OAAQ,MAAM,SAAU,MAAM,mBAAmB,EACnG,GAAI,cAAe,OAAO,cAC1B,MAAMA,aAAc,aAAa,UAAU,KAAK,EAChD,GAAI,CAAC,MAAM,uBAAyBA,cAAe,OAAO,QAAQ,SAASA,YAAW,EAAG,OAAOA,YAClG,CACA,MAAM,SAAW,QAAQ,KAAK,EAC9B,GAAI,UAAY,OAAO,QAAQ,SAAS,QAAQ,EAAG,OAAO,SAC1D,MAAM,SAAW,OAAO,cACxB,GAAI,UAAY,OAAO,QAAQ,SAAS,QAAQ,EAAG,OAAO,SAC1D,MAAM,YAAc,aAAa,UAAU,KAAK,EAChD,OAAI,aAAe,OAAO,QAAQ,SAAS,WAAW,EAAU,YACzD,OAAO,SAAS,CAAC,GAAK,EAC/B,CAAC,EACD,wBAAiB,QAAQ,EAAI,KACtB,IACT,CAEA,SAAS,wBAAwB,SAAU,MAAO,CAC5C,CAAC,UAAY,MAAQ,IACpB,uBAAuB,QAAQ,IAAG,uBAAuB,QAAQ,EAAI,IAAI,KAC9E,uBAAuB,QAAQ,EAAE,IAAI,KAAK,EAC5C,CAEA,SAAS,uBAAuB,SAAU,MAAO,CAC/C,MAAO,GAAQ,OAAS,GAAK,uBAAuB,QAAQ,GAAG,IAAI,KAAK,EAC1E,CAEA,SAAS,mCAAmC,MAAO,SAAW,MAAM,MAAO,CACzE,GAAI,WAAa,UAAY,MAAM,QAAU,SAAU,MAAO,GAC9D,MAAM,aAAe,mBAAmB,MAAM,SAAS,EACjD,aAAe,mBAAmB,KAAK,EAC7C,MAAO,CAAC,aAAa,SAAS,SAAS,GACjC,CAAC,aAAa,SAAS,WAAW,GAAK,CAAC,aAAa,SAAS,UAAU,CAChF,CAEA,SAAS,sBAAsB,SAAW,MAAM,MAAO,CACrD,MAAM,QAAU,qBAAqB,QAAQ,EAC7C,GAAI,CAAC,SAAS,UAAU,OAAQ,OAAO,KACvC,MAAM,WAAa,uBAAuB,QAAQ,EAC5C,MAAQ,QAAQ,SAAS,KAAM,SACnC,MAAM,QAAQ,QAAQ,OAAO,GAC1B,QAAQ,QAAQ,SAAW,WAAW,QACtC,QAAQ,QAAQ,MAAM,CAAC,OAAQ,QAAU,SAAW,WAAW,KAAK,CAAC,CACzE,EACD,GAAI,MAAO,CACT,MAAM,YAAc,qBAAqB,OAAO,EAChD,OAAI,aAAe,GAAK,CAAC,mCAAmC,MAAM,UAAU,WAAW,EAAG,QAAQ,EAAU,KACrG,KACT,CACA,OAAO,QAAQ,sBAAwB,yBAAyB,OAAO,EAAI,IAC7E,CAEA,SAAS,kBAAkB,QAAS,QAAU,sBAAuB,CACnE,OAAK,SAAS,SAAS,OAChB,QAAQ,QAAQ,UAAW,QAAW,QAAQ,KAAK,OAAO,MAAQ,EAAE,CAAC,EADtC,EAExC,CAEA,SAAS,qBAAqB,QAAS,CACrC,GAAI,CAAC,SAAS,SAAS,OAAQ,MAAO,GACtC,MAAM,OAAS,QAAQ,QAAQ,UAAW,QAAW,4BAA4B,KAAK,OAAO,MAAQ,EAAE,CAAC,EACxG,OAAI,QAAU,EAAU,OACjB,QAAQ,QAAQ,UAAW,QAChC,OAAO,QAAQ,KAAM,OAAU,oCAAoC,KAAK,OAAO,OAAS,EAAE,CAAC,CAAC,CAC7F,CACH,CAEA,SAAS,kBAAkB,OAAQ,CACjC,MAAM,KAAO,mBAAmB,QAAQ,IAAI,EAC5C,GAAI,OAAS,aAAe,OAAS,cAAgB,OAAS,YAAc,OAAS,gBAAiB,MAAO,GAC7G,GAAI,OAAS,gBAAkB,OAAS,SAAU,MAAO,GACzD,MAAM,qBAAuB,IAAI,IAAI,CAAC,SAAU,YAAa,MAAO,QAAS,UAAW,aAAc,gBAAiB,kBAAkB,CAAC,EACpI,OAAS,MAAM,QAAQ,QAAQ,MAAM,EAAI,OAAO,OAAS,CAAC,EAChE,OAAO,OAAO,OAAS,GAAK,OAAO,MAAO,OAAU,qBAAqB,IAAI,mBAAmB,KAAK,CAAC,CAAC,CACzG,CAEA,SAAS,iBAAiB,OAAQ,CAChC,MAAM,QAAU,OAAO,QAAQ,MAAQ,EAAE,EAAE,YAAY,EACjD,KAAO,mBAAmB,QAAQ,IAAI,EAC5C,OAAO,OAAS,YACX,OAAS,OACT,OAAS,gBACT,OAAS,QACT,OAAS,YACT,OAAS,OACT,OAAS,SACT,OAAS,UACT,sDAAsD,KAAK,OAAO,CACzE,CAEA,SAAS,qBAAqB,QAAS,CACrC,OAAK,SAAS,SAAS,OAChB,QAAQ,QAAQ,UAAW,QAAW,kBAAkB,MAAM,CAAC,EADhC,EAExC,CAEA,SAAS,wBAAwB,MAAO,CAItC,MAAM,MAAQ,OAAO,OAAS,EAAE,EAAE,KAAK,EAAE,MAAM,yDAAyD,EACxG,OAAO,MAAQ,OAAO,MAAM,CAAC,CAAC,EAAI,CACpC,CAEA,SAAS,uBAAwB,CAC/B,OAAO,MAAM,KAAK,YAAY,iBAAiB,wBAAwB,CAAC,EACrE,IAAK,QAAW,OAAO,OAAO,QAAQ,gBAAkB,CAAC,CAAC,EAC1D,OAAQ,OAAU,OAAO,SAAS,KAAK,GAAK,MAAQ,CAAC,CAC1D,CAEA,SAAS,wBAAwB,OAAQ,CACvC,MAAM,OAAS,MAAM,QAAQ,QAAQ,MAAM,EAAI,OAAO,OAAS,CAAC,EAChE,GAAI,CAAC,OAAO,OAAQ,MAAO,GAC3B,MAAM,cAAgB,IAAI,IAAI,sBAAsB,CAAC,EACrD,GAAI,CAAC,cAAc,KAAM,MAAO,GAChC,MAAM,aAAe,OAAO,IAAK,OAAU,wBAAwB,KAAK,CAAC,EAAE,OAAQ,OAAU,MAAQ,CAAC,EACtG,OAAK,aAAa,OACK,aAAa,OAAQ,OAAU,cAAc,IAAI,KAAK,CAAC,EAC3D,QAAU,KAAK,IAAI,cAAc,KAAM,CAAC,EAAU,GAC9D,OAAO,MAAO,OAAU,uDAAuD,KAAK,OAAO,OAAS,EAAE,CAAC,CAAC,EAH9E,EAInC,CAEA,SAAS,oBAAoB,QAAS,CACpC,GAAI,CAAC,SAAS,SAAS,OAAQ,MAAO,GACtC,MAAM,WAAa,QAAQ,QAAQ,UAAW,QAAW,iBAAiB,MAAM,CAAC,EACjF,OAAI,YAAc,EAAU,WACrB,QAAQ,QAAQ,UAAW,QAAW,wBAAwB,MAAM,CAAC,CAC9E,CAEA,SAAS,4BAA4B,OAAQ,SAAU,WAAa,GAAI,CACtE,GAAI,YAAc,QAAQ,QAAQ,SAAS,UAAU,EAAG,OAAO,WAC/D,MAAM,UAAY,KAAK,IAAI,EAAG,OAAO,UAAY,CAAC,GAAK,CAAC,EAClD,WAAa,CACjB,OAAO,SAAS,EAChB,GAAG,SAAS,MACZ,GAAG,SAAS,OACZ,GAAG,SAAS,OACZ,GAAG,SAAS,QACZ,GAAG,SAAS,QACd,EACA,UAAW,aAAa,WAAY,CAClC,MAAM,MAAQ,oBAAoB,OAAQ,SAAS,EACnD,GAAI,MAAO,OAAO,KACpB,CACA,OAAO,QAAQ,QAAQ,KAAM,OAAU,wBAAwB,KAAK,IAAM,SAAS,GAAK,EAC1F,CAEA,SAAS,0BAA0B,SAAW,MAAM,MAAO,CACzD,MAAM,QAAU,qBAAqB,QAAQ,EAC7C,MAAO,GAAQ,SAAS,SAAS,QAAU,YAAY,cAAc,wBAAwB,GAAK,oBAAoB,OAAO,GAAK,EACpI,CAEA,SAAS,yBAAyB,SAAW,MAAM,MAAO,CACxD,OAAO,WAAa,MAAM,OAAS,0BAA0B,QAAQ,GAAK,CAAC,MAAM,qBACnF,CAEA,SAAS,wBAAwB,SAAW,MAAM,MAAO,CACvD,OAAO,0BAA0B,QAAQ,EAAI,EAAI,MAAM,QACzD,CAEA,SAAS,+BAA+B,QAAS,MAAO,CACtD,OAAK,SAAS,UAAU,KAAK,EACzB,qBAAoB,QAAU,qBAAqB,OAAO,GAC1D,YAAY,cAAc,wBAAwB,GAAK,QAAU,oBAAoB,OAAO,GAFzD,EAIzC,CAEA,SAAS,eAAe,OAAQ,CAC9B,MAAO,UAAU,KAAK,QAAQ,MAAQ,EAAE,CAC1C,CAEA,SAAS,0BAA0B,SAAW,MAAM,MAAO,CACzD,OAAO,WAAa,QAAU,WAAa,MAC7C,CAEA,SAAS,0BAA0B,WAAY,CAC7C,MAAM,MAAQ,OAAO,YAAc,EAAE,EAC/B,OAAS,MAAM,MAAM,oBAAoB,EAC/C,OAAI,OAAe,OAAO,OAAO,CAAC,CAAC,GAAK,GAAK,SAAW,YACpD,8DAA8D,KAAK,KAAK,EAAU,SAC/E,EACT,CAEA,SAAS,oBAAoB,OAAQ,aAAc,CACjD,MAAM,QAAU,mBAAmB,YAAY,EAC/C,MAAI,CAAC,SAAW,CAAC,QAAQ,QAAQ,OAAe,GACzC,OAAO,OAAO,KAAM,OAAU,mBAAmB,KAAK,IAAM,OAAO,GACrE,OAAO,OAAO,KAAM,OAAU,CAC/B,MAAM,IAAM,mBAAmB,KAAK,EACpC,OAAO,IAAI,SAAS,OAAO,GAAK,QAAQ,SAAS,GAAG,CACtD,CAAC,GACE,EACP,CAEA,SAAS,qBAAqB,MAAO,CACnC,MAAM,IAAM,mBAAmB,KAAK,EACpC,OAAI,IAAI,SAAS,OAAO,GAAK,IAAI,SAAS,MAAM,EAAU,SACtD,IAAI,SAAS,WAAW,GAAK,IAAI,SAAS,UAAU,EAAU,YAC3D,OAAO,OAAS,EAAE,CAC3B,CAEA,SAAS,0BAA0B,WAAY,SAAW,MAAM,MAAO,CACrE,GAAI,CAAC,0BAA0B,QAAQ,EAAG,MAAO,CAAE,MAAO,GAAI,MAAO,GAAI,SAAU,EAAG,EACtF,MAAM,QAAU,qBAAqB,QAAQ,EACvC,MAAQ,qBAAqB,OAAO,EACpC,SAAW,0BAA0B,UAAU,EACrD,OAAI,MAAQ,GAAK,CAAC,SAAiB,CAAE,MAAO,MAAO,GAAI,QAAS,EACzD,CACL,MACA,SACA,MAAO,oBAAoB,QAAQ,QAAQ,KAAK,EAAG,QAAQ,CAC7D,CACF,CAEA,SAAS,6BAA6B,WAAY,SAAW,MAAM,MAAO,CACxE,MAAM,SAAW,0BAA0B,WAAY,QAAQ,EAC/D,GAAI,SAAS,MAAQ,GAAK,CAAC,SAAS,MAAO,MAAO,GAClD,MAAM,WAAa,uBAAuB,QAAQ,EAClD,kBAAW,SAAS,KAAK,EAAI,SAAS,MACtC,iBAAiB,QAAQ,EAAI,WACtB,SAAS,KAClB,CAEA,SAAS,2BAA2B,SAAW,MAAM,MAAO,CAC1D,MAAM,QAAU,qBAAqB,QAAQ,EACvC,WAAa,2BAA2B,QAAQ,EACtD,MAAO,GACL,YACG,kBAAkB,OAAO,EAAI,GAC7B,0BAA0B,WAAY,QAAQ,EAAE,MAEvD,CAEA,SAAS,mBAAmB,SAAW,MAAM,MAAO,CAClD,MAAM,MAAQ,OAAO,QAAQ,EAC7B,MAAO,GAAQ,OAAS,CAAC,MAAM,SAAW,CAAC,MAAM,gBACnD,CAEA,SAAS,0BAA0B,SAAW,MAAM,MAAO,aAAe,GAAO,CAC/E,MAAM,QAAU,qBAAqB,QAAQ,EACvC,MAAQ,kBAAkB,OAAO,EAEvC,OADI,MAAQ,GACR,cAAgB,CAAC,uBAAuB,SAAU,KAAK,EAAU,GAC9D,uBAAuB,QAAQ,EAAE,KAAK,GAAK,EACpD,CAEA,SAAS,2BAA2B,SAAW,MAAM,MAAO,CAC1D,GAAI,WAAa,MAAM,MAAO,CAC5B,GAAI,cAAc,OAAQ,OAAO,cAAc,OAAS,GACxD,GAAI,eAAe,MAAO,OAAO,eAAe,MAChD,GAAI,MAAM,MAAO,OAAO,MAAM,KAChC,CACA,OAAO,0BAA0B,SAAU,EAAI,CACjD,CAEA,SAAS,2BAA2B,SAAW,MAAM,MAAO,CAE1D,MADI,CAAC,0BAA0B,QAAQ,GAAK,CAAC,mBAAmB,QAAQ,GAAK,cAAc,QACvF,2BAA2B,QAAQ,EAAU,GAC1C,CAAC,iCAAiC,QAAQ,CACnD,CAEA,SAAS,iCAAiC,SAAW,MAAM,MAAO,CAChE,MAAM,QAAU,qBAAqB,QAAQ,EACvC,QAAU,sBAAsB,QAAQ,EAC9C,MAAO,GAAQ,SAAW,SAAS,GACrC,CAEA,SAAS,6BAA6B,SAAW,MAAM,MAAO,CAC5D,MAAM,QAAU,qBAAqB,QAAQ,EAC7C,GAAI,CAAC,SAAS,SAAS,OAAQ,MAAO,CAAC,EACvC,MAAM,WAAa,uBAAuB,QAAQ,EAClD,OAAO,QAAQ,QAAQ,OAAO,CAAC,MAAO,OAAQ,SACxC,WAAW,KAAK,IAAG,MAAM,IAAI,OAAO,MAAQ,UAAU,MAAQ,CAAC,EAAE,EAAE,EAAI,WAAW,KAAK,GACpF,OACN,CAAC,CAAC,CACP,CAEA,SAAS,iBAAiB,SAAW,MAAM,MAAO,CAQhD,MAPe,CACb,KAAM,eACN,KAAM,oBACN,OAAQ,WACR,QAAS,gBACT,YAAa,aACf,EACc,QAAQ,GAAK,OAAO,QAAQ,GAAG,OAAS,QACxD,CAEA,SAAS,iBAAiB,MAAO,YAAc,GAAI,CACjD,OAAO,OAAO,OAAO,QAAQ,kBAAoB,OAAO,QAAQ,oBAAsB,aAAe,EAAE,EAAE,KAAK,CAChH,CAEA,SAAS,mBAAmB,MAAO,YAAc,GAAI,CACnD,OAAO,OAAO,OAAO,QAAQ,oBAAsB,iBAAiB,MAAO,WAAW,GAAK,aAAe,EAAE,EAAE,KAAK,CACrH,CAEA,SAAS,6BAA8B,CACrC,OAAO,MAAM,KAAK,MAAM,MAAM,EAAE,IAAK,KAAQ,CAC3C,MAAM,MAAQ,YAAY,cAAc,8BAA8B,IAAI,OAAO,GAAG,CAAC,IAAI,EACzF,OAAI,2BAA2B,KAAK,EAAU,GACvC,iBAAiB,MAAO,GAAG,GAAK,GACzC,CAAC,EAAE,OAAO,OAAO,CACnB,CAEA,SAAS,2BAA4B,CACnC,IAAI,MAAQ,EACZ,aAAM,OAAO,QAAS,KAAQ,CAC5B,GAAI,cAAc,GAAG,EAAI,EAAG,OAC5B,MAAM,MAAQ,YAAY,cAAc,8BAA8B,IAAI,OAAO,GAAG,CAAC,IAAI,EACrF,2BAA2B,KAAK,IACpC,OAAS,EACX,CAAC,EACM,KACT,CAEA,SAAS,8BAA8B,MAAO,CAC5C,MAAM,MAAQ,CACZ,YAAa,iBAAiB,MAAM,KAAK,EACzC,wBAAyB,MAAM,KACjC,EAEA,GAAI,CAAC,MAAM,QAAS,CAClB,MAAM,MAAQ,mBAAmB,EAC7B,QAAO,MAAM,aAAa,EAAI,MACpC,CAEA,MAAM,oBAAsB,4BAA4B,EACxD,OAAI,oBAAoB,SAAQ,MAAM,wBAAwB,EAAI,oBAAoB,KAAK,IAAI,GAC/F,OAAO,OAAO,MAAO,6BAA6B,CAAC,EAC5C,KACT,CAEA,SAAS,8BAA8B,WAAY,QAAS,CACrD,4BACL,0BAA0B,gBAAgB,EACrC,SACL,OAAO,QAAQ,YAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAK,KAAK,IAAM,CACzD,GAAI,CAAC,KAAO,OAAS,MAAQ,OAAO,KAAK,IAAM,GAAI,OACnD,MAAM,MAAQ,SAAS,cAAc,OAAO,EAC5C,MAAM,KAAO,SACb,MAAM,KAAO,cAAc,GAAG,IAC9B,MAAM,MAAQ,OAAO,KAAK,EAC1B,0BAA0B,OAAO,KAAK,CACxC,CAAC,EACH,CAEA,SAAS,uBAAuB,CAAE,SAAU,UAAW,SAAU,EAAG,CAClE,MAAM,WAAa,EAAQ,OAAO,WAAa,EAAE,EAC3C,MAAQ,GAAQ,UAAY,YAElC,MAAO,CAAE,MAAO,iBADS,GAAQ,WAAa,YACZ,QAAS,KAAM,CACnD,CAEA,SAAS,oBAAoB,CAAE,SAAU,UAAW,UAAW,SAAU,UAAW,EAAG,CACrF,GAAI,CAAC,iBAAmB,CAAC,qBAAuB,CAAC,wBAA0B,CAAC,wBAAyB,OACrG,MAAM,cAAgB,OAAO,WAAa,EAAE,EACtC,aAAe,KAAK,IAAI,EAAG,OAAO,UAAY,CAAC,GAAK,CAAC,EACrD,CAAE,MAAO,iBAAkB,OAAQ,EAAI,uBAAuB,CAClE,SACA,UACA,UAAW,aACb,CAAC,EACK,eAAiB,uBAAuB,QAAU,cAClD,gBAAkB,wBAAwB,QAAU,OAAO,YAAY,EAE7E,gBAAgB,OAAS,CAAC,QAC1B,gBAAgB,aAAa,cAAe,QAAU,QAAU,MAAM,EACtE,gBAAgB,aAAa,gBAAiB,iBAAmB,OAAS,OAAO,EACjF,gBAAgB,UAAU,OAAO,yBAA0B,gBAAgB,EACvE,kBACF,gBAAgB,aAAa,OAAQ,QAAQ,EAC7C,gBAAgB,aAAa,aAAc,uHAAuH,IAElK,gBAAgB,gBAAgB,MAAM,EACtC,gBAAgB,gBAAgB,YAAY,GAE9C,oBAAoB,MAAQ,CAAC,MAC7B,oBAAoB,aAAa,gBAAiB,MAAQ,QAAU,MAAM,EAC1E,oBAAoB,QAAQ,cAAgB,MAAQ,OAAS,QAC7D,uBAAuB,MAAQ,cAC/B,wBAAwB,MAAQ,OAAO,YAAY,EACnD,uBAAuB,SAAW,CAAC,QACnC,wBAAwB,SAAW,CAAC,QACpC,8BAA8B,WAAY,OAAO,EAC7C,+BAA8B,6BAA6B,OAAS,CAAC,kBACrE,4BAA2B,0BAA0B,OAAS,CAAC,kBAE/D,QAAU,gBAAkB,kBAC9B,uBAAuB,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,CAE/E,CAEA,SAAS,uCAAuC,QAAS,YAAa,MAAO,WAAY,CACvF,OAAK,SAAS,UAAU,OACjB,QAAQ,SAAS,OAAQ,SAC9B,QAAQ,UAAU,WAAW,IAAM,OAChC,QAAQ,QAAQ,MAAM,CAAC,YAAa,QACrC,QAAU,aAAe,CAAC,WAAW,KAAK,GAAK,cAAgB,WAAW,KAAK,CAChF,CACF,EANsC,CAAC,CAO1C,CAEA,SAAS,0BAA0B,QAAS,YAAa,MAAO,WAAY,CAC1E,MAAM,SAAW,uCAAuC,QAAS,YAAa,MAAO,UAAU,EACzF,WAAa,mCAAmC,KAAK,EACrD,MAAQ,YAAc,SAAS,OAAS,EAC9C,MAAO,CACL,SACA,WACA,MACA,UAAW,OAAS,SAAS,KAAM,SAAY,CAAC,cAAc,OAAO,EAAE,UAAU,CACnF,CACF,CAEA,SAAS,iCAAkC,CACzC,GAAI,MAAM,QAAU,SAAU,OAC9B,MAAM,QAAU,qBAAqB,EAC/B,YAAc,qBAAqB,OAAO,EAC1C,OAAS,SAAS,UAAU,WAAW,GAAG,QAAU,CAAC,EAC3D,GAAI,YAAc,GAAK,CAAC,OAAO,OAAQ,OACvC,MAAM,WAAa,uBAAuB,EAE1C,GADgB,0BAA0B,QAAS,YAAa,WAAW,WAAW,EAAG,UAAU,EACvF,MAAO,OACnB,MAAM,WAAa,OAAO,IAAK,QAAW,CACxC,MACA,MAAO,0BAA0B,QAAS,YAAa,MAAO,UAAU,CAC1E,EAAE,EACI,KAAO,WAAW,KAAM,WAAc,UAAU,MAAM,SAAS,GAChE,WAAW,KAAM,WAAc,UAAU,MAAM,KAAK,EACpD,OACL,WAAW,WAAW,EAAI,KAAK,MAC/B,iBAAiB,MAAM,KAAK,EAAI,WAClC,CAEA,SAAS,uBAAuB,QAAS,YAAa,MAAO,CAC3D,OAAK,SAAS,UAAU,OACjB,QAAQ,SAAS,OAAQ,SAAY,QAAQ,UAAU,WAAW,IAAM,KAAK,EAD7C,CAAC,CAE1C,CAEA,SAAS,uBAAuB,SAAU,CACxC,MAAM,YAAc,SAAS,IAAK,SAAY,cAAc,QAAS,CAAC,CAAC,EACvE,OAAI,YAAY,KAAM,OAAU,MAAM,YAAc,YAAc,MAAM,YAAc,QAAQ,EACrF,CAAE,UAAW,WAAY,MAAO,UAAW,EAEhD,YAAY,KAAM,OAAU,MAAM,YAAc,aAAa,EACxD,CAAE,UAAW,cAAe,MAAO,WAAY,EAEpD,YAAY,KAAM,OAAU,MAAM,YAAc,QAAQ,EACnD,CAAE,UAAW,SAAU,MAAO,cAAe,EAE/C,CAAE,UAAW,aAAc,MAAO,cAAe,CAC1D,CAEA,SAAS,kCAAmC,CAC1C,OAAO,KAAK,MAAM,EAAE,QAAS,KAAQ,CACnC,MAAM,QAAU,qBAAqB,GAAG,EACxC,GAAI,CAAC,QAAS,OACd,MAAM,QAAU,sBAAsB,GAAG,GAAK,yBAAyB,OAAO,EAC1E,QAAQ,QAAO,OAAO,GAAG,EAAE,MAAQ,QAAQ,OAC3C,SAAS,OAAS,OAAM,OAAO,GAAG,EAAE,MAAQ,OAAO,QAAQ,KAAK,GACpE,OAAO,GAAG,EAAE,KAAO,SAAS,gBAAkB,KAAO,OAAO,QAAQ,cAAc,EAAI,KACtF,MAAM,KAAO,YAAY,cAAc,8BAA8B,IAAI,OAAO,GAAG,CAAC,IAAI,GAAG,QAAQ,cAAc,EAC3G,UAAY,MAAM,cAAc,qBAAqB,EACrD,UAAY,MAAM,cAAc,eAAe,EACjD,WAAa,QAAQ,QACvB,UAAU,YAAc,UAAU,QAAQ,gBAAkB,QAAQ,MACpE,UAAU,MAAQ,QAAQ,OAExB,YACF,UAAU,UAAY,SAAS,OAAS,KACpC,gBAAgB,OAAO,QAAQ,KAAK,EAAG,SAAS,gBAAkB,KAAO,OAAO,QAAQ,cAAc,EAAI,IAAI,EAC9G,8CAER,CAAC,CACH,CAEA,SAAS,yBAAyB,WAAY,SAAW,MAAM,MAAO,CACpE,MAAM,QAAU,qBAAqB,QAAQ,EACvC,MAAQ,kBAAkB,OAAO,EACvC,GAAI,MAAQ,EAAG,MAAO,GACtB,MAAM,OAAS,mBAAmB,UAAU,EAEtC,MADS,QAAQ,QAAQ,KAAK,EACf,QAAQ,KAAM,OAAU,CAC3C,MAAM,SAAW,mBAAmB,KAAK,EACzC,OAAO,WAAa,QAAU,SAAS,SAAS,MAAM,GAAK,OAAO,SAAS,QAAQ,CACrF,CAAC,EACD,GAAI,CAAC,MAAO,MAAO,GACnB,MAAM,WAAa,uBAAuB,QAAQ,EAClD,kBAAW,KAAK,EAAI,MACpB,iBAAiB,QAAQ,EAAI,WAC7B,wBAAwB,SAAU,KAAK,EAChC,EACT,CAEA,SAAS,iBAAiB,WAAY,CACpC,MAAM,MAAQ,OAAO,YAAc,EAAE,EACrC,MAAI,qBAAqB,KAAK,KAAK,EAAU,QACzC,kBAAkB,KAAK,KAAK,EAAU,UACtC,gBAAgB,KAAK,KAAK,EAAU,SACpC,WAAW,KAAK,KAAK,EAAU,UAC/B,4BAA4B,KAAK,KAAK,EAAU,SAChD,aAAa,KAAK,KAAK,EAAU,OACjC,sBAAsB,KAAK,KAAK,EAAU,OAC1C,eAAe,KAAK,KAAK,EAAU,QACnC,oBAAoB,KAAK,KAAK,EAAU,SACxC,QAAQ,KAAK,KAAK,EAAU,OAC5B,WAAW,KAAK,KAAK,EAAU,UAC/B,sBAAsB,KAAK,KAAK,EAAU,WACvC,OACT,CAEA,SAAS,+BAA+B,OAAQ,CAC9C,GAAI,CAAC,sBAAsB,KAAK,OAAO,QAAQ,MAAQ,EAAE,CAAC,EAAG,MAAO,GACpE,MAAM,OAAS,MAAM,QAAQ,QAAQ,MAAM,EAAI,OAAO,OAAO,OAAQ,OAAU,OAAO,OAAS,EAAE,EAAE,KAAK,CAAC,EAAI,CAAC,EAC9G,MAAO,GAAQ,OAAO,QAAU,OAAO,MAAO,OAAU,iBAAiB,KAAK,IAAM,OAAO,EAC7F,CAEA,SAAS,qBAAqB,QAAS,CACrC,OAAK,SAAS,SAAS,OAChB,QAAQ,QAAQ,UAAW,QAAW,+BAA+B,MAAM,CAAC,EAD7C,EAExC,CAEA,SAAS,qBAAqB,QAAS,CACrC,MAAM,MAAQ,OACZ,SAAS,OACN,YAAY,QAAQ,cACpB,OAAO,MAAM,KAAK,GAAG,OACrB,yBACL,EAAE,KAAK,EACD,MAAQ,iBAAiB,KAAK,EAC9B,uBAAyB,QAAU,QACnC,WAAa,uBAAyB,OAAS,MAC/C,MAAQ,QAAU,QACpB,MACA,MAAM,QAAQ,IAAI,OAAO,QAAQ,KAAK,4BAAmB,GAAG,EAAG,EAAE,EAAE,KAAK,GAAK,MACjF,MAAO,CAAE,MAAO,WAAY,MAAO,MAAO,sBAAuB,CACnE,CAEA,SAAS,kBAAmB,CAC1B,MAAM,QAAU,qBAAqB,EAC/B,MAAQ,qBAAqB,OAAO,EACpC,OAAS,OAAS,EAAI,SAAS,UAAU,KAAK,EAAI,KACxD,MAAO,CAAE,QAAS,MAAO,MAAO,CAClC,CAEA,SAAS,4BAA4B,QAAU,qBAAqB,EAAG,CACrE,MAAO,GACL,mBACG,SACA,MAAM,QAAU,UAChB,MAAM,QAAU,eAChB,qBAAqB,OAAO,GAAK,EAExC,CAEA,SAAS,kBAAmB,CAC1B,KAAM,CAAE,QAAS,MAAO,MAAO,EAAI,iBAAiB,EACpD,MAAI,CAAC,SAAW,MAAQ,GAAK,CAAC,QAAQ,QAAQ,OAAe,CAAC,EACvD,OAAO,OAAO,IAAK,OAAU,CAClC,MAAM,SAAW,uBAAuB,QAAS,MAAO,KAAK,EACvD,OAAS,uBAAuB,QAAQ,EACxC,cAAgB,0BAA0B,MAAO,MAAM,KAAK,EAC5D,UAAY,cAAc,OAAS,cAAc,UAAY,OACnE,MAAO,CACL,MAAO,iBAAiB,KAAK,EAC7B,MAAO,MACP,OACA,SACF,CACF,CAAC,CACH,CAEA,SAAS,gBAAiB,CACxB,eAAe,UAAU,OAAO,SAAS,EACzC,eAAe,UAAU,OAAO,SAAS,EACzC,YAAY,cAAc,qBAAqB,GAAG,aAAa,gBAAiB,OAAO,EACvF,YAAY,cAAc,qBAAqB,GAAG,aAAa,gBAAiB,OAAO,CACzF,CAEA,SAAS,uBAAwB,CAC/B,GAAI,CAAC,kBAAmB,OACxB,KAAM,CAAE,QAAS,KAAM,EAAI,iBAAiB,EACtC,KAAO,4BAA4B,OAAO,EAGhD,GAFA,kBAAkB,OAAS,CAAC,KAC5B,YAAY,UAAU,OAAO,6BAA8B,IAAI,EAC3D,CAAC,KAAM,CACT,eAAe,EACf,MACF,CAEA,MAAM,QAAU,iBAAiB,EAC3B,WAAa,uBAAuB,EACpC,eAAiB,qBAAqB,OAAO,EAC7C,kBAAoB,gBAAkB,GAAI,WAAW,cAAc,GAAK,GAC9E,GAAI,CAAC,QAAQ,OAAQ,CACnB,MAAM,UAAY,qBAAqB,OAAO,EACxC,MAAQ,sBAAsB,EAAI,cAAc,sBAAsB,CAAC,EAAE,MAAQ,GACvF,kBAAoB,UAAU,MAC1B,gBAAe,cAAc,YAAc,mBAC3C,gBAAe,cAAc,YAAc,UAAU,OACrD,gBAAe,cAAc,UAAY,sDACzC,gBAAe,cAAc,YAAc,mBAAqB,QAChE,gBAAe,cAAc,YAAc,yDAAyD,OAAS,sCAAsC,IACnJ,gBAAe,cAAc,UAAY,wCAAwC,WAAW,UAAU,KAAK,CAAC,qDAC5G,gBAAe,cAAc,UAAY,wCAAwC,WAAW,UAAU,KAAK,CAAC,uBAAuB,WAAW,UAAU,KAAK,CAAC,kBAClK,MACF,CACA,MAAM,cAAgB,OAAS,GAAI,WAAW,KAAK,GAAK,mBAAmB,EACrE,cAAgB,QAAQ,KAAM,OAAU,MAAM,QAAU,aAAa,GAAK,KAEhF,kBADsB,mBAAqB,eAAe,OAAS,QAAQ,CAAC,GAAG,OAAS,iBAAiB,aAAa,GAAK,QAE3H,MAAM,aAAe,MAAM,KAAK,IAAI,IAAI,QAAQ,IAAK,OAAU,CAAC,MAAM,MAAO,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,EACxF,eAAiB,QAAQ,OAAQ,OAAU,MAAM,QAAU,iBAAiB,EAC5E,aAAe,OAAS,EAC1B,2FACA,6EACE,eAAiB,eAAe,QAAQ,QAAU,cAAgB,cAAc,sBAAsB,CAAC,EAAE,WAAa,UACtH,kBAAoB,eAAe,YAAc,cAAgB,0BAA0B,cAAe,MAAM,KAAK,EAAE,MAAQ,QAUrI,GARI,gBAAe,cAAc,YAAc,mBAC3C,gBAAe,cAAc,YAAc,eAAiB,gBAC5D,gBACF,cAAc,UAAY,cACtB,+BAA+B,WAAW,cAAc,CAAC,UACzD,6CAEF,gBAAe,cAAc,YAAc,mBAAqB,QAChE,cAAe,CACjB,MAAM,MAAQ,sBAAsB,EAAI,cAAc,sBAAsB,CAAC,EAAE,MAAQ,GACvF,cAAc,YAAc,cACxB,GAAG,aAAa,KAAK,mBAAqB,MAAM,eAAe,OAAS,YAAY,GACpF,YACN,CACI,gBACF,cAAc,UAAY,aAAa,OACnC,aAAa,IAAK,OAAU,CAC5B,MAAM,MAAQ,QAAQ,OAAQ,MAAS,KAAK,QAAU,MAAM,KAAK,EAAE,OACnE,MAAO,gDAAgD,MAAM,QAAU,kBAAoB,aAAe,EAAE,sBAAsB,WAAW,MAAM,KAAK,CAAC;AAAA,sBAC7I,WAAW,MAAM,KAAK,CAAC;AAAA,qBACxB,KAAK,IAAI,QAAU,EAAI,MAAQ,MAAM;AAAA,oBAElD,CAAC,EAAE,KAAK,EAAE,EACR,4DAEF,gBACF,cAAc,UAAY,eAAe,OACrC,eAAe,IAAK,OAAU,gDAAgD,MAAM,QAAU,cAAgB,aAAe,EAAE,4BAA4B,WAAW,MAAM,KAAK,CAAC;AAAA,oBACxK,WAAW,MAAM,KAAK,CAAC;AAAA,mBACxB,WAAW,MAAM,SAAS,CAAC,MAAM,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,kBAChE,EAAE,KAAK,EAAE,EACjB,uEAER,CAEA,SAAS,uBAAuB,SAAW,MAAM,MAAO,CACtD,MAAM,MAAQ,OAAO,QAAQ,EAC7B,MAAO,GACL,WAAa,MAAM,OAChB,eAAe,OACf,CAAC,cAAc,QACf,CAAC,2BAA2B,QAAQ,GACpC,CAAC,OAAO,SACR,CAAC,OAAO,gBAEf,CAEA,SAAS,qBAAsB,CAC7B,GAAI,CAAC,oBAAsB,CAAC,oBAAqB,OACjD,MAAM,QAAU,qBAAqB,EAC/B,QAAU,SAAS,SAAW,CAAC,EAC/B,cAAgB,QAAQ,OAAQ,QAAW,OAAO,QAAQ,QAAU,EAAE,QAAQ,uBAAyB,OAAO,OAAO,SAAW,EAAE,EAClI,eAAiB,QAAQ,KAAM,QAAW,cAAc,MAAM,CAAC,EAC/D,qBAAuB,GAAQ,SAAW,MAAM,QAAU,eAAiB,CAAC,gBAClF,GAAI,CAAC,SAAY,CAAC,cAAc,QAAU,CAAC,qBAAuB,CAChE,mBAAmB,OAAS,GAC5B,oBAAoB,UAAY,GAC5B,qBAAoB,mBAAmB,OAAS,IAChD,uBAAsB,qBAAqB,UAAY,IAC3D,MACF,CACA,MAAM,WAAa,uBAAuB,EACpC,mBAAqB,qBAAqB,OAAO,EACjD,qBAAuB,GAC3B,MAAM,QAAU,UACb,oBACA,sBACA,oBAAsB,GACtB,QAAQ,UAAU,kBAAkB,GAAG,QAAQ,QAE9C,WAAa,kBAAkB,OAAO,EACtC,eAAiB,qBAAqB,OAAO,EAC7C,iBAAmB,4BAA4B,OAAO,GAAK,gBAAkB,EAC7E,kBAAoB,mBAAmB,EACvC,oBAAsB,GAAQ,0BAA0B,GAAK,oBAAsB,GACnF,mBAAqB,oBACtB,kBAAoB,6BAA6B,iBAAiB,EAAI,WAAW,kBAAkB,GAAK,GACzG,GACE,QAAU,sBAAsB,EAChC,iBAAmB,mBAAmB,GAAK,WAAa,EACxD,qBAAuB,GAAQ,0BAA0B,GAAK,mBAAqB,oBAEnF,8BAAgC,GAAQ,qBAAuB,CAAC,mBAAqB,oBAAsB,SAC3G,kBAAoB,GAAQ,qBAAuB,CAAC,oBAAsB,mBAAmB,GAAK,CAAC,cAAc,QAAU,CAAC,iCAAiC,GACnK,GAAI,oBAAsB,uBACxB,mBAAmB,OAAS,CAAC,qBAC7B,qBAAqB,UAAY,GAC7B,sBAAsB,CACxB,MAAM,OAAS,QAAQ,QAAQ,kBAAkB,EACjD,qBAAqB,aAAa,OAAQ,YAAY,EACtD,qBAAqB,aAAa,aAAc,OAAO,MAAQ,gBAAgB,EAC/E,qBAAqB,UAAY,OAAO,OAAO,IAAK,OAAU,CAC5D,MAAM,SAAW,QAAU,WAAW,kBAAkB,EAClD,YAAc,0BAA0B,QAAS,mBAAoB,MAAO,UAAU,EAC5F,MAAO,oEAAoE,SAAW,eAAiB,EAAE,GAAG,YAAY,UAAY,GAAK,iBAAiB,+BAA+B,kBAAkB,+BAA+B,WAAW,KAAK,CAAC,mBAAmB,SAAW,OAAS,OAAO,mBAAmB,SAAW,OAAS,OAAO,oBAAoB,YAAY,MAAQ,QAAU,MAAM,IAAI,YAAY,MAAQ,GAAK,WAAW;AAAA,cACnb,WAAW,qBAAqB,KAAK,CAAC,CAAC;AAAA,oBAE7C,CAAC,EAAE,KAAK,EAAE,CACZ,CAEF,mBAAmB,OAAS,GACxB,uBAAsB,qBAAqB,YAAc,sBAAwB,8BAAgC,gBAAkB,mBACvI,MAAM,sBAAwB,sBAAwB,MAAM,QAAU,SAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAW7E,GACE,cAAgB,QAAQ,IAAI,CAAC,OAAQ,SAAW,CAAE,OAAQ,KAAM,EAAE,EACpE,MAAM,QAAU,UAClB,cAAc,KAAK,CAAC,EAAG,IAAM,CAC3B,MAAM,MAAQ,OAAO,EAAE,QAAQ,MAAQ,EAAE,EAAE,YAAY,EACjD,MAAQ,OAAO,EAAE,QAAQ,MAAQ,EAAE,EAAE,YAAY,EACjD,MAAQ,MAAM,SAAS,QAAQ,EAAI,EAAI,EAAE,QAAU,mBAAqB,EAAI,EAC5E,MAAQ,MAAM,SAAS,QAAQ,EAAI,EAAI,EAAE,QAAU,mBAAqB,EAAI,EAClF,OAAO,MAAQ,OAAS,EAAE,MAAQ,EAAE,KACtC,CAAC,EAEH,oBAAoB,UAAY,sBAAwB,cAAc,IAAI,CAAC,CAAE,OAAQ,KAAM,IAAM,CAM/F,GALI,CAAC,OAAO,QAAQ,QAChB,MAAM,QAAU,UAAY,eAAe,MAAM,GACjD,MAAM,QAAU,UAAY,OAAO,OAAO,SAAW,GACrD,sBAAwB,QAAU,oBAClC,kBAAoB,QAAU,gBAC9B,+BAA+B,QAAS,KAAK,EAAG,MAAO,GAC3D,MAAM,SAAW,sBAAsB,KAAK,GACtC,cAAgB,GAAQ,qBAAuB,QAAU,oBACzD,YAAc,cAAc,MAAM,EAClC,sBAAwB,GACxB,sBAAwB,oBAAsB,WAAW,KAAK,GAAK,GACzE,OAAI,eAAiB,CAAC,mBACb;AAAA;AAAA,qBAEM,WAAW,OAAO,MAAQ,UAAU,MAAQ,CAAC,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,UAM3D,sBACK;AAAA;AAAA,qBAEM,WAAW,OAAO,MAAQ,gBAAgB,CAAC;AAAA;AAAA,sBAE1C,WAAW,uBAAyB,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA,UAMvD,aAAe,CAAC,cACX;AAAA;AAAA,qBAEM,WAAW,OAAO,MAAQ,UAAU,MAAQ,CAAC,EAAE,CAAC;AAAA,+EACU,WAAW,OAAO,MAAQ,OAAO,CAAC;AAAA,gBACjG,OAAO,OAAO,IAAK,OAAU,CAC7B,MAAM,SAAW,QAAU,WAAW,KAAK,EAErC,UADU,uCAAuC,QAAS,MAAO,MAAO,UAAU,EAC9D,KAAM,MAAS,CAAC,cAAc,IAAI,EAAE,UAAU,EACxE,MAAO,mDAAmD,SAAW,eAAiB,EAAE,GAAG,UAAY,GAAK,iBAAiB,+BAA+B,KAAK,+BAA+B,WAAW,KAAK,CAAC,mBAAmB,SAAW,OAAS,OAAO;AAAA,qEAC1M,WAAW,iBAAiB,KAAK,CAAC,CAAC;AAAA,0BAC9E,WAAW,KAAK,CAAC;AAAA,oBACvB,UAAY,GAAK,oBAAoB;AAAA,0BAE3C,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,UAKZ;AAAA,yCAC4B,cAAgB,kBAAoB,EAAE;AAAA,wBACvD,QAAQ,KAAK,WAAW,OAAO,MAAQ,UAAU,MAAQ,CAAC,EAAE,CAAC,GAAG,cAAgB,UAAY,EAAE;AAAA,wBAC9F,QAAQ,+BAA+B,KAAK,IAAI,cAAgB,YAAc,EAAE;AAAA,cAC1F,OAAO,OAAO,IAAK,OAAU,kBAAkB,WAAW,KAAK,CAAC,IAAI,QAAU,WAAW,KAAK,EAAI,YAAc,EAAE,IAAI,WAAW,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,YAE9J,cAAgB,0CAA0C,kBAAoB,gBAAgB,WAAW,iBAAiB,CAAC,IAAM,2CAA2C,WAAa,EAAE;AAAA;AAAA,OAGnM,CAAC,EAAE,KAAK,EAAE,EACV,MAAM,6BAAgC,WAAc,CAClD,WAAW,iBAAiB,4BAA4B,EAAE,QAAS,QAAW,CAC5E,OAAO,iBAAiB,QAAU,OAAU,CAC1C,GAAI,OAAO,UAAY,OAAO,aAAa,eAAe,IAAM,OAAQ,OACxE,MAAM,MAAQ,OAAO,OAAO,QAAQ,mBAAqB,CAAC,EACpD,KAAO,uBAAuB,EAChC,MAAM,QAAU,UAAY,QAAU,qBAAqB,qBAAqB,CAAC,GAE/E,CADgB,0BAA0B,qBAAqB,EAAG,MAAO,OAAO,QAAQ,mBAAqB,GAAI,IAAI,EACxG,QAEnB,KAAK,KAAK,EAAI,OAAO,QAAQ,mBAAqB,GAClD,iBAAiB,MAAM,KAAK,EAAI,KAChC,wBAAwB,MAAM,MAAO,KAAK,EAC1C,cAAc,OAAS,GACvB,eAAe,MAAQ,GACvB,eAAe,MAAQ,GACvB,iBAAiB,EACjB,MAAM,MAAQ,0BAA0B,MAAM,MAAO,EAAI,GAAK,MAAM,MACpE,kCAAkC,KAAK,EACvC,gBAAgB,EAClB,CAAC,CACH,CAAC,CACH,EACA,GAAI,CAAC,oBAAoB,UAAU,KAAK,EAAG,CACzC,6BAA6B,oBAAoB,EACjD,mBAAmB,OAAS,GACxB,uBAAsB,qBAAqB,YAAc,IAC7D,MACF,CACA,oBAAoB,iBAAiB,kCAAkC,EAAE,QAAS,QAAW,CAC3F,OAAO,iBAAiB,SAAW,OAAU,CAC3C,MAAM,MAAQ,OAAO,OAAO,QAAQ,mBAAqB,CAAC,EACpD,KAAO,uBAAuB,EACpC,KAAK,KAAK,EAAI,OAAO,MACrB,iBAAiB,MAAM,KAAK,EAAI,KAChC,wBAAwB,MAAM,MAAO,KAAK,EAC1C,cAAc,OAAS,GACvB,eAAe,MAAQ,GACvB,eAAe,MAAQ,GACvB,iBAAiB,EACjB,MAAM,MAAQ,0BAA0B,MAAM,MAAO,EAAI,GAAK,MAAM,MACpE,kCAAkC,KAAK,EACvC,gBAAgB,CAClB,CAAC,CACH,CAAC,EACD,CAAC,oBAAqB,oBAAoB,EAAE,QAAQ,4BAA4B,EAC5E,uBACF,qBAAqB,UAAU,OAAO,aAAc,CAAC,SAAW,CAAC,QAAQ,SAAS,EAClF,qBAAqB,YAAc,SAAS,UAAY,WAAa,WAEzE,CAEA,SAAS,YAAa,CACpB,IAAIC,OAAQ,EACZ,aAAM,OAAO,QAAS,KAAQ,CAC5B,MAAM,MAAQ,YAAY,cAAc,8BAA8B,IAAI,OAAO,GAAG,CAAC,IAAI,EACrF,2BAA2B,KAAK,IACpCA,QAAS,OAAO,OAAO,QAAQ,YAAc,CAAC,EAAI,cAAc,GAAG,EACrE,CAAC,EACMA,MACT,CAEA,SAAS,gBAAiB,CACxB,IAAIA,OAAQ,EACZ,aAAM,OAAO,QAAS,KAAQ,CAC5B,MAAM,MAAQ,YAAY,cAAc,8BAA8B,IAAI,OAAO,GAAG,CAAC,IAAI,EACzF,GAAI,2BAA2B,KAAK,EAAG,OACvC,MAAM,WAAa,OAAO,OAAO,QAAQ,YAAc,CAAC,EAClD,oBAAsB,OAAO,OAAO,QAAQ,qBAAuB,YAAc,CAAC,EACxFA,QAAS,oBAAsB,cAAc,GAAG,CAClD,CAAC,EACMA,MACT,CAEA,SAAS,WAAY,CACnB,MAAM,MAAQ,YAAY,cAAc,4BAA4B,EACpE,OAAO,OAAO,OAAO,QAAQ,WAAa,CAAC,CAC7C,CAEA,SAAS,cAAc,gBAAkB,KAAM,CAC7C,MAAM,QAAU,iBAAmB,sBAAsB,EACnD,SAAW,wBAAwB,EACzC,OAAI,SAAS,OAAS,KAAa,OAAO,QAAQ,KAAK,EAAI,SACpD,OAAO,MAAM,KAAK,EAAE,OAAS,KAAO,OAAO,MAAM,KAAK,EAAE,MAAQ,SAAW,CACpF,CAEA,SAAS,kBAAkB,gBAAkB,KAAM,CACjD,MAAM,QAAU,iBAAmB,sBAAsB,EACnD,SAAW,wBAAwB,EACzC,OAAI,MAAM,QAAU,cACd,SAAS,gBAAkB,KAAa,OAAO,QAAQ,cAAc,EAAI,SACtE,OAAO,MAAM,KAAK,EAAE,MAAQ,KAAO,OAAO,MAAM,KAAK,EAAE,KAAO,SAAW,CAIpF,CAEA,SAAS,MAAM,gBAAkB,KAAM,CACrC,OAAI,MAAM,QAAU,cAAsB,cAAc,eAAe,EAAI,WAAW,EAC/E,cAAc,eAAe,EAAI,WAAW,EAAI,UAAU,EAAI,wBAAwB,CAC/F,CAEA,SAAS,oBAAqB,CAC5B,GAAI,cAAc,OAAQ,MAAO,GAAG,cAAc,KAAK,IAAI,cAAc,KAAK,GAAG,KAAK,EACtF,GAAI,eAAe,MAAO,OAAO,eAAe,MAChD,MAAM,aAAe,0BAA0B,MAAM,MAAO,EAAI,GAAK,0BAA0B,MAAM,MAAO,EAAK,EACjH,OAAI,cACG,MAAM,OAAS,EACxB,CAEA,SAAS,qBAAsB,CAC7B,YAAY,iBAAiB,gEAAgE,EAAE,QAAS,MAAS,CAC/G,MAAM,MAAQ,KAAK,cAAc,OAAO,EACxC,KAAK,UAAU,OAAO,cAAe,EAAQ,OAAO,OAAQ,CAC9D,CAAC,CACH,CAEA,SAAS,oBAAqB,CAC5B,OAAO,YAAY,cAAc,8BAA8B,IAAI,OAAO,MAAM,KAAK,CAAC,IAAI,GAAG,QAAQ,cAAc,GAAK,IAC1H,CAEA,SAAS,mBAAoB,CAC3B,YAAY,iBAAiB,aAAa,EAAE,QAAS,MAAS,CAC5D,KAAK,UAAU,OAAO,YAAa,OAAO,KAAK,QAAQ,cAAgB,EAAE,IAAM,aAAa,KAAK,CACnG,CAAC,CACH,CAEA,SAAS,yBAAyB,SAAW,SAAU,CACrD,GAAI,CAAC,cAAe,OACpB,MAAM,YAAc,cAAc,cAAc,mCAAmC,aAAa,KAAK,IAAI,EACzG,GAAI,CAAC,YAAa,OAClB,MAAM,SAAW,cAAc,sBAAsB,EAC/C,UAAY,YAAY,sBAAsB,EAC9C,aAAe,UAAU,KAC3B,SAAS,KACT,cAAc,YACb,cAAc,YAAc,UAAU,OAAS,EACpD,cAAc,SAAS,CAAE,KAAM,KAAK,IAAI,EAAG,YAAY,EAAG,QAAS,CAAC,CACtE,CAEA,SAAS,sBAAuB,CAC9B,GAAI,CAAC,cAAe,MAAO,CAAC,EAC5B,MAAM,SAAW,cAAc,sBAAsB,EACrD,OAAO,MAAM,KAAK,cAAc,iBAAiB,iCAAiC,CAAC,EAAE,OAAQ,OAAU,CACrG,MAAM,KAAO,MAAM,sBAAsB,EACzC,OAAO,KAAK,MAAQ,SAAS,KAAO,GAAK,KAAK,KAAO,SAAS,MAAQ,CACxE,CAAC,CACH,CAEA,SAAS,uBAAuB,OAAQ,CACtC,GAAI,CAAC,eAAiB,CAAC,OAAQ,OAAO,KACtC,MAAM,OAAS,MAAM,KAAK,cAAc,iBAAiB,iCAAiC,CAAC,EAC3F,GAAI,OAAO,OAAS,EAAG,OAAO,KAC9B,MAAM,QAAU,qBAAqB,EACrC,GAAI,CAAC,QAAQ,OAAQ,OAAO,KAC5B,MAAM,MAAQ,OAAO,QAAQ,MAAM,EACnC,OAAI,MAAQ,EAAU,KAClB,SAAW,QAAQ,QAAQ,OAAS,CAAC,GAAK,MAAQ,OAAO,OAAS,EAC7D,OAAO,MAAQ,CAAC,EAErB,SAAW,QAAQ,CAAC,GAAK,MAAQ,EAC5B,OAAO,KAAK,IAAI,EAAG,MAAQ,QAAQ,MAAM,CAAC,EAE5C,IACT,CAEA,SAAS,yBAAyB,OAAQ,CACpC,CAAC,eAAiB,CAAC,QACvB,sBAAsB,IAAM,CAC1B,MAAM,SAAW,cAAc,sBAAsB,EAE/C,KADa,OAAO,sBAAsB,EACxB,KAAO,SAAS,KAAO,cAAc,WAC7D,cAAc,SAAS,CAAE,KAAM,KAAK,IAAI,EAAG,IAAI,EAAG,SAAU,QAAS,CAAC,CACxE,CAAC,CACH,CAEA,SAAS,oBAAqB,CAC5B,OAAO,2BAA2B,GAAK,0BAA0B,MAAM,MAAO,EAAK,CACrF,CAuHA,SAAS,qBAAsB,CAC7B,GAAI,CAAC,OAAO,SAAS,aAAc,OACnC,MAAM,QAAU,IAAI,IAAI,OAAO,SAAS,IAAI,EAC5C,QAAQ,aAAa,IAAI,QAAS,MAAM,KAAK,EAC7C,MAAM,QAAU,sBAAsB,EAClC,SAAS,IAAM,MAAM,oBAAqB,QAAQ,aAAa,IAAI,UAAW,QAAQ,EAAE,EACvF,QAAQ,aAAa,OAAO,SAAS,EAC1C,OAAO,QAAQ,aAAa,CAAC,EAAG,GAAI,OAAO,CAC7C,CAEA,SAAS,WAAW,MAAO,CACzB,OAAO,OAAO,OAAS,EAAE,EAAE,QAAQ,WAAa,OAAU,CACxD,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,QACP,GAAG,IAAI,CAAC,CACV,CAEA,SAAS,8BAA+B,CACtC,OAAO,mCAAmC,MAAM,mBAAmB,GAC9D,MAAM,KAAK,YAAY,iBAAiB,wBAAwB,CAAC,EAAE,KAAM,QAC1E,OAAO,OAAO,QAAQ,gBAAkB,CAAC,IAAM,MAAM,QACtD,GACE,IACP,CAEA,SAAS,mCAAmC,YAAa,CACvD,OAAK,aACE,MAAM,KAAK,YAAY,iBAAiB,wBAAwB,CAAC,EAAE,KAAM,QAC9E,OAAO,QAAQ,sBAAwB,WACxC,GAAK,IACR,CAEA,SAAS,iCAAiC,SAAW,MAAM,MAAO,CAEhE,GADI,WAAa,MAAM,OACnB,yBAAyB,QAAQ,EAAG,OAAO,KAC/C,MAAM,OAAS,6BAA6B,EACtC,IAAM,QAAQ,QAAQ,kBAAoB,GAChD,OAAK,IACE,CACL,KAAM,QACN,IACA,MAAO,OAAO,QAAQ,oBAAsB,IAC5C,IAAK,OAAO,QAAQ,kBAAoB,OAAO,YAAY,KAAK,GAAK,8BACrE,cAAe,EACjB,EAPiB,IAQnB,CAEA,SAAS,qBAAqB,MAAO,SAAW,MAAM,MAAO,CAC3D,MAAM,cAAgB,iCAAiC,QAAQ,EAC/D,GAAI,CAAC,cAAe,OAAO,MAC3B,MAAM,YAAc,cAAc,KAAO,cAAc,MACjD,aAAe,MAAM,OAAQ,OACjB,MAAM,KAAO,MAAM,OAAS,MACzB,WACpB,EACD,MAAO,CAAC,cAAe,GAAG,YAAY,CACxC,CAEA,SAAS,kBAAkB,SAAW,MAAM,MAAO,CACjD,MAAM,cAAgB,iCAAiC,QAAQ,EAC/D,OAAO,cAAgB,CAAC,aAAa,EAAI,CAAC,CAC5C,CAEA,SAAS,oBAAoB,MAAO,SAAW,MAAM,MAAO,CAC1D,MAAM,cAAgB,iCAAiC,QAAQ,EAC/D,GAAI,CAAC,cAAe,OAAO,MAC3B,MAAM,YAAc,cAAc,KAAO,cAAc,MAKvD,MAAO,CAAC,GAJa,MAAM,OAAQ,OACjB,MAAM,KAAO,MAAM,OAAS,MACzB,WACpB,EACwB,aAAa,CACxC,CAEA,SAAS,oBAAoB,SAAW,MAAM,MAAO,QAAU,qBAAqB,QAAQ,EAAG,CAC7F,MAAM,aAAe,MAAM,QAAQ,SAAS,KAAK,EAAI,QAAQ,MAAQ,CAAC,EAChE,YAAc,MAAM,QAAQ,gBAAgB,QAAQ,CAAC,EAAI,gBAAgB,QAAQ,EAAI,CAAC,EAC5F,OAAQ,aAAa,OAAS,aAAe,aAAa,OAAQ,MAAS,OAAS,KAAK,KAAO,KAAK,MAAM,CAC7G,CAEA,SAAS,gBAAgB,KAAM,CAC7B,OAAO,MAAM,QAAQ,MAAM,UAAU,EACjC,KAAK,WAAW,IAAK,IAAO,OAAO,EAAE,CAAC,EAAE,OAAO,OAAO,EACtD,CAAC,CACP,CAEA,SAAS,gCAAgC,MAAO,CAC9C,MAAM,eAAiB,MAAM,UAAW,MAAS,MAAM,OAAS,SAAW,CAAC,gBAAgB,IAAI,EAAE,MAAM,EAClG,UAAY,gBAAkB,EAChC,eACA,MAAM,UAAW,MAAS,CAAC,gBAAgB,IAAI,EAAE,MAAM,EAC3D,OAAI,WAAa,EAAU,MACpB,CAAC,MAAM,SAAS,EAAG,GAAG,MAAM,MAAM,EAAG,SAAS,EAAG,GAAG,MAAM,MAAM,UAAY,CAAC,CAAC,CACvF,CAEA,SAAS,oBAAoB,KAAM,QAAS,CAC1C,MAAM,IAAM,gBAAgB,IAAI,EAChC,OAAK,IAAI,OACF,GAAQ,SAAS,IAAM,IAAI,SAAS,OAAO,QAAQ,EAAE,CAAC,GADrC,EAE1B,CAEA,SAAS,0BAA0B,MAAO,QAAS,CACjD,OAAK,SAAS,GACP,MAAM,OAAQ,MAAS,oBAAoB,KAAM,OAAO,CAAC,EADvC,KAE3B,CAEA,SAAS,yBAAyB,MAAO,CACvC,OAAO,MAAM,OAAQ,MAAS,CAAC,gBAAgB,IAAI,EAAE,MAAM,CAC7D,CAEA,SAAS,4BAA4B,MAAO,MAAO,CACjD,GAAI,CAAC,OAAS,EAAE,MAAM,KAAO,MAAM,OAAQ,OAAO,MAClD,MAAM,QAAU,MAAM,IAAM,KAAO,OAAO,MAAM,EAAE,EAAI,GAChD,SAAW,MAAM,KAAO,GACxB,WAAa,MAAM,OAAS,GAC5B,aAAe,MAAM,OAAQ,MAAS,CAC1C,MAAM,OAAS,MAAM,IAAM,KAAO,OAAO,KAAK,EAAE,EAAI,GAC9C,QAAU,MAAM,KAAO,GACvB,UAAY,MAAM,OAAS,GACjC,OAAI,SAAW,SAAW,QAAgB,GACnC,UAAY,UAAY,UAAY,YAAc,YAAc,UAAY,YAAc,UACnG,CAAC,EACD,MAAO,CAAC,MAAO,GAAG,YAAY,CAChC,CAEA,SAAS,6BAA6B,MAAO,CAC3C,OAAI,aAAa,UAAY,MAAM,QAAU,4BAAoC,MAC1E,MAAM,MAAM,EAAG,6BAA6B,CACrD,CAEA,SAAS,oBAAoB,SAAW,MAAM,MAAO,CACnD,MAAO,CAAC,aAAa,UAAY,yBAAyB,QAAQ,EAAE,OAAS,2BAC/E,CAEA,SAAS,yBAAyB,SAAW,MAAM,MAAO,CACxD,MAAM,QAAU,sBAAsB,QAAQ,EAC9C,OAAO,SAAS,GAAK,OAAO,QAAQ,EAAE,EAAI,EAC5C,CAEA,SAAS,+BAA+B,QAAS,CAC/C,GAAI,SAAS,eAAe,KAAO,SAAS,eAAe,MAAO,OAAO,QAAQ,cACjF,MAAM,UAAY,SAAS,IAAM,wBAAwB,EACnD,IAAM,UAAY,gBAAgB,SAAS,EAAI,GACrD,OAAK,IACE,CACL,KAAM,QACN,IACA,MAAO,IACP,IAAK,SAAS,OAAS,mBAAmB,GAAG,QAAQ,WAAa,4BACpE,EANiB,IAOnB,CAEA,SAAS,yBAAyB,SAAW,MAAM,MAAO,CACxD,MAAM,wBAA0B,WAAa,cAAgB,qBAAqB,QAAQ,EAAI,KAC9F,GAAI,CAAC,SAAS,QAAQ,GAAK,CAAC,wBAAyB,MAAO,CAAC,EAC7D,GAAI,kBAAoB,cAAe,MAAO,CAAC,EAC/C,GAAI,uBAAuB,QAAQ,EAAG,MAAO,CAAC,EAC9C,MAAM,QAAU,qBAAqB,QAAQ,EACvC,aAAe,oBAAoB,SAAU,OAAO,EAC1D,GAAI,yBAAyB,QAAQ,EACnC,OAAO,gCAAgC,yBAAyB,YAAY,CAAC,EAE/E,MAAM,QAAU,sBAAsB,QAAQ,EAC9C,GAAI,SAAS,UAAU,QAAU,CAAC,QAAS,MAAO,CAAC,EAEnD,MAAM,2BAA6B,kBAAoB,mBAClD,WAAa,MAAM,OACnB,MAAM,sBAEX,GAAI,kBAAoB,kBAAmB,CACzC,MAAM,iBAAmB,gCAAgC,yBAAyB,YAAY,CAAC,EACzF,qBAAuB,+BAA+B,OAAO,EACnE,IAAI,kBAAoB,qBACpB,4BAA4B,iBAAkB,oBAAoB,EAClE,iBACJ,OAAK,MAAM,sBACT,kBAAoB,gCAAgC,iBAAiB,GAEnE,4BAA8B,CAAC,uBACjC,kBAAoB,oBAAoB,kBAAmB,QAAQ,GAE9D,kBAAkB,OAAS,kBAAoB,CAAC,CACzD,CAEA,MAAM,MAAQ,aACd,OAAI,MAAM,OAAe,qBAAqB,MAAO,QAAQ,EACtD,SAAS,eAAe,IAAM,qBAAqB,CAAC,QAAQ,aAAa,EAAG,QAAQ,EAAI,kBAAkB,QAAQ,CAC3H,CAEA,SAAS,qBAAqB,SAAW,MAAM,MAAO,CACpD,OAAO,6BAA6B,yBAAyB,QAAQ,CAAC,CACxE,CAEA,SAAS,oBAAoB,MAAO,QAAU,GAAO,CACnD,GAAI,CAAC,cAAe,OACpB,GAAI,CAAC,MAAM,OAAQ,CACjB,cAAc,UAAY,sIAC1B,MACF,CACA,MAAM,aAAe,MAAM,IAAI,CAAC,KAAM,QAI7B;AAAA,iCAHY,KAAK,OAAS,SAAW,KAAK,OAAS,iBACtD,oBACA,KAAK,OAAS,QAAU,oBAAsB,EAEb,GAAG,QAAU,aAAa,MAAQ,aAAe,EAAE,uCAAuC,KAAK,gCAAgC,MAAQ,CAAC;AAAA,UACzK,KAAK,OAAS,KAAK,IAAM,aAAa,WAAW,KAAK,OAAS,KAAK,GAAG,CAAC,UAAU,WAAW,KAAK,KAAO,wBAAwB,CAAC,oBAAsB,oBAAoB;AAAA;AAAA,KAGjL,EAAE,KAAK,EAAE,EACJ,eAAiB,QACnB,iLACA,GACJ,cAAc,UAAY,aAAe,cAC3C,CAEA,SAAS,wBAAwB,SAAW,MAAM,MAAO,CACvD,MAAM,QAAU,qBAAqB,QAAQ,EACvC,aAAe,MAAM,QAAQ,SAAS,KAAK,EAAI,QAAQ,MAAQ,CAAC,EAChE,YAAc,MAAM,QAAQ,gBAAgB,QAAQ,CAAC,EAAI,gBAAgB,QAAQ,EAAI,CAAC,EACtF,OAAS,aAAa,OAAS,aAAe,aAAa,OAAQ,MAAS,OAAS,KAAK,OAAS,KAAK,IAAI,EAClH,OAAO,MAAM,KAAM,MAAS,KAAK,OAAS,UAAY,KAAK,OAAS,KAAK,IAAI,GAAK,MAAM,CAAC,GAAK,IAChG,CAEA,SAAS,kCAAmC,CAC1C,GAAI,kBAAoB,eAAiB,uBAAuB,EAAG,OAAO,KAC1E,MAAM,QAAU,sBAAsB,EACtC,GAAI,SAAS,eAAe,OAAS,SAAS,eAAe,IAAK,OAAO,QAAQ,cACjF,MAAM,UAAY,SAAS,IAAM,wBAAwB,EACnD,UAAY,UAAY,gBAAgB,SAAS,EAAI,GAC3D,OAAI,UACK,CACL,KAAM,QACN,IAAK,UACL,MAAO,UACP,IAAK,SAAS,OAAS,mBAAmB,GAAG,QAAQ,WAAa,4BACpE,EAEmB,wBAAwB,GACtB,IACzB,CAEA,SAAS,mBAAoB,CAC3B,GAAI,CAAC,cAAe,OACpB,MAAM,MAAQ,iCAAiC,EAC3C,OAAO,OAAS,OAAO,KACzB,cAAc,OAAS,GACvB,cAAc,IAAM,MAAM,OAAS,MAAM,IACzC,cAAc,IAAM,MAAM,KAAO,mBAAmB,GAAG,QAAQ,WAAa,+BAE5E,cAAc,OAAS,GACvB,cAAc,IAAM,6CAExB,CAEA,SAAS,gBAAgB,MAAO,cAAe,QAAU,CAAC,EAAG,CAC3D,MAAM,MAAQ,eAAiB,qBAAqB,EAC9C,SAAW,MAAM,OAAS,EAChC,aAAa,MAAQ,SAAW,KAAK,IAAI,EAAG,KAAK,IAAI,MAAO,MAAM,OAAS,CAAC,CAAC,EAAI,EACjF,MAAM,QAAU,SAAW,MAAM,aAAa,KAAK,EAAI,KAmBvD,GAjBI,mBACF,iBAAiB,OAAS,GAC1B,iBAAiB,IAAM,8CAErB,mBACF,iBAAiB,OAAS,GAC1B,iBAAiB,gBAAgB,KAAK,EACtC,iBAAiB,gBAAgB,QAAQ,GAEvC,mBACF,iBAAiB,OAAS,GAC1B,iBAAiB,gBAAgB,KAAK,GAEpC,mBACF,iBAAiB,OAAS,GAC1B,iBAAiB,UAAY,IAE3B,SAAS,KAAO,QAAQ,OAAS,SAAW,iBAC9C,iBAAiB,OAAS,GAC1B,iBAAiB,IAAM,QAAQ,IAC3B,QAAQ,QAAO,iBAAiB,OAAS,QAAQ,OACrD,iBAAiB,KAAK,UACb,SAAS,KAAO,QAAQ,OAAS,kBAAoB,iBAC9D,iBAAiB,OAAS,GAC1B,iBAAiB,IAAM,QAAQ,YACtB,SAAS,OAAS,SAAW,iBAAkB,CACxD,MAAM,cAAgB,QAAQ,IAAM,MAAQ,sBACxC,MAAM,KAAK,sBAAsB,iBAAiB,+BAA+B,CAAC,EAAE,KAAM,UAAa,OAAO,SAAS,QAAQ,oBAAoB,IAAM,OAAO,QAAQ,EAAE,CAAC,EAC3K,KACA,eAAe,SACjB,iBAAiB,OAAS,GAC1B,iBAAiB,YAAY,cAAc,QAAQ,UAAU,EAAI,CAAC,GACzD,mBAAqB,SAAS,KAAO,SAAS,SACvD,iBAAiB,OAAS,GAC1B,iBAAiB,IAAM,QAAQ,KAAO,QAAQ,MAC9C,iBAAiB,IAAM,QAAQ,KAAO,mBAAmB,GAAG,QAAQ,WAAa,yBAErF,MAAW,mBACL,SAAS,KAAO,SAAS,SAC3B,iBAAiB,OAAS,GAC1B,iBAAiB,IAAM,QAAQ,KAAO,QAAQ,MAC9C,iBAAiB,IAAM,QAAQ,KAAO,mBAAmB,GAAG,QAAQ,WAAa,0BAGjF,qBACF,mBAAmB,OAAS,SAC5B,mBAAmB,UAAU,OAAO,YAAa,QAAQ,GAEvD,iBACF,eAAe,OAAS,CAAC,SACzB,eAAe,YAAc,SAAW,GAAG,aAAa,MAAQ,CAAC,IAAI,MAAM,MAAM,GAAK,IAEpF,cAAa,YAAY,OAAS,MAAM,OAAS,GACjD,cAAa,YAAY,OAAS,MAAM,OAAS,GACrD,kBAAkB,EAClB,kBAAkB,EACd,QAAQ,cAAgB,IAAO,yBAAyB,CAC9D,CAEA,SAAS,YAAY,UAAW,CAC9B,MAAM,MAAQ,qBAAqB,EACnC,GAAI,MAAM,OAAS,EAAG,OACtB,MAAM,MAAQ,aAAa,MAAQ,UAAY,MAAM,QAAU,MAAM,OACrE,gBAAgB,KAAM,KAAK,CAC7B,CAEA,SAAS,cAAe,CACtB,MAAM,aAAe,aAAa,QAAU,MAAM,MAC5C,cAAgB,yBAAyB,EACzC,eAAiB,aAAa,YAAc,cAClD,aAAa,MAAQ,MAAM,MAC3B,aAAa,SAAW,MAAM,SAC9B,aAAa,UAAY,eACrB,cAAgB,kBAClB,aAAa,MAAQ,EACrB,aAAa,SAAW,IAE1B,MAAM,MAAQ,qBAAqB,EAC/B,aAAa,OAAS,MAAM,SAAQ,aAAa,MAAQ,GAC7D,oBAAoB,MAAO,oBAAoB,CAAC,EAChD,gBAAgB,aAAa,MAAO,KAAK,CAC3C,CAEA,SAAS,qBAAsB,CAC7B,YAAY,iBAAiB,qBAAqB,EAAE,QAAS,OAAU,CACrE,MAAM,MAAQ,wBAAwB,MAAO,cAAc,MAAM,KAAK,CAAC,EACjE,KAAO,MAAM,QAAQ,aAAa,EAClC,sBAAwB,2BAA2B,KAAK,EAE9D,GADA,MAAM,gBAAgB,SAAU,qBAAqB,EACjD,sBAAuB,CACzB,MAAM,QAAU,GAChB,MAAM,OAAO,OAAO,MAAM,KAAK,EAC/B,MAAM,gBAAgB,MAAM,KAAK,EAAI,EACrC,MACF,CACA,MAAM,UAAY,MAAM,cAAc,oBAAoB,EAC1D,MAAM,UAAU,OAAO,WAAY,MAAM,YAAc,UAAU,EACjE,MAAM,UAAU,OAAO,eAAgB,MAAM,YAAc,QAAQ,EACnE,MAAM,UAAU,OAAO,cAAe,MAAM,YAAc,aAAa,EACvE,MAAM,UAAU,OAAO,iBAAkB,MAAM,UAAU,EACrD,YACF,UAAU,YAAc,MAAM,MAC9B,UAAU,UAAY,eAAe,MAAM,SAAS,IAElD,MAAM,QAAQ,iBAAgB,MAAM,SAAW,MAAM,YAAc,CAAC,MAAM,OAAO,IAAI,MAAM,KAAK,GACpG,MAAM,iBAAiB,kBAAkB,EAAE,QAAS,QAAW,CAC7D,MAAM,MAAQ,OAAO,OAAO,QAAQ,eAAiB,CAAC,EACtD,OAAO,SAAW,GAAS,MAAM,UAAY,CAAC,MAAM,SAAa,MAAQ,GAAK,cAAc,MAAM,KAAK,GAAK,EAC9G,CAAC,EACG,MAAM,YAAc,CAAC,MAAM,sBAAwB,MAAM,OAAO,IAAI,MAAM,KAAK,IACjF,MAAM,QAAU,GAChB,MAAM,OAAO,OAAO,MAAM,KAAK,EAEnC,CAAC,EACD,yBAAyB,CAC3B,CAEA,SAAS,iBAAkB,CACzB,MAAM,MAAQ,OAAO,MAAM,KAAK,EAC1B,SAAW,MAAM,SAAW,MAAM,QAAU,SAC5C,OAAS,MAAM,QAAU,OACzB,cAAgB,MAAM,gBACtB,cAAgB,mBAAmB,EACnC,mBAAqB,GAAQ,CAAC,UAAY,CAAC,eAAiB,2BAA2B,GACvF,qBAAuB,GAAQ,CAAC,UAAY,CAAC,eAAiB,eAAiB,6BAA6B,aAAa,GACzH,gBAAkB,yBAAyB,EACjD,gCAAgC,EAChC,MAAM,cAAgB,sBAAsB,EACtC,8BAAgC,eAAiB,iBAAmB,6BAA6B,EACnG,yBAAyB,qBAAqB,CAAC,EAC/C,KACE,eAAiB,eAAiB,8BAClC,kBAAoB,0BAA0B,EACpD,iCAAiC,EACjC,MAAM,gBAAkB,cAAc,cAAc,EAC9C,aAAe,MAAM,cAAc,EACnC,KAAO,kBAAkB,cAAc,EACvC,aAAe,cAAc,cAAe,wBAAwB,CAAC,EAC3E,oBAAoB,EACpB,MAAM,WAAa,wBAAwB,EACrC,wBAA0B,GAAQ,eAAiB,CAAC,iBAAmB,CAAC,wBAAwB,GAChG,gBACJ,gBAAgB,OAAS,MACrB,CAAC,eAAiB,MAAM,OAAS,KAGvC,SAAS,KAAK,UAAU,OAAO,sBAAuB,QAAQ,EAC9D,SAAS,KAAK,UAAU,OAAO,oBAAqB,MAAM,EAC1D,SAAS,KAAK,UAAU,OAAO,2BAA4B,aAAa,EACxE,YAAY,UAAU,OAAO,sBAAuB,QAAQ,EAC5D,YAAY,UAAU,OAAO,oBAAqB,MAAM,EACxD,YAAY,UAAU,OAAO,2BAA4B,aAAa,EACtE,YAAY,QAAQ,0BAA4B,kBAChD,YAAY,QAAQ,gCAAkC,cAClD,UAAS,QAAQ,YAAc,MAAM,OACrC,gBAAe,cAAc,YAAc,MAAM,OACjD,qBAAoB,mBAAmB,YAAc,SAAW,SAAW,oBAC/E,MAAM,UAAY,WAAa,WAAW,MAAM,WAAc,cAAgB,aAAa,WAAa,GAClG,cAAgB,kBAAkB,EAGxC,GAFI,eAAc,aAAa,YAAc,UAAY,GAAG,MAAM,IAAI,MAAM,SAAS,GAAK,MAAM,MAC5F,gBAAe,cAAc,YAAc,gBAAkB,MAAM,YAAY,EAAI,YACnF,WAAY,CACd,WAAW,YAAc,MAAM,OAAO,KAAO,qBAAuB,QACpE,MAAM,SAAW,WAAW,cACxB,WAAU,SAAS,MAAM,QAAU,MAAM,OAAO,KAAO,OAAS,GACtE,CACI,mBAAkB,iBAAiB,YAAc,MAAM,OACvD,kBAAiB,gBAAgB,YAAc,UAAY,GAAG,MAAM,IAAI,MAAM,SAAS,GAAK,MAAM,MAClG,mBAAkB,iBAAiB,YAAc,gBAAkB,MAAM,cAAc,CAAC,EAAI,YAChG,iBAAiB,QAAS,MAAS,CACjC,MAAM,SAAW,KAAK,QAAQ,WAAa,MAAM,MACjD,KAAK,UAAU,OAAO,YAAa,QAAQ,EACvC,SAAU,KAAK,aAAa,eAAgB,MAAM,EACjD,KAAK,gBAAgB,cAAc,CAC1C,CAAC,EACG,gBAAe,cAAc,YAAc,MAAM,UACrD,YAAY,iBAAiB,wBAAwB,EAAE,QAAS,QAAW,CACzE,MAAM,SAAW,CAAC,kBAChB,MAAM,oBACF,OAAO,QAAQ,sBAAwB,MAAM,oBAC7C,OAAO,OAAO,QAAQ,gBAAkB,CAAC,IAAM,MAAM,UAE3D,OAAO,UAAU,OAAO,cAAe,QAAQ,EAC/C,OAAO,aAAa,eAAgB,SAAW,OAAS,OAAO,CACjE,CAAC,EACG,mBAAkB,iBAAiB,QAAQ,kBAAoB,MAAM,WACzE,YAAY,iBAAiB,0BAA0B,EAAE,QAAS,QAAW,CAC3E,MAAM,SAAW,OAAO,QAAQ,kBAAoB,MAAM,UAC1D,OAAO,UAAU,OAAO,cAAe,QAAQ,EAC/C,OAAO,aAAa,eAAgB,SAAW,OAAS,OAAO,CACjE,CAAC,EACD,YAAY,iBAAiB,wBAAwB,EAAE,QAAS,MAAS,CACvE,KAAK,YAAc,cAAc,KAAK,QAAQ,aAAa,CAC7D,CAAC,EACG,aAAY,WAAW,OAAS,IAChC,YAAW,UAAU,OAAS,IAC9B,YAAW,UAAU,OAAS,eAClC,MAAM,UAAY,MAAQ,UAAU,IAAM,EAAI,KAAO,eAAe,EAAI,KACxE,WAAW,QAAS,MAAS,CAC3B,MAAM,aAAe,EAAQ,KAAK,QAAQ,oBAAoB,EACxD,eAAiB,aAAe,aAAe,gBAC/C,cAAgB,aAAe,UAAY,KACjD,KAAK,UAAY,gBACb,gBAAgB,eAAgB,aAAa,EAC7C,qDACN,CAAC,EAED,MAAM,cAAgB,qBAAqB,EACrC,uBAAyB,2BAA2B,aAAa,EACjE,iBAAmB,uBAAuB,MAC1C,uBAAyB,+BAA+B,gBAAgB,EACxE,sBAAwB,OAAO,eAAe,IAAM,EAAE,EAC5D,IAAI,qBAAuB,GAC3B,mBAAmB,QAAS,OAAU,CAEpC,MAAM,aADc,OAAO,MAAM,QAAQ,wBAA0B,EAAE,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAC/D,SAAS,qBAAqB,EAC/D,MAAM,OAAS,CAAC,aAChB,qBAAuB,sBAAwB,YACjD,CAAC,EACD,4BAA4B,QAAS,MAAS,CAC5C,KAAK,YAAc,sBACrB,CAAC,EACD,2BAA2B,QAAS,KAAQ,CAC1C,IAAI,OAAS,CAAC,sBAAwB,CAAC,sBACzC,CAAC,EACG,sBACF,YAAY,QAAQ,uBAAyB,uBAAuB,OACpE,YAAY,QAAQ,sBAAwB,uBAAuB,MACnE,YAAY,QAAQ,4BAA8B,uBAAuB,YACzE,YAAY,QAAQ,2BAA6B,uBAAuB,WACxE,YAAY,QAAQ,0BAA4B,uBAAuB,UACvE,YAAY,UAAU,OAAO,6BAA8B,uBAAuB,QAAU,OAAO,EACnG,YAAY,UAAU,OAAO,qCAAsC,uBAAuB,cAAgB,SAAS,GAErH,sBAAsB,QAAS,MAAS,CACtC,KAAK,YAAc,gBACrB,CAAC,EACD,qBAAqB,QAAS,KAAQ,CACpC,IAAI,OAAS,CAAC,gBAChB,CAAC,EACG,eACF,aAAa,YAAc,iBAC3B,aAAa,OAAS,CAAC,kBAErB,kBACF,gBAAgB,YAAc,iBAC9B,gBAAgB,OAAS,CAAC,kBAE5B,MAAM,eAAiB,GAAQ,eAAe,OAAS,CAAC,cAAc,QAAU,CAAC,UAAY,CAAC,eAAiB,CAAC,sBAC1G,gBAA0B,MAAM,QAAU,eAAiB,CAAC,SAAS,MAAM,KAAK,GAAK,CAAC,cAAc,OACpG,cAAgB,oBAAsB,gBAAkB,GAC5D,eACG,CAAC,cAAc,QACf,CAAC,kBACA,CAAC,eAAiB,cAAc,YAAc,IAAS,aAAa,aAEpE,SAAW,eAAiB,iBAAmB,yBAA2B,EAAQ,YAAe,cACvG,eAAe,QAAS,QAAW,CAAE,OAAO,SAAW,QAAU,CAAC,EAClE,cAAc,QAAS,QAAW,CAChC,OAAO,SAAW,SAClB,OAAO,YAAc,cACjB,YAAY,UACV,wBACA,sBACF,iBAEA,wBADA,mBAGA,WACA,mBACA,mBACE,qBACF,eACE,oBACA,gBACE,kBACF,cACE,mBACA,aACV,CAAC,EAED,MAAM,sBAAwB,0BAA0B,EAAI,EACtD,4BAA8B,CAAC,UAChC,CAAC,iBACD,CAAC,cAAc,QACf,UAAU,GAAK,EACpB,oBAAoB,CAClB,SAAU,6BAA+B,CAAC,sBAC1C,UAAW,6BAA+B,sBAC1C,UAAW,wBAAwB,EACnC,SAAU,wBAAwB,EAClC,WAAY,8BAA8B,KAAK,CACjD,CAAC,EAED,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,CACtB,CAEA,SAAS,yBAA0B,CACjC,GAAI,cAAc,OAAQ,MAAO,GACjC,MAAM,cAAgB,sBAAsB,EAC5C,OAAI,eAAe,GAAW,cAAc,GACrC,EACT,CAEA,SAAS,mBAAoB,CAE3B,OADc,YAAY,cAAc,4BAA4B,GACtD,QAAQ,YAAY,GAAG,cAAc,QAAQ,GAAG,aAAa,KAAK,GAAK,EACvF,CAEA,SAAS,kBAAmB,CAC1B,OAAO,MAAM,aAAa,SAAS,EAAG,CAAE,QAAS,CAAE,OAAQ,kBAAmB,CAAE,CAAC,EAC9E,KAAM,UAAa,SAAS,GAAK,SAAS,KAAK,EAAI,IAAI,EACvD,KAAM,MACA,MACL,SAAS,iBAAiB,wDAAwD,EAAE,QAAS,MAAS,CACpG,KAAK,YAAc,OAAO,KAAK,YAAc,CAAC,CAChD,CAAC,EACM,MAJW,IAKnB,EACA,MAAM,IAAM,IAAI,CACrB,CAEA,MAAM,oBAAsB,IAAI,QAChC,IAAI,qBAAuB,KAE3B,SAAS,6BAA8B,CACrC,kBAAkB,QAAS,QAAW,CAC/B,oBAAoB,IAAI,MAAM,GAAG,oBAAoB,IAAI,OAAQ,OAAO,WAAW,CAC1F,CAAC,CACH,CAEA,SAAS,0BAA2B,CAC7B,uBACL,qBAAqB,OAAS,GAC9B,qBAAqB,QAAQ,yBAAyB,GAAG,UAAU,OAAO,mBAAmB,EAC/F,CAEA,SAAS,uBAAwB,CAC3B,uBACF,OAAO,aAAa,oBAAoB,EACxC,qBAAuB,MAEzB,kBAAkB,QAAS,QAAW,CACpC,OAAO,UAAU,OAAO,kBAAmB,iBAAiB,EACvD,OAAO,QAAQ,gBAAgB,IAAG,OAAO,YAAc,oBAAoB,IAAI,MAAM,GAAK,cACjG,CAAC,EACD,yBAAyB,EACzB,gBAAgB,CAClB,CAEA,SAAS,mBAAoB,CAC3B,4BAA4B,EACxB,uBACF,OAAO,aAAa,oBAAoB,EACxC,qBAAuB,MAEzB,yBAAyB,EACzB,kBAAkB,QAAS,QAAW,CACpC,OAAO,UAAU,OAAO,iBAAiB,EACzC,OAAO,UAAU,IAAI,iBAAiB,EACtC,OAAO,SAAW,GAClB,OAAO,YAAc,WACvB,CAAC,CACH,CAEA,SAAS,yBAA0B,CAC7B,cAAa,YAAY,UAAY,2BAA2B,aAAa,MAAM,CAAC,mBACpF,uBACF,qBAAqB,KAAO,aAAa,MAAM,EAC/C,qBAAqB,OAAS,GAC9B,qBAAqB,QAAQ,yBAAyB,GAAG,UAAU,IAAI,mBAAmB,GAE5F,gBAAgB,EAChB,kBAAkB,QAAS,QAAW,CACpC,OAAO,UAAU,OAAO,iBAAiB,EACzC,OAAO,UAAU,IAAI,iBAAiB,EACtC,OAAO,YAAc,OACvB,CAAC,EACD,qBAAuB,OAAO,WAAW,sBAAuB,IAAI,CACtE,CAEA,SAAS,oBAAqB,CAC5B,MAAM,WAAa,SAAS,cAAc,aAAa,EACvD,OAAK,YAAY,oBACV,CACL,OAAQ,WACR,SAAU,WAAW,oBAAoB,EAAE,IAAK,SAAY,QAAQ,EAAE,CACxE,EAJ6C,IAK/C,CAEA,eAAe,8BAA+B,CAC5C,MAAM,cAAgB,mBAAmB,EACzC,GAAI,CAAC,cAAe,OAAO,KAC3B,MAAM,KAAO,OAAO,SAAS,QAAQ,MAAQ,IACvC,eAAiB,KAAK,SAAS,GAAG,EAAI,KAAO,GAAG,IAAI,IACpD,aAAe,cAAc,SAAS,IAAK,SAAY,mBAAmB,OAAO,CAAC,EAAE,KAAK,GAAG,EAC5F,CAAC,iBAAkB,YAAY,EAAI,MAAM,QAAQ,IAAI,CACzD,MAAM,GAAG,cAAc,aAAa,YAAY,GAAI,CAAE,QAAS,CAAE,OAAQ,kBAAmB,CAAE,CAAC,EAC/F,MAAM,aAAa,SAAS,EAAG,CAAE,QAAS,CAAE,OAAQ,kBAAmB,CAAE,CAAC,CAC5E,CAAC,EACD,GAAI,CAAC,iBAAiB,IAAM,CAAC,aAAa,GAAI,OAAO,KACrD,MAAM,SAAW,MAAM,iBAAiB,KAAK,EAAE,MAAM,IAAM,IAAI,EACzD,KAAO,MAAM,aAAa,KAAK,EAAE,MAAM,IAAM,IAAI,EACvD,MAAI,CAAC,UAAY,CAAC,KAAa,MAC/B,SAAS,iBAAiB,wDAAwD,EAAE,QAAS,MAAS,CACpG,KAAK,YAAc,OAAO,KAAK,YAAc,CAAC,CAChD,CAAC,EACM,CAAE,GAAG,KAAM,QAAS,EAC7B,CAEA,SAAS,oBAAoB,WAAY,CACvC,OAAK,YACL,WAAW,UAAU,OAAO,UAAU,EAClC,WAAW,KACb,WAAW,KAAK,GAEhB,WAAW,UAAU,IAAI,UAAW,QAAQ,EAC5C,SAAS,KAAK,UAAU,IAAI,iBAAiB,GAExC,IARiB,EAS1B,CAEA,SAAS,eAAe,YAAa,CACnC,MAAM,WAAa,SAAS,cAAc,aAAa,EACvD,GAAI,CAAC,WAAY,MAAO,GACxB,GAAI,aAAa,UAAY,WAAW,eACtC,GAAI,CACF,kBAAW,eAAe,WAAW,EAC9B,EACT,OAAS,MAAO,CACd,eAAQ,KAAK,mEAAoE,KAAK,EAC/E,oBAAoB,UAAU,CACvC,CAEF,MAAI,sBAAoB,UAAU,CAIpC,CAEA,eAAe,sBAAsB,YAAa,CAChD,GAAI,CACF,MAAM,aAAe,MAAM,6BAA6B,EACxD,GAAI,cAAc,SAAU,OAAO,eAAe,YAAY,CAChE,OAAS,MAAO,CACd,QAAQ,KAAK,kEAAmE,KAAK,CACvF,CACA,OAAO,eAAe,WAAW,CACnC,CAEA,SAAS,wBAAyB,CAChC,MAAM,MAAQ,CAAC,EACf,aAAM,OAAO,QAAS,KAAQ,CAC5B,MAAM,MAAQ,YAAY,cAAc,8BAA8B,IAAI,OAAO,GAAG,CAAC,IAAI,EACzF,GAAI,2BAA2B,KAAK,EAAG,OACvC,MAAM,UAAY,OAAO,QAAQ,eAC3B,SAAW,cAAc,GAAG,EAClC,GAAI,WAAW,IACX,UAAW,CACb,MAAM,YAAc,iBAAiB,MAAO,GAAG,EACzC,cAAgB,mBAAmB,MAAO,GAAG,EAC7C,WAAa,CAAE,uBAAwB,aAAe,GAAI,EAC5D,gBAAe,WAAW,yBAAyB,EAAI,eACvD,KAAO,aAAe,MAAQ,cAAa,WAAW,sBAAsB,EAAI,KACpF,MAAM,KAAK,CACT,GAAI,OAAO,SAAS,EACpB,SACA,UACF,CAAC,CACH,CACF,CAAC,EACM,KACT,CAEA,eAAe,UAAU,mBAAoB,CAC3C,MAAM,MAAQ,OAAO,MAAM,KAAK,EAChC,GAAI,yBAAyB,EAAG,CAC1B,cAAa,YAAY,YAAc,0CAC3C,YAAY,cAAc,wBAAwB,GAAG,MAAM,EAC3D,MACF,CACA,GAAI,MAAM,QAAU,eAAiB,CAAC,SAAS,MAAM,KAAK,EAAG,CACvD,cAAa,YAAY,YAAc,+EAC3C,MACF,CACA,MAAM,cAAgB,qBAAqB,EACrC,cAAgB,sBAAsB,EACtC,aAAe,cAAc,cAAe,wBAAwB,CAAC,EACrE,WAAa,wBAAwB,EAC3C,GAAI,kBAAkB,EAAG,CACvB,MAAM,QAAU,oBAAoB,EAChC,cAAa,YAAY,YAAc,SACvC,YAAY,UACd,OAAO,SAAS,KAAO,YAAY,UACzB,mBAAmB,GAC7B,uBAAuB,EAEzB,MACF,CACA,GAAI,2BAA2B,EAAG,CAC5B,cAAa,YAAY,YAAc,+FAC3C,YAAY,cAAc,4BAA4B,GAAG,eAAe,CAAE,SAAU,OAAO,SAAS,WAAa,OAAS,SAAU,MAAO,QAAS,CAAC,EACrJ,MACF,CACA,GAAI,cAAc,OAAQ,CACpB,cAAa,YAAY,YAAc,4GAC3C,uBAAuB,EACvB,MACF,CACA,GAAI,eAAe,OAAS,CAAC,cAAc,QAAU,MAAM,QAAU,UAAY,MAAM,QAAU,eAAiB,CAAC,2BAA2B,EAAG,CAC3I,cAAa,YAAY,YAAc,GAAG,eAAe,KAAK,iFAClE,uBAAuB,EACvB,MACF,CACA,GAAI,eAAiB,CAAC,cAAc,SAAW,CAAC,eAAiB,cAAc,YAAc,IAAS,aAAa,YAAa,CAC1H,cAAa,YAAY,YAAe,cAExC,qBAAqB,aAAa,KAAK,GADvC,gEAEJ,MACF,CACA,GAAI,WAAY,CACV,cAAa,YAAY,YAAc,qBAAqB,WAAW,MAAM,KAAK,IACtF,MACF,CACA,GAAI,UAAU,EAAI,EAAG,CACf,cAAa,YAAY,YAAc,sEAC3C,MACF,CACA,MAAM,WAAa,8BAA8B,KAAK,EAClD,UAAU,EAAI,IAAG,WAAW,WAAW,EAAI,kBAAkB,GACjE,MAAM,MAAQ,uBAAuB,EAC/B,iBAAmB,wBAAwB,EAEjD,GAAI,CAAC,iBAAkB,CACjB,cAAa,YAAY,YAAc,gEAC3C,MACF,CACA,MAAM,QAAQ,CACZ,GAAI,OAAO,gBAAgB,EAC3B,SAAU,wBAAwB,EAClC,UACF,CAAC,EAED,MAAM,oBAAsB,0BAA0B,EAChD,uBAAyB,KAAK,IAAI,EAAG,MAAM,OAAS,CAAC,EAC3D,GAAI,qBAAuB,uBAAyB,oBAAqB,CACnE,cAAa,YAAY,YAAc,mFAC3C,MACF,CAEA,kBAAkB,EAClB,MAAM,cAAgB,mBAAmB,EACnC,SAAW,CAAE,KAAM,EACrB,gBACF,SAAS,SAAW,cAAc,SAClC,SAAS,aAAe,OAAO,SAAS,SACxC,cAAc,OAAO,mBAAmB,SAAS,aAAa,GAEhE,IAAI,YAAc,KAClB,GAAI,CACF,MAAM,SAAW,MAAM,MAAM,aAAa,aAAa,EAAG,CACxD,OAAQ,OACR,QAAS,CAAE,eAAgB,mBAAoB,OAAQ,kBAAmB,EAC1E,KAAM,KAAK,UAAU,QAAQ,CAC/B,CAAC,EAED,GADA,YAAc,MAAM,SAAS,KAAK,EAAE,MAAM,IAAM,IAAI,EAChD,CAAC,SAAS,GACZ,MAAM,IAAI,MAAM,aAAa,aAAe,aAAa,SAAW,iBAAiB,EAEvF,MAAM,iBAAiB,CACzB,OAAS,MAAO,CACd,sBAAsB,EAClB,cAAa,YAAY,YAAc,sBAAsB,OAAO,OAAO,GAC/E,MACF,CAEA,GAAI,mBAAoB,CACtB,OAAO,SAAS,KAAO,aAAa,UAAU,EAC9C,MACF,CAEA,wBAAwB,EAEpB,CADiB,MAAM,sBAAsB,WAAW,GACvC,cACnB,YAAY,UAAY,2BAA2B,aAAa,MAAM,CAAC,4BAA4B,aAAa,UAAU,CAAC,iBAE/H,CAEA,YAAY,iBAAiB,qBAAqB,EAAE,QAAS,OAAU,CACrE,MAAM,QAAU,MAAM,QAAU,MAAM,MACtC,MAAM,iBAAiB,SAAU,IAAM,CACrC,MAAM,MAAQ,MAAM,MACpB,sCAAsC,MAAM,KAAK,EACjD,6BAA6B,EAC7B,iBAAiB,EACjB,gBAAgB,CAClB,CAAC,CACH,CAAC,EAED,YAAY,iBAAiB,qBAAqB,EAAE,QAAS,OAAU,CACjE,iBAAmB,mBAAmB,MAAM,KAAK,IAAM,kBACzD,MAAM,QAAU,GAChB,MAAM,MAAQ,MAAM,OAEtB,MAAM,iBAAiB,SAAW,OAAU,CAC1C,MAAM,MAAQ,MAAM,MACpB,cAAc,OAAS,GACvB,eAAe,MAAQ,GACvB,eAAe,MAAQ,GACvB,iBAAiB,EACjB,kCAAkC,KAAK,EACvC,gBAAgB,CAClB,CAAC,CACH,CAAC,EA6ED,mBAAmB,iBAAiB,QAAU,OAAU,CACtD,MAAM,YAAc,MAAM,OAAO,QAAQ,qBAAqB,EAC9D,GAAI,YAAa,CACf,MAAM,eAAe,EACrB,MAAM,SAAW,CAAC,eAAe,UAAU,SAAS,SAAS,EAC7D,eAAe,UAAU,OAAO,SAAS,EACzC,eAAe,UAAU,OAAO,UAAW,QAAQ,EACnD,YAAY,aAAa,gBAAiB,SAAW,OAAS,OAAO,EACrE,YAAY,cAAc,qBAAqB,GAAG,aAAa,gBAAiB,OAAO,EACvF,MACF,CAEA,MAAM,YAAc,MAAM,OAAO,QAAQ,qBAAqB,EAC9D,GAAI,YAAa,CACf,MAAM,eAAe,EACrB,MAAM,SAAW,CAAC,eAAe,UAAU,SAAS,SAAS,EAC7D,eAAe,UAAU,OAAO,SAAS,EACzC,eAAe,UAAU,OAAO,UAAW,QAAQ,EACnD,YAAY,aAAa,gBAAiB,SAAW,OAAS,OAAO,EACrE,YAAY,cAAc,qBAAqB,GAAG,aAAa,gBAAiB,OAAO,EACvF,MACF,CAEA,MAAM,YAAc,MAAM,OAAO,QAAQ,mBAAmB,EAC5D,GAAI,YAAa,CACf,MAAM,eAAe,EACrB,kBAAoB,YAAY,QAAQ,WAAa,GACrD,eAAe,UAAU,OAAO,SAAS,EACzC,eAAe,UAAU,IAAI,SAAS,EACtC,YAAY,cAAc,qBAAqB,GAAG,aAAa,gBAAiB,OAAO,EACvF,YAAY,cAAc,qBAAqB,GAAG,aAAa,gBAAiB,MAAM,EACtF,sBAAsB,EACtB,MACF,CAEA,MAAM,YAAc,MAAM,OAAO,QAAQ,yBAAyB,EAClE,GAAI,YAAa,CACf,MAAM,eAAe,EACrB,MAAM,WAAa,YAAY,QAAQ,gBAAkB,GACnD,CAAE,QAAS,KAAM,EAAI,iBAAiB,EAC5C,GAAI,SAAW,OAAS,GAAK,WAAY,CACvC,MAAM,WAAa,uBAAuB,EAC1C,WAAW,KAAK,EAAI,WACpB,iBAAiB,MAAM,KAAK,EAAI,WAChC,wBAAwB,MAAM,MAAO,KAAK,EAC1C,MAAM,MAAQ,WACd,cAAc,OAAS,GACvB,eAAe,MAAQ,GACvB,eAAe,MAAQ,GACvB,eAAe,EACf,kCAAkC,KAAK,EACvC,gBAAgB,CAClB,CACF,CACF,CAAC,EAED,YAAY,iBAAiB,2BAA2B,EAAE,QAAS,QAAW,CAC5E,OAAO,iBAAiB,QAAS,IAAM,CAChC,8BACL,uBAAuB,CACzB,CAAC,CACH,CAAC,EAED,kBAAkB,iBAAiB,QAAU,OAAU,CACrD,MAAM,OAAS,MAAM,OAAO,QAAQ,0BAA0B,EAC9D,GAAI,CAAC,OAAQ,OACb,MAAM,eAAe,EACrB,MAAM,cAAgB,OAAO,QAAQ,iBAAmB,GACnD,gBACL,MAAM,UAAY,cAClB,kCAAkC,KAAK,EACvC,gBAAgB,EAClB,CAAC,EAED,YAAY,iBAAiB,qBAAqB,EAAE,QAAS,OAAU,CACjE,2BAA2B,KAAK,GAClC,MAAM,QAAU,GAChB,iBAAiB,MAAM,MAAO,CAAC,GACtB,iBAAiB,IAAI,mBAAmB,MAAM,KAAK,CAAC,IAC7D,MAAM,QAAU,GAChB,MAAM,OAAO,IAAI,MAAM,KAAK,EAC5B,iBAAiB,MAAM,MAAO,KAAK,IAAI,EAAG,cAAc,MAAM,KAAK,CAAC,CAAC,GAEvE,MAAM,iBAAiB,SAAU,IAAM,CACjC,MAAM,SACR,iBAAiB,MAAM,MAAO,KAAK,IAAI,EAAG,cAAc,MAAM,KAAK,CAAC,CAAC,EACrE,MAAM,OAAO,IAAI,MAAM,KAAK,GAE5B,iBAAiB,MAAM,MAAO,CAAC,EAEjC,gBAAgB,CAClB,CAAC,CACH,CAAC,EAED,YAAY,iBAAiB,oBAAoB,EAAE,QAAS,OAAU,CACpE,MAAM,QAAU,MAAM,QAAU,MAAM,KACtC,MAAM,iBAAiB,SAAU,IAAM,CACrC,MAAM,KAAO,MAAM,MACnB,gBAAgB,CAClB,CAAC,CACH,CAAC,EAED,YAAY,iBAAiB,iBAAiB,EAAE,QAAS,QAAW,OAAO,iBAAiB,QAAU,OAAU,CAC1G,0BAA0B,GAAK,CAAC,MAAM,YAC1C,MAAM,SAAW,OAAO,QAAQ,WAAa,WAAa,MAAM,SAAW,EAAI,KAAK,IAAI,EAAG,MAAM,SAAW,CAAC,EAC7G,MAAM,oBAAsB,MAAM,KAAK,YAAY,iBAAiB,wBAAwB,CAAC,EAAE,KAAM,QACnG,OAAO,OAAO,QAAQ,gBAAkB,CAAC,IAAM,MAAM,QACtD,GAAG,QAAQ,qBAAuB,GAC/B,MAAM,YACR,MAAM,sBAAwB,GAC9B,kCAAkC,KAAK,GAEzC,gBAAgB,EAClB,CAAC,CAAC,EACF,YAAY,iBAAiB,wBAAwB,EAAE,QAAS,QAAW,OAAO,iBAAiB,QAAU,OAAU,CACrH,GAAI,0BAA0B,GAAK,CAAC,MAAM,UAAW,OACrD,MAAM,aAAe,OAAO,OAAO,QAAQ,gBAAkB,CAAC,EAC1D,CAAC,OAAO,SAAS,YAAY,GAAK,aAAe,IACrD,MAAM,SAAW,aACjB,MAAM,oBAAsB,OAAO,QAAQ,qBAAuB,GAC9D,MAAM,YACR,MAAM,sBAAwB,GAC9B,kCAAkC,KAAK,GAEzC,gBAAgB,EAClB,CAAC,CAAC,EAEF,YAAY,iBAAiB,kBAAkB,EAAE,QAAS,QAAW,OAAO,iBAAiB,QAAU,OAAU,CAC/G,MAAM,eAAe,EACrB,MAAM,gBAAgB,EACtB,MAAM,IAAM,OAAO,QAAQ,UAAY,GACjC,MAAQ,OAAO,OAAO,QAAQ,eAAiB,CAAC,EACtD,iBAAiB,IAAK,cAAc,GAAG,EAAI,KAAK,EAChD,MAAM,MAAQ,YAAY,cAAc,8BAA8B,IAAI,OAAO,GAAG,CAAC,IAAI,EACrF,OAAS,CAAC,MAAM,SAAW,MAAQ,GAAK,CAAC,MAAM,WACjD,MAAM,QAAU,GAChB,MAAM,OAAO,IAAI,MAAM,KAAK,GAE9B,gBAAgB,CAClB,CAAC,CAAC,EAEF,eAAe,iBAAiB,QAAU,OAAU,CAElD,GADuB,MAAM,OAAO,QAAQ,0BAA0B,EAClD,CAClB,aAAa,SAAW,GACxB,MAAM,MAAQ,qBAAqB,EACnC,oBAAoB,MAAO,oBAAoB,CAAC,EAChD,gBAAgB,aAAa,MAAO,KAAK,EACzC,MACF,CACA,MAAM,OAAS,MAAM,OAAO,QAAQ,sBAAsB,EAC1D,GAAI,CAAC,OAAQ,OACb,MAAM,WAAa,uBAAuB,MAAM,EAChD,gBAAgB,OAAO,OAAO,QAAQ,cAAgB,CAAC,EAAG,OAAW,CAAE,YAAa,CAAC,UAAW,CAAC,EACjG,yBAAyB,UAAU,CACrC,CAAC,EAED,aAAa,iBAAiB,QAAS,IAAM,YAAY,EAAE,CAAC,EAC5D,aAAa,iBAAiB,QAAS,IAAM,YAAY,CAAC,CAAC,EAC3D,aAAa,iBAAiB,cAAgB,OAAU,CACtD,aAAa,OAAS,MAAM,OAC9B,CAAC,EACD,aAAa,iBAAiB,YAAc,OAAU,CACpD,MAAM,MAAQ,MAAM,QAAU,aAAa,OACvC,KAAK,IAAI,KAAK,EAAI,IAAI,YAAY,MAAQ,EAAI,GAAK,CAAC,CAC1D,CAAC,EAED,MAAM,WAAa,CACjB,MAAO,CACL,QAAS,SACT,OAAQ,CAAC,oBAAqB,gBAAiB,YAAa,gBAAiB,oBAAqB,gBAAiB,YAAa,oBAAqB,gBAAiB,iBAAkB,WAAW,EACnM,UAAW,gBACX,KAAM,sFACR,EACA,QAAS,CACP,QAAS,UACT,OAAQ,CAAC,mBAAoB,aAAc,gBAAiB,eAAe,EAC3E,UAAW,iBACX,KAAM,6DACR,EACA,OAAQ,CACN,QAAS,SACT,OAAQ,CAAC,eAAgB,WAAY,cAAe,SAAS,EAC7D,UAAW,iBACX,KAAM,8DACR,EACA,OAAQ,CACN,QAAS,cACT,OAAQ,CAAC,YAAa,WAAY,SAAU,OAAO,EACnD,UAAW,gBACX,KAAM,mEACR,EACA,KAAM,CACJ,QAAS,cACT,OAAQ,CAAC,UAAW,OAAQ,UAAW,UAAU,EACjD,UAAW,sBACX,KAAM,oDACR,EACA,YAAa,CACX,QAAS,cACT,OAAQ,CAAC,mBAAoB,uBAAwB,mBAAmB,EACxE,UAAW,qBACX,KAAM,kEACR,CACF,EAEA,SAAS,kBAAkB,IAAK,CAC9B,GAAI,CAAC,cAAgB,CAAC,aAAe,CAAC,WAAY,OAIlD,GAHA,WAAW,UAAU,OAAO,cAAc,EAC1C,cAAc,iBAAiB,QAAQ,EAAE,QAAS,QAAW,OAAO,UAAU,OAAO,YAAa,OAAO,QAAQ,cAAgB,GAAG,CAAC,EAEjI,MAAQ,UAAW,CACrB,GAAI,CAAC,6BAA8B,CACjC,aAAa,OAAS,GACtB,YAAY,OAAS,GACrB,MACF,CACA,aAAa,OAAS,GACtB,YAAY,OAAS,GACrB,aAAa,UAAY;AAAA;AAAA;AAAA;AAAA,QAKzB,YAAY,UAAY,oIACxB,MACF,CAEA,MAAM,KAAO,WAAW,GAAG,GAAK,WAAW,MACrC,gBAAkB,6BACpB,0FACA,GACE,gBAAkB,6BACpB,0FACA,GACJ,aAAa,OAAS,GACtB,YAAY,OAAS,GACrB,aAAa,UAAY,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,IAAK,MAAS,4CAA4C,IAAI,wBAAwB,KAAK,OAAO,KAAK,IAAI,WAAW,EAAE,KAAK,EAAE,CAAC,GAAG,eAAe,GAClN,YAAY,UAAY,OAAO,KAAK,SAAS,WAAW,KAAK,IAAI,OAAO,eAAe,EACzF,CAEA,SAAS,wBAAyB,CAC3B,8BACL,sBAAsB,CACxB,CAEA,SAAS,qBAAsB,CAC7B,MAAM,YAAc,mBAAmB,GAAK,eAAe,OAAS,GAC9D,YAAc,iBAAiB,WAAW,EAChD,GAAI,aAAe,cAAgB,QAAS,OAAO,YACnD,MAAM,UAAY,qBAAqB,qBAAqB,CAAC,EAC7D,OAAO,UAAU,OAAS,CAAC,UAAU,uBAAyB,UAAU,MAAQ,EAClF,CAEA,SAAS,mBAAoB,CAC3B,OAAO,mBAAmB,GAAK,eAAe,OAAS,EACzD,CAEA,SAAS,mBAAmB,MAAO,KAAM,CAClC,kBACL,gBAAgB,UAAY,WAAW,WAAW,KAAK,CAAC,kBAAkB,WAAW,IAAI,CAAC,UAC5F,CAEA,SAAS,uBAAwB,CAC/B,GAAI,CAAC,6BAA8B,OACnC,iBAAiB,EACjB,MAAM,MAAQ,oBAAoB,GAAK,QACjC,MAAQ,kBAAkB,EAChC,GAAI,aAAc,CAChB,MAAM,OAAS,MAAM,KAAK,aAAa,OAAO,EAAE,KAAM,MAAS,KAAK,MAAM,YAAY,IAAM,MAAM,YAAY,CAAC,EAC/G,aAAa,MAAQ,OAAS,OAAO,MAAQ,OAC/C,CAkCA,GAjCI,kBACF,gBAAgB,MAAQ,cAAc,QAAU,SAAW,MAAQ,MAAQ,IAEzE,eAAc,aAAa,MAAQ,OAmBnC,iBACF,eAAe,SAAW,GAC1B,eAAe,QAAQ,cAAgB,GACvC,eAAe,QAAQ,YAAc,GACrC,eAAe,QAAQ,aAAe,GACtC,eAAe,YAAc,iBAE/B,mBACE,oBACA,4EACF,EACI,CAAC,aAAc,CACjB,kBAAkB,SAAS,EAC3B,YAAY,eAAe,CAAE,SAAU,OAAO,SAAS,WAAa,OAAS,SAAU,MAAO,QAAS,CAAC,EACxG,gBAAgB,EAChB,MACF,CACA,aAAa,OAAS,GACtB,SAAS,gBAAgB,UAAU,IAAI,yBAAyB,EAChE,gBAAgB,EAChB,OAAO,sBAAsB,IAAM,CAC5B,cAAc,MACd,cAAc,OAAO,EADA,cAAc,MAAM,CAEhD,CAAC,CACH,CAEA,SAAS,wBAAyB,CAC3B,eACL,aAAa,OAAS,GACtB,SAAS,gBAAgB,UAAU,OAAO,yBAAyB,EACnE,gBAAgB,EAClB,CAEA,SAAS,qBAAsB,CAC7B,MAAM,SAAW,cAAc,OAAS,GAClC,OAAS,iBAAiB,MAAM,KAAK,GAAK,GAChD,OAAO,WAAa,QAAU,OAAS,UAAY,MACrD,CAEA,SAAS,eAAe,CAAE,OAAS,GAAI,UAAY,GAAI,MAAQ,GAAI,MAAQ,EAAG,EAAI,CAAC,EAAG,CACpF,YAAY,WAAa,GACzB,YAAY,OAAS,OACrB,YAAY,UAAY,UACxB,YAAY,MAAQ,MACpB,YAAY,MAAQ,KACtB,CAEA,SAAS,kBAAmB,CAC1B,YAAY,WAAa,GACzB,YAAY,OAAS,GACrB,YAAY,UAAY,GACxB,YAAY,MAAQ,GACpB,YAAY,MAAQ,EACtB,CAEA,SAAS,oBAAqB,CAC5B,MAAO,GAAQ,cAAgB,CAAC,aAAa,OAC/C,CAEA,SAAS,mBAAoB,CAC3B,OAAO,YAAY,YAAc,mBAAmB,CACtD,CAEA,SAAS,qBAAsB,CAC7B,OAAI,YAAY,UAAkB,uGAC3B,YAAY,QAAU,gEAC/B,CAEA,eAAe,mBAAmB,MAAO,MAAO,CAC9C,MAAM,SAAW,YAAY,QAAQ,sBAAwB,GAC7D,GAAI,CAAC,SACH,MAAO,CAAE,GAAI,GAAO,QAAS,2CAA4C,EAE3E,MAAM,KAAO,IAAI,gBAAgB,CAC/B,MACA,MACA,SAAU,MACV,SAAU,MACV,gBAAiB,MACjB,gBAAiB,MACjB,WAAY,OAAO,SAAS,MAAQ,OAAO,SAAS,SACpD,cAAe,YAAY,QAAQ,sBAAwB,GAC3D,aAAc,YAAY,QAAQ,cAAgB,GAClD,UAAW,GACX,eAAgB,UAAU,UAAY,EACxC,CAAC,EACK,SAAW,MAAM,MAAM,SAAU,CACrC,OAAQ,OACR,QAAS,CACP,eAAgB,kDAChB,OAAQ,kBACV,EACA,IACF,CAAC,EACK,QAAU,MAAM,SAAS,KAAK,EAAE,MAAM,KAAO,CAAC,EAAE,EACtD,MAAI,CAAC,SAAS,IAAM,QAAQ,KAAO,GAC1B,CAAE,GAAI,GAAO,QAAS,QAAQ,SAAW,QAAQ,OAAS,uBAAwB,EAEpF,OACT,CAEA,SAAS,yBAAyB,MAAO,MAAO,CAC9C,MAAM,SAAW,mBAAmB,KAAK,EACnC,SAAW,mBAAmB,KAAK,EACzC,MAAO,GAAQ,UAAY,UAAY,WAAa,SACtD,CAEA,SAAS,+BAA+B,QAAS,QAAS,CACxD,MAAM,MAAQ,QAAQ,QAAQ,OAAO,EACrC,GAAI,MAAQ,EAAG,MAAO,GACtB,MAAM,MAAQ,QAAQ,MAAM,MAAQ,QAAQ,MAAM,EAClD,OAAK,MACE,oBAAoB,KAAM,QAAW,QAAU,QAAU,MAAM,WAAW,MAAM,CAAC,EADrE,EAErB,CAEA,SAAS,yBAAyB,MAAO,WAAY,CACnD,MAAM,SAAW,eAAe,KAAK,EAC/B,SAAW,iBAAiB,UAAU,EAC5C,MAAI,CAAC,UAAY,WAAa,QAAgB,GACvC,eAAe,QAAQ,IAAM,QACtC,CAEA,SAAS,oBAAoB,MAAO,CAClC,MAAM,KAAO,OAAO,OAAS,EAAE,EAAE,KAAK,EACtC,GAAI,CAAC,KAAM,MAAO,GAClB,MAAM,SAAW,KAAK,MAAM,wBAAwB,EACpD,GAAI,SAAU,OAAO,SAAS,CAAC,EAC/B,MAAM,aAAe,KAAK,MAAM,OAAO,EACvC,OAAO,aAAe,aAAa,CAAC,EAAI,EAC1C,CAEA,SAAS,sBAAsB,MAAO,CACpC,MAAM,OAAS,OAAO,OAAO,sBAAwB,EAAE,EAAE,KAAK,EACxD,OAAS,OAAO,OAAO,mBAAqB,EAAE,EAAE,KAAK,IAAM,OAAS,aAAa,MAAM,GAAK,IAClG,GAAI,CAAC,OAAQ,MAAO,GACpB,MAAM,UAAY,oBAAoB,OAAO,gBAAgB,EACvD,IAAM,IAAI,IAAI,OAAQ,OAAO,SAAS,MAAM,EAC9C,WAAW,IAAI,aAAa,IAAI,UAAW,SAAS,EACxD,MAAM,eAAiB,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,kBAAkB,EACzF,OAAI,gBAAkB,CAAC,IAAI,aAAa,IAAI,kBAAkB,GAC5D,IAAI,aAAa,IAAI,mBAAoB,cAAc,EAElD,GAAG,IAAI,QAAQ,GAAG,IAAI,MAAM,GAAG,IAAI,IAAI,EAChD,CAEA,SAAS,0BAA0B,MAAO,MAAO,CAC/C,MAAM,QAAU,qBAAqB,EACrC,GAAI,CAAC,QAAS,OAAO,KACrB,MAAM,WAAa,kBAAkB,OAAO,EAC5C,GAAI,YAAc,EAAG,CAEnB,MAAM,MADS,QAAQ,UAAU,UAAU,GACrB,QAAQ,KAAM,OAClC,yBAAyB,MAAO,KAAK,GAClC,yBAAyB,MAAO,KAAK,CACzC,EACD,GAAI,MAAO,CACT,MAAM,SAAW,uBAAuB,QAAS,WAAY,KAAK,EAC5D,eAAiB,SAAS,KAAMC,UAAYA,SAAQ,GAAG,EACvD,cAAgB,SAAS,KAAMA,UAAYA,SAAQ,EAAE,EAC3D,MAAO,CACL,KAAM,SACN,MAAO,MACP,SACA,OAAQ,EAAQ,eAChB,aAAc,EAAQ,aACxB,CACF,CACF,CAEA,MAAM,UAAY,qBAAqB,OAAO,EACxC,QAAU,sBAAsB,GAAK,QAAQ,WAAW,CAAC,GAAK,KACpE,OACE,SAAS,IACN,yBAAyB,MAAO,UAAU,KAAK,IAEhD,yBAAyB,MAAO,UAAU,KAAK,GAC5C,yBAAyB,MAAO,UAAU,KAAK,GAG7C,CACL,KAAM,kBACN,MAAO,UAAU,MACjB,SAAU,CAAC,OAAO,EAClB,OAAQ,EAAQ,QAAQ,IACxB,aAAc,EAChB,EAGK,IACT,CAEA,SAAS,yBAAyB,QAAS,CACzC,GAAI,CAAC,SAAS,GAAI,MAAO,GACzB,MAAM,IAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EACxC,WAAI,aAAa,IAAI,QAAS,MAAM,KAAK,EACzC,IAAI,aAAa,IAAI,UAAW,QAAQ,EAAE,EACnC,GAAG,IAAI,QAAQ,GAAG,IAAI,MAAM,GAAG,IAAI,IAAI,EAChD,CAEA,SAAS,gCAAgC,MAAO,CAC9C,GAAI,CAAC,OAAO,UAAU,OAAQ,OAAO,KACrC,MAAM,QAAU,qBAAqB,EAC/B,WAAa,kBAAkB,OAAO,EACtC,WAAa,uBAAuB,MAAM,KAAK,EACrD,OAAO,MAAM,SAAS,KAAM,SAC1B,QAAQ,IACL,QAAQ,KACR,QAAQ,SAAS,MAAM,CAAC,MAAO,QAChC,QAAU,YAAc,CAAC,WAAW,KAAK,GAAK,WAAW,KAAK,IAAM,KACrE,CACF,GACI,MAAM,SAAS,KAAM,SAAY,QAAQ,IAAM,QAAQ,GAAG,GAC1D,MAAM,SAAS,KAAM,SAAY,QAAQ,EAAE,GAC3C,IACP,CAEA,SAAS,uBAAuB,QAAS,CACvC,GAAI,CAAC,SAAS,SAAS,OAAQ,OAC/B,iBAAiB,MAAM,KAAK,EAAI,QAAQ,QAAQ,MAAM,EACtC,qBAAqB,GAC5B,SAAS,QAAQ,CAAC,OAAQ,QAAU,CACvC,QAAQ,QAAQ,KAAK,GAAG,wBAAwB,MAAM,MAAO,KAAK,CACxE,CAAC,CACH,CAEA,SAAS,yBAAyB,MAAO,QAAU,CAAC,EAAG,CACrD,GAAK,MACL,IAAI,MAAM,OAAS,SAAU,CAC3B,MAAM,cAAgB,gCAAgC,KAAK,EAG3D,GAFI,eAAe,uBAAuB,aAAa,GACtC,cAAgB,GAAO,yBAAyB,MAAM,KAAK,KAE1E,MAAM,MAAQ,MAAM,MACpB,cAAc,OAAS,GACvB,eAAe,MAAQ,GACvB,eAAe,MAAQ,GACvB,iBAAiB,EACjB,uBAAuB,EACvB,kCAAkC,EAClC,gBAAgB,EACZ,cAAa,YAAY,YAAc,GAAG,MAAM,KAAK,sEACrD,QAAQ,UAAU,CACpB,MAAM,QAAU,eAAiB,sBAAsB,GAAK,MAAM,SAAS,KAAM,MAAS,KAAK,EAAE,GAAK,KAChG,UAAY,yBAAyB,OAAO,EAC9C,YAAW,OAAO,SAAS,KAAO,UACxC,CAEF,MACF,CACA,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EACZ,cAAa,YAAY,YAAc,GAAG,MAAM,KAAK,mFAC3D,CAEA,eAAe,qBAAsB,CACnC,MAAM,MAAQ,oBAAoB,EAAE,KAAK,EACnC,MAAQ,cAAc,MAAM,KAAK,GAAK,GAC5C,GAAI,CAAC,OAAS,CAAC,MAAO,CACpB,mBACE,oBACA,6DACF,EACI,iBACF,eAAe,SAAW,GAC1B,eAAe,QAAQ,cAAgB,GACvC,eAAe,QAAQ,YAAc,GACrC,eAAe,QAAQ,aAAe,GACtC,eAAe,YAAc,iBAE/B,MACF,CACA,MAAM,UAAY,0BAA0B,MAAO,KAAK,EACxD,GAAI,WAAW,QAAU,UAAU,aAAc,CAC/C,iBAAiB,EACjB,mBACE,+BACA,GAAG,UAAU,KAAK,oGACpB,EACI,iBACF,eAAe,SAAW,GAC1B,eAAe,QAAQ,cAAgB,eACvC,eAAe,QAAQ,YAAc,UAAU,KAC/C,eAAe,QAAQ,aAAe,UAAU,MAChD,eAAe,YAAc,sBAE/B,OAAO,WAAW,IAAM,CACtB,yBAAyB,UAAW,CAAE,SAAU,EAAK,CAAC,CACxD,EAAG,GAAG,EACN,MACF,CACA,GAAI,WAAW,cAAgB,CAAC,UAAU,OAAQ,CAChD,eAAe,CACb,OAAQ,GAAG,UAAU,KAAK,2EAC1B,MACA,KACF,CAAC,EACD,mBACE,kCACA,GAAG,UAAU,KAAK,0IACpB,EACI,iBACF,eAAe,SAAW,GAC1B,eAAe,QAAQ,cAAgB,GACvC,eAAe,QAAQ,YAAc,GACrC,eAAe,QAAQ,aAAe,GACtC,eAAe,YAAc,iBAE/B,gBAAgB,EAChB,MACF,CACA,mBACE,iBACA,wEACF,EACA,IAAI,YACJ,GAAI,CACF,YAAc,MAAM,mBAAmB,MAAO,KAAK,CACrD,OAAS,MAAO,CACd,YAAc,CACZ,GAAI,GACJ,QAAS,iBAAiB,MAAQ,MAAM,QAAU,OAAO,KAAK,CAChE,CACF,CACA,GAAI,aAAa,KAAO,GAAO,CAC7B,eAAe,CACb,OAAQ,GAAG,KAAK,IAAI,KAAK,0CACzB,MACA,KACF,CAAC,EACD,mBACE,0BACA,GAAG,KAAK,IAAI,KAAK,mBAAmB,YAAY,SAAW,kBAAkB,EAC/E,EACI,iBACF,eAAe,SAAW,GAC1B,eAAe,QAAQ,cAAgB,GACvC,eAAe,QAAQ,YAAc,GACrC,eAAe,QAAQ,aAAe,GACtC,eAAe,YAAc,iBAE/B,gBAAgB,EAChB,MACF,CACA,GAAI,aAAa,iBAAmB,wBAAyB,CAC3D,MAAM,SAAW,YAAY,eAAiB,CAAC,EACzC,UAAY,sBAAsB,QAAQ,EAChD,eAAe,CACb,OAAQ,GAAG,SAAS,OAAS,KAAK,IAAI,SAAS,OAAS,KAAK,8CAC7D,UAAW,UACX,MAAO,SAAS,OAAS,MACzB,MAAO,SAAS,OAAS,KAC3B,CAAC,EACD,mBACE,6BACA,GAAG,SAAS,OAAS,KAAK,IAAI,SAAS,OAAS,KAAK,sGACvD,EACI,iBACF,eAAe,SAAW,CAAC,UAC3B,eAAe,QAAQ,cAAgB,UAAY,kBAAoB,GACvE,eAAe,QAAQ,YAAc,eACrC,eAAe,QAAQ,aAAe,GACtC,eAAe,QAAQ,WAAa,UACpC,eAAe,YAAc,iBAE3B,gBAAkB,YAAW,eAAe,YAAc,uBAC1D,cAAa,YAAY,YAAc,6CAA6C,SAAS,OAAS,KAAK,IAAI,SAAS,OAAS,KAAK,KAC1I,gBAAgB,EACZ,WACF,OAAO,WAAW,IAAM,CAClB,YAAY,YAAc,YAAW,OAAO,SAAS,KAAO,UAClE,EAAG,GAAG,EAER,MACF,CACA,GAAI,aAAa,iBAAmB,4BAA6B,CAC/D,MAAM,SAAW,YAAY,eAAiB,CAAC,EAC/C,eAAe,CACb,OAAQ,GAAG,SAAS,OAAS,KAAK,IAAI,SAAS,OAAS,KAAK,8BAC7D,MAAO,SAAS,OAAS,MACzB,MAAO,SAAS,OAAS,KAC3B,CAAC,EACD,mBACE,8BACA,GAAG,SAAS,OAAS,KAAK,IAAI,SAAS,OAAS,KAAK,6IACvD,EACI,iBACF,eAAe,SAAW,GAC1B,eAAe,QAAQ,cAAgB,GACvC,eAAe,QAAQ,YAAc,GACrC,eAAe,QAAQ,aAAe,GACtC,eAAe,QAAQ,WAAa,GACpC,eAAe,YAAc,iBAE3B,cAAa,YAAY,YAAc,8BAA8B,SAAS,OAAS,KAAK,IAAI,SAAS,OAAS,KAAK,sBAC3H,gBAAgB,EAChB,MACF,CACA,GAAI,aAAa,iBAAmB,0BAA2B,CAC7D,MAAM,SAAW,YAAY,eAAiB,CAAC,EAC/C,eAAe,CACb,OAAQ,GAAG,SAAS,OAAS,KAAK,IAAI,SAAS,OAAS,KAAK,8DAC7D,MAAO,SAAS,OAAS,MACzB,MAAO,SAAS,OAAS,KAC3B,CAAC,EACD,mBACE,4BACA,GAAG,SAAS,OAAS,KAAK,IAAI,SAAS,OAAS,KAAK,iHACvD,CACF,MAAW,aAAa,iBAAmB,qBAAuB,aAAa,WAC7E,eAAe,CACb,OAAQ,GAAG,KAAK,IAAI,KAAK,yCACzB,MACA,KACF,CAAC,EACD,mBACE,2BACA,GAAG,KAAK,IAAI,KAAK,sHACnB,IAEA,eAAe,CACb,OAAQ,GAAG,KAAK,IAAI,KAAK,2DACzB,MACA,KACF,CAAC,EACD,mBACE,2BACA,GAAG,KAAK,IAAI,KAAK,sFACnB,GAEF,cAAc,OAAS,GACvB,cAAc,MAAQ,GACtB,cAAc,MAAQ,GACtB,eAAe,MAAQ,GACvB,eAAe,MAAQ,GACnB,iBACF,eAAe,SAAW,GAC1B,eAAe,QAAQ,cAAgB,GACvC,eAAe,QAAQ,YAAc,GACrC,eAAe,QAAQ,aAAe,GACtC,eAAe,YAAc,iBAE3B,cAAa,YAAY,YAAc,8BAA8B,KAAK,IAAI,KAAK,oCACvF,gBAAgB,CAClB,CAEA,cAAc,iBAAiB,QAAU,OAAU,CACjD,MAAM,OAAS,MAAM,OAAO,QAAQ,qBAAqB,EACzD,GAAK,OACL,IAAI,OAAO,QAAQ,cAAgB,UAAW,CAC5C,GAAI,CAAC,6BAA8B,OACnC,sBAAsB,EACtB,MACF,CACA,kBAAkB,OAAO,QAAQ,WAAW,EAC9C,CAAC,EAED,cAAc,iBAAiB,QAAU,OAAU,CAEjD,GADoB,MAAM,OAAO,QAAQ,qBAAqB,EAC7C,CACf,GAAI,CAAC,6BAA8B,OACnC,uBAAuB,EACvB,MACF,CAGA,GADsB,MAAM,OAAO,QAAQ,8BAA8B,EACtD,CACjB,MAAM,MAAQ,YAAY,cAAc,6BAA6B,GAAG,MAAM,KAAK,EAC7E,MAAQ,YAAY,cAAc,6BAA6B,GAAG,MAAM,KAAK,EAC7E,QAAU,YAAY,cAAc,+BAA+B,EACzE,GAAI,CAAC,OAAS,CAAC,MAAO,CAChB,UAAS,QAAQ,YAAc,4DACnC,MACF,CACI,OAAS,QACX,cAAc,OAAS,GACvB,cAAc,MAAQ,GACtB,cAAc,MAAQ,GACtB,eAAe,MAAQ,GACvB,eAAe,MAAQ,GACvB,eAAe,CACb,OAAQ,GAAG,KAAK,IAAI,KAAK,sDACzB,MACA,KACF,CAAC,EACG,UAAS,QAAQ,YAAc,sCAAsC,KAAK,IAAI,KAAK,mEACnF,cAAa,YAAY,YAAc,8BAA8B,KAAK,IAAI,KAAK,oCACvF,gBAAgB,GAElB,MACF,CACA,MAAM,YAAc,MAAM,OAAO,QAAQ,qBAAqB,EAC9D,GAAI,YAAa,CACf,cAAc,OAAS,GACvB,iBAAiB,EACjB,eAAe,MAAQ,YAAY,QAAQ,aAAe,eAC1D,eAAe,MAAQ,YAAY,QAAQ,aAAe,IACtD,MAAM,QAAU,UAAY,MAAM,QAAU,iBAC9C,MAAM,MAAQ,OACd,sCAAsC,MAAM,KAAK,GAE7B,yBAAyB,eAAe,KAAK,IAEjE,eAAe,MAAQ,GACvB,eAAe,MAAQ,IAEzB,MAAM,WAAa,YAAY,cAAc,8BAA8B,IAAI,OAAO,MAAM,KAAK,CAAC,IAAI,EAClG,aAAY,WAAW,QAAU,IACjC,cAAa,YAAY,YAAc,GAAG,eAAe,KAAK,sCAClE,kCAAkC,KAAK,EACvC,gBAAgB,CAClB,CACF,CAAC,EAED,aAAa,iBAAiB,QAAU,OAAU,CAC5C,MAAM,OAAO,QAAQ,qBAAqB,GAAK,8BAA8B,uBAAuB,CAC1G,CAAC,EAED,cAAc,iBAAiB,QAAU,OAAU,CACjD,GAAI,MAAM,OAAO,QAAQ,sBAAsB,EAAG,CAChD,uBAAuB,EACvB,MACF,CACA,GAAI,MAAM,OAAO,QAAQ,yBAAyB,EAAG,CACnD,oBAAoB,EACpB,MACF,CACA,GAAI,MAAM,OAAO,QAAQ,wBAAwB,EAAG,CAClD,GAAI,gBAAgB,QAAQ,gBAAkB,eAAgB,CAC5D,yBAAyB,CACvB,KAAM,eAAe,QAAQ,aAAe,SAC5C,MAAO,eAAe,QAAQ,cAAgB,cAAc,MAAM,KAAK,GAAK,EAC9E,CAAC,EACD,MACF,CACA,GAAI,gBAAgB,QAAQ,gBAAkB,kBAAmB,CAC/D,MAAM,UAAY,eAAe,QAAQ,YAAc,GACnD,YAAW,OAAO,SAAS,KAAO,WACtC,MACF,CACA,mBACE,0BACA,wFACF,CACF,CACF,CAAC,EAED,cAAc,iBAAiB,SAAU,IAAM,CACxC,kBACD,aAAa,QAAU,QAAS,gBAAgB,MAAM,EACrD,gBAAgB,MAAQ,GAC/B,CAAC,EAED,cAAc,iBAAiB,UAAY,OAAU,CAC/C,MAAM,MAAQ,UAAU,uBAAuB,CACrD,CAAC,EAEG,kBAAoB,UACtB,sBAAsB,GAEtB,YAAY,UAAU,IAAI,cAAc,EACpC,eACF,aAAa,OAAS,GACtB,aAAa,UAAY,IAEvB,cACF,YAAY,OAAS,GACrB,YAAY,UAAY,KAI5B,MAAM,gBAAkB,YAAY,cAAc,yBAAyB,EACrE,kBAAoB,YAAY,cAAc,mCAAmC,EAEvF,SAAS,+BAAgC,CACvC,GAAI,CAAC,iBAAmB,CAAC,kBAAmB,OAC5C,MAAM,KAAO,kBAAkB,sBAAsB,EAC/C,uBAAyB,KAAK,MAAQ,GACvC,KAAK,OAAS,GACd,KAAK,OAAS,GACd,KAAK,IAAM,OAAO,YACjB,6BAA+B,KAAK,KAAO,OAAO,YAClD,WAAa,wBAA0B,6BAC7C,gBAAgB,OAAS,WACzB,gBAAgB,aAAa,cAAe,WAAa,OAAS,OAAO,CAC3E,CAEA,SAAS,cAAc,EAAG,EAAG,CAC3B,GAAI,CAAC,gBAAiB,MAAO,CAAE,EAAG,CAAE,EACpC,MAAM,KAAO,gBAAgB,sBAAsB,EACnD,MAAO,CACL,EAAG,KAAK,IAAI,KAAK,IAAI,GAAI,CAAC,EAAG,OAAO,WAAa,KAAK,MAAQ,EAAE,EAChE,EAAG,KAAK,IAAI,KAAK,IAAI,GAAI,CAAC,EAAG,OAAO,YAAc,KAAK,OAAS,EAAE,CACpE,CACF,CACA,SAAS,YAAY,EAAG,EAAG,QAAS,CAClC,GAAI,CAAC,gBAAiB,OACtB,MAAM,KAAO,cAAc,EAAG,CAAC,EAC/B,gBAAgB,MAAM,YAAY,eAAgB,GAAG,KAAK,CAAC,IAAI,EAC/D,gBAAgB,MAAM,YAAY,eAAgB,GAAG,KAAK,CAAC,IAAI,EAC/D,gBAAgB,UAAU,IAAI,eAAe,EACzC,SAAS,aAAa,QAAQ,8BAA+B,KAAK,UAAU,IAAI,CAAC,CACvF,CACA,GAAI,gBAAiB,CACnB,8BAA8B,EAC1B,mBAAqB,yBAA0B,QACrB,IAAI,qBAAqB,8BAA+B,CAClF,UAAW,CAAC,EAAG,GAAI,CACrB,CAAC,EACmB,QAAQ,iBAAiB,EAE/C,IAAI,WAAa,KACb,SAAW,GACX,QAAU,EACV,QAAU,EACd,MAAM,MAAQ,KAAK,MAAM,aAAa,QAAQ,6BAA6B,GAAK,MAAM,EAClF,OAAO,YAAY,MAAM,EAAG,MAAM,EAAG,EAAK,EAC9C,MAAM,MAAS,OAAU,CACvB,GAAI,MAAM,OAAO,QAAQ,QAAQ,EAAG,OACpC,MAAM,MAAQ,MAAM,QAAU,MAAM,QAAQ,CAAC,EAAI,MAC3C,KAAO,gBAAgB,sBAAsB,EACnD,QAAU,MAAM,QAAU,KAAK,KAC/B,QAAU,MAAM,QAAU,KAAK,IAC/B,WAAa,OAAO,WAAW,IAAM,CACnC,SAAW,GACX,gBAAgB,UAAU,IAAI,aAAa,EAC3C,YAAY,KAAK,KAAM,KAAK,IAAK,EAAK,CACxC,EAAG,GAAG,CACR,EACM,KAAQ,OAAU,CACtB,GAAI,CAAC,SAAU,OACf,MAAM,eAAe,EACrB,MAAM,MAAQ,MAAM,QAAU,MAAM,QAAQ,CAAC,EAAI,MACjD,YAAY,MAAM,QAAU,QAAS,MAAM,QAAU,QAAS,EAAK,CACrE,EACM,IAAM,IAAM,CAEhB,GADA,OAAO,aAAa,UAAU,EAC1B,SAAU,CACZ,MAAM,KAAO,gBAAgB,sBAAsB,EACnD,YAAY,KAAK,KAAM,KAAK,IAAK,EAAI,CACvC,CACA,SAAW,GACX,gBAAgB,UAAU,OAAO,aAAa,CAChD,EACA,gBAAgB,iBAAiB,YAAa,KAAK,EACnD,gBAAgB,iBAAiB,aAAc,MAAO,CAAE,QAAS,EAAK,CAAC,EACvE,OAAO,iBAAiB,YAAa,IAAI,EACzC,OAAO,iBAAiB,YAAa,KAAM,CAAE,QAAS,EAAM,CAAC,EAC7D,OAAO,iBAAiB,UAAW,GAAG,EACtC,OAAO,iBAAiB,WAAY,GAAG,EACvC,OAAO,iBAAiB,SAAU,IAAM,CAEtC,GADA,8BAA8B,EAC1B,CAAC,gBAAgB,UAAU,SAAS,eAAe,EAAG,OAC1D,MAAM,KAAO,gBAAgB,sBAAsB,EACnD,YAAY,KAAK,KAAM,KAAK,IAAK,EAAI,CACvC,CAAC,CACH,CAEA,eAAe,QAAS,QAAW,OAAO,iBAAiB,QAAU,OAAU,CAC7E,MAAM,eAAe,EACrB,UAAU,EAAK,CACjB,CAAC,CAAC,EACF,cAAc,QAAS,QAAW,OAAO,iBAAiB,QAAU,OAAU,CAC5E,MAAM,eAAe,EACrB,UAAU,EAAK,CACjB,CAAC,CAAC,EACF,iCAAiC,EACjC,gBAAgB,CAClB,GAAG",
  "names": ["fromVariant", "total", "variant"]
}
