{
  "version": 3,
  "sources": ["/cdn/shop/t/2/assets/theme.js?view=modal"],
  "sourcesContent": ["/*\nImpulse by Archetype Themes (https://archetypethemes.co)\n  Access unminified JS in assets/theme.js\n\n  Use this event listener to run your own JS outside of this file.\n  Documentation - https://archetypethemes.co/blogs/impulse/javascript-events-for-developers\n\n  document.addEventListener('page:loaded', function() {\n    // Page has loaded and theme assets are ready\n  });\n*/\n\nwindow.theme = window.theme || {};\n\n// Medium breakpoint is also set in theme.css.liquid and inline throughout some templates. Do not change values unless you know what you're doing.\ntheme.bp = {};\ntheme.bp.smallUp = 769;\ntheme.bp.small = theme.bp.smallUp - 1;\n\ntheme.config = {\n  bpSmall: false,\n  hasSessionStorage: true,\n  hasLocalStorage: true,\n  mediaQuerySmall: 'screen and (max-width: '+ theme.bp.small +'px)',\n  mediaQuerySmallUp: 'screen and (min-width: '+ theme.bp.smallUp +'px)',\n  youTubeReady: false,\n  vimeoReady: false,\n  vimeoLoading: false,\n  isTouch: ('ontouchstart' in window) || window.DocumentTouch && window.document instanceof DocumentTouch || window.navigator.maxTouchPoints || window.navigator.msMaxTouchPoints ? true : false,\n  isIpad: /ipad/.test(window.navigator.userAgent.toLowerCase()) || (window.navigator.platform === 'MacIntel' && window.navigator.maxTouchPoints > 1),\n  stickyHeader: false,\n  recentlyViewed: [],\n  rtl: document.documentElement.getAttribute('dir') == 'rtl' ? true : false\n};\n\ntheme.recentlyViewed = {\n  recent: {}, // will store handle+url of recent products\n  productInfo: {} // will store product data to reduce API calls\n};\n\nif (theme.config.isIpad) {\n  document.documentElement.className += ' js-ipad';\n}\n\nif (console && console.log) {\n  console.log('Impulse theme ('+theme.settings.themeVersion+') by ARCH\u039ETYPE | Learn more at https://archetypethemes.co');\n}\n\nwindow.lazySizesConfig = window.lazySizesConfig || {};\nlazySizesConfig.expFactor = 4;\n\n(function($){\n  var $ = jQuery = $;\n\n  theme.utils = {\n    /**\n     * _.defaultTo from lodash\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     * Source: https://github.com/lodash/lodash/blob/master/defaultTo.js\n     *\n     * @param {*} value - Value to check\n     * @param {*} defaultValue - Default value\n     * @returns {*} - Returns the resolved value\n     */\n    defaultTo: function(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value\n    }\n  };\n  \n  theme.a11y = {\n  \n    /**\n     * Traps the focus in a particular container\n     *\n     * @param {object} options - Options to be used\n     * @param {jQuery} options.$container - Container to trap focus within\n     * @param {jQuery} options.$elementToFocus - Element to be focused when focus leaves container\n     * @param {string} options.namespace - Namespace used for new focus event handler\n     */\n    trapFocus: function(options) {\n      var eventsName = {\n        focusin: options.namespace ? 'focusin.' + options.namespace : 'focusin',\n        focusout: options.namespace\n          ? 'focusout.' + options.namespace\n          : 'focusout',\n        keydown: options.namespace\n          ? 'keydown.' + options.namespace\n          : 'keydown.handleFocus'\n      };\n  \n      /**\n       * Get every possible visible focusable element\n       */\n      var $focusableElements = options.$container.find(\n        $(\n          'button, [href], input, select, textarea, [tabindex]:not([tabindex^=\"-\"])'\n        ).filter(':visible')\n      );\n      var firstFocusable = $focusableElements[0];\n      var lastFocusable = $focusableElements[$focusableElements.length - 1];\n  \n      if (!options.$elementToFocus) {\n        options.$elementToFocus = options.$container;\n      }\n  \n      function _manageFocus(evt) {\n        // Tab key\n        if (evt.keyCode !== 9) return;\n  \n        /**\n         * On the last focusable element and tab forward,\n         * focus the first element.\n         */\n        if (evt.target === lastFocusable && !evt.shiftKey) {\n          evt.preventDefault();\n          firstFocusable.focus();\n        }\n        /**\n         * On the first focusable element and tab backward,\n         * focus the last element.\n         */\n        if (evt.target === firstFocusable && evt.shiftKey) {\n          evt.preventDefault();\n          lastFocusable.focus();\n        }\n      }\n  \n      options.$container.attr('tabindex', '-1');\n      options.$elementToFocus.focus();\n  \n      $(document).off('focusin');\n  \n      $(document).on(eventsName.focusout, function() {\n        $(document).off(eventsName.keydown);\n      });\n  \n      $(document).on(eventsName.focusin, function(evt) {\n        if (evt.target !== lastFocusable && evt.target !== firstFocusable) return;\n  \n        $(document).on(eventsName.keydown, function(evt) {\n          _manageFocus(evt);\n        });\n      });\n    },\n  \n    /**\n     * Removes the trap of focus in a particular container\n     *\n     * @param {object} options - Options to be used\n     * @param {jQuery} options.$container - Container to trap focus within\n     * @param {string} options.namespace - Namespace used for new focus event handler\n     */\n    removeTrapFocus: function(options) {\n      var eventName = options.namespace\n        ? 'focusin.' + options.namespace\n        : 'focusin';\n  \n      if (options.$container && options.$container.length) {\n        options.$container.removeAttr('tabindex');\n      }\n  \n      $(document).off(eventName);\n    },\n  \n    lockMobileScrolling: function(namespace, $element) {\n      if ($element) {\n        var $el = $element;\n      } else {\n        var $el = $(document.documentElement).add('body');\n      }\n      $el.on('touchmove' + namespace, function () {\n        return false;\n      });\n    },\n  \n    unlockMobileScrolling: function(namespace, $element) {\n      if ($element) {\n        var $el = $element;\n      } else {\n        var $el = $(document.documentElement).add('body');\n      }\n      $el.off(namespace);\n    }\n  };\n  \n  theme.Sections = function Sections() {\n    this.constructors = {};\n    this.instances = [];\n  \n    $(document)\n      .on('shopify:section:load', this._onSectionLoad.bind(this))\n      .on('shopify:section:unload', this._onSectionUnload.bind(this))\n      .on('shopify:section:select', this._onSelect.bind(this))\n      .on('shopify:section:deselect', this._onDeselect.bind(this))\n      .on('shopify:block:select', this._onBlockSelect.bind(this))\n      .on('shopify:block:deselect', this._onBlockDeselect.bind(this));\n  };\n  \n  theme.Sections.prototype = $.extend({}, theme.Sections.prototype, {\n    createInstance: function(container, constructor, customScope) {\n      var $container = $(container);\n      var id = $container.attr('data-section-id');\n      var type = $container.attr('data-section-type');\n  \n      constructor = constructor || this.constructors[type];\n  \n      if (typeof constructor === 'undefined') {\n        return;\n      }\n  \n      // If custom scope passed, check to see if instance\n      // is already initialized so we don't double up\n      if (customScope) {\n        var instanceExists = this._findInstance(id);\n        if (instanceExists) {\n          return;\n        }\n      }\n  \n      var instance = $.extend(new constructor(container), {\n        id: id,\n        type: type,\n        container: container\n      });\n  \n      this.instances.push(instance);\n    },\n  \n    _onSectionLoad: function(evt, subSection, subSectionId) {\n      if (AOS) {\n        AOS.refreshHard();\n      }\n      var container = subSection ? subSection : $('[data-section-id]', evt.target)[0];\n  \n      if (!container) {\n        return;\n      }\n  \n      this.createInstance(container);\n  \n      var instance = subSection ? subSectionId : this._findInstance(evt.detail.sectionId);\n  \n      if (!subSection) {\n        this._loadSubSections();\n      }\n  \n      // Run JS only in case of the section being selected in the editor\n      // before merchant clicks \"Add\"\n      if (instance && typeof instance.onLoad === 'function') {\n        instance.onLoad(evt);\n      }\n    },\n  \n    _loadSubSections: function() {\n      if (AOS) {\n        AOS.refreshHard();\n      }\n      $('[data-subsection]').each(function(evt, el) {\n        this._onSectionLoad(null, el, $(el).data('section-id'));\n      }.bind(this));\n    },\n  \n    _onSectionUnload: function(evt) {\n      var instance = this._removeInstance(evt.detail.sectionId);\n      if (instance && typeof instance.onUnload === 'function') {\n        instance.onUnload(evt);\n      }\n    },\n  \n    _onSelect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (instance && typeof instance.onSelect === 'function') {\n        instance.onSelect(evt);\n      }\n    },\n  \n    _onDeselect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (instance && typeof instance.onDeselect === 'function') {\n        instance.onDeselect(evt);\n      }\n    },\n  \n    _onBlockSelect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (instance && typeof instance.onBlockSelect === 'function') {\n        instance.onBlockSelect(evt);\n      }\n    },\n  \n    _onBlockDeselect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (instance && typeof instance.onBlockDeselect === 'function') {\n        instance.onBlockDeselect(evt);\n      }\n    },\n  \n    _findInstance: function(id) {\n      for (var i = 0; i < this.instances.length; i++) {\n        if (this.instances[i].id === id) {\n          return this.instances[i];\n        }\n      }\n    },\n  \n    _removeInstance: function(id) {\n      var i = this.instances.length;\n      var instance;\n  \n      while(i--) {\n        if (this.instances[i].id === id) {\n          instance = this.instances[i];\n          this.instances.splice(i, 1);\n          break;\n        }\n      }\n  \n      return instance;\n    },\n  \n    register: function(type, constructor, $scope) {\n      var afterLoad = false;\n      this.constructors[type] = constructor;\n      var $sections = $('[data-section-type=' + type + ']');\n  \n      if ($scope) {\n        $sections = $('[data-section-type=' + type + ']', $scope);\n      }\n  \n      $sections.each(function(index, container) {\n        this.createInstance(container, constructor, $scope);\n      }.bind(this));\n    }\n  });\n  \n  \n  /**\n   * Currency Helpers\n   * -----------------------------------------------------------------------------\n   * A collection of useful functions that help with currency formatting\n   *\n   * Current contents\n   * - formatMoney - Takes an amount in cents and returns it as a formatted dollar value.\n   *\n   * Alternatives\n   * - Accounting.js - http://openexchangerates.github.io/accounting.js/\n   *\n   */\n  \n  theme.Currency = (function() {\n    var moneyFormat = '${{amount}}';\n  \n    function formatMoney(cents, format) {\n      if (!format) {\n        format = theme.settings.moneyFormat;\n      }\n      if (typeof cents === 'string') {\n        cents = cents.replace('.', '');\n      }\n      var value = '';\n      var placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/;\n      var formatString = (format || moneyFormat);\n  \n      function formatWithDelimiters(number, precision, thousands, decimal) {\n        precision = theme.utils.defaultTo(precision, 2);\n        thousands = theme.utils.defaultTo(thousands, ',');\n        decimal = theme.utils.defaultTo(decimal, '.');\n  \n        if (isNaN(number) || number == null) {\n          return 0;\n        }\n  \n        number = (number / 100.0).toFixed(precision);\n  \n        var parts = number.split('.');\n        var dollarsAmount = parts[0].replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, '$1' + thousands);\n        var centsAmount = parts[1] ? (decimal + parts[1]) : '';\n  \n        return dollarsAmount + centsAmount;\n      }\n  \n      switch (formatString.match(placeholderRegex)[1]) {\n        case 'amount':\n          value = formatWithDelimiters(cents, 2);\n          break;\n        case 'amount_no_decimals':\n          value = formatWithDelimiters(cents, 0);\n          break;\n        case 'amount_with_comma_separator':\n          value = formatWithDelimiters(cents, 2, '.', ',');\n          break;\n        case 'amount_no_decimals_with_comma_separator':\n          value = formatWithDelimiters(cents, 0, '.', ',');\n          break;\n        case 'amount_no_decimals_with_space_separator':\n          value = formatWithDelimiters(cents, 0, ' ');\n          break;\n      }\n  \n      return formatString.replace(placeholderRegex, value);\n    }\n  \n    function getBaseUnit(variant) {\n      if (!variant) {\n        return;\n      }\n  \n      if (!variant.unit_price_measurement || !variant.unit_price_measurement.reference_value) {\n        return;\n      }\n  \n      return variant.unit_price_measurement.reference_value === 1\n        ? variant.unit_price_measurement.reference_unit\n        : variant.unit_price_measurement.reference_value +\n            variant.unit_price_measurement.reference_unit;\n    }\n  \n    return {\n      formatMoney: formatMoney,\n      getBaseUnit: getBaseUnit\n    }\n  })();\n  \n  \n  /**\n   * Image Helper Functions\n   * -----------------------------------------------------------------------------\n   * A collection of functions that help with basic image operations.\n   *\n   */\n  \n  theme.Images = (function() {\n  \n    /**\n     * Find the Shopify image attribute size\n     *\n     * @param {string} src\n     * @returns {null}\n     */\n    function imageSize(src) {\n      if (!src) {\n        return '620x'; // default based on theme\n      }\n  \n      var match = src.match(/.+_((?:pico|icon|thumb|small|compact|medium|large|grande)|\\d{1,4}x\\d{0,4}|x\\d{1,4})[_\\.@]/);\n  \n      if (match !== null) {\n        return match[1];\n      } else {\n        return null;\n      }\n    }\n  \n    /**\n     * Adds a Shopify size attribute to a URL\n     *\n     * @param src\n     * @param size\n     * @returns {*}\n     */\n    function getSizedImageUrl(src, size) {\n      if (!src) {\n        return src;\n      }\n  \n      if (size == null) {\n        return src;\n      }\n  \n      if (size === 'master') {\n        return this.removeProtocol(src);\n      }\n  \n      var match = src.match(/\\.(jpg|jpeg|gif|png|bmp|bitmap|tiff|tif)(\\?v=\\d+)?$/i);\n  \n      if (match != null) {\n        var prefix = src.split(match[0]);\n        var suffix = match[0];\n  \n        return this.removeProtocol(prefix[0] + '_' + size + suffix);\n      }\n  \n      return null;\n    }\n  \n    function removeProtocol(path) {\n      return path.replace(/http(s)?:/, '');\n    }\n  \n    /**\n     * Create lazyloading-friendly image string\n     *\n     * @param string\n     * @returns string with _{width}x as size param\n     */\n    function lazyloadImagePath(string) {\n      var image;\n  \n      if (string !== null) {\n        image = string.replace(/(\\.[^.]*)$/, \"_{width}x$1\");\n      }\n  \n      return image;\n    }\n  \n    return {\n      imageSize: imageSize,\n      getSizedImageUrl: getSizedImageUrl,\n      removeProtocol: removeProtocol,\n      lazyloadImagePath: lazyloadImagePath\n    };\n  })();\n  \n  theme.Variants = (function() {\n  \n    function Variants(options) {\n      this.$container = options.$container;\n      this.variants = options.variants;\n      this.singleOptionSelector = options.singleOptionSelector;\n      this.originalSelectorId = options.originalSelectorId;\n      this.enableHistoryState = options.enableHistoryState;\n      this.currentVariant = this._getVariantFromOptions();\n  \n      $(this.singleOptionSelector, this.$container).on('change', this._onSelectChange.bind(this));\n    }\n  \n    Variants.prototype = $.extend({}, Variants.prototype, {\n  \n      _getCurrentOptions: function() {\n        var currentOptions = $.map($(this.singleOptionSelector, this.$container), function(element) {\n          var $element = $(element);\n          var type = $element.attr('type');\n          var currentOption = {};\n  \n          if (type === 'radio' || type === 'checkbox') {\n            if ($element[0].checked) {\n              currentOption.value = $element.val();\n              currentOption.index = $element.data('index');\n  \n              return currentOption;\n            } else {\n              return false;\n            }\n          } else {\n            currentOption.value = $element.val();\n            currentOption.index = $element.data('index');\n  \n            return currentOption;\n          }\n        });\n  \n        // remove any unchecked input values if using radio buttons or checkboxes\n        currentOptions = this._compact(currentOptions);\n  \n        return currentOptions;\n      },\n  \n      _getVariantFromOptions: function() {\n        var selectedValues = this._getCurrentOptions();\n        var variants = this.variants;\n        var found = false;\n  \n        variants.forEach(function(variant) {\n          var match = true;\n          var options = variant.options;\n  \n          selectedValues.forEach(function(option) {\n            if (match) {\n              match = (variant[option.index] === option.value);\n            }\n          });\n  \n          if (match) {\n            found = variant;\n          }\n        });\n  \n        return found || null;\n      },\n  \n      _onSelectChange: function() {\n        var variant = this._getVariantFromOptions();\n  \n        this.$container.trigger({\n          type: 'variantChange',\n          variant: variant\n        });\n  \n        document.dispatchEvent(new CustomEvent('variant:change', {\n          detail: {\n            variant: variant\n          }\n        }));\n  \n        if (!variant) {\n          return;\n        }\n  \n        this._updateMasterSelect(variant);\n        this._updateImages(variant);\n        this._updatePrice(variant);\n        this._updateUnitPrice(variant);\n        this._updateSKU(variant);\n        this.currentVariant = variant;\n  \n        if (this.enableHistoryState) {\n          this._updateHistoryState(variant);\n        }\n      },\n  \n      _updateImages: function(variant) {\n        var variantImage = variant.featured_image || {};\n        var currentVariantImage = this.currentVariant.featured_image || {};\n  \n        if (!variant.featured_image || variantImage.src === currentVariantImage.src) {\n          return;\n        }\n  \n        this.$container.trigger({\n          type: 'variantImageChange',\n          variant: variant\n        });\n      },\n  \n      _updatePrice: function(variant) {\n        if (variant.price === this.currentVariant.price && variant.compare_at_price === this.currentVariant.compare_at_price) {\n          return;\n        }\n  \n        this.$container.trigger({\n          type: 'variantPriceChange',\n          variant: variant\n        });\n      },\n  \n      _updateUnitPrice: function(variant) {\n        if (variant.unit_price === this.currentVariant.unit_price) {\n          return;\n        }\n  \n        this.$container.trigger({\n          type: 'variantUnitPriceChange',\n          variant: variant\n        });\n      },\n  \n      _updateSKU: function(variant) {\n        if (variant.sku === this.currentVariant.sku) {\n          return;\n        }\n  \n        this.$container.trigger({\n          type: 'variantSKUChange',\n          variant: variant\n        });\n      },\n  \n      _updateHistoryState: function(variant) {\n        if (!history.replaceState || !variant) {\n          return;\n        }\n  \n        var newurl = window.location.protocol + '//' + window.location.host + window.location.pathname + '?variant=' + variant.id;\n        window.history.replaceState({path: newurl}, '', newurl);\n      },\n  \n      _updateMasterSelect: function(variant) {\n        $(this.originalSelectorId, this.$container).val(variant.id);\n      },\n  \n      // _.compact from lodash\n      // https://github.com/lodash/lodash/blob/4d4e452ade1e78c7eb890968d851f837be37e429/compact.js\n      _compact: function(array) {\n        var index = -1,\n            length = array == null ? 0 : array.length,\n            resIndex = 0,\n            result = [];\n  \n        while (++index < length) {\n          var value = array[index];\n          if (value) {\n            result[resIndex++] = value;\n          }\n        }\n        return result;\n      }\n    });\n  \n    return Variants;\n  })();\n  \n  theme.rte = {\n    init: function() {\n      theme.rte.wrapTable();\n      theme.rte.wrapVideo();\n      theme.rte.imageLinks();\n    },\n  \n    wrapTable: function() {\n      $('.rte table').wrap('<div class=\"table-wrapper\"></div>');\n    },\n  \n    wrapVideo: function() {\n      var $iframeVideo = $('.rte iframe[src*=\"youtube.com/embed\"], .rte iframe[src*=\"player.vimeo\"]');\n      var $iframeReset = $iframeVideo.add('iframe#admin_bar_iframe');\n  \n      $iframeVideo.each(function () {\n        // Add wrapper to make video responsive\n        if (!$(this).parents('.video-wrapper').length) {\n          $(this).wrap('<div class=\"video-wrapper\"></div>');\n        }\n      });\n  \n      $iframeReset.each(function () {\n        // Re-set the src attribute on each iframe after page load\n        // for Chrome's \"incorrect iFrame content on 'back'\" bug.\n        // https://code.google.com/p/chromium/issues/detail?id=395791\n        // Need to specifically target video and admin bar\n        this.src = this.src;\n      });\n    },\n  \n    // Remove CSS that adds animated underline under image links\n    imageLinks: function() {\n      $('.rte a img').parent().addClass('rte__image');\n    }\n  };\n  \n\n  theme.LibraryLoader = (function() {\n    var types = {\n      link: 'link',\n      script: 'script'\n    };\n  \n    var status = {\n      requested: 'requested',\n      loaded: 'loaded'\n    };\n  \n    var cloudCdn = 'https://cdn.shopify.com/shopifycloud/';\n  \n    var libraries = {\n      youtubeSdk: {\n        tagId: 'youtube-sdk',\n        src: 'https://www.youtube.com/iframe_api',\n        type: types.script\n      },\n      shopifyXr: {\n        tagId: 'shopify-model-viewer-xr',\n        src: cloudCdn + 'shopify-xr-js/assets/v1.0/shopify-xr.en.js',\n        type: types.script\n      },\n      modelViewerUi: {\n        tagId: 'shopify-model-viewer-ui',\n        src: cloudCdn + 'model-viewer-ui/assets/v1.0/model-viewer-ui.en.js',\n        type: types.script\n      },\n      modelViewerUiStyles: {\n        tagId: 'shopify-model-viewer-ui-styles',\n        src: cloudCdn + 'model-viewer-ui/assets/v1.0/model-viewer-ui.css',\n        type: types.link\n      }\n    };\n  \n    function load(libraryName, callback) {\n      var library = libraries[libraryName];\n  \n      if (!library) return;\n      if (library.status === status.requested) return;\n  \n      callback = callback || function() {};\n      if (library.status === status.loaded) {\n        callback();\n        return;\n      }\n  \n      library.status = status.requested;\n  \n      var tag;\n  \n      switch (library.type) {\n        case types.script:\n          tag = createScriptTag(library, callback);\n          break;\n        case types.link:\n          tag = createLinkTag(library, callback);\n          break;\n      }\n  \n      tag.id = library.tagId;\n      library.element = tag;\n  \n      var firstScriptTag = document.getElementsByTagName(library.type)[0];\n      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n    }\n  \n    function createScriptTag(library, callback) {\n      var tag = document.createElement('script');\n      tag.src = library.src;\n      tag.addEventListener('load', function() {\n        library.status = status.loaded;\n        callback();\n      });\n      return tag;\n    }\n  \n    function createLinkTag(library, callback) {\n      var tag = document.createElement('link');\n      tag.href = library.src;\n      tag.rel = 'stylesheet';\n      tag.type = 'text/css';\n      tag.addEventListener('load', function() {\n        library.status = status.loaded;\n        callback();\n      });\n      return tag;\n    }\n  \n    return {\n      load: load\n    };\n  })();\n  \n  theme.Modals = (function() {\n    function Modal(id, name, options) {\n      var defaults = {\n        close: '.js-modal-close',\n        open: '.js-modal-open-' + name,\n        openClass: 'modal--is-active',\n        closingClass: 'modal--is-closing',\n        bodyOpenClass: 'modal-open',\n        bodyOpenSolidClass: 'modal-open--solid',\n        bodyClosingClass: 'modal-closing',\n        closeOffContentClick: true\n      };\n  \n      this.id = id;\n      this.$modal = $('#' + id);\n  \n      if (!this.$modal.length) {\n        return false;\n      }\n  \n      this.nodes = {\n        $parent: $('html').add('body'),\n        $modalContent: this.$modal.find('.modal__inner')\n      };\n  \n      this.config = $.extend(defaults, options);\n      this.modalIsOpen = false;\n      this.$focusOnOpen = this.config.focusOnOpen ? $(this.config.focusOnOpen) : this.$modal;\n      this.isSolid = this.config.solid;\n  \n      this.init();\n    }\n  \n    Modal.prototype.init = function() {\n      var $openBtn = $(this.config.open);\n  \n      // Add aria controls\n      $openBtn.attr('aria-expanded', 'false');\n  \n      $(this.config.open).on('click', this.open.bind(this));\n      this.$modal.find(this.config.close).on('click', this.close.bind(this));\n  \n      // Close modal if a drawer is opened\n      $('body').on('drawerOpen', function() {\n        this.close();\n      }.bind(this));\n    };\n  \n    Modal.prototype.open = function(evt) {\n      // Keep track if modal was opened from a click, or called by another function\n      var externalCall = false;\n  \n      // don't open an opened modal\n      if (this.modalIsOpen) {\n        return;\n      }\n  \n      // Prevent following href if link is clicked\n      if (evt) {\n        evt.preventDefault();\n      } else {\n        externalCall = true;\n      }\n  \n      // Without this, the modal opens, the click event bubbles up to $nodes.page\n      // which closes the modal.\n      if (evt && evt.stopPropagation) {\n        evt.stopPropagation();\n        // save the source of the click, we'll focus to this on close\n        this.$activeSource = $(evt.currentTarget).attr('aria-expanded', 'true');\n      }\n  \n      if (this.modalIsOpen && !externalCall) {\n        this.close();\n      }\n  \n      this.$modal\n        .prepareTransition()\n        .addClass(this.config.openClass);\n      this.nodes.$parent.addClass(this.config.bodyOpenClass);\n  \n      if (this.isSolid) {\n        this.nodes.$parent.addClass(this.config.bodyOpenSolidClass);\n      }\n  \n      this.modalIsOpen = true;\n  \n      theme.a11y.trapFocus({\n        $container: this.$modal,\n        $elementToFocus: this.$focusOnOpen,\n        namespace: 'modal_focus'\n      });\n  \n      $('body')\n        .trigger('productModalOpen')\n        .trigger('modalOpen.' + this.id);\n  \n      this.bindEvents();\n    };\n  \n    Modal.prototype.close = function() {\n      // don't close a closed modal\n      if (!this.modalIsOpen) {\n        return;\n      }\n  \n      // deselect any focused form elements\n      $(document.activeElement).trigger('blur');\n  \n      this.$modal\n        .prepareTransition()\n        .removeClass(this.config.openClass)\n        .addClass(this.config.closingClass);\n      this.nodes.$parent.removeClass(this.config.bodyOpenClass);\n      this.nodes.$parent.addClass(this.config.bodyClosingClass);\n      window.setTimeout(function() {\n        this.nodes.$parent.removeClass(this.config.bodyClosingClass);\n        this.$modal.removeClass(this.config.closingClass);\n        if (this.$activeSource && this.$activeSource.attr('aria-expanded')) {\n          this.$activeSource.attr('aria-expanded', 'false').focus();\n        }\n      }.bind(this), 550); // modal close css transition\n  \n      if (this.isSolid) {\n        this.nodes.$parent.removeClass(this.config.bodyOpenSolidClass);\n      }\n  \n      this.modalIsOpen = false;\n  \n      theme.a11y.removeTrapFocus({\n        $container: this.$modal,\n        namespace: 'modal_focus'\n      });\n  \n      $('body').trigger('modalClose.' + this.id);\n  \n      this.unbindEvents();\n    };\n  \n    Modal.prototype.bindEvents = function() {\n      // Pressing escape closes modal\n      this.nodes.$parent.on('keyup.modal', function(evt) {\n        if (evt.keyCode === 27) {\n          this.close();\n        }\n      }.bind(this));\n  \n      if (this.config.closeOffContentClick) {\n        // Clicking outside of the modal content also closes it\n        this.$modal.on('click.modal', this.close.bind(this));\n  \n        // Exception to above: clicking anywhere on the modal content will NOT close it\n        this.nodes.$modalContent.on('click.modal', function(evt) {\n          evt.stopImmediatePropagation();\n        });\n      }\n    };\n  \n    Modal.prototype.unbindEvents = function() {\n      this.nodes.$parent.off('.modal');\n  \n      if (this.config.closeOffContentClick) {\n        this.$modal.off('.modal');\n        this.nodes.$modalContent.off('.modal');\n      }\n    };\n  \n    return Modal;\n  })();\n  \n  theme.Drawers = (function() {\n    function Drawer(id, name, ignoreScrollLock) {\n      this.config = {\n        id: id,\n        close: '.js-drawer-close',\n        open: '.js-drawer-open-' + name,\n        openClass: 'js-drawer-open',\n        closingClass: 'js-drawer-closing',\n        activeDrawer: 'drawer--is-open',\n        namespace: '.drawer-' + name\n      };\n  \n      this.$nodes = {\n        parent: $(document.documentElement).add('body'),\n        page: $('#MainContent')\n      };\n  \n      this.$drawer = $('#' + id);\n  \n      if (!this.$drawer.length) {\n        return false;\n      }\n  \n      this.isOpen = false;\n      this.ignoreScrollLock = ignoreScrollLock;\n      this.init();\n    };\n  \n    Drawer.prototype = $.extend({}, Drawer.prototype, {\n      init: function() {\n        var $openBtn = $(this.config.open);\n  \n        // Add aria controls\n        $openBtn.attr('aria-expanded', 'false');\n  \n        $openBtn.on('click', this.open.bind(this));\n        this.$drawer.find(this.config.close).on('click', this.close.bind(this));\n  \n        // Close modal if a drawer is opened\n        $('body').on('productModalOpen', function() {\n          this.close();\n        }.bind(this));\n      },\n  \n      open: function(evt, returnFocusEl) {\n        if (evt) {\n          evt.preventDefault();\n        }\n  \n        if (this.isOpen) {\n          return;\n        }\n  \n        // Without this the drawer opens, the click event bubbles up to $nodes.page which closes the drawer.\n        if (evt && evt.stopPropagation) {\n          evt.stopPropagation();\n          // save the source of the click, we'll focus to this on close\n          this.$activeSource = $(evt.currentTarget).attr('aria-expanded', 'true');\n        } else if (returnFocusEl) {\n          var $el = $(returnFocusEl);\n          this.$activeSource = $el.attr('aria-expanded', 'true');\n        }\n  \n        this.$drawer.prepareTransition().addClass(this.config.activeDrawer);\n  \n        this.$nodes.parent.addClass(this.config.openClass);\n        this.isOpen = true;\n  \n        theme.a11y.trapFocus({\n          $container: this.$drawer,\n          namespace: 'drawer_focus'\n        });\n  \n        $('body')\n          .trigger('drawerOpen')\n          .trigger('drawerOpen.' + this.config.id);\n  \n        this.bindEvents();\n      },\n  \n      close: function() {\n        if (!this.isOpen) {\n          return;\n        }\n  \n        // deselect any focused form elements\n        $(document.activeElement).trigger('blur');\n  \n        this.$drawer.prepareTransition().removeClass(this.config.activeDrawer);\n  \n        this.$nodes.parent.removeClass(this.config.openClass);\n        this.$nodes.parent.addClass(this.config.closingClass);\n        window.setTimeout(function() {\n          this.$nodes.parent.removeClass(this.config.closingClass);\n          if (this.$activeSource && this.$activeSource.attr('aria-expanded')) {\n            this.$activeSource.attr('aria-expanded', 'false').focus();\n          }\n        }.bind(this), 500);\n  \n        this.isOpen = false;\n  \n        theme.a11y.removeTrapFocus({\n          $container: this.$drawer,\n          namespace: 'drawer_focus'\n        });\n  \n        this.unbindEvents();\n      },\n  \n      bindEvents: function() {\n        if (!this.ignoreScrollLock) {\n          theme.a11y.lockMobileScrolling(this.config.namespace, this.$nodes.page);\n        }\n  \n        // Clicking out of drawer closes it.\n        // Check to see if clicked on element in drawer\n        // because of any drawer built witin #MainContent\n        this.$nodes.page.on('click' + this.config.namespace, function (evt) {\n          var $target = $(evt.target);\n          var doNotClose = this.elementInsideDrawer($target);\n          if (!doNotClose) {\n            this.close();\n            return false;\n          }\n  \n        }.bind(this));\n  \n        // Pressing escape closes drawer\n        this.$nodes.parent.on('keyup' + this.config.namespace, function(evt) {\n          if (evt.keyCode === 27) {\n            this.close();\n          }\n        }.bind(this));\n      },\n  \n      unbindEvents: function() {\n        if (!this.ignoreScrollLock) {\n          theme.a11y.unlockMobileScrolling(this.config.namespace, this.$nodes.page);\n        }\n        this.$nodes.parent.off(this.config.namespace);\n        this.$nodes.page.off(this.config.namespace);\n      },\n  \n      // Check if clicked element is inside the drawer\n      elementInsideDrawer: function($el) {\n        return this.$drawer.find($el).length;\n      }\n    });\n  \n    return Drawer;\n  })();\n  \n  theme.cart = {\n    getCart: function() {\n      return $.getJSON(theme.routes.cart);\n    },\n  \n    changeItem: function(key, qty) {\n      return this._updateCart({\n        type: 'POST',\n        url: theme.routes.cartChange,\n        data: 'quantity=' + qty + '&id=' + key,\n        dataType: 'json'\n      });\n    },\n  \n    addItemFromForm: function(data) {\n      return this._updateCart({\n        type: 'POST',\n        url: theme.routes.cartAdd,\n        data: data,\n        dataType: 'json'\n      });\n    },\n  \n    _updateCart: function(params) {\n      return $.ajax(params)\n        .then(function(cart) {\n          return cart;\n        }.bind(this))\n    },\n  \n    updateNote: function(note) {\n      var params = {\n        type: 'POST',\n        url: '/cart/update.js',\n        data: 'note=' + theme.cart.attributeToString(note),\n        dataType: 'json',\n        success: function(cart) {},\n        error: function(XMLHttpRequest, textStatus) {}\n      };\n  \n      $.ajax(params);\n    },\n  \n    attributeToString: function(attribute) {\n      if ((typeof attribute) !== 'string') {\n        attribute += '';\n        if (attribute === 'undefined') {\n          attribute = '';\n        }\n      }\n      return attribute.trim();\n    }\n  }\n  \n  $(function() {\n    // Add a loading indicator on the cart checkout button (/cart and drawer)\n    $('body').on('click', '.cart__checkout', function() {\n      $(this).addClass('btn--loading');\n    });\n  \n    $('body').on('change', 'textarea[name=\"note\"]', function() {\n      var newNote = $(this).val();\n      theme.cart.updateNote(newNote);\n    });\n  \n  \n    // Custom JS to prevent checkout without confirming terms and conditions\n    $('body').on('click', '.cart__checkout--ajax', function(evt) {\n      if ($('#CartAgree').is(':checked')) {\n      } else {\n        alert(theme.strings.cartTermsConfirmation);\n        $(this).removeClass('btn--loading');\n        return false;\n      }\n    });\n  \n    $('body').on('click', '.cart__checkout--page', function(evt) {\n      if ($('#CartPageAgree').is(':checked')) {\n      } else {\n        alert(theme.strings.cartTermsConfirmation);\n        $(this).removeClass('btn--loading');\n        return false;\n      }\n    });\n  });\n  \n  theme.QtySelector = (function() {\n    var classes = {\n      input: '.js-qty__num',\n      plus: '.js-qty__adjust--plus',\n      minus: '.js-qty__adjust--minus'\n    };\n  \n    function QtySelector($el, options) {\n      this.$wrapper = $el;\n      this.$input = $el.find(classes.input);\n      this.$plus = $el.find(classes.plus);\n      this.$minus = $el.find(classes.minus);\n      this.minValue = this.$input.attr('min') || 1;\n  \n      var defaults = {\n        namespace: null,\n        key: this.$input.data('id')\n      };\n  \n      this.options = $.extend(defaults, options);\n  \n      this.initEventListeners();\n    };\n  \n    QtySelector.prototype = $.extend({}, QtySelector.prototype, {\n      initEventListeners: function() {\n        this.$plus.on('click', function() {\n          var qty = this.validateQty(this.$input.val());\n          this.addQty(qty);\n        }.bind(this));\n  \n        this.$minus.on('click', function() {\n          var qty = this.validateQty(this.$input.val());\n          this.subtractQty(qty);\n        }.bind(this));\n  \n        this.$input.on('change', function() {\n          var qty = this.validateQty(this.$input.val());\n          this.changeQty(qty);\n        }.bind(this));\n      },\n  \n      addQty: function(number) {\n        var qty = number + 1;\n        this.changeQty(qty);\n      },\n  \n      subtractQty: function(number) {\n        var qty = number - 1;\n        if (qty <= this.minValue) {\n          qty = this.minValue;\n        }\n        this.changeQty(qty);\n      },\n  \n      changeQty: function(qty) {\n        this.$input.val(qty);\n        $('body').trigger('qty' + this.options.namespace, [this.options.key, qty]);\n      },\n  \n      validateQty: function(number) {\n        if((parseFloat(number) == parseInt(number)) && !isNaN(number)) {\n          // We have a valid number!\n        } else {\n          // Not a number. Default to 1.\n          number = 1;\n        }\n        return parseInt(number);\n      }\n    });\n  \n    return QtySelector;\n  })();\n  \n  theme.CartDrawer = (function() {\n    var config = {\n      namespace: '.ajaxcart'\n    };\n  \n    var selectors = {\n      drawer: '#CartDrawer',\n      container: '#CartContainer',\n      template: '#CartTemplate',\n      cartBubble: '.cart-link__bubble'\n    };\n  \n    function CartDrawer() {\n      this.status = {\n        loaded: false,\n        loading: false\n      };\n  \n      this.drawer = new theme.Drawers('CartDrawer', 'cart');\n  \n      // Prep handlebars template\n      var source = $(selectors.template).html();\n      this.template = Handlebars.compile(source);\n  \n      // Build cart on page load so it's ready in the drawer\n      theme.cart.getCart().then(this.buildCart.bind(this));\n  \n      document.addEventListener('cart:build', function() {\n        theme.cart.getCart().then(this.buildCart.bind(this));\n      }.bind(this));\n  \n      this.initEventListeners();\n    };\n  \n    CartDrawer.prototype = $.extend({}, CartDrawer.prototype, {\n      initEventListeners: function() {\n        $('body').on('updateCart' + config.namespace, this.initQtySelectors.bind(this));\n        $('body').on('updateCart' + config.namespace, this.updateCartNotification.bind(this));\n  \n        $('body').on('added.ajaxProduct', function(evt, returnFocusEl) {\n          theme.cart.getCart().then(function(cart) {\n            this.buildCart(cart, true, returnFocusEl);\n          }.bind(this));\n        }.bind(this));\n      },\n  \n      buildCart: function(cart, openDrawer, returnFocusEl) {\n        this.loading(true);\n        this.emptyCart();\n  \n        if (cart.item_count === 0) {\n          $(selectors.container).append('<div class=\"drawer__scrollable\"><p class=\"appear-animation appear-delay-3\">' + theme.strings.cartEmpty +'</p></div>');\n        } else {\n          var items = [];\n          var item = {};\n          var data = {};\n          var animation_row = 1;\n  \n          $.each(cart.items, function(index, product) {\n            var prodImg;\n            if (product.image !== null) {\n              prodImg = product.image.replace(/(\\.[^.]*)$/, \"_180x$1\");\n            } else {\n              prodImg = '//cdn.shopify.com/s/assets/admin/no-image-medium-cc9732cb976dd349a0df1d39816fbcc7.gif';\n            }\n  \n            if (product.properties !== null) {\n              $.each(product.properties, function(key, value) {\n                if (key.charAt(0) === '_' || !value) {\n                   delete product.properties[key];\n                 }\n              });\n            }\n  \n            // If we have line-item discount, add formattedAmount to discount object\n            var amount = 0;\n            if (product.line_level_discount_allocations.length !== 0) {\n              for (var discount in product.line_level_discount_allocations) {\n                amount = product.line_level_discount_allocations[discount].amount;\n  \n                product.line_level_discount_allocations[discount].formattedAmount = theme.Currency.formatMoney(amount, theme.settings.moneyFormat);\n              }\n            }\n  \n            animation_row+=2;\n  \n            item = {\n              key: product.key,\n              url: product.url,\n              img: prodImg,\n              animationRow: animation_row,\n              name: product.product_title,\n              variation: product.variant_title,\n              properties: product.properties,\n              itemQty: product.quantity,\n              price: theme.Currency.formatMoney(product.price, theme.settings.moneyFormat),\n              unitPrice: theme.Currency.formatMoney(product.unit_price, theme.settings.moneyFormat),\n              unitBase: theme.Currency.getBaseUnit(product),\n              discountedPrice: theme.Currency.formatMoney((product.price - (product.total_discount/product.quantity)), theme.settings.moneyFormat),\n              discounts: product.line_level_discount_allocations,\n              discountsApplied: product.line_level_discount_allocations.length === 0 ? false : true,\n              selling_plan_name: product.selling_plan_allocation\n              ? product.selling_plan_allocation.selling_plan.name\n              : null,\n              vendor: product.vendor\n            };\n  \n            items.push(item);\n          });\n  \n          animation_row+=2;\n  \n          // If we have cart discount, add a formattedAmount to the discount object\n          var cartAmount = 0;\n          if (cart.cart_level_discount_applications.length !== 0) {\n            for (var cartDiscount in cart.cart_level_discount_applications) {\n              cartAmount = cart.cart_level_discount_applications[cartDiscount].total_allocated_amount;\n  \n              cart.cart_level_discount_applications[cartDiscount].formattedAmount = theme.Currency.formatMoney(cartAmount,theme.settings.moneyFormat);\n            }\n          }\n  \n          data = {\n            items: items,\n            note: cart.note,\n            lastAnimationRow: animation_row,\n            cartDiscounts: cart.cart_level_discount_applications,\n            cartDiscountsApplied: cart.cart_level_discount_applications.length === 0 ? false : true,\n            totalPrice: theme.Currency.formatMoney(cart.total_price, theme.settings.moneyFormat)\n          };\n  \n          $(selectors.container).append(this.template(data));\n        }\n  \n        this.status.loaded = true;\n        this.loading(false);\n  \n        $('body').trigger('updateCart' + config.namespace, cart);\n  \n        if (Shopify && Shopify.StorefrontExpressButtons) {\n          Shopify.StorefrontExpressButtons.initialize();\n        }\n  \n        // If specifically asked, open the cart drawer (only happens after product added from form)\n        if (openDrawer === true) {\n          this.drawer.open(false, returnFocusEl);\n        }\n  \n        document.dispatchEvent(new CustomEvent('cart:updated', {\n          detail: {\n            cart: cart\n          }\n        }));\n      },\n  \n      initQtySelectors: function() {\n        $(selectors.container).find('.js-qty__wrapper').each(function(index, el) {\n          var selector = new theme.QtySelector($(el), {\n            namespace: '.cart-drawer'\n          });\n        }.bind(this));\n  \n        $('body').on('qty.cart-drawer', this.updateItem.bind(this));\n      },\n  \n      updateItem: function(evt, key, qty) {\n        if (this.status.loading) {\n          return;\n        }\n  \n        this.loading(true);\n  \n        theme.cart.changeItem(key, qty)\n          .then(function(cart) {\n            this.updateSuccess(cart);\n          }.bind(this))\n          .catch(function(XMLHttpRequest) {\n            this.updateError(XMLHttpRequest)\n          }.bind(this))\n          .always(function() {\n            this.loading(false);\n          }.bind(this));\n      },\n  \n      loading: function(state) {\n        this.status.loading = state;\n  \n        if (state) {\n          $(selectors.container).addClass('is-loading');\n        } else {\n          $(selectors.container).removeClass('is-loading');\n        }\n      },\n  \n      emptyCart: function() {\n        $(selectors.container).empty();\n      },\n  \n      updateSuccess: function(cart) {\n        this.buildCart(cart)\n      },\n  \n      updateError: function(XMLHttpRequest) {\n        if (XMLHttpRequest.responseJSON && XMLHttpRequest.responseJSON.description) {\n          // console.warn(XMLHttpRequest.responseJSON.description);\n        }\n      },\n  \n      updateCartNotification: function(evt, cart) {\n        if (cart.items.length > 0) {\n          $(selectors.cartBubble).addClass('cart-link__bubble--visible');\n        } else {\n          $(selectors.cartBubble).removeClass('cart-link__bubble--visible');\n        }\n      }\n    });\n  \n    return CartDrawer;\n  })();\n  \n  theme.AjaxProduct = (function() {\n    var status = {\n      loading: false\n    };\n  \n    function ProductForm($form) {\n      this.$form = $form;\n      this.$addToCart = this.$form.find('.add-to-cart');\n  \n      if (this.$form.length) {\n        this.$form.on('submit', this.addItemFromForm.bind(this));\n      }\n    };\n  \n    ProductForm.prototype = $.extend({}, ProductForm.prototype, {\n      addItemFromForm: function(evt, callback){\n        evt.preventDefault();\n  \n        if (status.loading) {\n          return;\n        }\n  \n        // Loading indicator on add to cart button\n        this.$addToCart.addClass('btn--loading');\n  \n        status.loading = true;\n  \n        var data = this.$form.serialize();\n  \n        theme.cart.addItemFromForm(data)\n          .then(function(product) {\n            this.success(product);\n          }.bind(this))\n          .catch(function(XMLHttpRequest) {\n            this.error(XMLHttpRequest)\n          }.bind(this))\n          .always(function() {\n            status.loading = false;\n            this.$addToCart.removeClass('btn--loading');\n          }.bind(this));\n      },\n  \n      success: function(product) {\n        this.$form.find('.errors').remove();\n        $('body').trigger('added.ajaxProduct', this.$addToCart);\n        document.dispatchEvent(new CustomEvent('ajaxProduct:added', {\n          detail: {\n            product: product\n          }\n        }));\n      },\n  \n      error: function(XMLHttpRequest) {\n        this.$form.find('.errors').remove();\n  \n        if (XMLHttpRequest.responseJSON && XMLHttpRequest.responseJSON.description) {\n          this.$form.prepend('<div class=\"errors text-center\">' + XMLHttpRequest.responseJSON.description + '</div>');\n  \n          document.dispatchEvent(new CustomEvent('ajaxProduct:error', {\n            detail: {\n              errorMessage: XMLHttpRequest.responseJSON.description\n            }\n          }));\n        }\n      }\n    });\n  \n    return ProductForm;\n  })();\n  \n  theme.collapsibles = (function() {\n  \n    var selectors = {\n      trigger: '.collapsible-trigger',\n      module: '.collapsible-content',\n      moduleInner: '.collapsible-content__inner'\n    };\n  \n    var classes = {\n      hide: 'hide',\n      open: 'is-open',\n      autoHeight: 'collapsible--auto-height'\n    };\n  \n    var namespace = '.collapsible';\n  \n    var isTransitioning = false;\n  \n    function init() {\n      $(selectors.trigger).each(function() {\n        var $el = $(this);\n        var state = $el.hasClass(classes.open);\n        $el.attr('aria-expanded', state);\n      });\n  \n      // Event listeners (hack for modals)\n      $('body, .modal__inner')\n        .off(namespace)\n        .on('click' + namespace, selectors.trigger, function() {\n  \n        if (isTransitioning) {\n          return;\n        }\n  \n        isTransitioning = true;\n  \n        var $el = $(this);\n        var isOpen = $el.hasClass(classes.open);\n        var moduleId = $el.attr('aria-controls');\n        var $module = $('#' + moduleId);\n        var height = $module.find(selectors.moduleInner).outerHeight();\n        var isAutoHeight = $el.hasClass(classes.autoHeight);\n  \n        // If isAutoHeight, set the height to 0 just after setting the actual height\n        // so the closing animation works nicely\n        if (isOpen && isAutoHeight) {\n          setTimeout(function() {\n            height = 0;\n            setTransitionHeight($module, height, isOpen, isAutoHeight);\n          }, 0);\n        }\n  \n        if (isOpen && !isAutoHeight) {\n          height = 0;\n        }\n  \n        $el\n          .attr('aria-expanded', !isOpen)\n          .toggleClass(classes.open, !isOpen);\n  \n        setTransitionHeight($module, height, isOpen, isAutoHeight);\n      });\n    }\n  \n    function setTransitionHeight($module, height, isOpen, isAutoHeight) {\n      $module\n        .removeClass(classes.hide)\n        .prepareTransition()\n        .css('height', height)\n        .toggleClass(classes.open, !isOpen);\n  \n      if (!isOpen && isAutoHeight) {\n        var o = $module;\n        window.setTimeout(function() {\n          o.css('height','auto');\n          isTransitioning = false;\n        }, 350);\n      } else {\n        isTransitioning = false;\n      }\n    }\n  \n    return {\n      init: init\n    };\n  })();\n  \n  theme.headerNav = (function() {\n  \n    var $parent = $(document.documentElement).add('body');\n    var $page = $('#MainContent');\n    var selectors = {\n      wrapper: '.header-wrapper',\n      siteHeader: '.site-header',\n      searchBtn: '.js-search-header',\n      closeSearch: '.js-search-header-close',\n      searchContainer: '.site-header__search-container',\n      logoContainer: '.site-header__logo',\n      logo: '.site-header__logo img',\n      navigation: '.site-navigation',\n      megamenu: '.megamenu',\n      navContainerWithLogo: '.header-item--logo',\n      navItems: '.site-nav__item',\n      navLinks: '.site-nav__link',\n      navLinksWithDropdown: '.site-nav__link--has-dropdown',\n      navDropdownLinks: '.site-nav__dropdown-link--second-level'\n    };\n  \n    var classes = {\n      hasDropdownClass: 'site-nav--has-dropdown',\n      hasSubDropdownClass: 'site-nav__deep-dropdown-trigger',\n      dropdownActive: 'is-focused',\n      overlaidBodyClass: 'overlaid-header',\n      stickyBodyClass: 'sticky-header'\n    };\n  \n    var config = {\n      namespace: '.siteNav',\n      wrapperOverlayed: false,\n      overlayedClass: 'is-light',\n      stickyEnabledClass: 'header-wrapper--sticky',\n      stickyEnabled: false,\n      stickyActive: false,\n      stickyInitialized: false,\n      forceStopSticky: false,\n      stickyClass: 'site-header--stuck',\n      openTransitionClass: 'site-header--opening',\n      lastScroll: 0\n    };\n  \n    // Elements used in resize functions, defined in init\n    var $window;\n    var $navContainerWithLogo;\n    var $logoContainer;\n    var $nav;\n    var $wrapper;\n    var $siteHeader;\n  \n    function init() {\n      $window = $(window);\n      $navContainerWithLogo = $(selectors.navContainerWithLogo);\n      $logoContainer = $(selectors.logoContainer);\n      $nav = $(selectors.navigation);\n      $wrapper = $(selectors.wrapper);\n      $siteHeader = $(selectors.siteHeader);\n  \n      config.wrapperOverlayed = theme.settings.overlayHeader = $wrapper.hasClass(config.overlayedClass);\n      config.stickyEnabled = $siteHeader.data('sticky');\n  \n      if (config.stickyEnabled) {\n        stickyHeaderCheck();\n        $window.on('resize' + config.namespace, $.debounce(150, stickyHeaderCheck));\n      }\n  \n      if (config.wrapperOverlayed) {\n        $('body').addClass(classes.overlaidBodyClass);\n      }\n  \n      accessibleDropdowns();\n      searchDrawer();\n    }\n  \n    function unload() {\n      $(window).off(config.namespace);\n      $(selectors.searchBtn).off(config.namespace);\n      $(selectors.closeSearch).off(config.namespace);\n      $parent.off(config.namespace);\n      $(selectors.navLinks).off(config.namespace);\n      $(selectors.navDropdownLinks).off(config.namespace);\n    }\n  \n    function searchDrawer() {\n      $(selectors.searchBtn).on('click' + config.namespace, function(evt) {\n        evt.preventDefault();\n        openSearchDrawer();\n      });\n  \n      $(selectors.closeSearch).on('click' + config.namespace, function() {\n        closeSearchDrawer();\n      });\n    }\n  \n    function openSearchDrawer() {\n      $(selectors.searchContainer).addClass('is-active');\n      $parent.addClass('js-drawer-open--search');\n  \n      theme.a11y.trapFocus({\n        $container: $(selectors.searchContainer),\n        namespace: 'header_search',\n        $elementToFocus: $(selectors.searchContainer).find('input')\n      });\n  \n      // If sticky is enabled, scroll to top on mobile when close to it\n      // so you don't get an invisible search box\n      if (theme.config.bpSmall && config.stickyEnabled && config.lastScroll < 300) {\n        window.scrollTo(0,0);\n      }\n  \n      // Bind events\n      theme.a11y.lockMobileScrolling(config.namespace);\n  \n      // Clicking out of container closes it\n      $page.on('click' + config.namespace, function () {\n        closeSearchDrawer();\n        return false;\n      });\n  \n      $parent.on('keyup' + config.namespace, function(evt) {\n        if (evt.keyCode === 27) {\n          closeSearchDrawer();\n        }\n      });\n    }\n  \n    function closeSearchDrawer() {\n      // deselect any focused form elements\n      $(document.activeElement).trigger('blur');\n  \n      $parent.removeClass('js-drawer-open--search').off(config.namespace);\n      $(selectors.searchContainer).removeClass('is-active');\n  \n      theme.a11y.removeTrapFocus({\n        $container: $(selectors.searchContainer),\n        namespace: 'header_search'\n      });\n  \n      theme.a11y.unlockMobileScrolling(config.namespace);\n      $page.off('click' + config.namespace);\n      $parent.off('keyup' + config.namespace);\n    }\n  \n    function accessibleDropdowns() {\n      var hasActiveDropdown = false;\n      var hasActiveSubDropdown = false;\n      var closeOnClickActive = false;\n  \n      // Touch devices open dropdown on first click, navigate to link on second\n      if (theme.config.isTouch) {\n        $(selectors.navLinksWithDropdown).on('touchend' + config.namespace, function(evt) {\n          var $el = $(this);\n          var $parentItem = $el.parent();\n          if (!$parentItem.hasClass(classes.dropdownActive)) {\n            evt.preventDefault();\n            closeDropdowns();\n            openFirstLevelDropdown($el);\n          } else {\n            window.location.replace($el.attr('href'));\n          }\n        });\n  \n        $(selectors.navDropdownLinks).on('touchend' + config.namespace, function(evt) {\n          var $el = $(this);\n          var $parentItem = $el.parent();\n  \n          // Open third level menu or go to link based on active state\n          if ($parentItem.hasClass(classes.hasSubDropdownClass)) {\n            if (!$parentItem.hasClass(classes.dropdownActive)) {\n              evt.preventDefault();\n              closeThirdLevelDropdown();\n              openSecondLevelDropdown($el);\n            } else {\n              window.location.replace($el.attr('href'));\n            }\n          } else {\n            // No third level nav, go to link\n            window.location.replace($el.attr('href'));\n          }\n        });\n  \n        // tapping outside of the dropdown closes it\n        $('body').on('touchend' + config.namespace, function() {\n          closeSecondLevelDropdown();\n          closeThirdLevelDropdown();\n        });\n  \n        // Exception to above: clicking anywhere on the megamenu content will NOT close it\n        $(selectors.megamenu).on('touchend' + config.namespace, function(evt) {\n          evt.stopImmediatePropagation();\n        });\n      }\n  \n      $(selectors.navLinks).on('focusin mouseover' + config.namespace, function() {\n        if (hasActiveDropdown) {\n          closeSecondLevelDropdown();\n        }\n  \n        if (hasActiveSubDropdown) {\n          closeThirdLevelDropdown();\n        }\n  \n        openFirstLevelDropdown($(this));\n      });\n  \n      // Force remove focus on sitenav links because focus sometimes gets stuck\n      $(selectors.navLinks).on('mouseleave' + config.namespace, function() {\n        closeSecondLevelDropdown();\n        closeThirdLevelDropdown();\n      });\n  \n      // Open/hide sub level dropdowns\n      $(selectors.navDropdownLinks).on('focusin' + config.namespace, function() {\n        if (hasActiveSubDropdown) {\n          closeThirdLevelDropdown();\n        }\n  \n        openSecondLevelDropdown($(this), true);\n      });\n  \n      // Private dropdown methods\n      function openFirstLevelDropdown($el) {\n        var $parentItem = $el.parent();\n        if ($parentItem.hasClass(classes.hasDropdownClass)) {\n          $parentItem.addClass(classes.dropdownActive);\n          hasActiveDropdown = true;\n        }\n  \n        if (!theme.config.isTouch) {\n          if (!closeOnClickActive) {\n            var eventType = theme.config.isTouch ? 'touchend' : 'click';\n            closeOnClickActive = true;\n            $('body').on(eventType + config.namespace, function() {\n              closeDropdowns();\n              $('body').off(config.namespace);\n              closeOnClickActive = false;\n            });\n          }\n        }\n      }\n  \n      function openSecondLevelDropdown($el, skipCheck) {\n        var $parentItem = $el.parent();\n        if ($parentItem.hasClass(classes.hasSubDropdownClass) || skipCheck) {\n          $parentItem.addClass(classes.dropdownActive);\n          hasActiveSubDropdown = true;\n        }\n      }\n  \n      function closeDropdowns() {\n        closeSecondLevelDropdown();\n        closeThirdLevelDropdown();\n      }\n  \n      function closeSecondLevelDropdown() {\n        $(selectors.navItems).removeClass(classes.dropdownActive);\n      }\n  \n      function closeThirdLevelDropdown() {\n        $(selectors.navDropdownLinks).parent().removeClass(classes.dropdownActive);\n      }\n    }\n  \n    function stickyHeaderCheck() {\n      // Disable sticky header if any mega menu is taller than window\n      theme.config.stickyHeader = doesMegaMenuFit();\n  \n      if (theme.config.stickyHeader) {\n        config.forceStopSticky = false;\n        stickyHeaderSetup();\n      } else {\n        config.forceStopSticky = true;\n      }\n    }\n  \n    function stickyHeaderSetup() {\n      if (!config.stickyInitialized) {\n        $parent.addClass(classes.stickyBodyClass);\n        $siteHeader.wrap('<div class=\"site-header-sticky\"></div>');\n  \n        stickyHeaderHeight();\n        setTimeout(function() {\n          stickyHeaderHeight();\n        }, 200);\n  \n        $window.on('resize' + config.namespace, $.debounce(50, stickyHeaderHeight));\n        $window.on('scroll' + config.namespace, $.throttle(15, stickyHeaderScroll));\n      }\n  \n      config.stickyInitialized = true;\n    }\n  \n    function doesMegaMenuFit() {\n      var largestMegaNav = 0;\n      $(selectors.megamenu).each(function() {\n        var h = $(this).outerHeight();\n        if (h > largestMegaNav) {\n          largestMegaNav = h;\n        }\n      });\n  \n      // 120 ~ space of visible header when megamenu open\n      if (window.innerHeight < (largestMegaNav + 120)) {\n        return false;\n      }\n  \n      return true;\n    }\n  \n    function stickyHeaderHeight() {\n      var height = $siteHeader.outerHeight(true);\n      var $stickyHeader = $('.site-header-sticky').css('height', height);\n  \n      // Also update top position of sticky sidebar\n      if ($('.grid__item--sidebar').length) {\n        $('.grid__item--sidebar').css('top', height + 10);\n      }\n    }\n  \n    function stickyHeaderScroll() {\n      if (config.forceStopSticky) {\n        return;\n      }\n  \n      var scroll = $window.scrollTop();\n      var threshold = 150;\n  \n      if (scroll > threshold) {\n        if (config.stickyActive) {\n          return;\n        }\n  \n        config.stickyActive = true;\n  \n        $siteHeader.addClass(config.stickyClass);\n        if (config.wrapperOverlayed) {\n          $wrapper.removeClass(config.overlayedClass);\n        }\n  \n        // Add open transition class after element is set to fixed\n        // so CSS animation is applied correctly\n        setTimeout(function() {\n          $siteHeader.addClass(config.openTransitionClass);\n        }, 100);\n      } else {\n        if (!config.stickyActive) {\n          return;\n        }\n  \n        config.stickyActive = false;\n  \n        $siteHeader.removeClass(config.openTransitionClass).removeClass(config.stickyClass);\n        if (config.wrapperOverlayed) {\n          $wrapper.addClass(config.overlayedClass);\n        }\n      }\n  \n      config.lastScroll = scroll;\n    }\n  \n    // If the header setting to overlay the menu on the collection image\n    // is enabled but the collection setting is disabled, we need to undo\n    // the init of the sticky nav\n    function disableOverlayHeader() {\n      $(selectors.wrapper)\n        .removeClass(config.stickyEnabledClass)\n        .removeClass(config.overlayedClass);\n  \n      $('body').removeClass(classes.overlaidBodyClass);\n      config.wrapperOverlayed = false;\n    }\n  \n    return {\n      init: init,\n      disableOverlayHeader: disableOverlayHeader,\n      unload: unload\n    };\n  })();\n  \n  theme.Slideshow = (function() {\n    this.$slideshow = null;\n  \n    var classes = {\n      next: 'is-next',\n      init: 'is-init',\n      animateOut: 'animate-out',\n      wrapper: 'slideshow-wrapper',\n      slideshow: 'slideshow',\n      allSlides: 'slick-slide',\n      currentSlide: 'slick-current',\n      pauseButton: 'slideshow__pause',\n      isPaused: 'is-paused'\n    };\n  \n    function slideshow(el, args) {\n      this.$slideshow = $(el);\n      this.$wrapper = this.$slideshow.closest('.' + classes.wrapper);\n      this.$pause = this.$wrapper.find('.' + classes.pauseButton);\n  \n      this.settings = {\n        accessibility: true,\n        arrows: args.arrows ? true : false,\n        dots: args.dots ? true : false,\n        fade: args.fade ? true : false,\n        speed: args.speed ? args.speed : 500,\n        draggable: true,\n        touchThreshold: 5,\n        pauseOnHover: false,\n        rtl: theme.config.rtl,\n        autoplay: args.autoplay ? true : false,\n        autoplaySpeed: this.$slideshow.data('speed')\n      };\n  \n      this.$slideshow.off('beforeChange');\n      this.$slideshow.off('afterSlideChange');\n      this.$slideshow.on('init', this.init.bind(this));\n      this.$slideshow.on('beforeChange', this.beforeSlideChange.bind(this));\n      this.$slideshow.on('afterChange', this.afterSlideChange.bind(this));\n  \n      this.$slideshow.slick(this.settings);\n  \n      this.$pause.on('click', this._togglePause.bind(this));\n    }\n  \n    slideshow.prototype = $.extend({}, slideshow.prototype, {\n      init: function(event, obj) {\n        this.$slideshowList = obj.$list;\n        this.$slickDots = obj.$dots;\n        this.$allSlides = obj.$slides;\n        this.slideCount = obj.slideCount;\n  \n        this.$slideshow.addClass(classes.init);\n        this._a11y();\n        this._clonedLazyloading();\n      },\n      beforeSlideChange: function(event, slick, currentSlide, nextSlide) {\n        var $slider = slick.$slider;\n        var $currentSlide = $slider.find('.' + classes.currentSlide).addClass(classes.animateOut);\n      },\n      afterSlideChange: function(event, slick, currentSlide) {\n        var $slider = slick.$slider;\n        var $allSlides = $slider.find('.' + classes.allSlides).removeClass(classes.animateOut);\n      },\n      destroy: function() {\n        this.$slideshow.slick('unslick');\n      },\n  \n      // Playback\n      _play: function() {\n        this.$slideshow.slick('slickPause');\n        $(classes.pauseButton).addClass('is-paused');\n      },\n      _pause: function() {\n        this.$slideshow.slick('slickPlay');\n        $(classes.pauseButton).removeClass('is-paused');\n      },\n      _togglePause: function() {\n        var slideshowSelector = this._getSlideshowId(this.$pause);\n        if (this.$pause.hasClass(classes.isPaused)) {\n          this.$pause.removeClass(classes.isPaused);\n          $(slideshowSelector).slick('slickPlay');\n        } else {\n          this.$pause.addClass(classes.isPaused);\n          $(slideshowSelector).slick('slickPause');\n        }\n      },\n  \n      // Helpers\n      _getSlideshowId: function($el) {\n        return '#Slideshow-' + $el.data('id');\n      },\n      _activeSlide: function() {\n        return this.$slideshow.find('.slick-active');\n      },\n      _currentSlide: function() {\n        return this.$slideshow.find('.slick-current');\n      },\n      _nextSlide: function(index) {\n        return this.$slideshow.find('.slideshow__slide[data-slick-index=\"' + index + '\"]');\n      },\n  \n      // a11y fixes\n      _a11y: function() {\n        var $list = this.$slideshowList;\n        var autoplay = this.settings.autoplay;\n  \n        if (!$list) {\n          return;\n        }\n  \n        // Remove default Slick aria-live attr until slider is focused\n        $list.removeAttr('aria-live');\n  \n        // When an element in the slider is focused\n        // pause slideshow and set aria-live\n        $(classes.wrapper).on('focusin', function(evt) {\n          if (!$(classes.wrapper).has(evt.target).length) {\n            return;\n          }\n  \n          $list.attr('aria-live', 'polite');\n          if (autoplay) {\n            this._pause();\n          }\n        }.bind(this));\n  \n        // Resume autoplay\n        $(classes.wrapper).on('focusout', function(evt) {\n          if (!$(classes.wrapper).has(evt.target).length) {\n            return;\n          }\n  \n          $list.removeAttr('aria-live');\n          if (autoplay) {\n            this._play();\n          }\n        }.bind(this));\n      },\n  \n      // Make sure lazyloading works on cloned slides\n      _clonedLazyloading: function() {\n        var $slideshow = this.$slideshow;\n  \n        $slideshow.find('.slick-slide').each(function(index, el) {\n          var $slide = $(el);\n          if ($slide.hasClass('slick-cloned')) {\n            var slideId = $slide.data('id');\n            var $slideImg = $slide.find('.hero__image').removeClass('lazyloading').addClass('lazyloaded');\n  \n            // Get inline style attribute from non-cloned slide with arbitrary timeout\n            // so the image is loaded\n            setTimeout(function() {\n              var loadedImageStyle = $slideshow.find('.slideshow__slide--' + slideId + ':not(.slick-cloned) .hero__image').attr('style');\n  \n              if (loadedImageStyle) {\n                $slideImg.attr('style', loadedImageStyle);\n              }\n  \n            }, this.settings.autoplaySpeed / 1.5);\n  \n          }\n        }.bind(this));\n      }\n    });\n  \n    return slideshow;\n  })();\n  \n  theme.announcementBar = (function() {\n    var slideCount = 0;\n    var compact = false;\n    var defaults = {\n      accessibility: true,\n      arrows: false,\n      dots: false,\n      autoplay: true,\n      autoplaySpeed: 5000,\n      touchThreshold: 20,\n      rtl: theme.config.rtl,\n      slidesToShow: 1\n    };\n    var $slider;\n  \n    function init() {\n      $slider = $('#AnnouncementSlider');\n      if (!$slider.length) {\n        return;\n      }\n  \n      slideCount = $slider.data('block-count');\n      compact = $slider.data('compact-style');\n  \n      var desktopOptions = $.extend({}, defaults, {\n        slidesToShow: compact ? 1 : slideCount,\n        slidesToScroll: 1\n      });\n  \n      var mobileOptions = $.extend({}, defaults, {\n        slidesToShow: 1\n      });\n  \n      if (theme.config.bpSmall) {\n        initSlider($slider, mobileOptions);\n      } else {\n        initSlider($slider, desktopOptions);\n      }\n  \n      $('body').on('matchSmall', function() {\n        initSlider($slider, mobileOptions);\n      }.bind(this));\n  \n      $('body').on('matchLarge', function() {\n        initSlider($slider, desktopOptions);\n      }.bind(this));\n    }\n  \n    function initSlider($slider, args) {\n      if (isInitialized($slider)) {\n        $slider.slick('unslick');\n      }\n      $slider.slick(args);\n    }\n  \n    function isInitialized($slider) {\n      return $slider.length && $slider.hasClass('slick-initialized');\n    }\n  \n    // Go to slide if selected in the editor\n    function onBlockSelect(id) {\n      var $slide = $('#AnnouncementSlide-' + id);\n      if ($slider.length) {\n        $slider.slick('slickPause');\n      }\n      if ($slide.length) {\n        $slider.slick('slickGoTo', $slide.data('index'));\n      }\n    }\n  \n    function onBlockDeselect(id) {\n      if ($slider.length && isInitialized($slider)) {\n        $slider.slick('slickPlay');\n      }\n    }\n  \n    function unload() {\n      if (isInitialized($slider)) {\n        $slider.slick('unslick');\n      }\n    }\n  \n    return {\n      init: init,\n      onBlockSelect: onBlockSelect,\n      onBlockDeselect: onBlockDeselect,\n      unload: unload\n    };\n  })();\n  \n  theme.predictiveSearch = (function() {\n    var currentString = '';\n    var isLoading = false;\n    var searchTimeout;\n    var namespace = '.predictive';\n  \n    var selectors = {\n      form: '#HeaderSearchForm',\n      input: 'input[type=\"search\"]',\n      wrapper: '.predictive-results',\n  \n      searchButton: '[data-predictive-search-button]',\n  \n      resultDiv: '#PredictiveResults',\n      resultTemplate: '#PredictiveTemplate'\n    };\n  \n    var classes = {\n      isActive: 'predicitive-active'\n    };\n  \n    var keys = {\n      up_arrow: 38,\n      down_arrow: 40,\n      tab: 9\n    };\n  \n    function init() {\n      // Only some languages support predictive search\n      if (document.getElementById('shopify-features')) {\n        var supportedShopifyFeatures = JSON.parse(document.getElementById('shopify-features').innerHTML);\n        if (!supportedShopifyFeatures.predictiveSearch) {\n          return;\n        }\n      }\n  \n      $(selectors.form).attr('autocomplete', 'off');\n      $(selectors.form).on('submit' + namespace, submitSearch);\n  \n      $(selectors.input, selectors.form).on('keyup' + namespace, handleKeyup);\n      $(selectors.searchButton, selectors.wrapper).on('click' + namespace, triggerSearch);\n  \n      // Prep handlebars template\n      var source = $(selectors.resultTemplate).html();\n      resultTemplate = Handlebars.compile(source);\n    }\n  \n    function reset() {\n      $(selectors.wrapper).addClass('hide');\n      clearTimeout(searchTimeout);\n    }\n  \n    function triggerSearch() {\n      $(selectors.form).trigger('submit');\n    }\n  \n    // Append * wildcard to search\n    function submitSearch(evt) {\n      var $form = $(this);\n      evt.preventDefault ? evt.preventDefault() : evt.returnValue = false;\n  \n      var data = $form.serializeArray().reduce(function(obj, item) {\n        obj[item.name] = item.value;\n        return obj;\n      }, {});\n  \n      if (data.q) {\n        data.q += '*';\n      }\n  \n      var query = $.param(data);\n  \n      window.location.href = '/search?' + query;\n      return false;\n    }\n  \n    function handleKeyup(evt) {\n      if (evt.keyCode === keys.up_arrow) {\n        navigationEvent(evt, 'up');\n        return;\n      }\n  \n      if (evt.keyCode === keys.down_arrow) {\n        navigationEvent(evt, 'down');\n        return;\n      }\n  \n      if (evt.keyCode === keys.tab) {\n        return;\n      }\n  \n      search();\n    }\n  \n    function search() {\n      var keyword = $(selectors.input, selectors.form).val();\n  \n      if (keyword === '') {\n        reset();\n        return;\n      }\n  \n      var q = _normalizeQuery(keyword);\n  \n      clearTimeout(searchTimeout);\n      searchTimeout = setTimeout(\n        function () {\n          predictQuery(q);\n        }.bind(this),\n        500\n      );\n    }\n  \n    function predictQuery(q) {\n      if (isLoading) {\n        return;\n      }\n  \n      // Do not re-search the same thing\n      if (currentString === q) {\n        return;\n      }\n  \n      currentString = q;\n      isLoading = true;\n  \n      jQuery.getJSON('/search/suggest.json', {\n        \"q\": q,\n        \"resources\": {\n          \"type\": theme.settings.predictiveSearchType,\n          \"limit\": 4,\n          \"options\": {\n            \"unavailable_products\": \"last\",\n            \"fields\": \"title,product_type,variants.title,vendor\"\n          }\n        }\n      }).done(function(response) {\n        isLoading = false;\n        var data = {};\n        var resultCount = 0;\n  \n        $(selectors.wrapper).removeClass('hide');\n  \n        var resultTypes = Object.entries(response.resources.results);\n  \n        for (var i = resultTypes.length - 1; i >= 0; i--) {\n          var obj = resultTypes[i];\n          var type = obj[0];\n          var results = obj[1];\n          resultCount += results.length;\n  \n          switch(type) {\n            case 'products':\n              data[type] = buildProducts(results);\n              break;\n            case 'collections':\n              data[type] = buildCollections(results);\n              break;\n            default:\n              data[type] = parseResultImages(results);\n              break;\n          }\n        }\n  \n        if (resultCount === 0) {\n          reset();\n        }\n  \n        // Append result markup\n        $(selectors.resultDiv).empty().append(resultTemplate(data));\n      });\n    }\n  \n    function buildProducts(results) {\n      var products = [];\n  \n      for (var i = results.length - 1; i >= 0; i--) {\n        var product = results[i];\n  \n        var new_product = {\n          title: product.title,\n          url: product.url,\n          image: theme.Images.lazyloadImagePath(product.image),\n          vendor: product.vendor,\n          price: theme.Currency.formatMoney(product.price),\n          compare_price_max: theme.Currency.formatMoney(product.compare_at_price_max),\n          on_sale: parseInt(product.compare_at_price_max) > parseInt(product.price),\n          custom_label: _checkCustomLabel(product.tags)\n        };\n  \n        products.push(new_product);\n      }\n  \n      return products;\n    }\n  \n    function buildCollections(results) {\n      var collections = [];\n  \n      for (var i = results.length - 1; i >= 0; i--) {\n        var collection = results[i];\n  \n        var new_collection = {\n          title: collection.title,\n          url: collection.url\n        };\n  \n        collections.push(new_collection);\n      }\n  \n      return collections;\n    }\n  \n    // Overwrite full sized image returned form API\n    // with lazyloading-friendly path\n    function parseResultImages(results) {\n      for (var i = results.length - 1; i >= 0; i--) {\n        if (!results[i].image) {\n          continue;\n        }\n  \n        var image = theme.Images.lazyloadImagePath(results[i].image);\n        results[i].image = image;\n      }\n  \n      return results;\n    }\n  \n    function _checkCustomLabel(tags) {\n      if (!tags.length) {\n        return false;\n      }\n  \n      for (var i = tags.length - 1; i >= 0; i--) {\n        if (tags[i].indexOf('_label_') !== -1) {\n          return tags[i].replace('_label_', '');\n        }\n      }\n  \n      return false;\n    }\n  \n    function _normalizeQuery(string) {\n      if (typeof string !== 'string') {\n        return null;\n      }\n  \n      return string\n        .trim()\n        .replace(/\\ /g, '-')\n        .toLowerCase();\n    }\n  \n    function navigationEvent(evt, direction) {\n  \n    }\n  \n    return {\n      init: init\n    };\n  })();\n  \n  theme.initQuickShop = function() {\n    var ids = [];\n    var $buttons = $('.quick-product__btn');\n    var $products = $('.grid-product');\n  \n    $buttons.each(function() {\n      var id = $(this).data('product-id');\n      var modalId = 'QuickShopModal-' + id;\n      var name = 'quick-modal-' + id;\n  \n      // If another identical modal exists, remove duplicates\n      if (ids.indexOf(id) > -1) {\n        $('.modal--quick-shop[data-product-id=\"'+ id +'\"]').each(function(i) {\n          if (i > 0) {\n            $(this).remove();\n          }\n        });\n        return;\n      }\n  \n      new theme.Modals(modalId, name);\n      ids.push(id);\n    });\n  \n    if ($buttons.length) {\n      $products.on('mouseover', function() {\n        var $el = $(this);\n  \n        // No quick view on mobile breakpoint\n        if (!theme.config.bpSmall) {\n          $el.off('mouseover');\n          var handle = $el.data('product-handle');\n          var $btn = $el.find('.quick-product__btn');\n          theme.preloadProductModal(handle, $btn);\n        }\n      });\n    }\n  };\n  \n  theme.preloadProductModal = function(handle, $btn) {\n    var $holder = $('#QuickShopHolder-' + handle);\n    var url = theme.routes.home + 'products/' + handle + '?view=modal';\n  \n    $holder.load(url + ' .product-section[data-product-handle='+handle+']', function() {\n      sections.register('product-template', theme.Product, $holder);\n      $btn.removeClass('quick-product__btn--not-ready');\n    });\n  }\n  \n  // Video modal will auto-initialize for any anchor link that points to YouTube\n  // MP4 videos must manually be enabled with:\n  //   - .product-video-trigger--mp4 (trigger button)\n  //   - .product-video-mp4-sound video player element (cloned into modal)\n  //     - see media.liquid for example of this\n  theme.videoModal = function() {\n    var youtubePlayer = null;\n    var videoOptions = {\n      width: 1280,\n      height: 720,\n      playerVars: {\n        autohide: 0,\n        autoplay: 1,\n        branding: 0,\n        cc_load_policy: 0,\n        fs: 0,\n        iv_load_policy: 3,\n        modestbranding: 1,\n        playsinline: 1,\n        quality: 'hd720',\n        rel: 0,\n        showinfo: 0,\n        wmode: 'opaque'\n      },\n      events: {\n        onReady: onPlayerReady\n      }\n    };\n  \n    var videoHolderId = 'VideoHolder';\n    var activeVideo = false;\n  \n    var selectors = {\n      videoHolder: '#' + videoHolderId,\n      youtube: 'a[href*=\"youtube.com/watch\"], a[href*=\"youtu.be/\"]',\n      mp4Trigger: '.product-video-trigger--mp4',\n      mp4Player: '.product-video-mp4-sound'\n    };\n  \n    if (!$(selectors.youtube).length && !$(selectors.mp4Trigger).length) {\n      return;\n    }\n  \n    var modal = new theme.Modals('VideoModal', 'video-modal', {\n      closeOffContentClick: true,\n      solid: true\n    });\n  \n    $(selectors.youtube).on('click', triggerYouTubeModal);\n    $(selectors.mp4Trigger).on('click', triggerMp4Modal);\n  \n    // Handle closing video modal\n    $('body').on('modalClose.VideoModal', function() {\n      // Slight timeout so YouTube player is destroyed after the modal closes\n      if (youtubePlayer && activeVideo === 'youtube') {\n        setTimeout(function() {\n          youtubePlayer.destroy();\n        }, 500); // modal close css transition\n      } else {\n        emptyVideoHolder();\n      }\n    });\n  \n    function triggerYouTubeModal(evt) {\n      emptyVideoHolder();\n  \n      evt.preventDefault();\n      theme.LibraryLoader.load('youtubeSdk');\n  \n      if (theme.config.youTubeReady) {\n        startYoutubeOnClick(evt);\n      } else {\n        $('body').on('youTubeReady', function() {\n          startYoutubeOnClick(evt);\n        });\n      }\n    }\n  \n    function triggerMp4Modal(evt) {\n      emptyVideoHolder();\n  \n      var $el = $(evt.currentTarget);\n      var $mp4Player = $el.next(selectors.mp4Player);\n  \n      $mp4Player.clone().removeClass('hide').appendTo(selectors.videoHolder);\n  \n      modal.open(evt);\n  \n      // Play new video element\n      $(selectors.videoHolder).find('video')[0].play();\n  \n      activeVideo = 'mp4';\n    }\n  \n    function startYoutubeOnClick(evt) {\n      var $el = $(evt.currentTarget);\n      var videoId = getYoutubeVideoId($el.attr('href'));\n  \n      var args = $.extend({}, videoOptions, {\n        videoId: videoId\n      });\n  \n      // Disable plays inline on mobile\n      args.playerVars.playsinline = theme.config.bpSmall ? 0 : 1;\n  \n      youtubePlayer = new YT.Player(videoHolderId, args);\n      modal.open(evt);\n  \n      activeVideo = 'youtube';\n    }\n  \n    function onPlayerReady(evt) {\n      evt.target.playVideo();\n    }\n  \n    function getYoutubeVideoId(url) {\n      var regExp = /^.*((youtu.be\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*/;\n      var match = url.match(regExp);\n      return (match&&match[7].length==11)? match[7] : false;\n    }\n  \n    function emptyVideoHolder() {\n      $(selectors.videoHolder).empty();\n    }\n  };\n  \n  theme.RecentlyViewed = (function() {\n    var selectors = {\n      template: '#RecentlyViewedProduct',\n      outputContainer: '#RecentlyViewed-'\n    };\n  \n    var init = false;\n  \n    function RecentlyViewed(container) {\n      var $container = this.$container = $(container);\n      var sectionId = this.sectionId = $container.attr('data-section-id');\n      this.namespace = '.recently-viewed' + sectionId;\n  \n      if (!$(selectors.template).length) {\n        return;\n      }\n  \n      // Lazyload API\n      this.checkVisibility();\n      $(window).on('scroll' + this.namespace, $.throttle(200, this.checkVisibility.bind(this)));\n    };\n  \n    RecentlyViewed.prototype = $.extend({}, RecentlyViewed.prototype, {\n      init: function() {\n        if (init) {\n          return;\n        }\n  \n        init = true;\n  \n        if ($.isEmptyObject(theme.recentlyViewed.recent)) {\n          // No previous history on page load, so bail\n          return;\n        }\n  \n        this.outputContainer = $(selectors.outputContainer + this.sectionId);\n        this.handle = this.$container.attr('data-product-handle');\n  \n        // Request new product info via JS API\n        var promises = [];\n        for (handle in theme.recentlyViewed.recent) {\n          if (handle !== 'undefined') {\n            promises.push(this.getProductInfo(handle));\n          }\n        }\n  \n        Promise.all(promises).then(function(result) {\n          this.setupOutput(result);\n          this.captureProductDetails(result);\n        }.bind(this), function(error) {\n          console.warn('Theme | recently viewed products failed to load');\n        });\n      },\n  \n      checkVisibility: function() {\n        if (theme.isElementVisible(this.$container, 600)) {\n          this.init();\n          $(window).off('scroll' + this.namespace);\n        }\n      },\n  \n      getProductInfo: function(handle) {\n        return new Promise(function(resolve, reject) {\n          if (theme.recentlyViewed.productInfo.hasOwnProperty(handle)) {\n            resolve(theme.recentlyViewed.productInfo[handle]);\n          } else {\n            jQuery.getJSON('/products/'+ handle +'.js', function(product) {\n              resolve(product);\n            });\n          }\n        });\n      },\n  \n      setupOutput: function(products) {\n        var allProducts = [];\n        var data = {};\n        var limit = this.$container.attr('data-recent-count');\n  \n        var i = 0;\n        for (key in products) {\n          var product = products[key];\n          // Ignore current product\n          if (product.handle === this.handle) {\n            continue;\n          }\n  \n          // Ignore undefined key\n          if (typeof product.handle == 'undefined') {\n            continue;\n          }\n  \n          i++;\n  \n          // New or formatted properties\n          product.url_formatted = theme.recentlyViewed.recent[product.handle] ? theme.recentlyViewed.recent[product.handle].url : product.url;\n          product.image_responsive_url = theme.recentlyViewed.recent[product.handle].featuredImage;\n          product.image_aspect_ratio = theme.recentlyViewed.recent[product.handle].aspectRatio;\n          product.on_sale = product.compare_at_price > product.price;\n          product.sold_out = !product.available;\n          product.price_formatted = theme.Currency.formatMoney(product.price, theme.settings.moneyFormat);\n          product.compare_at_price_formatted = theme.Currency.formatMoney(product.compare_at_price, theme.settings.moneyFormat);\n          product.price_min_formatted = theme.Currency.formatMoney(product.price_min, theme.settings.moneyFormat);\n          product.money_saved = theme.Currency.formatMoney((product.compare_at_price - product.price), theme.settings.moneyFormat);\n  \n          // Unit pricing checks first variant\n          var firstVariant = product.variants[0];\n          if (firstVariant && firstVariant.unit_price) {\n            var baseUnit = '';\n  \n            if (firstVariant.unit_price_measurement) {\n              if (firstVariant.unit_price_measurement.reference_value != 1) {\n                baseUnit += firstVariant.unit_price_measurement.reference_value + ' ';\n              }\n              baseUnit += firstVariant.unit_price_measurement.reference_unit;\n            }\n  \n            product.unit_price = theme.Currency.formatMoney(firstVariant.unit_price);\n            if (baseUnit != '') {\n              product.unit_price += '/' + baseUnit;\n            }\n          }\n  \n          allProducts.unshift(product);\n        }\n  \n        data = {\n          items: allProducts.slice(0, limit),\n          grid_item_width: this.$container.attr('data-grid-item-class')\n        };\n  \n        if (allProducts.length === 0) {\n          return;\n        }\n  \n        // Prep handlebars template\n        var source = $(selectors.template).html();\n        var template = Handlebars.compile(source);\n        this.outputContainer.append(template(data));\n  \n        if (AOS) {\n          AOS.refreshHard();\n        }\n      },\n  \n      captureProductDetails: function(products) {\n        for (var i = 0; i < products.length; i++) {\n          var product = products[i];\n          theme.recentlyViewed.productInfo[product.handle] = product;\n        }\n  \n        // Add data to session storage to reduce API requests later\n        if (theme.config.hasSessionStorage) {\n          sessionStorage.setItem('recent-products', JSON.stringify(theme.recentlyViewed.productInfo));\n        }\n      },\n  \n      onUnload: function() {\n        init = false;\n        $('window').off(this.namespace);\n      }\n    });\n  \n    return RecentlyViewed;\n  })();\n  \n  theme.parallaxSections = {};\n  \n  theme.Parallax = (function() {\n    var speed = 7; // higher is slower\n  \n    function parallax(el, args) {\n      this.$container = $(el);\n      this.namespace = args.namespace;\n  \n      if (!this.$container.length) {\n        return;\n      }\n  \n      if (args.desktopOnly) {\n        this.desktopInit();\n      } else {\n        this.init(this.$container, args)\n      }\n    }\n  \n    parallax.prototype = $.extend({}, parallax.prototype, {\n      init: function(desktopOnly) {\n        var $window = this.$window = $(window);\n        var elTop = this.$container.offset().top;\n  \n        $window.on('scroll' + this.namespace, function(evt) {\n          var scrolled = $window.scrollTop();\n          var shiftDistance = (elTop - scrolled) / speed;\n          this.$container.css({\n            'transform': 'translate3d(0, ' + shiftDistance + 'px, 0)'\n          });\n        }.bind(this));\n  \n        // Reinit on resize\n        $window.on('resize' + this.namespace, $.debounce(350, function() {\n          $window.off(this.namespace);\n  \n          if (desktopOnly) {\n            if (!theme.config.bpSmall) {\n              this.init(true);\n              return;\n            }\n          }\n  \n          this.init();\n        }.bind(this)));\n      },\n  \n      desktopInit: function() {\n        if (!theme.config.bpSmall) {\n          this.init(true);\n        }\n  \n        $('body').on('matchSmall', function() {\n          this.destroy();\n        }.bind(this));\n  \n        $('body').on('matchLarge', function() {\n          this.init(true);\n        }.bind(this));\n      },\n  \n      destroy: function() {\n        this.$container.removeAttr('style');\n        this.$window.off(this.namespace);\n      }\n    });\n  \n    return parallax;\n  })();\n  \n  // Select-like popovers for currency and language selection\n  theme.Disclosure = (function() {\n    var selectors = {\n      disclosureList: '[data-disclosure-list]',\n      disclosureToggle: '[data-disclosure-toggle]',\n      disclosureInput: '[data-disclosure-input]',\n      disclosureOptions: '[data-disclosure-option]'\n    };\n  \n    var classes = {\n      listVisible: 'disclosure-list--visible'\n    };\n  \n    function Disclosure($disclosure) {\n      this.$container = $disclosure;\n      this.cache = {};\n      this._cacheSelectors();\n      this._connectOptions();\n      this._connectToggle();\n      this._onFocusOut();\n    }\n  \n    Disclosure.prototype = $.extend({}, Disclosure.prototype, {\n      _cacheSelectors: function() {\n        this.cache = {\n          $disclosureList: this.$container.find(selectors.disclosureList),\n          $disclosureToggle: this.$container.find(selectors.disclosureToggle),\n          $disclosureInput: this.$container.find(selectors.disclosureInput),\n          $disclosureOptions: this.$container.find(selectors.disclosureOptions)\n        };\n      },\n  \n      _connectToggle: function() {\n        this.cache.$disclosureToggle.on(\n          'click',\n          function(evt) {\n            var ariaExpanded =\n              $(evt.currentTarget).attr('aria-expanded') === 'true';\n            $(evt.currentTarget).attr('aria-expanded', !ariaExpanded);\n  \n            this.cache.$disclosureList.toggleClass(classes.listVisible);\n          }.bind(this)\n        );\n      },\n  \n      _connectOptions: function() {\n        this.cache.$disclosureOptions.on(\n          'click',\n          function(evt) {\n            evt.preventDefault();\n            this._submitForm($(evt.currentTarget).data('value'));\n          }.bind(this)\n        );\n      },\n  \n      _onFocusOut: function() {\n        this.cache.$disclosureToggle.on(\n          'focusout',\n          function(evt) {\n            var disclosureLostFocus =\n              this.$container.has(evt.relatedTarget).length === 0;\n  \n            if (disclosureLostFocus) {\n              this._hideList();\n            }\n          }.bind(this)\n        );\n  \n        this.cache.$disclosureList.on(\n          'focusout',\n          function(evt) {\n            var childInFocus =\n              $(evt.currentTarget).has(evt.relatedTarget).length > 0;\n            var isVisible = this.cache.$disclosureList.hasClass(\n              classes.listVisible\n            );\n  \n            if (isVisible && !childInFocus) {\n              this._hideList();\n            }\n          }.bind(this)\n        );\n  \n        this.$container.on(\n          'keyup',\n          function(evt) {\n            if (evt.which !== 27) return;\n            this._hideList();\n            this.cache.$disclosureToggle.focus();\n          }.bind(this)\n        );\n  \n        $('body').on(\n          'click',\n          function(evt) {\n            var isOption = this.$container.has(evt.target).length > 0;\n            var isVisible = this.cache.$disclosureList.hasClass(\n              classes.listVisible\n            );\n  \n            if (isVisible && !isOption) {\n              this._hideList();\n            }\n          }.bind(this)\n        );\n      },\n  \n      _submitForm: function(value) {\n        $('body').addClass('unloading');\n        this.cache.$disclosureInput.val(value);\n        this.$container.parents('form').submit();\n      },\n  \n      _hideList: function() {\n        this.cache.$disclosureList.removeClass(classes.listVisible);\n        this.cache.$disclosureToggle.attr('aria-expanded', false);\n      },\n  \n      unload: function() {\n        this.cache.$disclosureOptions.off();\n        this.cache.$disclosureToggle.off();\n        this.cache.$disclosureList.off();\n        this.$container.off();\n      }\n    });\n  \n    return Disclosure;\n  })();\n  \n  theme.ProductMedia = (function() {\n    var modelJsonSections = {};\n    var models = {};\n    var xrButtons = {};\n  \n    var selectors = {\n      mediaGroup: '[data-product-single-media-group]',\n      xrButton: '[data-shopify-xr]'\n    };\n  \n    function init(modelViewerContainers, sectionId) {\n      modelJsonSections[sectionId] = {\n        loaded: false\n      };\n  \n      modelViewerContainers.each(function(index) {\n        var $modelViewerContainer = $(this);\n        var mediaId = $modelViewerContainer.data('media-id');\n        var $modelViewerElement = $(\n          $modelViewerContainer.find('model-viewer')[0]\n        );\n        var modelId = $modelViewerElement.data('model-id');\n  \n        if (index === 0) {\n          var $xrButton = $modelViewerContainer\n            .closest(selectors.mediaGroup)\n            .find(selectors.xrButton);\n          xrButtons[sectionId] = {\n            $element: $xrButton,\n            defaultId: modelId\n          };\n        }\n  \n        models[mediaId] = {\n          modelId: modelId,\n          sectionId: sectionId,\n          $container: $modelViewerContainer,\n          $element: $modelViewerElement\n        };\n      });\n  \n      window.Shopify.loadFeatures([\n        {\n          name: 'shopify-xr',\n          version: '1.0',\n          onLoad: setupShopifyXr\n        },\n        {\n          name: 'model-viewer-ui',\n          version: '1.0',\n          onLoad: setupModelViewerUi\n        }\n      ]);\n  \n      theme.LibraryLoader.load('modelViewerUiStyles');\n    }\n  \n    function setupShopifyXr(errors) {\n      if (errors) return;\n  \n      if (!window.ShopifyXR) {\n        document.addEventListener('shopify_xr_initialized', function() {\n          setupShopifyXr();\n        });\n        return;\n      }\n  \n      for (var sectionId in modelJsonSections) {\n        if (modelJsonSections.hasOwnProperty(sectionId)) {\n          var modelSection = modelJsonSections[sectionId];\n  \n          if (modelSection.loaded) continue;\n          var $modelJson = $('#ModelJson-' + sectionId);\n  \n          window.ShopifyXR.addModels(JSON.parse($modelJson.html()));\n          modelSection.loaded = true;\n        }\n      }\n      window.ShopifyXR.setupXRElements();\n    }\n  \n    function setupModelViewerUi(errors) {\n      if (errors) return;\n  \n      for (var key in models) {\n        if (models.hasOwnProperty(key)) {\n          var model = models[key];\n          if (!model.modelViewerUi && Shopify) {\n            model.modelViewerUi = new Shopify.ModelViewerUI(model.$element);\n          }\n          setupModelViewerListeners(model);\n        }\n      }\n    }\n  \n    function setupModelViewerListeners(model) {\n      var xrButton = xrButtons[model.sectionId];\n      model.$container.on('mediaVisible', function() {\n        xrButton.$element.attr('data-shopify-model3d-id', model.modelId);\n        if (theme.config.isTouch) return;\n        model.modelViewerUi.play();\n      });\n  \n      model.$container\n        .on('mediaHidden', function() {\n          xrButton.$element.attr('data-shopify-model3d-id', xrButton.defaultId);\n          model.modelViewerUi.pause();\n        })\n        .on('xrLaunch', function() {\n          model.modelViewerUi.pause();\n        });\n    }\n  \n    function removeSectionModels(sectionId) {\n      for (var key in models) {\n        if (models.hasOwnProperty(key)) {\n          var model = models[key];\n          if (model.sectionId === sectionId) {\n            delete models[key];\n          }\n        }\n      }\n      delete modelJsonSections[sectionId];\n    }\n  \n    return {\n      init: init,\n      removeSectionModels: removeSectionModels\n    };\n  })();\n  \n\n  theme.collectionTemplate = (function() {\n    var isAnimating = false;\n  \n    var selectors = {\n      collectionGrid: '.collection-grid__wrapper',\n      sidebar: '#CollectionSidebar',\n      activeTagList: '.tag-list--active-tags',\n      tags: '.tag-list a',\n      filters: '.collection-filter'\n    };\n  \n    var settings = {\n      combineTags: $(selectors.sidebar).data('combine-tags')\n    };\n  \n    var classes = {\n      activeTag: 'tag--active',\n      removeTagParent: 'tag--remove'\n    };\n  \n    function init() {\n      // Ajax pagination\n      $(window).on('popstate', function(state) {\n        if (state) {\n          getNewCollectionContent(location.href);\n        }\n      });\n  \n      // Set mobile top value for filters if sticky header enabled\n      if (theme.config.stickyHeader) {\n        setFilterStickyPosition();\n        $(window).on('resize', $.debounce(150, setFilterStickyPosition));\n      }\n  \n      initTagClicks();\n    }\n  \n    function initTagClicks() {\n      $('body').on('click', selectors.tags, function(evt) {\n        var $el = $(this);\n        if (theme.FilterDrawer) {\n          theme.FilterDrawer.close();\n        }\n  \n        if ($el.hasClass('no-ajax')) {\n          return;\n        }\n  \n        evt.preventDefault();\n        if (isAnimating) {\n          return;\n        }\n  \n        isAnimating = true;\n  \n        var $el = $(evt.currentTarget);\n        var $parent = $el.parent();\n        var newUrl = $el.attr('href');\n  \n        if (settings.combineTags) {\n          if ($parent.hasClass(classes.activeTag)) {\n            $parent.removeClass(classes.activeTag);\n          } else {\n            $parent.addClass(classes.activeTag);\n  \n            // If adding a tag, show new tag right away.\n            // Otherwise, remove it before ajax finishes\n            if ($el.parent('li').hasClass(classes.removeTagParent)) {\n              $(this).parent().remove();\n            } else {\n              $(selectors.activeTagList).append('<li class=\"tag tag--remove\"><a class=\"btn btn--small\">' + $el.text() + '</a></li>');\n            }\n          }\n        } else {\n          $(selectors.tags).parent().removeClass(classes.activeTag);\n          $parent.addClass(classes.activeTag);\n        }\n  \n        updateScroll(true);\n  \n        history.pushState({}, '', newUrl);\n        $(selectors.collectionGrid).addClass('unload');\n        getNewCollectionContent(newUrl);\n      });\n    }\n  \n    function updateScroll(animate) {\n      var scrollTo;\n      if (theme.config.bpSmall) {\n        // 60 is ~ height of sticky filters\n        scrollTo = $('[data-scroll-to]').offset().top - 60;\n      } else {\n        scrollTo = $('#CollectionAjaxResult').offset().top + 1;\n      }\n  \n      if (theme.config.stickyHeader) {\n        var heightOfStickyNav = $('.site-header').outerHeight(true);\n        scrollTo = scrollTo - heightOfStickyNav;\n      }\n  \n      if (animate) {\n        $('html, body').animate({ scrollTop: scrollTo }, 300);\n      } else {\n        $('html, body').scrollTop(scrollTo);\n      }\n    }\n  \n    function setFilterStickyPosition() {\n      var headerHeight = $('.site-header').outerHeight(true);\n      $(selectors.filters).css('top', headerHeight + 10);\n    }\n  \n    function getNewCollectionContent(url) {\n      url = url.indexOf('?') === -1 ? (url + '?view=ajax') : (url + '&view=ajax');\n  \n      $('#CollectionAjaxResult').load(url + ' #CollectionAjaxContent', function() {\n        isAnimating = false;\n        theme.reinitSection('collection-template');\n        theme.collectionTemplate.reinit();\n      }.bind(this));\n    }\n  \n    function reinit() {\n      settings.combineTags = $(selectors.sidebar).data('combine-tags');\n  \n      updateScroll(false);\n  \n      theme.reinitProductGridItem();\n  \n      // Trigger resize for sticky sidebar styles to update\n      $('body').trigger('resize');\n    }\n  \n    return {\n      init: init,\n      reinit: reinit\n    };\n  })();\n  \n  theme.customerTemplates = (function() {\n  \n    function initEventListeners() {\n      // Show reset password form\n      $('#RecoverPassword').on('click', function(evt) {\n        evt.preventDefault();\n        toggleRecoverPasswordForm();\n      });\n  \n      // Hide reset password form\n      $('#HideRecoverPasswordLink').on('click', function(evt) {\n        evt.preventDefault();\n        toggleRecoverPasswordForm();\n      });\n    }\n  \n    /**\n     *\n     *  Show/Hide recover password form\n     *\n     */\n    function toggleRecoverPasswordForm() {\n      $('#RecoverPasswordForm').toggleClass('hide');\n      $('#CustomerLoginForm').toggleClass('hide');\n    }\n  \n    /**\n     *\n     *  Show reset password success message\n     *\n     */\n    function resetPasswordSuccess() {\n      var $formState = $('.reset-password-success');\n  \n      // check if reset password form was successfully submitted\n      if (!$formState.length) {\n        return;\n      }\n  \n      // show success message\n      $('#ResetSuccess').removeClass('hide');\n    }\n  \n    /**\n     *\n     *  Show/hide customer address forms\n     *\n     */\n    function customerAddressForm() {\n      var $newAddressForm = $('#AddressNewForm');\n      var $addressForms = $('.js-address-form');\n  \n      if (!$newAddressForm.length || !$addressForms.length) {\n        return;\n      }\n  \n      if (Shopify) {\n        $('.js-address-country').each(function() {\n          var $container = $(this);\n          var countryId = $container.data('country-id');\n          var provinceId = $container.data('province-id');\n          var provinceContainerId = $container.data('province-container-id');\n  \n          if (Shopify) {\n            new Shopify.CountryProvinceSelector(\n              countryId,\n              provinceId,\n              {\n                hideElement: provinceContainerId\n              }\n            );\n          }\n        });\n      }\n  \n      // Toggle new/edit address forms\n      $('.address-new-toggle').on('click', function() {\n        $newAddressForm.toggleClass('hide');\n      });\n  \n      $('.address-edit-toggle').on('click', function() {\n        var formId = $(this).data('form-id');\n        $('#EditAddress_' + formId).toggleClass('hide');\n      });\n  \n      $('.address-delete').on('click', function() {\n        var $el = $(this);\n        var formId = $el.data('form-id');\n        var confirmMessage = $el.data('confirm-message');\n  \n        if (confirm(confirmMessage || 'Are you sure you wish to delete this address?')) {\n          if (Shopify) {\n            Shopify.postLink('/account/addresses/' + formId, {parameters: {_method: 'delete'}});\n          }\n        }\n      });\n    }\n  \n    /**\n     *\n     *  Check URL for reset password hash\n     *\n     */\n    function checkUrlHash() {\n      var hash = window.location.hash;\n  \n      // Allow deep linking to recover password form\n      if (hash === '#recover') {\n        toggleRecoverPasswordForm();\n      }\n    }\n  \n    return {\n      init: function() {\n        checkUrlHash();\n        initEventListeners();\n        resetPasswordSuccess();\n        customerAddressForm();\n      }\n    };\n  })();\n  \n\n  theme.Product = (function() {\n  \n    var classes = {\n      onSale: 'on-sale',\n      disabled: 'disabled',\n      isModal: 'is-modal',\n      loading: 'loading',\n      loaded: 'loaded',\n      hidden: 'hide',\n      interactable: 'video-interactable',\n      visuallyHide: 'visually-invisible'\n    };\n  \n  \n  \n    var selectors = {\n      productVideo: '.product__video',\n      videoParent: '.product__video-wrapper',\n      currentSlide: '.slick-current',\n      startingSlide: '.starting-slide'\n    };\n  \n    var youtubeReady;\n    var videos = {};\n    var youtubePlayers = [];\n    var youtubeVideoOptions = {\n      height: '480',\n      width: '850',\n      playerVars :{\n        autohide: 0,\n        autoplay: 0,\n        branding: 0,\n        cc_load_policy: 0,\n        controls: 0,\n        fs: 0,\n        iv_load_policy: 3,\n        modestbranding: 1,\n        playsinline: 1,\n        quality: 'hd720',\n        rel: 0,\n        showinfo: 0,\n        wmode: 'opaque'\n      }\n    };\n  \n    function onVideoPlayerReady(evt, id) {\n      var $player = $('#' + id);\n      var playerId = $player.attr('id');\n      youtubePlayers[playerId] = evt.target; // update stored player\n      var player = youtubePlayers[playerId];\n  \n      setParentAsLoading($player);\n  \n      if (videos[playerId].style === 'muted') {\n        youtubePlayers[playerId].mute();\n      } else {\n        setParentAsLoaded($player);\n      }\n  \n      // If first slide or only photo, start video\n      if ($player.closest(selectors.startingSlide).length || $player.data('image-count') === 1) {\n        if (videos[playerId].style === 'muted') {\n          youtubePlayers[playerId].playVideo();\n          initCheckVisibility(playerId);\n        }\n      }\n    }\n  \n    function initCheckVisibility(playerId) {\n      // Add out of view pausing\n      videoVisibilityCheck(playerId);\n      $(window).on('scroll.' + playerId, {id: playerId}, $.throttle(150, videoVisibilityCheck));\n    }\n  \n    function videoVisibilityCheck(id) {\n      var playerId;\n  \n      if (typeof id === 'string') {\n        playerId = id;\n      } else {\n        // Data comes in as part of the scroll event\n        if (!id.data) {return}\n        playerId = id.data.id;\n      }\n  \n      if (theme.isElementVisible($('#' + playerId))) {\n        if (videos[playerId] && videos[playerId].style === 'unmuted') {\n          return;\n        }\n        playVisibleVideo(playerId);\n      } else {\n        pauseHiddenVideo(playerId);\n      }\n    }\n  \n    function playVisibleVideo(id) {\n      if (youtubePlayers[id] && typeof youtubePlayers[id].playVideo === 'function') {\n        youtubePlayers[id].playVideo();\n      }\n    }\n  \n    function pauseHiddenVideo(id) {\n      if (youtubePlayers[id] && typeof youtubePlayers[id].pauseVideo === 'function') {\n        youtubePlayers[id].pauseVideo();\n      }\n    }\n  \n    function onVideoStateChange(evt, id) {\n      var $player = $('#' + id);\n      var playerId = $player.attr('id');\n      var player = youtubePlayers[playerId];\n  \n      switch (evt.data) {\n        case -1: // unstarted\n          // Handle low power state on iOS by checking if\n          // video is reset to unplayed after attempting to buffer\n          if (videos[playerId].attemptedToPlay) {\n            setParentAsLoaded($player);\n            setVideoToBeInteractedWith($player);\n          }\n          break;\n        case 0: // ended\n          if (videos[playerId] && videos[playerId].loop) {\n            player.playVideo();\n          }\n          break;\n        case 1: // playing\n          setParentAsLoaded($player);\n          break;\n        case 3: // buffering\n          videos[playerId].attemptedToPlay = true;\n          break;\n      }\n    }\n  \n    function setParentAsLoading($el) {\n      $el\n        .closest(selectors.videoParent)\n        .addClass(classes.loading);\n    }\n  \n    function setParentAsLoaded($el) {\n      $el\n        .closest(selectors.videoParent)\n        .removeClass(classes.loading)\n        .addClass(classes.loaded);\n    }\n  \n    function setVideoToBeInteractedWith($el) {\n      $el\n        .closest(selectors.videoParent)\n        .addClass(classes.interactable);\n    }\n  \n    function Product(container) {\n      var $container = this.$container = $(container);\n      var sectionId = this.sectionId = $container.attr('data-section-id');\n  \n      this.inModal = $container.closest('.modal').length;\n      this.$modal;\n  \n      this.settings = {\n        enableHistoryState: $container.data('enable-history-state') || false,\n        namespace: '.product-' + sectionId,\n        inventory: $container.data('inventory') || false,\n        incomingInventory: $container.data('incoming-inventory') || false,\n        modalInit: false,\n        slickMainInitialized: false,\n        slickThumbInitialized: false,\n        thumbArrows: false,\n        thumbVertical: false,\n        hasImages: true,\n        hasMultipleImages: false,\n        imageSetName: null,\n        imageSetIndex: null,\n        currentImageSet: null,\n        has3d: false,\n        imageSize: '620x',\n        videoLooping: $container.data('video-looping')\n      };\n  \n      // Overwrite some settings when loaded in modal\n      if (this.inModal) {\n        this.settings.enableHistoryState = false;\n        this.settings.namespace = '.product-' + sectionId + '-modal';\n        this.$modal = $('#QuickShopModal-' + sectionId);\n      }\n  \n      this.selectors = {\n        variantsJson: 'VariantsJson-' + sectionId,\n        currentVariantJson: 'CurrentVariantJson-' + sectionId,\n  \n        video: 'ProductVideo-' + sectionId,\n        media: '[data-product-media-type-model]',\n        closeMedia: '.product-single__close-media',\n        photoThumbs: '.product__thumb-' + sectionId,\n        thumbSlider: '#ProductThumbs-' + sectionId,\n        mainSlider: '#ProductPhotos-' + sectionId,\n        imageContainer: '[data-product-images]',\n        productImageMain: '.product-image-main--' + sectionId,\n        dotsContainer: '.product__photo-dots--' + sectionId,\n  \n        priceWrapper: '.product__price-wrap-' + sectionId,\n        price: '#ProductPrice-' + sectionId,\n        comparePrice: '#ComparePrice-' + sectionId,\n        savePrice: '#SavePrice-' + sectionId,\n        priceA11y: '#PriceA11y-' + sectionId,\n        comparePriceA11y: '#ComparePriceA11y-' + sectionId,\n        unitWrapper: '.product__unit-price-wrapper--' + sectionId,\n        unitPrice: '.product__unit-price--' + sectionId,\n        unitPriceBaseUnit: '.product__unit-base--' + sectionId,\n        sku: '#Sku-' + sectionId,\n        inventory: '#ProductInventory-' + sectionId,\n        incomingInventory: '#ProductIncomingInventory-' + sectionId,\n  \n        addToCart: '#AddToCart-' + sectionId,\n        addToCartText: '#AddToCartText-' + sectionId,\n  \n        originalSelectorId: '#ProductSelect-' + sectionId,\n        singleOptionSelector: '.variant__input-' + sectionId,\n        variantColorSwatch: '.variant__input--color-swatch-' + sectionId,\n  \n        modalFormHolder: '#ProductFormHolder-' + sectionId,\n        formContainer: '#AddToCartForm-' + sectionId,\n        availabilityContainer: 'StoreAvailabilityHolder-' + sectionId\n      };\n  \n      this.$mainSlider = $(this.selectors.mainSlider);\n      this.$thumbSlider = $(this.selectors.thumbSlider);\n      this.$firstProductImage = this.$mainSlider.find('img').first();\n  \n      if (!this.$firstProductImage.length) {\n        this.settings.hasImages = false;\n      }\n  \n      this.settings.imageSetName = this.$mainSlider.find('[data-set-name]').data('set-name');\n  \n      this.init();\n    }\n  \n    Product.prototype = $.extend({}, Product.prototype, {\n      init: function() {\n        if (this.inModal) {\n          this.$container.addClass(classes.isModal);\n          $('body')\n            .off('modalOpen.QuickShopModal-' + this.sectionId)\n            .off('modalClose.QuickShopModal-' + this.sectionId);\n          $('body').on('modalOpen.QuickShopModal-' + this.sectionId, this.openModalProduct.bind(this));\n          $('body').on('modalClose.QuickShopModal-' + this.sectionId, this.closeModalProduct.bind(this));\n        }\n  \n        if (!this.inModal) {\n          this.stringOverrides();\n          this.formSetup();\n          this.productSetup();\n  \n          this.checkIfVideos();\n          this.createImageCarousels();\n          this.customMediaListners();\n  \n          // Add product id to recently viewed array\n          this.addIdToRecentlyViewed();\n        }\n      },\n  \n      formSetup: function() {\n        // Determine how to handle variant availability selectors\n        if (theme.settings.dynamicVariantsEnable) {\n          this.$variantSelectors = $(this.selectors.formContainer).find(this.selectors.singleOptionSelector);\n        }\n  \n        this.initQtySelector();\n        this.initAjaxProductForm();\n        this.availabilitySetup();\n        this.initVariants();\n  \n        // We know the current variant now so setup image sets\n        if (this.settings.imageSetName) {\n          this.updateImageSet();\n        }\n      },\n  \n      availabilitySetup: function() {\n        var container = document.getElementById(this.selectors.availabilityContainer);\n        if (container) {\n          this.storeAvailability = new theme.StoreAvailability(container);\n        }\n      },\n  \n      productSetup: function() {\n        this.setImageSizes();\n        this.initImageSwitch();\n        this.initImageZoom();\n        this.initModelViewerLibraries();\n        this.initShopifyXrLaunch();\n      },\n  \n      addIdToRecentlyViewed: function() {\n        var handle = this.$container.attr('data-product-handle');\n        var url = this.$container.attr('data-product-url');\n        var aspectRatio = this.$container.attr('data-aspect-ratio');\n        var featuredImage = this.$container.attr('data-img-url');\n  \n        // Remove current product if already in set of recent\n        if (theme.recentlyViewed.recent.hasOwnProperty(handle)) {\n          delete theme.recentlyViewed.recent[handle];\n        }\n  \n        // Add it back to the end\n        theme.recentlyViewed.recent[handle] = {\n          url: url,\n          aspectRatio: aspectRatio,\n          featuredImage: featuredImage\n        };\n  \n        if (theme.config.hasLocalStorage) {\n          window.localStorage.setItem('theme-recent', JSON.stringify(theme.recentlyViewed.recent));\n        }\n      },\n  \n      stringOverrides: function() {\n        theme.productStrings = theme.productStrings || {};\n        $.extend(theme.strings, theme.productStrings);\n      },\n  \n      initVariants: function() {\n        if (!document.getElementById(this.selectors.variantsJson)) {\n          return;\n        }\n  \n        this.variantsObject = JSON.parse(document.getElementById(this.selectors.variantsJson).innerHTML);\n  \n        var options = {\n          $container: this.$container,\n          enableHistoryState: this.settings.enableHistoryState,\n          singleOptionSelector: this.selectors.singleOptionSelector,\n          originalSelectorId: this.selectors.originalSelectorId,\n          variants: this.variantsObject\n        };\n  \n        if ($(this.selectors.variantColorSwatch).length) {\n          $(this.selectors.variantColorSwatch).on('change', function(evt) {\n            var $el = $(evt.currentTarget);\n            var color = $el.data('color-name');\n            var index = $el.data('color-index');\n            this.updateColorName(color, index);\n          }.bind(this));\n        }\n  \n        this.variants = new theme.Variants(options);\n  \n        // Product availability on page load\n        if (this.storeAvailability) {\n          var variant_id = this.variants.currentVariant ? this.variants.currentVariant.id : this.variants.variants[0].id;\n  \n          this.storeAvailability.updateContent(variant_id);\n          this.$container.on('variantChange' + this.settings.namespace, this.updateAvailability.bind(this));\n        }\n  \n        this.$container\n          .on('variantChange' + this.settings.namespace, this.updateCartButton.bind(this))\n          .on('variantImageChange' + this.settings.namespace, this.updateVariantImage.bind(this))\n          .on('variantPriceChange' + this.settings.namespace, this.updatePrice.bind(this))\n          .on('variantUnitPriceChange' + this.settings.namespace, this.updateUnitPrice.bind(this));\n  \n        if ($(this.selectors.sku).length) {\n          this.$container.on('variantSKUChange' + this.settings.namespace, this.updateSku.bind(this));\n        }\n        if (this.settings.inventory || this.settings.incomingInventory) {\n          this.$container.on('variantChange' + this.settings.namespace, this.updateInventory.bind(this));\n        }\n  \n        // Update individual variant availability on each selection\n        if (theme.settings.dynamicVariantsEnable && document.getElementById(this.selectors.currentVariantJson)) {\n          this.currentVariantObject = JSON.parse(document.getElementById(this.selectors.currentVariantJson).innerHTML);\n  \n          this.$variantSelectors.on('change' + this.settings.namespace, this.updateVariantAvailability.bind(this));\n  \n          // Set default state based on current selected variant\n          this.setCurrentVariantAvailability(this.currentVariantObject, true);\n        }\n  \n        if (this.settings.imageSetName) {\n          this.settings.imageSetIndex = $(this.selectors.formContainer).find('.variant-input-wrap[data-handle=\"'+this.settings.imageSetName+'\"]').data('index');\n          this.$container.on('variantChange' + this.settings.namespace, this.updateImageSet.bind(this))\n        }\n      },\n  \n      initQtySelector: function() {\n        this.$container.find('.js-qty__wrapper').each(function() {\n          new theme.QtySelector($(this), {\n            namespace: '.product'\n          });\n        });\n      },\n  \n      initAjaxProductForm: function() {\n        if (theme.settings.cartType === 'drawer') {\n          new theme.AjaxProduct($(this.selectors.formContainer));\n        }\n      },\n  \n      /*============================================================================\n        Dynamic variant availability\n          - To disable, set dynamicVariantsEnable to false in theme.liquid\n      ==============================================================================*/\n      setCurrentVariantAvailability: function(variant) {\n        var valuesToEnable = {\n          option1: [],\n          option2: [],\n          option3: []\n        };\n  \n        // Disable all options to start\n        this.disableVariantGroup($(this.selectors.formContainer).find('.variant-input-wrap'));\n  \n        // Combine all available variants\n        var availableVariants = this.variantsObject.filter(function(el) {\n          if (variant.id === el.id) {\n            return false;\n          }\n  \n          // Option 1\n          if (variant.option2 === el.option2 && variant.option3 === el.option3) {\n            return true;\n          }\n  \n          // Option 2\n          if (variant.option1 === el.option1 && variant.option3 === el.option3) {\n            return true;\n          }\n  \n          // Option 3\n          if (variant.option1 === el.option1 && variant.option2 === el.option2) {\n            return true;\n          }\n        });\n  \n  \n        // IE11 can't handle shortform of {variant} so extra step is needed\n        var variantObject = {\n          variant: variant\n        };\n  \n        availableVariants = Object.assign({}, variantObject, availableVariants);\n  \n        // Loop through each available variant to gather variant values\n        for (var property in availableVariants) {\n          if (availableVariants.hasOwnProperty(property)) {\n            var item = availableVariants[property];\n            var option1 = item.option1;\n            var option2 = item.option2;\n            var option3 = item.option3;\n  \n            if (option1) {\n              if (valuesToEnable.option1.indexOf(option1) === -1) {\n                valuesToEnable.option1.push(option1);\n              }\n            }\n            if (option2) {\n              if (valuesToEnable.option2.indexOf(option2) === -1) {\n                valuesToEnable.option2.push(option2);\n              }\n            }\n            if (option3) {\n              if (valuesToEnable.option3.indexOf(option3) === -1) {\n                valuesToEnable.option3.push(option3);\n              }\n            }\n          }\n        }\n  \n        // Have values to enable, separated by option index\n        if (valuesToEnable.option1.length) {\n          this.enableVariantOptionByValue(valuesToEnable.option1, 'option1');\n        }\n        if (valuesToEnable.option2.length) {\n          this.enableVariantOptionByValue(valuesToEnable.option2, 'option2');\n        }\n        if (valuesToEnable.option3.length) {\n          this.enableVariantOptionByValue(valuesToEnable.option3, 'option3');\n        }\n      },\n  \n      updateVariantAvailability: function(evt, value, index) {\n        if (value && index) {\n          var newVal = value;\n          var optionIndex = index;\n        } else {\n          var $el = $(evt.currentTarget);\n          var newVal = $el.val() ? $el.val() : evt.currentTarget.value;\n          var optionIndex = $el.data('index');\n        }\n  \n        var variants = this.variantsObject.filter(function(el) {\n          return el[optionIndex] === newVal;\n        });\n  \n        // Disable all buttons/dropdown options that aren't the current index\n        $(this.selectors.formContainer).find('.variant-input-wrap').each(function(index, el) {\n          var $group = $(el);\n          var currentOptionIndex = $group.data('index');\n  \n          if (currentOptionIndex !== optionIndex) {\n            // Disable all options as a starting point\n            this.disableVariantGroup($group);\n  \n            // Loop through legit available options and enable\n            for (var i = 0; i < variants.length; i++) {\n              this.enableVariantOption($group, variants[i][currentOptionIndex]);\n            }\n          }\n        }.bind(this));\n      },\n  \n      disableVariantGroup: function($group) {\n        if (theme.settings.dynamicVariantType === 'dropdown') {\n          $group.find('option').prop('disabled', true)\n        } else {\n          $group.find('input').prop('disabled', true);\n          $group.find('label').toggleClass('disabled', true);\n        }\n      },\n  \n      enableVariantOptionByValue: function(array, index) {\n        var $group = $(this.selectors.formContainer).find('.variant-input-wrap[data-index=\"'+ index +'\"]');\n  \n        for (var i = 0; i < array.length; i++) {\n          this.enableVariantOption($group, array[i]);\n        }\n      },\n  \n      enableVariantOption: function($group, value) {\n        // Selecting by value so escape it\n        value = value.replace(/([ #;&,.+*~\\':\"!^$[\\]()=>|\\/@])/g,'\\\\$1');\n  \n        if (theme.settings.dynamicVariantType === 'dropdown') {\n          $group.find('option[value=\"'+ value +'\"]').prop('disabled', false);\n        } else {\n          var $buttonGroup = $group.find('.variant-input[data-value=\"'+ value +'\"]');\n          $buttonGroup.find('input').prop('disabled', false);\n          $buttonGroup.find('label').toggleClass('disabled', false);\n        }\n      },\n  \n      /*============================================================================\n        Variant change methods\n      ==============================================================================*/\n      updateColorName: function(color, index) {\n        // Updates on radio button change, not variant.js\n        $('#VariantColorLabel-' + this.sectionId + '-' + index).text(color);\n      },\n  \n      updateCartButton: function(evt) {\n        var variant = evt.variant;\n  \n        if (variant) {\n          if (variant.available) {\n            // Available, enable the submit button and change text\n            $(this.selectors.addToCart).removeClass(classes.disabled).prop('disabled', false);\n            var defaultText = $(this.selectors.addToCartText).data('default-text');\n            $(this.selectors.addToCartText).html(defaultText);\n          } else {\n            // Sold out, disable the submit button and change text\n            $(this.selectors.addToCart).addClass(classes.disabled).prop('disabled', true);\n            $(this.selectors.addToCartText).html(theme.strings.soldOut);\n          }\n        } else {\n          // The variant doesn't exist, disable submit button\n          $(this.selectors.addToCart).addClass(classes.disabled).prop('disabled', true);\n          $(this.selectors.addToCartText).html(theme.strings.unavailable);\n        }\n      },\n  \n      updatePrice: function(evt) {\n        var variant = evt.variant;\n  \n        if (variant) {\n          // Regular price\n          $(this.selectors.price).html(theme.Currency.formatMoney(variant.price, theme.settings.moneyFormat)).show();\n  \n          // Sale price, if necessary\n          if (variant.compare_at_price > variant.price) {\n            $(this.selectors.comparePrice).html(theme.Currency.formatMoney(variant.compare_at_price, theme.settings.moneyFormat));\n            $(this.selectors.priceWrapper).removeClass('hide');\n            $(this.selectors.price).addClass(classes.onSale);\n            $(this.selectors.comparePriceA11y).attr('aria-hidden', 'false');\n            $(this.selectors.priceA11y).attr('aria-hidden', 'false');\n  \n            var savings = variant.compare_at_price - variant.price;\n  \n            if (theme.settings.saveType == 'percent') {\n              savings = Math.round(((savings) * 100) / variant.compare_at_price) + '%';\n            } else {\n              savings = theme.Currency.formatMoney(savings, theme.settings.moneyFormat);\n            }\n  \n            $(this.selectors.savePrice)\n              .removeClass('hide')\n              .html(theme.strings.savePrice.replace('[saved_amount]', savings));\n          } else {\n            $(this.selectors.priceWrapper).addClass('hide');\n            $(this.selectors.price).removeClass(classes.onSale);\n            $(this.selectors.comparePriceA11y).attr('aria-hidden', 'true');\n            $(this.selectors.priceA11y).attr('aria-hidden', 'true');\n            $(this.selectors.savePrice).addClass('hide')\n          }\n        }\n      },\n  \n      updateUnitPrice: function(evt) {\n        var variant = evt.variant;\n  \n        if (variant && variant.unit_price) {\n          $(this.selectors.unitPrice).html(theme.Currency.formatMoney(variant.unit_price, theme.settings.moneyFormat));\n          $(this.selectors.unitPriceBaseUnit).text(theme.Currency.getBaseUnit(variant));\n          $(this.selectors.unitWrapper).removeClass('hide').removeClass(classes.visuallyHide);\n        } else {\n          $(this.selectors.unitWrapper).addClass(classes.visuallyHide);\n        }\n      },\n  \n      updateImageSet: function(evt) {\n        // If called directly, use current variant\n        var variant = evt ? evt.variant : (this.variants ? this.variants.currentVariant : null);\n        if (!variant) {\n          return;\n        }\n  \n        var groupIndex = this.settings.imageSetIndex;\n        if (!groupIndex) {\n          return;\n        }\n  \n        var setValue = this.getImageSetName(variant[groupIndex]);\n  \n        // Already on the current image group\n        if (this.settings.currentImageSet === setValue) {\n          return;\n        }\n  \n        var set = this.settings.imageSetName + '_' + setValue;\n  \n        if (this.settings.slickMainInitialized) {\n          this.$mainSlider.slick('slickUnfilter');\n          this.$mainSlider.slick('slickFilter', '[data-group=\"'+set+'\"]').slick('refresh');\n        }\n        if (this.settings.slickThumbInitialized) {\n          this.$thumbSlider.slick('slickUnfilter');\n          this.$thumbSlider.slick('slickFilter', '[data-group=\"'+set+'\"]').slick('refresh');\n        }\n  \n        this.settings.currentImageSet = setValue;\n      },\n  \n      getImageSetName: function(string) {\n        return string.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/-$/, '').replace(/^-/, '');\n      },\n  \n      updateSku: function(evt) {\n        var variant = evt.variant;\n        var newSku = '';\n  \n        if (variant) {\n          if (variant.sku) {\n            newSku = variant.sku;\n          }\n  \n          $(this.selectors.sku).html(newSku);\n        }\n      },\n  \n      updateInventory: function(evt) {\n        var variant = evt.variant;\n  \n        // Hide stock if no inventory management or policy is continue\n        if (!variant || !variant.inventory_management || variant.inventory_policy === 'continue') {\n          this.toggleInventoryQuantity(false);\n          this.toggleIncomingInventory(false);\n          return;\n        }\n  \n        if (variant.inventory_management === 'shopify' && window.inventories && window.inventories[this.sectionId]) {\n          variantInventoryObject = window.inventories[this.sectionId][variant.id];\n          var quantity = variantInventoryObject.quantity;\n          var showInventory = true;\n          var showIncomingInventory = false;\n  \n          if (quantity <= 0 || quantity > theme.settings.inventoryThreshold) {\n            showInventory = false;\n          }\n  \n          this.toggleInventoryQuantity(showInventory, quantity);\n  \n          // Only show incoming inventory when:\n          // - inventory notice itself is hidden\n          // - have incoming inventory\n          // - current quantity is below theme setting threshold\n          if (!showInventory && variantInventoryObject.incoming && quantity <= theme.settings.inventoryThreshold) {\n            showIncomingInventory = true;\n          }\n  \n          this.toggleIncomingInventory(showIncomingInventory, variant.available, variantInventoryObject.next_incoming_date);\n        }\n      },\n  \n      updateAvailability: function(evt) {\n        var variant = evt.variant;\n        if (!variant) {\n          return;\n        }\n  \n        this.storeAvailability.updateContent(variant.id);\n      },\n  \n      toggleInventoryQuantity: function(show, qty) {\n        if (!this.settings.inventory) {\n          show = false;\n        }\n  \n        if (show) {\n          $(this.selectors.inventory)\n            .removeClass('hide')\n            .text(theme.strings.stockLabel.replace('[count]', qty));\n        } else {\n          $(this.selectors.inventory).addClass('hide');\n        }\n      },\n  \n      toggleIncomingInventory: function(show, available, date) {\n        if (!this.settings.incomingInventory) {\n          show = false;\n        }\n  \n        if (show) {\n          var string = available ?\n                       theme.strings.willNotShipUntil.replace('[date]', date) :\n                       theme.strings.willBeInStockAfter.replace('[date]', date);\n  \n          if (!date) {\n            string = theme.strings.waitingForStock;\n          }\n  \n          $(this.selectors.incomingInventory)\n            .removeClass('hide')\n            .text(string);\n        } else {\n          $(this.selectors.incomingInventory).addClass('hide');\n        }\n      },\n  \n      /*============================================================================\n        Product videos\n      ==============================================================================*/\n      checkIfVideos: function() {\n        var $productVideos = this.$mainSlider.find(selectors.productVideo);\n  \n        // Stop if there are 0 videos\n        if (!$productVideos.length) {\n          return false;\n        }\n  \n        var videoTypes = [];\n  \n        $productVideos.each(function() {\n          var type = $(this).data('video-type');\n  \n          if (videoTypes.indexOf(type) < 0) {\n            videoTypes.push(type);\n          }\n        });\n  \n        // Load YouTube API if not already loaded\n        if (videoTypes.indexOf('youtube') > -1) {\n          if (!theme.config.youTubeReady) {\n            theme.LibraryLoader.load('youtubeSdk');\n            $('body').on('youTubeReady' + this.settings.namespace, function() {\n              this.loadYoutubeVideos($productVideos);\n            }.bind(this));\n          } else {\n            this.loadYoutubeVideos($productVideos);\n          }\n        }\n  \n        // Add mp4 video players\n        if (videoTypes.indexOf('mp4') > -1) {\n          this.loadMp4Videos($productVideos);\n        }\n  \n        return videoTypes;\n      },\n  \n      loadMp4Videos: function($videos) {\n        $videos.each(function() {\n          var $el = $(this);\n          if ($el.data('video-type') != 'mp4') {\n            return;\n          }\n  \n          var id = $el.attr('id');\n          var videoId = $el.data('video-id');\n  \n          videos[id] = {\n            type: 'mp4',\n            divId: id,\n            style: $el.data('video-style')\n          };\n        });\n      },\n  \n      loadYoutubeVideos: function($videos) {\n        $videos.each(function() {\n          var $el = $(this);\n          if ($el.data('video-type') != 'youtube') {\n            return;\n          }\n  \n          var id = $el.attr('id');\n          var videoId = $el.data('youtube-id');\n  \n          videos[id] = {\n            type: 'youtube',\n            id: id,\n            videoId: videoId,\n            style: $el.data('video-style'),\n            loop: $el.data('video-loop'),\n            attemptedToPlay: false,\n            events: {\n              onReady: function(evt) {\n                onVideoPlayerReady(evt, id);\n              },\n              onStateChange: function(evt) {\n                onVideoStateChange(evt, id);\n              }\n            }\n          };\n        });\n  \n        // Create a player for each YouTube video\n        for (var key in videos) {\n          if (videos[key].type === 'youtube') {\n            if (videos.hasOwnProperty(key)) {\n              var args = $.extend({}, youtubeVideoOptions, videos[key]);\n  \n              if (args.style === 'muted') {\n                // default youtubeVideoOptions, no need to change anything\n              } else {\n                args.playerVars.controls = 1;\n                args.playerVars.autoplay = 0;\n              }\n  \n              youtubePlayers[key] = new YT.Player(key, args);\n            }\n          }\n        }\n  \n        youtubeReady = true;\n      },\n  \n      initVideo: function($video) {\n        var videoType = $video.data('video-type');\n        var divId = $video.attr('id');\n  \n        if (videoType === 'mp4' && videos[divId].style === 'muted') {\n          this.playMp4Video(divId);\n        }\n  \n        if (videoType === 'youtube') {\n          if (youtubeReady && videos[divId].style === 'muted') {\n            this.requestToPlayYoutubeVideo(divId);\n          }\n        }\n  \n        // Hacky way to trigger resetting the slider layout in modals\n        if (this.inModal) {\n          this.resizeSlides();\n        }\n      },\n  \n      stopVideo: function(id, type) {\n        if (!id) {\n          this.stopYoutubeVideo();\n          this.stopMp4Video();\n        }\n  \n        if (type === 'youtube') {\n          this.stopYoutubeVideo(id);\n        }\n  \n        if (type === 'mp4') {\n          this.stopMp4Video(id);\n        }\n      },\n  \n      getVideoType: function($video) {\n        return $video.data('video-type');\n      },\n  \n      getVideoId: function($video) {\n        return $video.attr('id');\n      },\n  \n      // Sub video functions (MP4 and YouTube)\n      requestToPlayYoutubeVideo: function(id, forcePlay) {\n        if (!theme.config.youTubeReady) {\n          return;\n        }\n  \n        var $player = $('#' + id);\n        setParentAsLoading($player);\n  \n        // If video is requested too soon, player might not be ready.\n        // Set arbitrary timeout to request it again in a second\n        if (typeof youtubePlayers[id].playVideo != 'function') {\n          setTimeout(function() {\n            this.playYoutubeVideo(id, forcePlay);\n          }.bind(this), 1000);\n          return;\n        }\n  \n        this.playYoutubeVideo(id, forcePlay);\n      },\n  \n      playYoutubeVideo: function (id, forcePlay) {\n        var $player = $('#' + id);\n        setParentAsLoaded($player);\n        if (typeof youtubePlayers[id].playVideo === 'function') {\n          youtubePlayers[id].playVideo();\n        }\n  \n        // forcePlay is sent as true from beforeSlideChange so the visibility\n        // check isn't fooled by the next slide positioning\n        if (!forcePlay) {\n          initCheckVisibility(id);\n        }\n      },\n  \n      stopYoutubeVideo: function(id) {\n        if (!theme.config.youTubeReady) {\n          return;\n        }\n  \n        if (id && youtubePlayers[id]) {\n          if (typeof youtubePlayers[id].pauseVideo === 'function') {\n            youtubePlayers[id].pauseVideo();\n          }\n          $(window).off('scroll.' + id);\n        } else {\n          for (key in youtubePlayers) {\n            var childVideo = this.$container.find('#' + key);\n            if (childVideo.length && typeof youtubePlayers[key].pauseVideo === 'function') {\n              youtubePlayers[key].pauseVideo();\n              $(window).off('scroll.' + key);\n            }\n          }\n        }\n      },\n  \n      playMp4Video: function(id) {\n        var $player = $('#' + id);\n        setParentAsLoaded($player);\n  \n        var playPromise = $player[0].play();\n  \n        if (playPromise !== undefined) {\n          playPromise.then(function() {})\n          .catch(function(error) {\n            // Likely low power mode on iOS, show controls\n            $player[0].setAttribute('controls', '');\n            $player.closest(selectors.videoParent).attr('data-video-style', 'unmuted');\n          });\n        }\n      },\n  \n      stopMp4Video: function(id) {\n        if (id) {\n          $('#' + id)[0].pause();\n        } else {\n          // loop through all mp4 videos to stop them\n          for (var key in videos) {\n            var childVideo = this.$container.find('#' + key);\n            if (childVideo.length && videos[key].type === 'mp4') {\n              var player = $('#' + videos[key].divId)[0];\n              if (player && typeof player.pause === 'function') {\n                player.pause();\n              }\n            }\n          }\n        }\n      },\n  \n      /*============================================================================\n        Product images\n      ==============================================================================*/\n      initImageZoom: function() {\n        var $container = $(this.selectors.imageContainer, this.$container);\n        var imageZoom = new theme.Photoswipe($container[0], this.sectionId);\n      },\n  \n      setImageSizes: function() {\n        if (!this.settings.hasImages) {\n          return;\n        }\n  \n        // Get srcset image src, works on most modern browsers\n        // otherwise defaults to settings.imageSize\n        var currentImage = this.$firstProductImage[0].currentSrc;\n  \n        if (currentImage) {\n          this.settings.imageSize = theme.Images.imageSize(currentImage);\n        }\n      },\n  \n      getThumbIndex: function($target) {\n        var $slide = $target.closest('.product__thumb-item');\n        return $slide.index();\n      },\n  \n      updateVariantImage: function(evt) {\n        var variant = evt.variant;\n        var sizedImgUrl = theme.Images.getSizedImageUrl(variant.featured_media.preview_image.src, this.settings.imageSize);\n        var $newImage = $('.product__thumb[data-id=\"' + variant.featured_media.id + '\"]');\n        var imageIndex = this.getThumbIndex($newImage);\n  \n        // No image, bail\n        if (typeof imageIndex === 'undefined') {\n          return;\n        }\n  \n        this.$mainSlider.slick('slickGoTo', imageIndex);\n      },\n  \n      initImageSwitch: function() {\n        if (!$(this.selectors.photoThumbs).length) {\n          return;\n        }\n  \n        $(this.selectors.photoThumbs)\n          .on('click', function(evt) {\n            evt.preventDefault();\n          })\n          .on('focus', function(evt) {\n            if (!this.settings.slickThumbInitialized) { return }\n            var index = this.getThumbIndex($(evt.currentTarget));\n            if (index !== undefined) {\n              this.$thumbSlider.slick('slickGoTo', index);\n            }\n          }.bind(this))\n          .on('keydown', function(evt) {\n            if (evt.keyCode === 13) {\n              this.$container.find(selectors.currentSlide).focus();\n            }\n          }.bind(this));\n      },\n  \n      createImageCarousels: function() {\n        if (!this.$thumbSlider.length || $(this.selectors.photoThumbs).length < 2) {\n          // Single product image. Init video if it exists\n          var $video = $(this.selectors.productImageMain).find(selectors.productVideo);\n          if ($video.length) {\n            this.initVideo($video);\n          }\n          return;\n        }\n  \n        this.settings.hasMultipleImages = true;\n        this.settings.has3d = this.$container.find(this.selectors.media).length;\n  \n        // Set starting slide (for both sliders)\n        var $activeSlide = this.$mainSlider.find('.starting-slide');\n        var startIndex = this._slideIndex($activeSlide);\n  \n        if (this.settings.imageSetName) {\n          startIndex = this.$mainSlider.find('[data-set-name=\"' + this.settings.imageSetName + '\"]').index();\n        }\n  \n        // Lame way to prevent duplicate event listeners\n        this.$mainSlider.off('init');\n        this.$mainSlider.off('beforeChange');\n        this.$mainSlider.on('init', this.mainSlideInit.bind(this));\n        this.$mainSlider.on('beforeChange', this.beforeSlideChange.bind(this));\n        this.$thumbSlider.on('init', this.thumbSlideInit.bind(this));\n  \n        // Default (mobile) slider settings\n        this.mainSliderArgs = {\n          infinite: this.settings.has3d ? false : true,\n          arrows: false,\n          dots: true,\n          adaptiveHeight: true,\n          rtl: theme.config.rtl,\n          initialSlide: startIndex,\n          appendDots: this.selectors.dotsContainer\n        };\n  \n        this.thumbSliderArgs = {\n          accessibility: false,\n          rtl: theme.config.rtl,\n          initialSlide: startIndex\n        };\n  \n        // Init sliders normally\n        var sliderArgs = this.setSliderArgs();\n        this.initSliders(sliderArgs);\n  \n        // Re-init slider when a breakpoint is hit\n        $('body').on('matchSmall matchLarge', function() {\n          var sliderArgs = this.setSliderArgs();\n          this.initSliders(sliderArgs);\n        }.bind(this));\n  \n        // Too many thumbnails can cause the AOS calculations to be off\n        // so refresh that when the slider is ready\n        if (AOS) {\n          AOS.refresh();\n        }\n      },\n  \n      initSliders: function(args) {\n        this.destroyImageCarousels();\n        this.$mainSlider.slick(args.main);\n        if (!theme.config.bpSmall) {\n          this.$thumbSlider.slick(args.thumbs);\n        }\n  \n        this.settings.slickMainInitialized = true;\n  \n        if (this.settings.imageSetName) {\n          this.updateImageSet();\n        }\n      },\n  \n      setSliderArgs: function() {\n        var args = {};\n  \n        var thumbnailsVertical = this.settings.thumbVertical = this.$thumbSlider.data('position') === 'beside' ? true : false;\n        var thumbArrows = this.settings.thumbArrows = this.$thumbSlider.data('arrows');\n  \n        var slidesToShow = thumbnailsVertical && thumbArrows ? 1 :\n                           (thumbnailsVertical ? 3 : 5);\n  \n        if (theme.config.bpSmall) {\n          args.main = this.mainSliderArgs;\n          args.thumbs = this.thumbSliderArgs;\n        } else {\n          args.main = $.extend({}, this.mainSliderArgs, {\n            asNavFor: this.selectors.thumbSlider,\n            adaptiveHeight: thumbnailsVertical ? false : true,\n            dots: false,\n            infinite: false,\n            fade: true\n          });\n          args.thumbs = $.extend({}, this.thumbSliderArgs, {\n            asNavFor: this.selectors.mainSlider,\n            slidesToShow: 1,\n            slidesToScroll: 1,\n            arrows: thumbArrows,\n            dots: false,\n            vertical: thumbnailsVertical,\n            verticalSwiping: thumbnailsVertical,\n            focusOnSelect: true,\n            infinite: false,\n            customHeightMatching: thumbArrows ? false : thumbnailsVertical,\n            customSlideAdvancement: true\n          });\n        }\n  \n        return args;\n      },\n  \n      destroyImageCarousels: function() {\n        if (this.$mainSlider && this.settings.slickMainInitialized) {\n          this.$mainSlider.slick('slickUnfilter');\n          this.$mainSlider.slick('unslick');\n          this.settings.slickMainInitialized = false;\n        }\n  \n        if (this.$thumbSlider && this.settings.slickThumbInitialized) {\n          this.$thumbSlider.slick('slickUnfilter');\n          this.$thumbSlider.slick('unslick');\n          this.settings.slickThumbInitialized = false;\n        }\n  \n        this.settings.slickMainInitialized = false;\n        this.settings.slickThumbInitialized = false;\n  \n        // Reset image set feature\n        this.settings.currentImageSet = null;\n      },\n  \n      mainSlideInit: function(event, slick) {\n        var $slider = slick.$slider;\n        var $currentSlide = $slider.find(selectors.currentSlide);\n        var $video = $currentSlide.find(selectors.productVideo);\n  \n        if (!$video.length) {\n          return;\n        }\n  \n        this.initVideo($video);\n      },\n  \n      thumbSlideInit: function(event, slick) {\n        this.settings.slickThumbInitialized = true;\n  \n        // Check if we need to hide the arrows\n        if (this.settings.thumbArrows) {\n          this.$thumbSlider.on('setPosition', this.thumbSlideArrowVisibility.bind(this));\n        }\n      },\n  \n      thumbSlideArrowVisibility: function(event, slick) {\n        var $slider = slick.$slider;\n        var $arrows = $slider.find('.slick-arrow');\n        var showArrows = false;\n  \n        if (this.settings.thumbVertical) {\n          var $trackHeight = $slider.find('.slick-track').height();\n          if ($trackHeight >= $slider.height()) {\n            showArrows = true;\n          }\n        } else {\n          var $trackWidth = $slider.find('.slick-track').width();\n          if ($trackWidth >= $slider.width()) {\n            showArrows = true;\n          }\n        }\n  \n        if (showArrows) {\n          $arrows.removeClass('hide');\n        } else {\n          $arrows.addClass('hide');\n        }\n      },\n  \n      beforeSlideChange: function(event, slick, currentSlide, nextSlide) {\n        var $slider = slick.$slider;\n        var $currentSlide = $slider.find(selectors.currentSlide);\n        var $prevVideo = $currentSlide.find('.product__video');\n        var $nextSlide = $slider.find('.slick-slide[data-slick-index=\"' + nextSlide + '\"]');\n        var $nextVideo = $nextSlide.find('.product__video');\n  \n        // Pause any existing slide video\n        if (currentSlide !== nextSlide && $prevVideo.length) {\n          var prevVideoType = this.getVideoType($prevVideo);\n          var prevVideoId = this.getVideoId($prevVideo);\n  \n          if (prevVideoId) {\n            this.stopVideo(prevVideoId, prevVideoType);\n          }\n        }\n  \n        // Prep next slide video\n        if ($nextVideo.length) {\n          var nextVideoType = this.getVideoType($nextVideo);\n          var nextVideoId = this.getVideoId($nextVideo);\n  \n          // Prep YouTube with a backup in case API isn't ready\n          if (nextVideoId && nextVideoType === 'youtube') {\n            if (youtubeReady) {\n              if (videos[nextVideoId] && videos[nextVideoId].style === 'muted') {\n                this.requestToPlayYoutubeVideo(nextVideoId, true);\n              }\n            } else {\n              $('body').on('youTubeReady' + this.settings.namespace, function() {\n                if (videos[nextVideoId] && videos[nextVideoId].style === 'muted') {\n                  this.requestToPlayYoutubeVideo(nextVideoId, true);\n                }\n              }.bind(this))\n            }\n          }\n  \n          // Autoplay muted MP4 videos\n          if (nextVideoId && videos[nextVideoId] && videos[nextVideoId].style === 'muted') {\n            if (nextVideoType === 'mp4') {\n              this.playMp4Video(nextVideoId);\n            }\n          }\n  \n          // Set unmuted videos to loaded state\n          if (nextVideoId && videos[nextVideoId] && videos[nextVideoId].style != 'muted') {\n            setParentAsLoaded($('#' + nextVideoId));\n          }\n        }\n  \n        // Pause any existing media\n        var $currentMedia = $currentSlide.find(this.selectors.media);\n        if ($currentMedia.length) {\n          $currentMedia.trigger('mediaHidden');\n        }\n  \n        // Prep next slide media\n        var $nextMedia = $nextSlide.find(this.selectors.media);\n        if ($nextMedia.length) {\n          $nextMedia.trigger('mediaVisible');\n          $nextSlide.find('.shopify-model-viewer-ui__button').attr('tabindex', 0);\n          $nextSlide.find('.product-single__close-media').attr('tabindex', 0);\n        }\n      },\n  \n      resizeSlides: function() {\n        if (!this.settings.hasMultipleImages) {\n          return;\n        }\n  \n        $(window).trigger('resize.slick');\n        setTimeout(function() {\n          if (this.$mainSlider && this.settings.slickMainInitialized) {\n            this.$mainSlider.slick('setPosition');\n          }\n          if (this.$thumbSlider && this.settings.slickThumbInitialized) {\n            this.$thumbSlider.slick('setPosition');\n          }\n        }.bind(this), 500); // same timing as modal open transition\n      },\n  \n      _slideIndex: function($el) {\n        return $el.data('index');\n      },\n  \n      /*============================================================================\n        Products when in quick view modal\n      ==============================================================================*/\n      openModalProduct: function() {\n        var initialized = false;\n        if (!this.settings.modalInit) {\n          var $formHolder = $(this.selectors.modalFormHolder);\n          var url = $formHolder.data('url');\n          var template = $formHolder.data('template');\n  \n          // Use stripped down ajax version for faster loading,\n          // unless preorder template is used so we show right button\n          if (template !== 'preorder') {\n            url = url + '?view=ajax';\n          }\n  \n          $formHolder.load(url + ' #AddToCartForm-' + this.sectionId, function() {\n            $formHolder.addClass('is-active');\n            this.formSetup();\n            if (Shopify && Shopify.PaymentButton) {\n              Shopify.PaymentButton.init();\n            }\n          }.bind(this));\n  \n          this.productSetup();\n          this.loadModalContent();\n          this.createImageCarousels();\n          this.customMediaListners();\n          this.settings.modalInit = true;\n  \n          document.dispatchEvent(new CustomEvent('quickview:loaded', {\n            detail: {\n              productId: this.sectionId\n            }\n          }));\n        } else {\n          initialized = true;\n        }\n  \n        this.resizeSlides();\n        AOS.refreshHard();\n  \n        document.dispatchEvent(new CustomEvent('quickview:open', {\n          detail: {\n            initialized: initialized,\n            productId: this.sectionId\n          }\n        }));\n  \n        // Add product id to recently viewed array\n        this.addIdToRecentlyViewed();\n      },\n  \n      closeModalProduct: function() {\n        this.stopVideo();\n        $('body').off(this.settings.namespace);\n        $(window).off(this.settings.namespace);\n      },\n  \n      loadModalContent: function() {\n        // Load videos if they exist\n        var videoTypes = this.checkIfVideos();\n  \n        // Lazyload mp4 videos\n        if (videoTypes && videoTypes.indexOf('mp4') > -1) {\n          this.$modal\n            .find('.product__video[data-video-type=\"mp4\"]')\n            .find('.product__video-src')\n            .each(function(i, video) {\n              var $el = $(video);\n              var src = $el.attr('src');\n              var type = $el.attr('type')\n              var newEl = document.createElement('source');\n              newEl.src = src;\n              newEl.type = type;\n              $el.after(newEl);\n            }.bind(this));\n        }\n      },\n  \n      /*============================================================================\n        Product media (3D)\n      ==============================================================================*/\n      initModelViewerLibraries: function() {\n        var $modelViewerElements = $(\n          this.selectors.media,\n          this.$container\n        );\n  \n        if ($modelViewerElements.length < 1) return;\n  \n        theme.ProductMedia.init($modelViewerElements, this.sectionId);\n      },\n  \n      initShopifyXrLaunch: function() {\n        var self = this;\n        $(document).on('shopify_xr_launch', function() {\n          var $currentMedia = $(\n            self.selectors.productMediaWrapper +\n              ':not(.' +\n              classes.hidden +\n              ')',\n            self.$container\n          );\n          $currentMedia.trigger('xrLaunch');\n        });\n      },\n  \n      customMediaListners: function() {\n        $('body').on('click', this.selectors.closeMedia, function() {\n          this.$mainSlider\n            .find(selectors.currentSlide)\n            .find(this.selectors.media)\n            .trigger('mediaHidden');\n        }.bind(this));\n  \n        this.$container.find('model-viewer')\n          .on('shopify_model_viewer_ui_toggle_play', function(evt) {\n            this.mediaLoaded(evt);\n          }.bind(this))\n          .on('shopify_model_viewer_ui_toggle_pause', function(evt) {\n            this.mediaUnloaded(evt);\n          }.bind(this));\n      },\n  \n      mediaLoaded: function(evt) {\n        this.$container.find(this.selectors.closeMedia).removeClass('hide');\n        this.toggleSliderSwiping(false);\n      },\n  \n      mediaUnloaded: function(evt) {\n        this.$container.find(this.selectors.closeMedia).addClass('hide');\n        this.toggleSliderSwiping(true);\n      },\n  \n      toggleSliderSwiping: function(enable) {\n        if (this.$mainSlider && this.settings.slickMainInitialized) {\n          this.$mainSlider.slick('slickSetOption', 'swipe', enable);\n          this.$mainSlider.slick('slickSetOption', 'draggable', enable);\n          this.$mainSlider.slick('slickSetOption', 'touchMove', enable);\n          this.$mainSlider.slick('slickSetOption', 'accessibility', enable);\n        }\n      },\n  \n      onUnload: function() {\n        this.$container.off(this.settings.namespace);\n        $('body').off(this.settings.namespace);\n        this.destroyImageCarousels();\n        theme.ProductMedia.removeSectionModels(this.sectionId);\n      }\n    });\n  \n    return Product;\n  })();\n  \n  theme.Recommendations = (function() {\n  \n    function Recommendations(container) {\n      var $container = this.$container = $(container);\n      var sectionId = this.sectionId = $container.attr('data-section-id');\n      this.url = $container.data('url');\n  \n      this.selectors = {\n        recommendations: '#Recommendations-' + sectionId,\n        placeholder: '.product-recommendations-placeholder',\n        sectionClass: ' .product-recommendations',\n        productResults: '.grid-product'\n      };\n  \n      this.init();\n    }\n  \n    Recommendations.prototype = $.extend({}, Recommendations.prototype, {\n      init: function() {\n        var $section = $(this.selectors.recommendations);\n  \n        if (!$section.length || $section.data('enable') === false) {\n          return;\n        }\n  \n        var $placeholder = $section.find(this.selectors.placeholder);\n        var id = $section.data('product-id');\n        var limit = $section.data('limit');\n  \n        var url = this.url + '?section_id=product-recommendations&limit='+ limit +'&product_id=' + id;\n  \n        $placeholder.load(url + this.selectors.sectionClass, function(data) {\n          theme.reinitProductGridItem($section);\n          this.updateVariantInventory($section);\n  \n          // If no results, hide the entire section\n          if ($(data).find(this.selectors.sectionClass).find(this.selectors.productResults).length === 0) {\n            $section.addClass('hide');\n          }\n        }.bind(this));\n      },\n  \n      // Recommended products load via JS and don't add variant inventory to the\n      // global variable that we later check. This function scrapes a data div\n      // to get that info and manually add the values.\n      updateVariantInventory: function($section) {\n        window.inventories = window.inventories || {};\n  \n        $section.find('.js-product-inventory-data').each(function() {\n          var $el = $(this);\n          var sectionId = $el.data('section-id');\n          window.inventories[sectionId] = {};\n          $('.js-variant-inventory-data', $el).each(function() {\n            var $child = $(this);\n            window.inventories[sectionId][$child.data('id')] = {\n              'quantity': $child.data('quantity'),\n              'incoming': $child.data('incoming'),\n              'next_incoming_date': $child.data('date')\n            }\n          });\n        });\n      }\n    });\n  \n    return Recommendations;\n  })();\n  \n  theme.StoreAvailability = (function() {\n    var selectors = {\n      drawerOpenBtn: '.js-drawer-open-availability',\n      productTitle: '[data-availability-product-title]'\n    };\n  \n    function StoreAvailability(container) {\n      this.container = container;\n      this.baseUrl = container.dataset.baseUrl;\n      this.productTitle = container.dataset.productName;\n    }\n  \n    StoreAvailability.prototype = Object.assign({}, StoreAvailability.prototype, {\n      updateContent: function(variantId) {\n        var variantSectionUrl =\n          this.baseUrl +\n          '/variants/' +\n          variantId +\n          '/?section_id=store-availability';\n  \n        this.container.innerHTML = '';\n  \n        var self = this;\n  \n        fetch(variantSectionUrl)\n          .then(function(response) {\n            return response.text();\n          })\n          .then(function(storeAvailabilityHTML) {\n            if (storeAvailabilityHTML.trim() === '') {\n              return;\n            }\n  \n            self.container.innerHTML = storeAvailabilityHTML;\n            self.container.innerHTML = self.container.firstElementChild.innerHTML;\n  \n            // Only create drawer if have open button\n            if (!self.container.querySelector(selectors.drawerOpenBtn)) {\n              return;\n            }\n  \n            self.drawer = new theme.Drawers('StoreAvailabilityDrawer', 'availability');\n  \n            self.container.querySelector(selectors.productTitle).textContent = self.productTitle;\n          });\n      }\n    });\n  \n    return StoreAvailability;\n  })();\n  \n  theme.CollectionHeader = (function() {\n  \n    var selectors = {\n      hero: '.collection-hero',\n      parallaxContainer: '.parallax-container'\n    };\n  \n    function CollectionHeader(container) {\n      var $container = $(container);\n      this.namespace = '.collection-header';\n  \n      var $heroImageContainer = this.$heroContainer = $container.find(selectors.hero);\n      if ($heroImageContainer.length) {\n        this.checkIfNeedReload();\n  \n        if ($container.data('parallax')) {\n          var $parallaxContainer = $container.find(selectors.parallaxContainer);\n          var args = {\n            namespace: this.namespace\n          };\n          theme.parallaxSections[this.namespace] = new theme.Parallax($parallaxContainer, args);\n        }\n      } else {\n        // Prevent 'Overlay header over collection' header setting\n        // from breaking layout. Required because settings from two\n        // different sections rely on each other on page load.\n        theme.headerNav.disableOverlayHeader();\n      }\n    }\n  \n    CollectionHeader.prototype = $.extend({}, CollectionHeader.prototype, {\n      // A liquid variable in the header needs a full page refresh\n      // if the collection header hero image setting is enabled\n      // and the header is set to sticky. Only necessary in the editor.\n      checkIfNeedReload: function() {\n        if (!Shopify.designMode) {\n          return;\n        }\n  \n        if (!theme.settings.overlayHeader) {\n          return;\n        }\n        var $header = $('.header-wrapper');\n        if (!$header.hasClass('is-light') && !$('.header-wrapper').hasClass('header-wrapper--sticky')) {\n          location.reload();\n        }\n      },\n  \n      onUnload: function() {\n        if (theme.parallaxSections[this.namespace]) {\n          theme.parallaxSections[this.namespace].destroy();\n          delete theme.parallaxSections[this.namespace];\n        }\n      }\n    });\n  \n    return CollectionHeader;\n  })();\n  \n  theme.CollectionSidebar = (function() {\n    var drawerStyle = false;\n  \n    function CollectionSidebar(container) {\n      this.$container = $(container);\n      this.init();\n    }\n  \n    CollectionSidebar.prototype = $.extend({}, CollectionSidebar.prototype, {\n      init: function() {\n        // Force close the drawer if it exists\n        this.onUnload();\n  \n        drawerStyle = this.$container.data('style') === 'drawer';\n        theme.FilterDrawer = new theme.Drawers('FilterDrawer', 'collection-filters', true);\n      },\n  \n      forceReload: function() {\n        this.init();\n      },\n  \n      onSelect: function() {\n        if (theme.FilterDrawer) {\n          if (!drawerStyle) {\n            theme.FilterDrawer.close();\n            return;\n          }\n  \n          if (drawerStyle || theme.config.bpSmall) {\n            theme.FilterDrawer.open();\n          }\n        }\n      },\n  \n      onDeselect: function() {\n        if (theme.FilterDrawer) {\n          theme.FilterDrawer.close();\n        }\n      },\n  \n      onUnload: function() {\n        if (theme.FilterDrawer) {\n          theme.FilterDrawer.close();\n        }\n      }\n    });\n  \n    return CollectionSidebar;\n  })();\n  \n  theme.Collection = (function() {\n  \n    var selectors = {\n      colorSwatchImage: '.grid-product__color-image',\n      colorSwatch: '.color-swatch--with-image',\n      sortSelect: '#SortBy'\n    };\n  \n    var data = {\n      sortBy: 'data-default-sortby'\n    };\n  \n    function Collection(container) {\n      this.container = container;\n      this.sectionId = $(container).attr('data-section-id');\n      this.namespace = '.collection-' + this.sectionId;\n  \n      this.init();\n    }\n  \n    Collection.prototype = $.extend({}, Collection.prototype, {\n      init: function() {\n        // init is called on load and when tags are selected\n        this.$container = $(this.container);\n        var sectionId = this.sectionId = this.$container.attr('data-section-id');\n        this.namespace = '.collection-' + sectionId;\n  \n        this.$sortSelect = $(selectors.sortSelect);\n        this.$sortSelect.on('change', this.onSortChange.bind(this));\n        this.defaultSort = this.getDefaultSortValue();\n  \n        this.initParams();\n        this.colorSwatchHovering();\n  \n        theme.reinitSection('collection-sidebar');\n      },\n  \n      initParams: function() {\n        this.queryParams = {};\n  \n        if (location.search.length) {\n          var aKeyValue;\n          var aCouples = location.search.substr(1).split('&');\n          for (var i = 0; i < aCouples.length; i++) {\n            aKeyValue = aCouples[i].split('=');\n            if (aKeyValue.length > 1) {\n              this.queryParams[\n                decodeURIComponent(aKeyValue[0])\n              ] = decodeURIComponent(aKeyValue[1]);\n            }\n          }\n        }\n      },\n  \n      getSortValue: function() {\n        return this.$sortSelect.val() || this.defaultSort;\n      },\n  \n      getDefaultSortValue: function() {\n        return this.$sortSelect.attr(data.sortBy);\n      },\n  \n      onSortChange: function() {\n        this.queryParams.sort_by = this.getSortValue();\n  \n        if (this.queryParams.page) {\n          delete this.queryParams.page;\n        }\n  \n        window.location.search = $.param(this.queryParams);\n      },\n  \n      colorSwatchHovering: function() {\n        var $colorImage = $(selectors.colorSwatchImage);\n        if (!$colorImage.length) {\n          return;\n        }\n  \n        $(selectors.colorSwatch).on({\n          mouseenter: function (evt) {\n            $el = $(evt.currentTarget);\n            var id = $el.data('variant-id');\n            var image = $el.data('variant-image');\n            $('.grid-product__color-image--' + id)\n              .css('background-image', 'url(' + image + ')')\n              .addClass('is-active');\n          },\n          mouseleave: function (evt) {\n            $el = $(evt.currentTarget);\n            var id = $el.data('variant-id');\n            $('.grid-product__color-image--' + id).removeClass('is-active');\n          }\n        });\n      },\n  \n      forceReload: function() {\n        this.onUnload();\n        this.init();\n      },\n  \n      onUnload: function() {\n        $(window).off(this.namespace);\n        this.$container.off(this.namespace);\n        $(selectors.colorSwatch).off(this.namespace);\n      }\n    });\n  \n    return Collection;\n  })();\n  \n  theme.HeaderSection = (function() {\n  \n    var selectors = {\n      drawer: '#NavDrawer',\n      mobileSubNavToggle: '.mobile-nav__toggle-btn',\n      hasSublist: '.mobile-nav__has-sublist',\n      disclosureLocale: '[data-disclosure-locale]',\n      disclosureCurrency: '[data-disclosure-currency]'\n    };\n  \n    var classes = {\n      navExpanded: 'mobile-nav--expanded'\n    };\n  \n    function Header(container) {\n      var $container = this.$container = $(container);\n      var sectionId = this.sectionId = $container.attr('data-section-id');\n  \n      // Reload any slideshow if when the header is reloaded to make sure the\n      // sticky header works as expected\n      theme.reinitSection('slideshow-section');\n  \n      this.initDrawers();\n      theme.headerNav.init();\n      theme.announcementBar.init();\n  \n      this.cache = {};\n      this.cacheSelectors();\n  \n      if (this.cache.$localeDisclosure.length) {\n        this.localeDisclosure = new theme.Disclosure(\n          this.cache.$localeDisclosure\n        );\n      }\n  \n      if (this.cache.$currencyDisclosure.length) {\n        this.currencyDisclosure = new theme.Disclosure(\n          this.cache.$currencyDisclosure\n        );\n      }\n  \n      // Set a timer to resize the header in case the logo changes size\n      if (Shopify.designMode) {\n        setTimeout(function() {\n          $('body').trigger('resize');\n        }, 500);\n      }\n    }\n  \n    Header.prototype = $.extend({}, Header.prototype, {\n      cacheSelectors: function() {\n        this.cache = {\n          $localeDisclosure: this.$container.find(selectors.disclosureLocale),\n          $currencyDisclosure: this.$container.find(selectors.disclosureCurrency)\n        };\n      },\n  \n      initDrawers: function() {\n        theme.NavDrawer = new theme.Drawers('NavDrawer', 'nav');\n        if (theme.settings.cartType === 'drawer') {\n          new theme.CartDrawer();\n        }\n  \n        this.drawerMenuButtons();\n      },\n  \n      drawerMenuButtons: function() {\n        $(selectors.drawer).find('.js-drawer-close').on('click', function(evt){\n          evt.preventDefault();\n          theme.NavDrawer.close();\n        });\n  \n        var $mobileSubNavToggle = $(selectors.mobileSubNavToggle);\n  \n        $mobileSubNavToggle.attr('aria-expanded', 'false');\n        $mobileSubNavToggle.each(function (i, el) {\n          var $el = $(el);\n          $el.attr('aria-controls', $el.attr('data-aria-controls'));\n        });\n  \n        $mobileSubNavToggle.on('click', function() {\n          var $el = $(this);\n          var currentlyExpanded = $el.attr('aria-expanded');\n          var toggleState = false;\n  \n          // Updated aria-expanded value based on state pre-click\n          if (currentlyExpanded === 'true') {\n            $el.attr('aria-expanded', 'false');\n          } else {\n            $el.attr('aria-expanded', 'true');\n            toggleState = true;\n          }\n  \n          // Toggle class that expands/collapses sublist\n          $el.closest(selectors.hasSublist).toggleClass(classes.navExpanded, toggleState);\n        });\n      },\n  \n      onBlockSelect: function(evt) {\n        theme.announcementBar.onBlockSelect(evt.detail.blockId);\n      },\n  \n      onDeselect: function() {\n        theme.announcementBar.onBlockDeselect();\n      },\n  \n      onUnload: function() {\n        theme.NavDrawer.close();\n        theme.headerNav.unload();\n        theme.announcementBar.unload();\n  \n        if (this.cache.$localeDisclosure.length) {\n          this.localeDisclosure.unload();\n        }\n  \n        if (this.cache.$currencyDisclosure.length) {\n          this.currencyDisclosure.unload();\n        }\n      }\n    });\n  \n    return Header;\n  \n  })();\n  \n  theme.FooterSection = (function() {\n  \n    var selectors = {\n      disclosureLocale: '[data-disclosure-locale]',\n      disclosureCurrency: '[data-disclosure-currency]'\n    };\n  \n    function Footer(container) {\n      var $container = this.$container = $(container);\n  \n      this.cache = {};\n      this.cacheSelectors();\n  \n      if (this.cache.$localeDisclosure.length) {\n        this.localeDisclosure = new theme.Disclosure(\n          this.cache.$localeDisclosure\n        );\n      }\n  \n      if (this.cache.$currencyDisclosure.length) {\n        this.currencyDisclosure = new theme.Disclosure(\n          this.cache.$currencyDisclosure\n        );\n      }\n    }\n  \n    Footer.prototype = $.extend({}, Footer.prototype, {\n      cacheSelectors: function() {\n        this.cache = {\n          $localeDisclosure: this.$container.find(selectors.disclosureLocale),\n          $currencyDisclosure: this.$container.find(selectors.disclosureCurrency)\n        };\n      },\n  \n      onUnload: function() {\n        if (this.cache.$localeDisclosure.length) {\n          this.localeDisclosure.unload();\n        }\n  \n        if (this.cache.$currencyDisclosure.length) {\n          this.currencyDisclosure.unload();\n        }\n      }\n    });\n  \n    return Footer;\n  })();\n  \n  theme.FeaturedContentSection = (function() {\n  \n    function FeaturedContent() {\n      $('.rte').find('a:not(:has(img))').addClass('text-link');\n    }\n  \n    return FeaturedContent;\n  })();\n  \n  theme.slideshows = {};\n  \n  theme.SlideshowSection = (function() {\n  \n    var selectors = {\n      parallaxContainer: '.parallax-container'\n    };\n  \n    function SlideshowSection(container) {\n      var $container = this.$container = $(container);\n      var $section = $container.parent();\n      var sectionId = $container.attr('data-section-id');\n      var slideshow = this.slideshow = '#Slideshow-' + sectionId;\n      this.namespace = '.' + sectionId;\n  \n      var $imageContainer = $(container).find('.hero');\n      if ($imageContainer.length) {\n        theme.loadImageSection($imageContainer);\n      }\n  \n      this.init();\n  \n      if ($container.data('parallax')) {\n        var args = {\n          namespace: this.namespace\n        };\n        theme.parallaxSections[this.namespace] = new theme.Parallax($container.find(selectors.parallaxContainer), args);\n      }\n    }\n  \n    SlideshowSection.prototype = $.extend({}, SlideshowSection.prototype, {\n      init: function() {\n        // Prevent slideshows from initializing on top of themselves\n        this.onUnload();\n  \n        var $slideshow = $(this.slideshow);\n        var args = {\n          autoplay: $slideshow.data('autoplay'),\n          arrows: $slideshow.data('arrows'),\n          dots: $slideshow.data('dots'),\n          fade: true,\n          speed: 500 // same as $slideshowImageAnimationSpeed in CSS\n        };\n  \n        theme.slideshows[this.slideshow] = new theme.Slideshow(this.slideshow, args);\n      },\n  \n      forceReload: function() {\n        this.init();\n      },\n  \n      onUnload: function() {\n        if (theme.parallaxSections[this.namespace]) {\n          theme.parallaxSections[this.namespace].destroy();\n          delete theme.parallaxSections[this.namespace];\n        }\n        if (theme.slideshows[this.slideshow]) {\n          theme.slideshows[this.slideshow].destroy();\n          delete theme.slideshows[this.slideshow];\n        }\n      },\n  \n      onSelect: function() {\n        $(this.slideshow).slick('slickPause');\n      },\n  \n      onDeselect: function() {\n        $(this.slideshow).slick('slickPlay');\n      },\n  \n      onBlockSelect: function(evt) {\n        var $slideshow = $(this.slideshow);\n  \n        // Ignore the cloned version\n        var $slide = $('.slideshow__slide--' + evt.detail.blockId + ':not(.slick-cloned)');\n        var slideIndex = $slide.data('slick-index');\n  \n        // Go to selected slide, pause autoplay\n        $slideshow.slick('slickGoTo', slideIndex).slick('slickPause');\n      },\n  \n      onBlockDeselect: function() {\n        $(this.slideshow).slick('slickPlay');\n      }\n    });\n  \n    return SlideshowSection;\n  })();\n  \n  theme.VideoSection = (function() {\n    var youtubeReady;\n    var videos = [];\n    var youtubePlayers = [];\n    var youtubeVideoOptions = {\n      width: 1280,\n      height: 720,\n      playerVars: {\n        autohide: 0,\n        branding: 0,\n        cc_load_policy: 0,\n        controls: 0,\n        fs: 0,\n        iv_load_policy: 3,\n        modestbranding: 1,\n        playsinline: 1,\n        quality: 'hd720',\n        rel: 0,\n        showinfo: 0,\n        wmode: 'opaque'\n      }\n    };\n  \n    var vimeoReady = false;\n    var vimeoVideoOptions = {\n      byline: false,\n      title: false,\n      portrait: false,\n      loop: true\n    };\n  \n    var selectors = {\n      videoParent: '.video-parent-section',\n      promoContainer: '.promo-grid__container'\n    };\n  \n    var classes = {\n      loading: 'loading',\n      loaded: 'loaded',\n      interactable: 'video-interactable'\n    };\n  \n    function videoSection(container) {\n      var $container = this.$container = $(container);\n      var sectionId = this.sectionId = $container.attr('data-section-id');\n      var youtubePlayerId = this.youtubePlayerId = 'YouTubeVideo-' + this.sectionId;\n      this.namespace = '.' + youtubePlayerId;\n      var vimeoPlayerId = this.vimeoPlayerId = 'Vimeo-' + this.sectionId;\n      var $vimeoTrigger = this.$vimeoTrigger = $('#VimeoTrigger-' + this.sectionId);\n      var mp4Video = 'Mp4Video-' + this.sectionId;\n  \n      var $youtubeDiv = $('#' + youtubePlayerId);\n      var $vimeoDiv = $('#' + vimeoPlayerId);\n      var $mp4Div = $('#' + mp4Video);\n  \n      this.vimeoPlayer = [];\n  \n      if ($youtubeDiv.length) {\n        this.youtubeVideoId = $youtubeDiv.data('video-id');\n        this.initYoutubeVideo();\n      }\n  \n      if ($vimeoDiv.length) {\n        this.vimeoVideoId = $vimeoDiv.data('video-id');\n        this.initVimeoVideo();\n      }\n  \n      if ($mp4Div.length) {\n        setParentAsLoaded($mp4Div);\n  \n        startMp4Playback(mp4Video).then(function() {\n          // Video played as expected, don't do anything\n        }).catch(function(error) {\n          // Video cannot be played with autoplay, so let\n          // user interact with video element itself\n          $mp4Div.attr('controls', '');\n          setVideoToBeInteractedWith($mp4Div);\n        })\n      }\n    }\n  \n    function startMp4Playback(mp4Video) {\n      return document.querySelector('#' + mp4Video).play();\n    }\n  \n    function onVideoPlayerReady(evt, id) {\n      var $player = $('#' + id);\n      var playerId = $player.attr('id');\n      youtubePlayers[playerId] = evt.target; // update stored player\n      var player = youtubePlayers[playerId];\n  \n      setParentAsLoading($player);\n  \n      youtubePlayers[playerId].mute();\n  \n      // Remove from tabindex because YouTube iframes are annoying and you can focus\n      // on the YouTube logo and it breaks\n      $player.attr('tabindex', '-1');\n  \n      // Add out of view pausing\n      videoVisibilityCheck(playerId);\n      $(window).on('scroll.' + playerId, {id: playerId}, $.throttle(150, videoVisibilityCheck));\n    }\n  \n    function videoVisibilityCheck(id) {\n      var playerId;\n  \n      if (typeof id === 'string') {\n        playerId = id;\n      } else {\n        // Data comes in as part of the scroll event\n        playerId = id.data ? id.data.id : false;\n      }\n  \n      if (playerId) {\n        if (theme.isElementVisible($('#' + playerId))) {\n          playVisibleVideo(playerId);\n        } else {\n          pauseHiddenVideo(playerId);\n        }\n      }\n    }\n  \n    function playVisibleVideo(id) {\n      if (youtubePlayers[id] && typeof youtubePlayers[id].playVideo === 'function') {\n        youtubePlayers[id].playVideo();\n      }\n    }\n  \n    function pauseHiddenVideo(id) {\n      if (youtubePlayers[id] && typeof youtubePlayers[id].pauseVideo === 'function') {\n        youtubePlayers[id].pauseVideo();\n      }\n    }\n  \n    function onVideoStateChange(evt, id) {\n      var $player = $('#' + id);\n      var playerId = $player.attr('id');\n      var player = youtubePlayers[playerId];\n  \n      switch (evt.data) {\n        case -1: // unstarted\n          // Handle low power state on iOS by checking if\n          // video is reset to unplayed after attempting to buffer\n          if (videos[playerId].attemptedToPlay) {\n            setParentAsLoaded($player);\n            setVideoToBeInteractedWith($player);\n          }\n          break;\n        case 0: // ended\n          player.playVideo();\n          break;\n        case 1: // playing\n          setParentAsLoaded($player);\n          break;\n        case 3: // buffering\n          videos[playerId].attemptedToPlay = true;\n          break;\n      }\n    }\n  \n    function setParentAsLoading($el) {\n      $el\n        .closest(selectors.videoParent)\n        .addClass(classes.loading);\n    }\n  \n    function setParentAsLoaded($el) {\n      $el\n        .closest(selectors.videoParent)\n        .removeClass(classes.loading)\n        .addClass(classes.loaded);\n    }\n  \n    function setVideoToBeInteractedWith($el) {\n      $el\n        .closest(selectors.videoParent)\n        .addClass(classes.interactable);\n  \n      $el\n        .closest(selectors.promoContainer)\n        .addClass(classes.interactable);\n    }\n  \n    videoSection.prototype = $.extend({}, videoSection.prototype, {\n      initYoutubeVideo: function() {\n        videos[this.youtubePlayerId] = {\n          id: this.youtubePlayerId,\n          videoId: this.youtubeVideoId,\n          type: 'youtube',\n          attemptedToPlay: false,\n          events: {\n            onReady: function(evt) {\n              onVideoPlayerReady(evt, this.youtubePlayerId);\n            }.bind(this),\n            onStateChange: function(evt) {\n              onVideoStateChange(evt, this.youtubePlayerId);\n            }.bind(this)\n          }\n        };\n  \n        if (!youtubeReady) {\n          theme.LibraryLoader.load('youtubeSdk');\n          $('body').on('youTubeReady' + this.namespace, this.loadYoutubeVideo.bind(this));\n        } else {\n          this.loadYoutubeVideo();\n        }\n      },\n  \n      loadYoutubeVideo: function() {\n        var args = $.extend({}, youtubeVideoOptions, videos[this.youtubePlayerId]);\n        args.playerVars.controls = 0;\n        youtubePlayers[this.youtubePlayerId] = new YT.Player(this.youtubePlayerId, args);\n  \n        youtubeReady = true;\n      },\n  \n      initVimeoVideo: function() {\n        videos[this.vimeoPlayerId] = {\n          divId: this.vimeoPlayerId,\n          id: this.vimeoVideoId,\n          type: 'vimeo'\n        };\n  \n        var $player = $('#' + this.vimeoPlayerId);\n        setParentAsLoading($player);\n  \n        // Button to play video on mobile\n        this.$vimeoTrigger.on('click', + this.namespace, function(evt) {\n          // $(evt.currentTarget).addClass('hide');\n          this.requestToPlayVimeoVideo(this.vimeoPlayerId);\n        }.bind(this));\n  \n        if (!vimeoReady) {\n          window.loadVimeo();\n          $('body').on('vimeoReady' + this.namespace, this.loadVimeoVideo.bind(this));\n        } else {\n          this.loadVimeoVideo();\n        }\n      },\n  \n      loadVimeoVideo: function() {\n        var args = $.extend({}, vimeoVideoOptions, videos[this.vimeoPlayerId]);\n        this.vimeoPlayer[this.vimeoPlayerId] = new Vimeo.Player(videos[this.vimeoPlayerId].divId, args);\n  \n        vimeoReady = true;\n  \n        // Only autoplay on larger screens\n        if (!theme.config.bpSmall) {\n          this.requestToPlayVimeoVideo(this.vimeoPlayerId);\n        } else {\n          var $player = $('#' + this.vimeoPlayerId);\n          setParentAsLoaded($player);\n        }\n      },\n  \n      requestToPlayVimeoVideo: function(id) {\n        // The slider may initialize and attempt to play the video before\n        // the API is even ready, because it sucks.\n  \n        if (!vimeoReady) {\n          // Wait for the trigger, then play it\n          $('body').on('vimeoReady' + this.namespace, function() {\n            this.playVimeoVideo(id);\n          }.bind(this))\n          return;\n        }\n  \n        this.playVimeoVideo(id);\n      },\n  \n      playVimeoVideo: function(id) {\n        this.vimeoPlayer[id].play();\n        this.vimeoPlayer[id].setVolume(0);\n  \n        var $player = $('#' + id);\n        setParentAsLoaded($player);\n      },\n  \n      onUnload: function(evt) {\n        var sectionId = evt.target.id.replace('shopify-section-', '');\n        var playerId = 'YouTubeVideo-' + sectionId;\n        youtubePlayers[playerId].destroy();\n        $(window).off('scroll' + this.namespace);\n        $('body').off('vimeoReady' + this.namespace);\n      }\n    });\n  \n    return videoSection;\n  })();\n  \n  theme.BackgroundImage = (function() {\n  \n    var selectors = {\n      parallaxContainer: '.parallax-container'\n    };\n  \n    function backgroundImage(container) {\n      var $container = $(container);\n      var sectionId = $container.attr('data-section-id');\n      this.namespace = '.' + sectionId;\n  \n      if (!$container.length) {\n        return;\n      }\n  \n      if ($container.data('parallax')) {\n        var $parallaxContainer = $container.find(selectors.parallaxContainer);\n        var args = {\n          namespace: this.namespace,\n          desktopOnly: true\n        };\n  \n        theme.parallaxSections[this.namespace] = new theme.Parallax($parallaxContainer, args);\n      }\n    }\n  \n    backgroundImage.prototype = $.extend({}, backgroundImage.prototype, {\n      onUnload: function(evt) {\n        theme.parallaxSections[this.namespace].destroy();\n        delete theme.parallaxSections[this.namespace];\n      }\n    });\n  \n    return backgroundImage;\n  })();\n  \n  theme.Testimonials = (function() {\n    var slideCount = 0;\n    var defaults = {\n      accessibility: true,\n      arrows: false,\n      dots: true,\n      autoplay: false,\n      touchThreshold: 20,\n      rtl: theme.config.rtl,\n      slidesToShow: 3,\n      slidesToScroll: 3\n    };\n  \n    function Testimonials(container) {\n      var $container = this.$container = $(container);\n      var sectionId = $container.attr('data-section-id');\n      var wrapper = this.wrapper = '.testimonials-wrapper';\n      var slider = this.slider = '#Testimonials-' + sectionId;\n      var $slider = $(slider);\n  \n      this.sliderActive = false;\n      var mobileOptions = $.extend({}, defaults, {\n        slidesToShow: 1,\n        slidesToScroll: 1,\n        adaptiveHeight: true\n      });\n  \n      slideCount = $slider.data('count');\n  \n      // Override slidesToShow/Scroll if there are not enough blocks\n      if (slideCount < defaults.slidesToShow) {\n        defaults.slidesToShow = slideCount;\n        defaults.slidesToScroll = slideCount;\n      }\n  \n      $slider.on('init', this.a11y.bind(this));\n  \n      if (theme.config.bpSmall) {\n        this.init($slider, mobileOptions);\n      } else {\n        this.init($slider, defaults);\n      }\n  \n      $('body').on('matchSmall', function() {\n        this.init($slider, mobileOptions);\n      }.bind(this));\n  \n      $('body').on('matchLarge', function() {\n        this.init($slider, defaults);\n      }.bind(this));\n    }\n  \n    Testimonials.prototype = $.extend({}, Testimonials.prototype, {\n      onUnload: function() {\n        $(this.slider, this.wrapper).slick('unslick');\n      },\n  \n      onBlockSelect: function(evt) {\n        // Ignore the cloned version\n        var $slide = $('.testimonials-slide--' + evt.detail.blockId + ':not(.slick-cloned)');\n        var slideIndex = $slide.data('slick-index');\n  \n        // Go to selected slide, pause autoplay\n        $(this.slider, this.wrapper).slick('slickGoTo', slideIndex);\n      },\n  \n      init: function(obj, args) {\n        if (this.sliderActive) {\n          obj.slick('unslick');\n          this.sliderActive = false;\n        }\n  \n        obj.slick(args);\n        this.sliderActive = true;\n  \n        if (AOS) {\n          AOS.refresh();\n        }\n      },\n  \n      a11y: function(event, obj) {\n        var $list = obj.$list;\n        var $wrapper = $(this.wrapper, this.$container);\n  \n        // Remove default Slick aria-live attr until slider is focused\n        $list.removeAttr('aria-live');\n  \n        // When an element in the slider is focused set aria-live\n        $wrapper.on('focusin', function(evt) {\n          if ($wrapper.has(evt.target).length) {\n            $list.attr('aria-live', 'polite');\n          }\n        });\n  \n        // Remove aria-live\n        $wrapper.on('focusout', function(evt) {\n          if ($wrapper.has(evt.target).length) {\n            $list.removeAttr('aria-live');\n          }\n        });\n      }\n    });\n  \n    return Testimonials;\n  })();\n  \n  theme.NewsletterPopup = (function() {\n    function NewsletterPopup(container) {\n      var $container = this.$container = $(container);\n      var sectionId = $container.attr('data-section-id');\n      this.cookieName = 'newsletter-' + sectionId;\n  \n      if (!$container.length) {\n        return;\n      }\n  \n      // Prevent popup on Shopify robot challenge page\n      if (window.location.pathname === '/challenge') {\n        return;\n      }\n  \n      this.data = {\n        secondsBeforeShow: $container.data('delay-seconds'),\n        daysBeforeReappear: $container.data('delay-days'),\n        cookie: Cookies.get(this.cookieName),\n        testMode: $container.data('test-mode')\n      };\n  \n      this.modal = new theme.Modals('NewsletterPopup-' + sectionId, 'newsletter-popup-modal');\n  \n      // Open modal if errors or success message exist\n      if ($container.find('.errors').length || $container.find('.note--success').length) {\n        this.modal.open();\n      }\n  \n      // Set cookie as opened if success message\n      if ($container.find('.note--success').length) {\n        this.closePopup(true);\n        return;\n      }\n  \n      $('body').on('modalClose.' + $container.attr('id'), this.closePopup.bind(this));\n  \n      if (!this.data.cookie || this.data.testMode) {\n        this.initPopupDelay();\n      }\n    }\n  \n    NewsletterPopup.prototype = $.extend({}, NewsletterPopup.prototype, {\n      initPopupDelay: function() {\n        setTimeout(function() {\n          this.modal.open();\n        }.bind(this), this.data.secondsBeforeShow * 1000);\n      },\n  \n      closePopup: function(success) {\n        // Remove a cookie in case it was set in test mode\n        if (this.data.testMode) {\n          Cookies.remove(this.cookieName, { path: '/' });\n          return;\n        }\n  \n        var expiry = success ? 200 : this.data.daysBeforeReappear;\n  \n        Cookies.set(this.cookieName, 'opened', { path: '/', expires: expiry });\n      },\n  \n      onLoad: function() {\n        this.modal.open();\n      },\n  \n      onSelect: function() {\n        this.modal.open();\n      },\n  \n      onDeselect: function() {\n        this.modal.close();\n      },\n  \n      onUnload: function() {}\n    });\n  \n    return NewsletterPopup;\n  })();\n  \n  theme.Maps = (function() {\n    var config = {\n      zoom: 14\n    };\n    var apiStatus = null;\n    var mapsToLoad = [];\n  \n    var errors = {\n      addressNoResults: theme.strings.addressNoResults,\n      addressQueryLimit: theme.strings.addressQueryLimit,\n      addressError: theme.strings.addressError,\n      authError: theme.strings.authError\n    };\n  \n    var selectors = {\n      section: '[data-section-type=\"map\"]',\n      map: '[data-map]',\n      mapOverlay: '[data-map-overlay]'\n    };\n  \n    var classes = {\n      mapError: 'map-section--load-error',\n      errorMsg: 'map-section__error errors text-center'\n    };\n  \n    // Global function called by Google on auth errors.\n    // Show an auto error message on all map instances.\n    window.gm_authFailure = function() {\n      if (!Shopify.designMode) {\n        return;\n      }\n  \n      $(selectors.section).addClass(classes.mapError);\n      $(selectors.map).remove();\n      $(selectors.mapOverlay).after(\n        '<div class=\"' +\n          classes.errorMsg +\n          '\">' +\n          theme.strings.authError +\n          '</div>'\n      );\n    };\n  \n    function Map(container) {\n      this.$container = $(container);\n      this.sectionId = this.$container.attr('data-section-id');\n      this.namespace = '.map-' + this.sectionId;\n      this.$map = this.$container.find(selectors.map);\n      this.key = this.$map.data('api-key');\n  \n      if (!this.key) {\n        return;\n      }\n  \n      // Lazyload API\n      this.checkVisibility();\n      $(window).on('scroll' + this.namespace, $.throttle(50, this.checkVisibility.bind(this)));\n    }\n  \n    function initAllMaps() {\n      // API has loaded, load all Map instances in queue\n      $.each(mapsToLoad, function(index, instance) {\n        instance.createMap();\n      });\n    }\n  \n    function geolocate($map) {\n      var deferred = $.Deferred();\n      var geocoder = new google.maps.Geocoder();\n      var address = $map.data('address-setting');\n  \n      geocoder.geocode({ address: address }, function(results, status) {\n        if (status !== google.maps.GeocoderStatus.OK) {\n          deferred.reject(status);\n        }\n  \n        deferred.resolve(results);\n      });\n  \n      return deferred;\n    }\n  \n    Map.prototype = $.extend({}, Map.prototype, {\n      prepMapApi: function() {\n        if (apiStatus === 'loaded') {\n          this.createMap();\n        } else {\n          mapsToLoad.push(this);\n  \n          if (apiStatus !== 'loading') {\n            apiStatus = 'loading';\n            if (typeof window.google === 'undefined' || typeof window.google.maps === 'undefined' ) {\n              $.getScript(\n                'https://maps.googleapis.com/maps/api/js?key=' + this.key\n              ).then(function() {\n                apiStatus = 'loaded';\n                initAllMaps();\n              });\n            }\n          }\n        }\n      },\n  \n      createMap: function() {\n        var $map = this.$map;\n  \n        return geolocate($map)\n          .then(\n            function(results) {\n              var mapOptions = {\n                zoom: config.zoom,\n                backgroundColor: 'none',\n                center: results[0].geometry.location,\n                draggable: false,\n                clickableIcons: false,\n                scrollwheel: false,\n                disableDoubleClickZoom: true,\n                disableDefaultUI: true\n              };\n  \n              var map = (this.map = new google.maps.Map($map[0], mapOptions));\n              var center = (this.center = map.getCenter());\n  \n              var marker = new google.maps.Marker({\n                map: map,\n                position: map.getCenter()\n              });\n  \n              google.maps.event.addDomListener(\n                window,\n                'resize',\n                $.debounce(250, function() {\n                  google.maps.event.trigger(map, 'resize');\n                  map.setCenter(center);\n                  $map.removeAttr('style');\n                })\n              );\n            }.bind(this)\n          )\n          .fail(function() {\n            var errorMessage;\n  \n            switch (status) {\n              case 'ZERO_RESULTS':\n                errorMessage = errors.addressNoResults;\n                break;\n              case 'OVER_QUERY_LIMIT':\n                errorMessage = errors.addressQueryLimit;\n                break;\n              case 'REQUEST_DENIED':\n                errorMessage = errors.authError;\n                break;\n              default:\n                errorMessage = errors.addressError;\n                break;\n            }\n  \n            // Show errors only to merchant in the editor.\n            if (Shopify.designMode) {\n              $map\n                .parent()\n                .addClass(classes.mapError)\n                .html(\n                  '<div class=\"' +\n                    classes.errorMsg +\n                    '\">' +\n                    errorMessage +\n                    '</div>'\n                );\n            }\n          });\n      },\n  \n      checkVisibility: function() {\n        if (theme.isElementVisible(this.$container, 600)) {\n          this.prepMapApi();\n          $(window).off(this.namespace);\n        }\n      },\n  \n      onUnload: function() {\n        if (this.$map.length === 0) {\n          return;\n        }\n        // Causes a harmless JS error when a section without an active map is reloaded\n        google.maps.event.clearListeners(this.map, 'resize');\n      }\n    });\n  \n    return Map;\n  })();\n  \n  theme.Blog = (function() {\n  \n    function Blog(container) {\n      this.tagFilters();\n    }\n  \n    Blog.prototype = $.extend({}, Blog.prototype, {\n      tagFilters: function() {\n        var $filterBy = $('#BlogTagFilter');\n  \n        if (!$filterBy.length) {\n          return;\n        }\n  \n        $filterBy.on('change', function() {\n          location.href = $(this).val();\n        });\n      },\n  \n      onUnload: function() {\n  \n      }\n    });\n  \n    return Blog;\n  })();\n  \n  theme.Photoswipe = (function() {\n    var selectors = {\n      trigger: '.js-photoswipe__zoom',\n      images: '.photoswipe__image',\n      activeImage: '.slick-active .photoswipe__image'\n    };\n  \n    function Photoswipe(container, sectionId) {\n      this.$container = $(container);\n      this.sectionId = sectionId;\n      this.namespace = '.photoswipe-' + this.sectionId;\n      this.gallery;\n      this.$images;\n      this.inSlideshow = false;\n  \n      if (this.$container.attr('data-zoom') === 'false') {\n        return;\n      }\n  \n      if (this.$container.attr('data-has-slideshow') === 'true') {\n        this.inSlideshow = true;\n      }\n  \n      this.init();\n    }\n  \n    Photoswipe.prototype = $.extend({}, Photoswipe.prototype, {\n      init: function() {\n        var $trigger = this.$container.find(selectors.trigger);\n        this.$images = this.$container.find(selectors.images);\n        var items = [];\n  \n        // Init gallery on active image\n        $trigger.on('click' + this.namespace, function(evt) {\n          items = this.getImageData();\n          if (this.inSlideshow) {\n            var index = this.$container.find(selectors.activeImage).data('index');\n          } else {\n            var index = $(evt.currentTarget).data('index');\n          }\n          this.initGallery(items, index);\n        }.bind(this));\n      },\n  \n      getImageData: function() {\n        var haveImages = false;\n        var items = [];\n        var options = {};\n  \n        this.$images.each(function() {\n          var haveImages = true;\n          var smallSrc = $(this).prop('currentSrc') || $(this).prop('src');\n          var item = {\n            msrc: smallSrc,\n            src: $(this).data('photoswipe-src'),\n            w: $(this).data('photoswipe-width'),\n            h: $(this).data('photoswipe-height'),\n            el: $(this)[0],\n            initialZoomLevel: 0.5\n          };\n  \n          items.push(item);\n        });\n  \n        return items;\n      },\n  \n      initGallery: function(items, index) {\n        var pswpElement = document.querySelectorAll('.pswp')[0];\n  \n        var options = {\n          allowPanToNext: false,\n          captionEl: false,\n          closeOnScroll: false,\n          counterEl: false,\n          history: false,\n          index: index - 1,\n          pinchToClose: false,\n          preloaderEl: false,\n          scaleMode: 'zoom',\n          shareEl: false,\n          tapToToggleControls: false,\n          getThumbBoundsFn: function(index) {\n            var pageYScroll = window.pageYOffset || document.documentElement.scrollTop;\n            var thumbnail = items[index].el;\n            var rect = thumbnail.getBoundingClientRect();\n            return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};\n          }\n        }\n  \n        this.gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);\n  \n        this.gallery.init();\n        this.gallery.listen('afterChange', this.afterChange.bind(this));\n      },\n  \n      afterChange: function() {\n        if (this.inSlideshow) {\n          var $slideshow = $('#ProductPhotos-' + this.sectionId);\n          if ($slideshow.hasClass('slick-initialized')) {\n            var newIndex = this.gallery.getCurrentIndex();\n            $slideshow.slick('slickGoTo', newIndex);\n          }\n        }\n      }\n    });\n  \n    return Photoswipe;\n  })();\n  \n  \n\n  window.onYouTubeIframeAPIReady = function() {\n    theme.config.youTubeReady = true;\n    $('body').trigger('youTubeReady');\n  }\n\n  window.loadVimeo = function() {\n    if (theme.config.vimeoLoading) {\n      return;\n    }\n\n    if (!theme.config.vimeoReady) {\n      theme.config.vimeoLoading = true;\n      var tag = document.createElement('script');\n      tag.src = \"https://player.vimeo.com/api/player.js\";\n      var firstScriptTag = document.getElementsByTagName('script')[0];\n      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n\n      // Because there's no way to check for the Vimeo API being loaded\n      // asynchronously, we use this terrible timeout to wait for it being ready\n      checkIfVimeoIsReady()\n        .then(function() {\n          theme.config.vimeoReady = true;\n          theme.config.vimeoLoading = false;\n          $('body').trigger('vimeoReady');\n        })\n        .fail(function() {\n          // No vimeo API to talk to\n        });\n    }\n  }\n\n  function checkIfVimeoIsReady() {\n    var deferred = $.Deferred();\n    var wait;\n    var timeout;\n\n    wait = setInterval(function() {\n      if (!Vimeo) {\n        return;\n      }\n\n      clearInterval(wait);\n      clearTimeout(timeout);\n      deferred.resolve();\n    }, 500);\n\n    timeout = setTimeout(function() {\n      clearInterval(wait);\n      deferred.reject();\n    }, 4000); // subjective. test up to 8 times over 4 seconds\n\n    return deferred;\n  }\n\n  theme.init = function() {\n    theme.setGlobals();\n    theme.collapsibles.init();\n    theme.rte.init();\n\n    AOS.init({\n      easing: 'ease-out-quad',\n      once: true,\n      offset: 60,\n      disableMutationObserver: true\n    });\n\n    $(document.documentElement).on('keyup.tab', function(evt) {\n      if (evt.keyCode === 9) {\n        $(document.documentElement).addClass('tab-outline');\n        $(document.documentElement).off('keyup.tab');\n      }\n    });\n\n    // Change email icon to submit text\n    $('.footer__newsletter-input').on('keyup', function() {\n      $(this).addClass('footer__newsletter-input--active');\n    });\n  };\n\n  theme.initSecondary = function() {\n    theme.initQuickShop();\n    if (theme.settings.predictiveSearch) {\n      theme.predictiveSearch.init();\n    }\n    theme.collectionTemplate.init();\n    theme.customerTemplates.init();\n    theme.videoModal();\n\n    document.dispatchEvent(new CustomEvent('page:loaded'));\n  };\n\n  theme.setGlobals = function() {\n    theme.config.hasSessionStorage = theme.isStorageSupported('session');\n    theme.config.hasLocalStorage = theme.isStorageSupported('local');\n\n    if (theme.config.hasLocalStorage) {\n      theme.recentlyViewed.localStorage = window.localStorage.getItem('theme-recent');\n\n      if (theme.recentlyViewed.localStorage) {\n        theme.recentlyViewed.recent = JSON.parse(theme.recentlyViewed.localStorage);\n      }\n    }\n\n    theme.recentlyViewed.productInfo = theme.config.hasSessionStorage && sessionStorage['recent-products'] ? JSON.parse(sessionStorage['recent-products']) : {};\n\n    if (theme.config.isTouch) {\n      $('body').addClass('supports-touch');\n    }\n\n    enquire.register(theme.config.mediaQuerySmall, {\n      match: function() {\n        theme.config.bpSmall = true;\n        $('body').trigger('matchSmall');\n      },\n      unmatch: function() {\n        theme.config.bpSmall = false;\n        $('body').trigger('unmatchSmall');\n      }\n    });\n\n    enquire.register(theme.config.mediaQuerySmallUp, {\n      match: function() {\n        $('body').trigger('matchLarge');\n      },\n      unmatch: function() {\n        $('body').trigger('unmatchLarge');\n      }\n    });\n  };\n\n  theme.loadImageSection = function($container) {\n    // Wait until images inside container have lazyloaded class\n    function setAsLoaded() {\n      $container.removeClass('loading loading--delayed').addClass('loaded');\n    }\n\n    function checkForLazyloadedImage() {\n      return $container.find('.lazyloaded').length;\n    }\n\n    // If it has SVGs it's in the onboarding state so set as loaded\n    if ($container.find('svg').length) {\n      setAsLoaded();\n      return;\n    };\n\n    if (checkForLazyloadedImage() > 0) {\n      setAsLoaded();\n      return;\n    }\n\n    var interval = setInterval(function() {\n      if (checkForLazyloadedImage() > 0) {\n        clearInterval(interval);\n        setAsLoaded();\n      }\n    }, 80);\n  };\n\n  theme.isStorageSupported = function(type) {\n    // Return false if we are in an iframe without access to sessionStorage\n    if (window.self !== window.top) {\n      return false;\n    }\n\n    var testKey = 'test';\n    var storage;\n    if (type === 'session') {\n      storage = window.sessionStorage;\n    }\n    if (type === 'local') {\n      storage = window.localStorage;\n    }\n\n    try {\n      storage.setItem(testKey, '1');\n      storage.removeItem(testKey);\n      return true;\n    } catch (error) {\n      return false;\n    }\n  };\n\n  theme.isElementVisible = function($el, threshold) {\n    var rect = $el[0].getBoundingClientRect();\n    var windowHeight = window.innerHeight || document.documentElement.clientHeight;\n    threshold = threshold ? threshold : 0;\n\n    return (\n      rect.bottom >= 0 &&\n      rect.right >= 0 &&\n      rect.top <= (windowHeight + threshold) &&\n      rect.left <= (window.innerWidth || document.documentElement.clientWidth)\n    );\n  };\n\n  theme.reinitSection = function(section) {\n    for (var i = 0; i < sections.instances.length; i++) {\n      var instance = sections.instances[i];\n      if (instance['type'] === section) {\n        if (typeof instance.forceReload === 'function') {\n          instance.forceReload();\n        }\n      }\n    }\n  };\n\n  theme.reinitProductGridItem = function($scope) {\n    if (AOS) {\n      AOS.refreshHard();\n    }\n\n    // Reload quick shop buttons\n    theme.initQuickShop();\n\n    // Refresh reviews app\n    if (window.SPR) {\n      SPR.initDomEls();SPR.loadBadges();\n    }\n\n    // Re-register product templates in quick view modals.\n    // Will not double-register.\n    sections.register('product-template', theme.Product, $scope);\n\n    // Re-hook up collapsible box triggers\n    theme.collapsibles.init();\n  };\n\n  window.onpageshow = function(evt) {\n    // Removes unload class when returning to page via history\n    if (evt.persisted) {\n      $('body').removeClass('unloading');\n    }\n  };\n\n  $(document).ready(function() {\n    theme.init();\n\n    window.sections = new theme.Sections();\n    sections.register('header-section', theme.HeaderSection);\n    sections.register('slideshow-section', theme.SlideshowSection);\n    sections.register('video-section', theme.VideoSection);\n    sections.register('background-image', theme.BackgroundImage);\n    sections.register('recently-viewed', theme.RecentlyViewed);\n    sections.register('product', theme.Product);\n    sections.register('product-recommendations', theme.Recommendations);\n    sections.register('store-availability', theme.StoreAvailability);\n    sections.register('product-template', theme.Product);\n    sections.register('collection-header', theme.CollectionHeader);\n    sections.register('collection-sidebar', theme.CollectionSidebar);\n    sections.register('collection-template', theme.Collection);\n    sections.register('featured-content-section', theme.FeaturedContentSection);\n    sections.register('testimonials', theme.Testimonials);\n    sections.register('newsletter-popup', theme.NewsletterPopup);\n    sections.register('map', theme.Maps);\n    sections.register('blog', theme.Blog);\n    sections.register('photoswipe', theme.Photoswipe);\n    sections.register('footer-section', theme.FooterSection);\n\n    theme.initSecondary();\n  });\n})(theme.jQuery);\n"],
  "mappings": "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",
  "names": ["evt", "$el", "status", "key", "$slider", "handle", "index", "sliderArgs", "haveImages"]
}
