{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/starapps-soldout-fix.js?aa=2"],
  "sourcesContent": ["(() => {\r\n  'use strict';\r\n\r\n  /*\r\n   * ==========================================================\r\n   * APPAREL ALCHEMISTS\r\n   * SHOPIFY / PRINTFUL AVAILABILITY CONTROL\r\n   *\r\n   * Printful -> Shopify inventory -> variant.available\r\n   *\r\n   * VERSION:\r\n   * - Uses Shopify's REAL option positions\r\n   * - Uses actual Shopify variant IDs where possible\r\n   * - Prevents false sold-out messages\r\n   * - Blocks genuinely unavailable variants\r\n   * - Keeps current colour/gallery visible\r\n   * - Compatible with aa-colour-gallery.js\r\n   * ==========================================================\r\n   */\r\n\r\n  const OVERLAY_ID =\r\n    'aa-unavailable-variant-overlay';\r\n\r\n  const STYLE_ID =\r\n    'aa-unavailable-variant-styles';\r\n\r\n  const PRODUCT_CACHE_MS =\r\n    15000;\r\n\r\n  let productData = null;\r\n  let productPromise = null;\r\n  let productLoadedAt = 0;\r\n  let evaluationTimer = null;\r\n\r\n  /*\r\n   * A sold-out choice is blocked before\r\n   * Shopify actually selects it.\r\n   *\r\n   * We therefore remember the attempted\r\n   * unavailable combination here.\r\n   */\r\n  let blockedSelection = null;\r\n\r\n  /*\r\n   * Used for dropdown variants.\r\n   */\r\n  const previousSelectValues =\r\n    new WeakMap();\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * HELPERS\r\n   * ==========================================================\r\n   */\r\n\r\n  const normalise = (\r\n    value = ''\r\n  ) =>\r\n    String(value)\r\n      .replace(':', '')\r\n      .trim()\r\n      .toLowerCase()\r\n      .replace(/\\s+/g, ' ');\r\n\r\n\r\n  const escapeHtml = (\r\n    value = ''\r\n  ) => {\r\n    const element =\r\n      document.createElement(\r\n        'div'\r\n      );\r\n\r\n    element.textContent =\r\n      value;\r\n\r\n    return element.innerHTML;\r\n  };\r\n\r\n\r\n  const isInsideVariantPicker =\r\n    element =>\r\n      Boolean(\r\n        element?.closest?.(\r\n          'variant-selects, variant-radios'\r\n        )\r\n      );\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * PRODUCT ELEMENTS\r\n   * ==========================================================\r\n   */\r\n\r\n  const getProductInfo = () =>\r\n    document.querySelector(\r\n      \"product-info[id^='MainProduct']\"\r\n    ) ||\r\n    document.querySelector(\r\n      'product-info'\r\n    );\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * STYLES\r\n   * ==========================================================\r\n   */\r\n\r\n  const injectStyles = () => {\r\n\r\n    if (\r\n      document.getElementById(\r\n        STYLE_ID\r\n      )\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    const style =\r\n      document.createElement(\r\n        'style'\r\n      );\r\n\r\n    style.id =\r\n      STYLE_ID;\r\n\r\n    style.textContent = `\r\n\r\n      .aa-colour-gallery,\r\n      media-gallery {\r\n        position: relative;\r\n      }\r\n\r\n\r\n      #${OVERLAY_ID} {\r\n\r\n        position: absolute;\r\n\r\n        inset: 0;\r\n\r\n        z-index: 50;\r\n\r\n        display: flex;\r\n\r\n        align-items: center;\r\n\r\n        justify-content: center;\r\n\r\n        padding: 32px;\r\n\r\n        background:\r\n          rgba(\r\n            0,\r\n            0,\r\n            0,\r\n            0.88\r\n          );\r\n\r\n        opacity: 0;\r\n\r\n        visibility: hidden;\r\n\r\n        pointer-events: none;\r\n\r\n        transition:\r\n          opacity 0.22s ease,\r\n          visibility 0.22s ease;\r\n      }\r\n\r\n\r\n      #${OVERLAY_ID}.is-visible {\r\n\r\n        opacity: 1;\r\n\r\n        visibility: visible;\r\n\r\n        pointer-events: auto;\r\n      }\r\n\r\n\r\n      #${OVERLAY_ID}\r\n      .aa-unavailable-card {\r\n\r\n        width:\r\n          min(\r\n            720px,\r\n            92%\r\n          );\r\n\r\n        padding:\r\n          72px 42px 56px;\r\n\r\n        text-align: center;\r\n\r\n        border:\r\n          1px solid\r\n          rgba(\r\n            200,\r\n            161,\r\n            90,\r\n            0.85\r\n          );\r\n\r\n        background:\r\n          rgba(\r\n            5,\r\n            5,\r\n            5,\r\n            0.97\r\n          );\r\n\r\n        box-shadow:\r\n          0 18px 50px\r\n          rgba(\r\n            0,\r\n            0,\r\n            0,\r\n            0.6\r\n          );\r\n      }\r\n\r\n\r\n      #${OVERLAY_ID}\r\n      .aa-unavailable-spiral {\r\n\r\n        margin-bottom:\r\n          42px;\r\n\r\n        color:\r\n          #c8a15a;\r\n\r\n        font-size:\r\n          44px;\r\n\r\n        line-height:\r\n          1;\r\n      }\r\n\r\n\r\n      #${OVERLAY_ID}\r\n      .aa-unavailable-message {\r\n\r\n        margin: 0;\r\n\r\n        color:\r\n          #f3eadc;\r\n\r\n        font-size:\r\n          clamp(\r\n            18px,\r\n            2.3vw,\r\n            25px\r\n          );\r\n\r\n        line-height:\r\n          1.7;\r\n      }\r\n\r\n\r\n      #${OVERLAY_ID}\r\n      .aa-unavailable-message\r\n      strong {\r\n\r\n        color:\r\n          #c8a15a;\r\n\r\n        font-weight:\r\n          600;\r\n      }\r\n\r\n\r\n      #${OVERLAY_ID}\r\n      .aa-unavailable-footer {\r\n\r\n        margin-top:\r\n          48px;\r\n\r\n        color:\r\n          rgba(\r\n            243,\r\n            234,\r\n            220,\r\n            0.68\r\n          );\r\n\r\n        font-size:\r\n          15px;\r\n\r\n        letter-spacing:\r\n          0.12em;\r\n\r\n        text-transform:\r\n          uppercase;\r\n      }\r\n\r\n\r\n      @media screen and\r\n      (max-width: 749px) {\r\n\r\n        #${OVERLAY_ID} {\r\n\r\n          padding:\r\n            16px;\r\n        }\r\n\r\n\r\n        #${OVERLAY_ID}\r\n        .aa-unavailable-card {\r\n\r\n          width:\r\n            100%;\r\n\r\n          padding:\r\n            48px 22px 38px;\r\n        }\r\n\r\n\r\n        #${OVERLAY_ID}\r\n        .aa-unavailable-spiral {\r\n\r\n          margin-bottom:\r\n            30px;\r\n        }\r\n\r\n\r\n        #${OVERLAY_ID}\r\n        .aa-unavailable-message {\r\n\r\n          font-size:\r\n            18px;\r\n        }\r\n\r\n\r\n        #${OVERLAY_ID}\r\n        .aa-unavailable-footer {\r\n\r\n          margin-top:\r\n            36px;\r\n        }\r\n      }\r\n    `;\r\n\r\n    document.head.appendChild(\r\n      style\r\n    );\r\n  };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * SHOPIFY PRODUCT JSON\r\n   * ==========================================================\r\n   *\r\n   * Printful updates Shopify.\r\n   *\r\n   * We read Shopify's current\r\n   * storefront availability.\r\n   * ==========================================================\r\n   */\r\n\r\n  const loadProduct =\r\n    async (\r\n      forceRefresh =\r\n        false\r\n    ) => {\r\n\r\n      const now =\r\n        Date.now();\r\n\r\n      const fresh =\r\n        productData &&\r\n        !forceRefresh &&\r\n        (\r\n          now -\r\n          productLoadedAt\r\n        ) <\r\n        PRODUCT_CACHE_MS;\r\n\r\n      if (fresh) {\r\n        return productData;\r\n      }\r\n\r\n\r\n      if (\r\n        productPromise &&\r\n        !forceRefresh\r\n      ) {\r\n        return productPromise;\r\n      }\r\n\r\n\r\n      const pathname =\r\n        window\r\n          .location\r\n          .pathname\r\n          .replace(\r\n            /\\/$/,\r\n            ''\r\n          );\r\n\r\n\r\n      productPromise =\r\n        fetch(\r\n          `${pathname}.js`,\r\n          {\r\n            credentials:\r\n              'same-origin',\r\n\r\n            cache:\r\n              'no-store',\r\n\r\n            headers: {\r\n              Accept:\r\n                'application/json'\r\n            }\r\n          }\r\n        )\r\n\r\n          .then(\r\n            response => {\r\n\r\n              if (\r\n                !response.ok\r\n              ) {\r\n                throw new Error(\r\n                  'Unable to load Shopify product availability.'\r\n                );\r\n              }\r\n\r\n              return (\r\n                response.json()\r\n              );\r\n            }\r\n          )\r\n\r\n          .then(\r\n            data => {\r\n\r\n              productData =\r\n                data;\r\n\r\n              productLoadedAt =\r\n                Date.now();\r\n\r\n              return data;\r\n            }\r\n          )\r\n\r\n          .catch(\r\n            error => {\r\n\r\n              console.error(\r\n                'AA stock availability:',\r\n                error\r\n              );\r\n\r\n              return (\r\n                productData ||\r\n                null\r\n              );\r\n            }\r\n          )\r\n\r\n          .finally(\r\n            () => {\r\n\r\n              productPromise =\r\n                null;\r\n            }\r\n          );\r\n\r\n\r\n      return productPromise;\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * SHOPIFY OPTION DEFINITIONS\r\n   * ==========================================================\r\n   *\r\n   * Example:\r\n   *\r\n   * Color = position 1\r\n   * Size  = position 2\r\n   *\r\n   * We use THIS ordering rather than\r\n   * whatever order the HTML happens\r\n   * to appear in.\r\n   * ==========================================================\r\n   */\r\n\r\n  const getProductOptionDefinitions =\r\n    product => {\r\n\r\n      if (\r\n        !product ||\r\n        !Array.isArray(\r\n          product.options\r\n        )\r\n      ) {\r\n        return [];\r\n      }\r\n\r\n\r\n      return (\r\n        product.options.map(\r\n          (\r\n            option,\r\n            index\r\n          ) => {\r\n\r\n            if (\r\n              typeof option ===\r\n              'string'\r\n            ) {\r\n              return {\r\n                name:\r\n                  option,\r\n\r\n                position:\r\n                  index + 1\r\n              };\r\n            }\r\n\r\n\r\n            return {\r\n\r\n              name:\r\n                option?.name ||\r\n                '',\r\n\r\n              position:\r\n                Number(\r\n                  option?.position\r\n                ) ||\r\n                index + 1\r\n            };\r\n          }\r\n        )\r\n      );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * OPTION PICKER\r\n   * ==========================================================\r\n   */\r\n\r\n  const getOptionNameFromGroup =\r\n    group => {\r\n\r\n      if (!group) {\r\n        return '';\r\n      }\r\n\r\n\r\n      const legend =\r\n        group.querySelector(\r\n          'legend'\r\n        );\r\n\r\n\r\n      const label =\r\n        group.querySelector(\r\n          '.form__label'\r\n        ) ||\r\n        group.querySelector(\r\n          'label'\r\n        );\r\n\r\n\r\n      return (\r\n        legend\r\n          ?.childNodes?.[0]\r\n          ?.textContent ||\r\n\r\n        legend\r\n          ?.textContent ||\r\n\r\n        label\r\n          ?.textContent ||\r\n\r\n        ''\r\n      )\r\n        .replace(\r\n          ':',\r\n          ''\r\n        )\r\n        .trim();\r\n    };\r\n\r\n\r\n  const getGroupValue =\r\n    group => {\r\n\r\n      if (!group) {\r\n        return '';\r\n      }\r\n\r\n\r\n      const checked =\r\n        group.querySelector(\r\n          'input[type=\"radio\"]:checked'\r\n        );\r\n\r\n\r\n      if (checked) {\r\n\r\n        return (\r\n          checked.value ||\r\n          ''\r\n        );\r\n      }\r\n\r\n\r\n      const select =\r\n        group.querySelector(\r\n          'select'\r\n        );\r\n\r\n\r\n      if (select) {\r\n\r\n        return (\r\n          select.value ||\r\n          ''\r\n        );\r\n      }\r\n\r\n\r\n      const selected =\r\n        group.querySelector(\r\n          '[data-selected-value]'\r\n        );\r\n\r\n\r\n      if (\r\n        selected\r\n          ?.textContent\r\n          ?.trim()\r\n      ) {\r\n\r\n        return (\r\n          selected\r\n            .textContent\r\n            .trim()\r\n        );\r\n      }\r\n\r\n\r\n      return '';\r\n    };\r\n\r\n\r\n  const getOptionGroups =\r\n    productInfo => {\r\n\r\n      if (!productInfo) {\r\n        return [];\r\n      }\r\n\r\n\r\n      return Array.from(\r\n        productInfo.querySelectorAll(\r\n          `\r\n          variant-selects fieldset,\r\n\r\n          variant-selects\r\n          .product-form__input--dropdown,\r\n\r\n          variant-radios fieldset,\r\n\r\n          variant-radios\r\n          .product-form__input--dropdown\r\n          `\r\n        )\r\n      );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * CURRENT OPTIONS BY NAME\r\n   * ==========================================================\r\n   */\r\n\r\n  const getCurrentOptionMap =\r\n    productInfo => {\r\n\r\n      const map =\r\n        new Map();\r\n\r\n\r\n      getOptionGroups(\r\n        productInfo\r\n      )\r\n        .forEach(\r\n          group => {\r\n\r\n            const name =\r\n              normalise(\r\n                getOptionNameFromGroup(\r\n                  group\r\n                )\r\n              );\r\n\r\n\r\n            const value =\r\n              getGroupValue(\r\n                group\r\n              );\r\n\r\n\r\n            if (\r\n              name &&\r\n              value !== ''\r\n            ) {\r\n\r\n              map.set(\r\n                name,\r\n                value\r\n              );\r\n            }\r\n          }\r\n        );\r\n\r\n\r\n      return map;\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * ORDER OPTIONS ACCORDING TO SHOPIFY\r\n   * ==========================================================\r\n   */\r\n\r\n  const buildOrderedOptionValues =\r\n    (\r\n      product,\r\n      productInfo,\r\n      overrideName = '',\r\n      overrideValue = ''\r\n    ) => {\r\n\r\n      const definitions =\r\n        getProductOptionDefinitions(\r\n          product\r\n        )\r\n          .sort(\r\n            (\r\n              a,\r\n              b\r\n            ) =>\r\n              a.position -\r\n              b.position\r\n          );\r\n\r\n\r\n      const current =\r\n        getCurrentOptionMap(\r\n          productInfo\r\n        );\r\n\r\n\r\n      const overrideKey =\r\n        normalise(\r\n          overrideName\r\n        );\r\n\r\n\r\n      return definitions.map(\r\n        definition => {\r\n\r\n          const key =\r\n            normalise(\r\n              definition.name\r\n            );\r\n\r\n\r\n          if (\r\n            overrideKey &&\r\n            key ===\r\n              overrideKey\r\n          ) {\r\n\r\n            return (\r\n              overrideValue\r\n            );\r\n          }\r\n\r\n\r\n          return (\r\n            current.get(\r\n              key\r\n            ) ||\r\n            ''\r\n          );\r\n        }\r\n      );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * VARIANT OPTIONS\r\n   * ==========================================================\r\n   */\r\n\r\n  const getVariantOptions =\r\n    variant => {\r\n\r\n      if (\r\n        Array.isArray(\r\n          variant?.options\r\n        ) &&\r\n        variant.options.length\r\n      ) {\r\n\r\n        return (\r\n          variant.options\r\n        );\r\n      }\r\n\r\n\r\n      return [\r\n\r\n        variant?.option1,\r\n\r\n        variant?.option2,\r\n\r\n        variant?.option3\r\n\r\n      ].filter(\r\n        value =>\r\n          value !==\r\n            undefined &&\r\n          value !==\r\n            null\r\n      );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * EXACT VARIANT LOOKUP\r\n   * ==========================================================\r\n   */\r\n\r\n  const findVariantByOrderedValues =\r\n    (\r\n      product,\r\n      orderedValues\r\n    ) => {\r\n\r\n      if (\r\n        !product ||\r\n        !Array.isArray(\r\n          product.variants\r\n        )\r\n      ) {\r\n        return null;\r\n      }\r\n\r\n\r\n      if (\r\n        !orderedValues.length ||\r\n        orderedValues.some(\r\n          value =>\r\n            value === ''\r\n        )\r\n      ) {\r\n        return null;\r\n      }\r\n\r\n\r\n      return (\r\n        product.variants.find(\r\n          variant => {\r\n\r\n            const variantOptions =\r\n              getVariantOptions(\r\n                variant\r\n              );\r\n\r\n\r\n            if (\r\n              variantOptions.length !==\r\n              orderedValues.length\r\n            ) {\r\n\r\n              return false;\r\n            }\r\n\r\n\r\n            return (\r\n              variantOptions.every(\r\n                (\r\n                  value,\r\n                  index\r\n                ) =>\r\n\r\n                  normalise(\r\n                    value\r\n                  ) ===\r\n                  normalise(\r\n                    orderedValues[\r\n                      index\r\n                    ]\r\n                  )\r\n              )\r\n            );\r\n          }\r\n        ) ||\r\n        null\r\n      );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * CURRENT VARIANT ID\r\n   * ==========================================================\r\n   */\r\n\r\n  const getVariantFromUrl =\r\n    product => {\r\n\r\n      if (\r\n        !product ||\r\n        !Array.isArray(\r\n          product.variants\r\n        )\r\n      ) {\r\n        return null;\r\n      }\r\n\r\n\r\n      const params =\r\n        new URLSearchParams(\r\n          window.location.search\r\n        );\r\n\r\n\r\n      const variantId =\r\n        params.get(\r\n          'variant'\r\n        );\r\n\r\n\r\n      if (!variantId) {\r\n        return null;\r\n      }\r\n\r\n\r\n      return (\r\n        product.variants.find(\r\n          variant =>\r\n            String(\r\n              variant.id\r\n            ) ===\r\n            String(\r\n              variantId\r\n            )\r\n        ) ||\r\n        null\r\n      );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * CURRENT SELECTED VARIANT\r\n   * ==========================================================\r\n   */\r\n\r\n  const getCurrentVariant =\r\n    (\r\n      product,\r\n      productInfo\r\n    ) => {\r\n\r\n      /*\r\n       * First use Shopify's REAL\r\n       * selected variant ID.\r\n       */\r\n      const urlVariant =\r\n        getVariantFromUrl(\r\n          product\r\n        );\r\n\r\n\r\n      if (urlVariant) {\r\n\r\n        return urlVariant;\r\n      }\r\n\r\n\r\n      /*\r\n       * Fallback only.\r\n       */\r\n      const values =\r\n        buildOrderedOptionValues(\r\n          product,\r\n          productInfo\r\n        );\r\n\r\n\r\n      return (\r\n        findVariantByOrderedValues(\r\n          product,\r\n          values\r\n        )\r\n      );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * PROSPECTIVE VARIANT\r\n   * ==========================================================\r\n   *\r\n   * Used BEFORE Dawn changes the variant.\r\n   * ==========================================================\r\n   */\r\n\r\n  const getProspectiveVariant =\r\n    (\r\n      product,\r\n      productInfo,\r\n      group,\r\n      nextValue\r\n    ) => {\r\n\r\n      const optionName =\r\n        getOptionNameFromGroup(\r\n          group\r\n        );\r\n\r\n\r\n      if (!optionName) {\r\n\r\n        return null;\r\n      }\r\n\r\n\r\n      const values =\r\n        buildOrderedOptionValues(\r\n          product,\r\n          productInfo,\r\n          optionName,\r\n          nextValue\r\n        );\r\n\r\n\r\n      return (\r\n        findVariantByOrderedValues(\r\n          product,\r\n          values\r\n        )\r\n      );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * DISPLAY LABELS\r\n   * ==========================================================\r\n   */\r\n\r\n  const getSelectionLabels =\r\n    (\r\n      product,\r\n      productInfo,\r\n      group = null,\r\n      nextValue = ''\r\n    ) => {\r\n\r\n      const definitions =\r\n        getProductOptionDefinitions(\r\n          product\r\n        )\r\n          .sort(\r\n            (\r\n              a,\r\n              b\r\n            ) =>\r\n              a.position -\r\n              b.position\r\n          );\r\n\r\n\r\n      const current =\r\n        getCurrentOptionMap(\r\n          productInfo\r\n        );\r\n\r\n\r\n      const overrideName =\r\n        normalise(\r\n          group\r\n            ?\r\n            getOptionNameFromGroup(\r\n              group\r\n            )\r\n            :\r\n            ''\r\n        );\r\n\r\n\r\n      return definitions\r\n\r\n        .map(\r\n          definition => {\r\n\r\n            const key =\r\n              normalise(\r\n                definition.name\r\n              );\r\n\r\n\r\n            return {\r\n\r\n              name:\r\n                definition.name,\r\n\r\n              value:\r\n                (\r\n                  overrideName &&\r\n                  key ===\r\n                    overrideName\r\n                )\r\n                  ?\r\n                  nextValue\r\n\r\n                  :\r\n                  (\r\n                    current.get(\r\n                      key\r\n                    ) ||\r\n                    ''\r\n                  )\r\n            };\r\n          }\r\n        )\r\n\r\n        .filter(\r\n          option =>\r\n            option.value !== ''\r\n        );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * GALLERY\r\n   * ==========================================================\r\n   */\r\n\r\n  const getVisibleGallery =\r\n    productInfo =>\r\n\r\n      productInfo\r\n        ?.querySelector(\r\n          '.aa-colour-gallery'\r\n        )\r\n\r\n      ||\r\n\r\n      document.querySelector(\r\n        '.aa-colour-gallery'\r\n      )\r\n\r\n      ||\r\n\r\n      productInfo\r\n        ?.querySelector(\r\n          'media-gallery'\r\n        )\r\n\r\n      ||\r\n\r\n      document.querySelector(\r\n        'media-gallery'\r\n      );\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * OVERLAY\r\n   * ==========================================================\r\n   */\r\n\r\n  const removeDuplicateOverlays =\r\n    (\r\n      keep = null\r\n    ) => {\r\n\r\n      document\r\n        .querySelectorAll(\r\n          `#${OVERLAY_ID}`\r\n        )\r\n        .forEach(\r\n          overlay => {\r\n\r\n            if (\r\n              keep &&\r\n              overlay ===\r\n                keep\r\n            ) {\r\n              return;\r\n            }\r\n\r\n\r\n            overlay.remove();\r\n          }\r\n        );\r\n    };\r\n\r\n\r\n  const createOverlay =\r\n    gallery => {\r\n\r\n      if (!gallery) {\r\n        return null;\r\n      }\r\n\r\n\r\n      let overlay =\r\n        gallery.querySelector(\r\n          `#${OVERLAY_ID}`\r\n        );\r\n\r\n\r\n      if (overlay) {\r\n\r\n        removeDuplicateOverlays(\r\n          overlay\r\n        );\r\n\r\n        return overlay;\r\n      }\r\n\r\n\r\n      removeDuplicateOverlays();\r\n\r\n\r\n      overlay =\r\n        document.createElement(\r\n          'div'\r\n        );\r\n\r\n\r\n      overlay.id =\r\n        OVERLAY_ID;\r\n\r\n\r\n      overlay.setAttribute(\r\n        'aria-live',\r\n        'polite'\r\n      );\r\n\r\n\r\n      overlay.setAttribute(\r\n        'aria-hidden',\r\n        'true'\r\n      );\r\n\r\n\r\n      overlay.innerHTML = `\r\n\r\n        <div\r\n          class=\"aa-unavailable-card\"\r\n        >\r\n\r\n          <div\r\n            class=\"aa-unavailable-spiral\"\r\n            aria-hidden=\"true\"\r\n          >\r\n            \uD81A\uDDB9\r\n          </div>\r\n\r\n\r\n          <p\r\n            class=\"aa-unavailable-message\"\r\n          ></p>\r\n\r\n\r\n          <div\r\n            class=\"aa-unavailable-footer\"\r\n          >\r\n            Apparel Alchemists\r\n          </div>\r\n\r\n        </div>\r\n      `;\r\n\r\n\r\n      gallery.appendChild(\r\n        overlay\r\n      );\r\n\r\n\r\n      return overlay;\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * MESSAGE\r\n   * ==========================================================\r\n   */\r\n\r\n  const buildUnavailableMessage =\r\n    selectedOptions => {\r\n\r\n      const colour =\r\n        selectedOptions.find(\r\n          option =>\r\n            [\r\n              'color',\r\n              'colour'\r\n            ].includes(\r\n              normalise(\r\n                option.name\r\n              )\r\n            )\r\n        );\r\n\r\n\r\n      const size =\r\n        selectedOptions.find(\r\n          option =>\r\n            normalise(\r\n              option.name\r\n            ) ===\r\n            'size'\r\n        );\r\n\r\n\r\n      if (\r\n        colour &&\r\n        size\r\n      ) {\r\n\r\n        return `\r\n\r\n          <strong>\r\n            ${escapeHtml(\r\n              colour.value\r\n            )}\r\n          </strong>\r\n\r\n          is currently unavailable in\r\n\r\n          <strong>\r\n            ${escapeHtml(\r\n              size.value\r\n            )}\r\n          </strong>.\r\n\r\n          <br><br>\r\n\r\n          Please choose another size or colour\r\n\r\n          <br>\r\n\r\n          to continue your journey.\r\n        `;\r\n      }\r\n\r\n\r\n      if (size) {\r\n\r\n        return `\r\n\r\n          <strong>\r\n            ${escapeHtml(\r\n              size.value\r\n            )}\r\n          </strong>\r\n\r\n          is currently unavailable.\r\n\r\n          <br><br>\r\n\r\n          Please choose another size\r\n\r\n          <br>\r\n\r\n          to continue your journey.\r\n        `;\r\n      }\r\n\r\n\r\n      if (\r\n        selectedOptions.length\r\n      ) {\r\n\r\n        const combination =\r\n          selectedOptions\r\n\r\n            .map(\r\n              option =>\r\n                `<strong>${escapeHtml(\r\n                  option.value\r\n                )}</strong>`\r\n            )\r\n\r\n            .join(\r\n              ' / '\r\n            );\r\n\r\n\r\n        return `\r\n\r\n          ${combination}\r\n\r\n          is currently unavailable.\r\n\r\n          <br><br>\r\n\r\n          Please choose another option\r\n\r\n          <br>\r\n\r\n          to continue your journey.\r\n        `;\r\n      }\r\n\r\n\r\n      return `\r\n\r\n        This item is currently unavailable.\r\n\r\n        <br><br>\r\n\r\n        Please check back soon\r\n\r\n        <br>\r\n\r\n        to continue your journey.\r\n      `;\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * SHOW OVERLAY\r\n   * ==========================================================\r\n   */\r\n\r\n  const showOverlay =\r\n    (\r\n      productInfo,\r\n      selectedOptions\r\n    ) => {\r\n\r\n      const gallery =\r\n        getVisibleGallery(\r\n          productInfo\r\n        );\r\n\r\n\r\n      if (!gallery) {\r\n        return;\r\n      }\r\n\r\n\r\n      const overlay =\r\n        createOverlay(\r\n          gallery\r\n        );\r\n\r\n\r\n      if (!overlay) {\r\n        return;\r\n      }\r\n\r\n\r\n      const message =\r\n        overlay.querySelector(\r\n          '.aa-unavailable-message'\r\n        );\r\n\r\n\r\n      if (message) {\r\n\r\n        message.innerHTML =\r\n          buildUnavailableMessage(\r\n            selectedOptions\r\n          );\r\n      }\r\n\r\n\r\n      overlay.classList.add(\r\n        'is-visible'\r\n      );\r\n\r\n\r\n      overlay.setAttribute(\r\n        'aria-hidden',\r\n        'false'\r\n      );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * HIDE OVERLAY\r\n   * ==========================================================\r\n   */\r\n\r\n  const hideOverlay = () => {\r\n\r\n    document\r\n      .querySelectorAll(\r\n        `#${OVERLAY_ID}`\r\n      )\r\n      .forEach(\r\n        overlay => {\r\n\r\n          overlay.classList.remove(\r\n            'is-visible'\r\n          );\r\n\r\n\r\n          overlay.setAttribute(\r\n            'aria-hidden',\r\n            'true'\r\n          );\r\n        }\r\n      );\r\n  };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * BLOCKED SELECTION\r\n   * ==========================================================\r\n   */\r\n\r\n  const setBlockedSelection =\r\n    (\r\n      options,\r\n      variant = null\r\n    ) => {\r\n\r\n      blockedSelection = {\r\n\r\n        options:\r\n          options.map(\r\n            option => ({\r\n              name:\r\n                option.name,\r\n\r\n              value:\r\n                option.value\r\n            })\r\n          ),\r\n\r\n        variantId:\r\n          variant?.id ||\r\n          null\r\n      };\r\n    };\r\n\r\n\r\n  const clearBlockedSelection =\r\n    () => {\r\n\r\n      blockedSelection =\r\n        null;\r\n    };\r\n\r\n\r\n  const refreshBlockedOverlay =\r\n    () => {\r\n\r\n      if (\r\n        !blockedSelection\r\n      ) {\r\n        return false;\r\n      }\r\n\r\n\r\n      const productInfo =\r\n        getProductInfo();\r\n\r\n\r\n      if (!productInfo) {\r\n\r\n        return false;\r\n      }\r\n\r\n\r\n      showOverlay(\r\n        productInfo,\r\n        blockedSelection.options\r\n      );\r\n\r\n\r\n      return true;\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * EVALUATE CURRENT SHOPIFY VARIANT\r\n   * ==========================================================\r\n   */\r\n\r\n  const evaluateCurrentSelection =\r\n    async (\r\n      forceRefresh = false\r\n    ) => {\r\n\r\n      /*\r\n       * If a sold-out click was blocked,\r\n       * keep that message visible.\r\n       */\r\n      if (\r\n        blockedSelection\r\n      ) {\r\n\r\n        refreshBlockedOverlay();\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      const productInfo =\r\n        getProductInfo();\r\n\r\n\r\n      if (!productInfo) {\r\n\r\n        hideOverlay();\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      const product =\r\n        await loadProduct(\r\n          forceRefresh\r\n        );\r\n\r\n\r\n      if (!product) {\r\n\r\n        hideOverlay();\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      const variant =\r\n        getCurrentVariant(\r\n          product,\r\n          productInfo\r\n        );\r\n\r\n\r\n      /*\r\n       * CRITICAL SAFETY RULE:\r\n       *\r\n       * If we cannot identify the variant,\r\n       * DON'T call it sold out.\r\n       */\r\n      if (!variant) {\r\n\r\n        hideOverlay();\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      if (\r\n        variant.available ===\r\n          false\r\n      ) {\r\n\r\n        showOverlay(\r\n          productInfo,\r\n\r\n          getSelectionLabels(\r\n            product,\r\n            productInfo\r\n          )\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      /*\r\n       * Shopify says available.\r\n       */\r\n      hideOverlay();\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * RADIO / BUTTON HELPERS\r\n   * ==========================================================\r\n   */\r\n\r\n  const getRadioFromLabel =\r\n    label => {\r\n\r\n      if (\r\n        !label ||\r\n        label.tagName !==\r\n          'LABEL'\r\n      ) {\r\n\r\n        return null;\r\n      }\r\n\r\n\r\n      const forId =\r\n        label.getAttribute(\r\n          'for'\r\n        );\r\n\r\n\r\n      if (forId) {\r\n\r\n        const input =\r\n          document.getElementById(\r\n            forId\r\n          );\r\n\r\n\r\n        if (\r\n          input &&\r\n          input.matches(\r\n            'input[type=\"radio\"]'\r\n          )\r\n        ) {\r\n\r\n          return input;\r\n        }\r\n      }\r\n\r\n\r\n      return (\r\n        label.querySelector(\r\n          'input[type=\"radio\"]'\r\n        )\r\n      );\r\n    };\r\n\r\n\r\n  const getClickedRadio =\r\n    target => {\r\n\r\n      if (\r\n        !(\r\n          target instanceof\r\n          Element\r\n        )\r\n      ) {\r\n\r\n        return null;\r\n      }\r\n\r\n\r\n      if (\r\n        target.matches(\r\n          'input[type=\"radio\"]'\r\n        )\r\n      ) {\r\n\r\n        return target;\r\n      }\r\n\r\n\r\n      const label =\r\n        target.closest(\r\n          'label'\r\n        );\r\n\r\n\r\n      if (label) {\r\n\r\n        return (\r\n          getRadioFromLabel(\r\n            label\r\n          )\r\n        );\r\n      }\r\n\r\n\r\n      return null;\r\n    };\r\n\r\n\r\n  const getGroupForControl =\r\n    control =>\r\n\r\n      control?.closest?.(\r\n        `\r\n        fieldset,\r\n        .product-form__input--dropdown\r\n        `\r\n      ) ||\r\n      null;\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * RADIO / PILL INTERCEPTION\r\n   * ==========================================================\r\n   *\r\n   * Synchronous.\r\n   *\r\n   * If Shopify says available:\r\n   * let Dawn continue.\r\n   *\r\n   * If Shopify says unavailable:\r\n   * stop Dawn before variant/media change.\r\n   * ==========================================================\r\n   */\r\n\r\n  const interceptVariantClick =\r\n    event => {\r\n\r\n      const target =\r\n        event.target;\r\n\r\n\r\n      if (\r\n        !(\r\n          target instanceof\r\n          Element\r\n        ) ||\r\n        !isInsideVariantPicker(\r\n          target\r\n        )\r\n      ) {\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      const radio =\r\n        getClickedRadio(\r\n          target\r\n        );\r\n\r\n\r\n      if (!radio) {\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      const group =\r\n        getGroupForControl(\r\n          radio\r\n        );\r\n\r\n\r\n      const productInfo =\r\n        getProductInfo();\r\n\r\n\r\n      const product =\r\n        productData;\r\n\r\n\r\n      if (\r\n        !group ||\r\n        !productInfo ||\r\n        !product\r\n      ) {\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      const prospectiveVariant =\r\n        getProspectiveVariant(\r\n\r\n          product,\r\n\r\n          productInfo,\r\n\r\n          group,\r\n\r\n          radio.value || ''\r\n        );\r\n\r\n\r\n      /*\r\n       * VERY IMPORTANT:\r\n       *\r\n       * If variant matching fails,\r\n       * FAIL OPEN.\r\n       *\r\n       * Do not falsely tell customers\r\n       * that something is sold out.\r\n       */\r\n      if (\r\n        !prospectiveVariant\r\n      ) {\r\n\r\n        clearBlockedSelection();\r\n\r\n        hideOverlay();\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      /*\r\n       * AVAILABLE\r\n       */\r\n      if (\r\n        prospectiveVariant\r\n          .available !==\r\n        false\r\n      ) {\r\n\r\n        clearBlockedSelection();\r\n\r\n        hideOverlay();\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      /*\r\n       * UNAVAILABLE\r\n       */\r\n      event.preventDefault();\r\n\r\n      event.stopPropagation();\r\n\r\n      event.stopImmediatePropagation();\r\n\r\n\r\n      const labels =\r\n        getSelectionLabels(\r\n\r\n          product,\r\n\r\n          productInfo,\r\n\r\n          group,\r\n\r\n          radio.value || ''\r\n        );\r\n\r\n\r\n      setBlockedSelection(\r\n\r\n        labels,\r\n\r\n        prospectiveVariant\r\n      );\r\n\r\n\r\n      showOverlay(\r\n\r\n        productInfo,\r\n\r\n        labels\r\n      );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * DROPDOWN VALUE MEMORY\r\n   * ==========================================================\r\n   */\r\n\r\n  const rememberSelectValue =\r\n    event => {\r\n\r\n      const target =\r\n        event.target;\r\n\r\n\r\n      if (\r\n        target instanceof\r\n          HTMLSelectElement &&\r\n        isInsideVariantPicker(\r\n          target\r\n        )\r\n      ) {\r\n\r\n        previousSelectValues.set(\r\n\r\n          target,\r\n\r\n          target.value\r\n        );\r\n      }\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * DROPDOWN INTERCEPTION\r\n   * ==========================================================\r\n   */\r\n\r\n  const interceptSelectChange =\r\n    event => {\r\n\r\n      const select =\r\n        event.target;\r\n\r\n\r\n      if (\r\n        !(\r\n          select instanceof\r\n          HTMLSelectElement\r\n        ) ||\r\n        !isInsideVariantPicker(\r\n          select\r\n        )\r\n      ) {\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      const group =\r\n        getGroupForControl(\r\n          select\r\n        );\r\n\r\n\r\n      const productInfo =\r\n        getProductInfo();\r\n\r\n\r\n      const product =\r\n        productData;\r\n\r\n\r\n      if (\r\n        !group ||\r\n        !productInfo ||\r\n        !product\r\n      ) {\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      const attemptedValue =\r\n        select.value;\r\n\r\n\r\n      const prospectiveVariant =\r\n        getProspectiveVariant(\r\n\r\n          product,\r\n\r\n          productInfo,\r\n\r\n          group,\r\n\r\n          attemptedValue\r\n        );\r\n\r\n\r\n      /*\r\n       * Couldn't identify variant?\r\n       * Allow it.\r\n       */\r\n      if (\r\n        !prospectiveVariant\r\n      ) {\r\n\r\n        clearBlockedSelection();\r\n\r\n        hideOverlay();\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      /*\r\n       * AVAILABLE\r\n       */\r\n      if (\r\n        prospectiveVariant\r\n          .available !==\r\n        false\r\n      ) {\r\n\r\n        previousSelectValues.set(\r\n\r\n          select,\r\n\r\n          select.value\r\n        );\r\n\r\n\r\n        clearBlockedSelection();\r\n\r\n        hideOverlay();\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      /*\r\n       * UNAVAILABLE\r\n       */\r\n      const previousValue =\r\n        previousSelectValues.get(\r\n          select\r\n        );\r\n\r\n\r\n      event.preventDefault();\r\n\r\n      event.stopPropagation();\r\n\r\n      event.stopImmediatePropagation();\r\n\r\n\r\n      if (\r\n        previousValue !==\r\n          undefined\r\n      ) {\r\n\r\n        select.value =\r\n          previousValue;\r\n      }\r\n\r\n\r\n      const labels =\r\n        getSelectionLabels(\r\n\r\n          product,\r\n\r\n          productInfo,\r\n\r\n          group,\r\n\r\n          attemptedValue\r\n        );\r\n\r\n\r\n      setBlockedSelection(\r\n\r\n        labels,\r\n\r\n        prospectiveVariant\r\n      );\r\n\r\n\r\n      showOverlay(\r\n\r\n        productInfo,\r\n\r\n        labels\r\n      );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * BACKGROUND STOCK REFRESH\r\n   * ==========================================================\r\n   */\r\n\r\n  const refreshProductData =\r\n    () => {\r\n\r\n      loadProduct(\r\n        true\r\n      )\r\n\r\n        .then(\r\n          product => {\r\n\r\n            if (\r\n              !product ||\r\n              !blockedSelection\r\n            ) {\r\n\r\n              return;\r\n            }\r\n\r\n\r\n            /*\r\n             * Recheck EXACT variant ID.\r\n             */\r\n            const variant =\r\n              blockedSelection\r\n                .variantId\r\n\r\n                ?\r\n\r\n                product\r\n                  .variants\r\n                  ?.find(\r\n                    item =>\r\n                      String(\r\n                        item.id\r\n                      ) ===\r\n                      String(\r\n                        blockedSelection\r\n                          .variantId\r\n                      )\r\n                  )\r\n\r\n                :\r\n\r\n                null;\r\n\r\n\r\n            /*\r\n             * If stock came back,\r\n             * remove stale warning.\r\n             */\r\n            if (\r\n              variant &&\r\n              variant.available !==\r\n                false\r\n            ) {\r\n\r\n              clearBlockedSelection();\r\n\r\n              hideOverlay();\r\n            }\r\n          }\r\n        )\r\n\r\n        .catch(\r\n          () => {}\r\n        );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * SCHEDULING\r\n   * ==========================================================\r\n   */\r\n\r\n  const scheduleEvaluation =\r\n    (\r\n      delay =\r\n        100\r\n    ) => {\r\n\r\n      clearTimeout(\r\n        evaluationTimer\r\n      );\r\n\r\n\r\n      evaluationTimer =\r\n        window.setTimeout(\r\n          () => {\r\n\r\n            evaluateCurrentSelection(\r\n              false\r\n            );\r\n          },\r\n          delay\r\n        );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * INITIALISE\r\n   * ==========================================================\r\n   */\r\n\r\n  const initialise =\r\n    async () => {\r\n\r\n      injectStyles();\r\n\r\n\r\n      /*\r\n       * Load Shopify product information\r\n       * BEFORE click interception.\r\n       */\r\n      await loadProduct(\r\n        true\r\n      );\r\n\r\n\r\n      /*\r\n       * Remember initial dropdown values.\r\n       */\r\n      document\r\n\r\n        .querySelectorAll(\r\n          `\r\n          variant-selects select,\r\n          variant-radios select\r\n          `\r\n        )\r\n\r\n        .forEach(\r\n          select => {\r\n\r\n            previousSelectValues.set(\r\n\r\n              select,\r\n\r\n              select.value\r\n            );\r\n          }\r\n        );\r\n\r\n\r\n      /*\r\n       * SOLD-OUT RADIO / PILL\r\n       */\r\n      document.addEventListener(\r\n\r\n        'click',\r\n\r\n        interceptVariantClick,\r\n\r\n        true\r\n      );\r\n\r\n\r\n      /*\r\n       * DROPDOWN MEMORY\r\n       */\r\n      document.addEventListener(\r\n\r\n        'pointerdown',\r\n\r\n        rememberSelectValue,\r\n\r\n        true\r\n      );\r\n\r\n\r\n      document.addEventListener(\r\n\r\n        'focusin',\r\n\r\n        rememberSelectValue,\r\n\r\n        true\r\n      );\r\n\r\n\r\n      /*\r\n       * DROPDOWN SOLD-OUT\r\n       */\r\n      document.addEventListener(\r\n\r\n        'change',\r\n\r\n        interceptSelectChange,\r\n\r\n        true\r\n      );\r\n\r\n\r\n      /*\r\n       * NORMAL VARIANT CHANGE\r\n       *\r\n       * Only selections that weren't\r\n       * blocked get this far.\r\n       */\r\n      document.addEventListener(\r\n\r\n        'change',\r\n\r\n        event => {\r\n\r\n          if (\r\n            event.target instanceof\r\n              Element &&\r\n            isInsideVariantPicker(\r\n              event.target\r\n            )\r\n          ) {\r\n\r\n            clearBlockedSelection();\r\n\r\n\r\n            /*\r\n             * Give Dawn time to update\r\n             * Shopify variant URL/state.\r\n             */\r\n            window.setTimeout(\r\n              () => {\r\n\r\n                evaluateCurrentSelection(\r\n                  false\r\n                );\r\n              },\r\n              120\r\n            );\r\n\r\n\r\n            window.setTimeout(\r\n              () => {\r\n\r\n                evaluateCurrentSelection(\r\n                  false\r\n                );\r\n              },\r\n              350\r\n            );\r\n          }\r\n        }\r\n      );\r\n\r\n\r\n      /*\r\n       * DAWN VARIANT EVENT\r\n       */\r\n      document.addEventListener(\r\n\r\n        'variant:change',\r\n\r\n        () => {\r\n\r\n          if (\r\n            blockedSelection\r\n          ) {\r\n\r\n            refreshBlockedOverlay();\r\n\r\n            return;\r\n          }\r\n\r\n\r\n          scheduleEvaluation(\r\n            100\r\n          );\r\n        }\r\n      );\r\n\r\n\r\n      /*\r\n       * BROWSER BACK / FORWARD\r\n       */\r\n      window.addEventListener(\r\n\r\n        'popstate',\r\n\r\n        () => {\r\n\r\n          clearBlockedSelection();\r\n\r\n          hideOverlay();\r\n\r\n\r\n          window.setTimeout(\r\n            () => {\r\n\r\n              evaluateCurrentSelection(\r\n                true\r\n              );\r\n            },\r\n            120\r\n          );\r\n        }\r\n      );\r\n\r\n\r\n      /*\r\n       * ========================================================\r\n       * AA COLOUR GALLERY REBUILD\r\n       * ========================================================\r\n       */\r\n\r\n      const observer =\r\n        new MutationObserver(\r\n          mutations => {\r\n\r\n            const galleryAdded =\r\n              mutations.some(\r\n                mutation =>\r\n\r\n                  Array.from(\r\n                    mutation.addedNodes\r\n                  )\r\n\r\n                    .some(\r\n                      node => {\r\n\r\n                        if (\r\n                          !(\r\n                            node instanceof\r\n                            Element\r\n                          )\r\n                        ) {\r\n\r\n                          return false;\r\n                        }\r\n\r\n\r\n                        return (\r\n\r\n                          node.matches?.(\r\n                            '.aa-colour-gallery'\r\n                          )\r\n\r\n                          ||\r\n\r\n                          node.querySelector?.(\r\n                            '.aa-colour-gallery'\r\n                          )\r\n\r\n                          ||\r\n\r\n                          node.matches?.(\r\n                            'media-gallery'\r\n                          )\r\n\r\n                          ||\r\n\r\n                          node.querySelector?.(\r\n                            'media-gallery'\r\n                          )\r\n                        );\r\n                      }\r\n                    )\r\n              );\r\n\r\n\r\n            if (\r\n              !galleryAdded\r\n            ) {\r\n\r\n              return;\r\n            }\r\n\r\n\r\n            /*\r\n             * A sold-out warning exists.\r\n             * Reattach it to rebuilt gallery.\r\n             */\r\n            if (\r\n              blockedSelection\r\n            ) {\r\n\r\n              window.setTimeout(\r\n\r\n                refreshBlockedOverlay,\r\n\r\n                30\r\n              );\r\n\r\n\r\n              window.setTimeout(\r\n\r\n                refreshBlockedOverlay,\r\n\r\n                120\r\n              );\r\n\r\n\r\n              return;\r\n            }\r\n\r\n\r\n            scheduleEvaluation(\r\n              120\r\n            );\r\n          }\r\n        );\r\n\r\n\r\n      observer.observe(\r\n\r\n        document.body,\r\n\r\n        {\r\n          childList:\r\n            true,\r\n\r\n          subtree:\r\n            true\r\n        }\r\n      );\r\n\r\n\r\n      /*\r\n       * Refresh Shopify stock every 30 sec.\r\n       */\r\n      window.setInterval(\r\n\r\n        refreshProductData,\r\n\r\n        30000\r\n      );\r\n\r\n\r\n      /*\r\n       * Initial availability check.\r\n       */\r\n      await evaluateCurrentSelection(\r\n        false\r\n      );\r\n    };\r\n\r\n\r\n  /*\r\n   * ==========================================================\r\n   * START\r\n   * ==========================================================\r\n   */\r\n\r\n  if (\r\n    document.readyState ===\r\n      'loading'\r\n  ) {\r\n\r\n    document.addEventListener(\r\n\r\n      'DOMContentLoaded',\r\n\r\n      initialise\r\n    );\r\n\r\n  } else {\r\n\r\n    initialise();\r\n  }\r\n\r\n})();"],
  "mappings": "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",
  "names": []
}
