{
  "version": 3,
  "sources": ["/cdn/shop/t/1/assets/theme.js?section_id=product-recommendations"],
  "sourcesContent": ["window.theme = window.theme || {};\n\n/* ================ SLATE ================ */\nwindow.theme = window.theme || {};\n\ntheme.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\ntheme.Sections.prototype = _.assignIn({}, theme.Sections.prototype, {\n  _createInstance: function(container, constructor) {\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 (_.isUndefined(constructor)) {\n      return;\n    }\n\n    var instance = _.assignIn(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) {\n    var container = $('[data-section-id]', evt.target)[0];\n    if (container) {\n      this._createInstance(container);\n    }\n  },\n\n  _onSectionUnload: function(evt) {\n    this.instances = _.filter(this.instances, function(instance) {\n      var isEventInstance = instance.id === evt.detail.sectionId;\n\n      if (isEventInstance) {\n        if (_.isFunction(instance.onUnload)) {\n          instance.onUnload(evt);\n        }\n      }\n\n      return !isEventInstance;\n    });\n  },\n\n  _onSelect: function(evt) {\n    // eslint-disable-next-line no-shadow\n    var instance = _.find(this.instances, function(instance) {\n      return instance.id === evt.detail.sectionId;\n    });\n\n    if (!_.isUndefined(instance) && _.isFunction(instance.onSelect)) {\n      instance.onSelect(evt);\n    }\n  },\n\n  _onDeselect: function(evt) {\n    // eslint-disable-next-line no-shadow\n    var instance = _.find(this.instances, function(instance) {\n      return instance.id === evt.detail.sectionId;\n    });\n\n    if (!_.isUndefined(instance) && _.isFunction(instance.onDeselect)) {\n      instance.onDeselect(evt);\n    }\n  },\n\n  _onBlockSelect: function(evt) {\n    // eslint-disable-next-line no-shadow\n    var instance = _.find(this.instances, function(instance) {\n      return instance.id === evt.detail.sectionId;\n    });\n\n    if (!_.isUndefined(instance) && _.isFunction(instance.onBlockSelect)) {\n      instance.onBlockSelect(evt);\n    }\n  },\n\n  _onBlockDeselect: function(evt) {\n    // eslint-disable-next-line no-shadow\n    var instance = _.find(this.instances, function(instance) {\n      return instance.id === evt.detail.sectionId;\n    });\n\n    if (!_.isUndefined(instance) && _.isFunction(instance.onBlockDeselect)) {\n      instance.onBlockDeselect(evt);\n    }\n  },\n\n  register: function(type, constructor) {\n    this.constructors[type] = constructor;\n\n    $('[data-section-type=' + type + ']').each(\n      function(index, container) {\n        this._createInstance(container, constructor);\n      }.bind(this)\n    );\n  }\n});\n\nwindow.slate = window.slate || {};\n\n/**\n * Slate utilities\n * -----------------------------------------------------------------------------\n * A collection of useful utilities to help build your theme\n *\n *\n * @namespace utils\n */\n\nslate.utils = {\n  /**\n   * Get the query params in a Url\n   * Ex\n   * https://mysite.com/search?q=noodles&b\n   * getParameterByName('q') = \"noodles\"\n   * getParameterByName('b') = \"\" (empty value)\n   * getParameterByName('test') = null (absent)\n   */\n  getParameterByName: function(name, url) {\n    if (!url) url = window.location.href;\n    name = name.replace(/[[\\]]/g, '\\\\$&');\n    var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\n      results = regex.exec(url);\n    if (!results) return null;\n    if (!results[2]) return '';\n    return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n  },\n\n  resizeSelects: function($selects) {\n    $selects.each(function() {\n      var $this = $(this);\n      var arrowWidth = 10;\n      // create test element\n      var text = $this.find('option:selected').text();\n      var $test = $('<span>').html(text);\n\n      // add to body, get width, and get out\n      $test.appendTo('body');\n      var width = $test.width();\n      $test.remove();\n\n      // set select width\n      $this.width(width + arrowWidth);\n    });\n  },\n\n  keyboardKeys: {\n    TAB: 9,\n    ENTER: 13,\n    ESCAPE: 27,\n    LEFTARROW: 37,\n    RIGHTARROW: 39\n  }\n};\n\nwindow.slate = window.slate || {};\n\n/**\n * iFrames\n * -----------------------------------------------------------------------------\n * Wrap videos in div to force responsive layout.\n *\n * @namespace iframes\n */\n\nslate.rte = {\n  /**\n   * Wrap tables in a container div to make them scrollable when needed\n   *\n   * @param {object} options - Options to be used\n   * @param {jquery} options.$tables - jquery object(s) of the table(s) to wrap\n   * @param {string} options.tableWrapperClass - table wrapper class name\n   */\n  wrapTable: function(options) {\n    options.$tables.wrap(\n      '<div class=\"' + options.tableWrapperClass + '\"></div>'\n    );\n  },\n\n  /**\n   * Wrap iframes in a container div to make them responsive\n   *\n   * @param {object} options - Options to be used\n   * @param {jquery} options.$iframes - jquery object(s) of the iframe(s) to wrap\n   * @param {string} options.iframeWrapperClass - class name used on the wrapping div\n   */\n  wrapIframe: function(options) {\n    options.$iframes.each(function() {\n      // Add wrapper to make video responsive\n      $(this).wrap('<div class=\"' + options.iframeWrapperClass + '\"></div>');\n\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\nwindow.slate = window.slate || {};\n\n/**\n * A11y Helpers\n * -----------------------------------------------------------------------------\n * A collection of useful functions that help make your theme more accessible\n * to users with visual impairments.\n *\n *\n * @namespace a11y\n */\n\nslate.a11y = {\n  /**\n   * For use when focus shifts to a container rather than a link\n   * eg for In-page links, after scroll, focus shifts to content area so that\n   * next `tab` is where user expects if focusing a link, just $link.focus();\n   *\n   * @param {JQuery} $element - The element to be acted upon\n   */\n  pageLinkFocus: function($element) {\n    var focusClass = 'js-focus-hidden';\n\n    $element\n      .first()\n      .attr('tabIndex', '-1')\n      .focus()\n      .addClass(focusClass)\n      .one('blur', callback);\n\n    function callback() {\n      $element\n        .first()\n        .removeClass(focusClass)\n        .removeAttr('tabindex');\n    }\n  },\n\n  /**\n   * If there's a hash in the url, focus the appropriate element\n   */\n  focusHash: function() {\n    var hash = window.location.hash;\n\n    // is there a hash in the url? is it an element on the page?\n    if (hash && document.getElementById(hash.slice(1))) {\n      this.pageLinkFocus($(hash));\n    }\n  },\n\n  /**\n   * When an in-page (url w/hash) link is clicked, focus the appropriate element\n   */\n  bindInPageLinks: function() {\n    $('a[href*=#]').on(\n      'click',\n      function(evt) {\n        this.pageLinkFocus($(evt.currentTarget.hash));\n      }.bind(this)\n    );\n  },\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      if (evt.keyCode !== slate.utils.keyboardKeys.TAB) 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  /**\n   * Add aria-describedby attribute to external and new window links\n   *\n   * @param {object} options - Options to be used\n   * @param {object} options.messages - Custom messages to be used\n   * @param {jQuery} options.$links - Specific links to be targeted\n   */\n  accessibleLinks: function(options) {\n    var body = document.querySelector('body');\n\n    var idSelectors = {\n      newWindow: 'a11y-new-window-message',\n      external: 'a11y-external-message',\n      newWindowExternal: 'a11y-new-window-external-message'\n    };\n\n    if (options.$links === undefined || !options.$links.jquery) {\n      options.$links = $('a[href]:not([aria-describedby])');\n    }\n\n    function generateHTML(customMessages) {\n      if (typeof customMessages !== 'object') {\n        customMessages = {};\n      }\n\n      var messages = $.extend(\n        {\n          newWindow: 'Opens in a new window.',\n          external: 'Opens external website.',\n          newWindowExternal: 'Opens external website in a new window.'\n        },\n        customMessages\n      );\n\n      var container = document.createElement('ul');\n      var htmlMessages = '';\n\n      for (var message in messages) {\n        htmlMessages +=\n          '<li id=' + idSelectors[message] + '>' + messages[message] + '</li>';\n      }\n\n      container.setAttribute('hidden', true);\n      container.innerHTML = htmlMessages;\n\n      body.appendChild(container);\n    }\n\n    function _externalSite($link) {\n      var hostname = window.location.hostname;\n\n      return $link[0].hostname !== hostname;\n    }\n\n    $.each(options.$links, function() {\n      var $link = $(this);\n      var target = $link.attr('target');\n      var rel = $link.attr('rel');\n      var isExternal = _externalSite($link);\n      var isTargetBlank = target === '_blank';\n\n      if (isExternal) {\n        $link.attr('aria-describedby', idSelectors.external);\n      }\n      if (isTargetBlank) {\n        if (rel === undefined || rel.indexOf('noopener') === -1) {\n          $link.attr('rel', function(i, val) {\n            var relValue = val === undefined ? '' : val + ' ';\n            return relValue + 'noopener';\n          });\n        }\n        $link.attr('aria-describedby', idSelectors.newWindow);\n      }\n      if (isExternal && isTargetBlank) {\n        $link.attr('aria-describedby', idSelectors.newWindowExternal);\n      }\n    });\n\n    generateHTML(options.messages);\n  }\n};\n\n/**\n * Image Helper Functions\n * -----------------------------------------------------------------------------\n * A collection of functions that help with basic image operations.\n *\n */\n\ntheme.Images = (function() {\n  /**\n   * Preloads an image in memory and uses the browsers cache to store it until needed.\n   *\n   * @param {Array} images - A list of image urls\n   * @param {String} size - A shopify image size attribute\n   */\n\n  function preload(images, size) {\n    if (typeof images === 'string') {\n      images = [images];\n    }\n\n    for (var i = 0; i < images.length; i++) {\n      var image = images[i];\n      this.loadImage(this.getSizedImageUrl(image, size));\n    }\n  }\n\n  /**\n   * Loads and caches an image in the browsers cache.\n   * @param {string} path - An image url\n   */\n  function loadImage(path) {\n    new Image().src = path;\n  }\n\n  /**\n   * Swaps the src of an image for another OR returns the imageURL to the callback function\n   * @param image\n   * @param element\n   * @param callback\n   */\n  function switchImage(image, element, callback) {\n    var size = this.imageSize(element.src);\n    var imageUrl = this.getSizedImageUrl(image.src, size);\n\n    if (callback) {\n      callback(imageUrl, image, element); // eslint-disable-line callback-return\n    } else {\n      element.src = imageUrl;\n    }\n  }\n\n  /**\n   * +++ Useful\n   * Find the Shopify image attribute size\n   *\n   * @param {string} src\n   * @returns {null}\n   */\n  function imageSize(src) {\n    var match = src.match(\n      /.+_((?:pico|icon|thumb|small|compact|medium|large|grande)|\\d{1,4}x\\d{0,4}|x\\d{1,4})[_\\\\.@]/\n    );\n\n    if (match !== null) {\n      if (match[2] !== undefined) {\n        return match[1] + match[2];\n      } else {\n        return match[1];\n      }\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * +++ Useful\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 (size === null) {\n      return src;\n    }\n\n    if (size === 'master') {\n      return this.removeProtocol(src);\n    }\n\n    var match = src.match(\n      /\\.(jpg|jpeg|gif|png|bmp|bitmap|tiff|tif)(\\?v=\\d+)?$/i\n    );\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  return {\n    preload: preload,\n    loadImage: loadImage,\n    switchImage: switchImage,\n    imageSize: imageSize,\n    getSizedImageUrl: getSizedImageUrl,\n    removeProtocol: removeProtocol\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\ntheme.Currency = (function() {\n  var moneyFormat = '${{amount}}'; // eslint-disable-line camelcase\n\n  function formatMoney(cents, format) {\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      thousands = thousands || ',';\n      decimal = 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(\n        /(\\d)(?=(\\d\\d\\d)+(?!\\d))/g,\n        '$1' + thousands\n      );\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      case 'amount_with_apostrophe_separator':\n        value = formatWithDelimiters(cents, 2, \"'\");\n        break;\n    }\n\n    return formatString.replace(placeholderRegex, value);\n  }\n\n  return {\n    formatMoney: formatMoney\n  };\n})();\n\n/**\n * Variant Selection scripts\n * ------------------------------------------------------------------------------\n *\n * Handles change events from the variant inputs in any `cart/add` forms that may\n * exist.  Also updates the master select and triggers updates when the variants\n * price or image changes.\n *\n * @namespace variants\n */\n\nslate.Variants = (function() {\n  /**\n   * Variant constructor\n   *\n   * @param {object} options - Settings from `product.js`\n   */\n  function Variants(options) {\n    this.$container = options.$container;\n    this.product = options.product;\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(\n      'change',\n      this._onSelectChange.bind(this)\n    );\n  }\n\n  Variants.prototype = _.assignIn({}, Variants.prototype, {\n    /**\n     * Get the currently selected options from add-to-cart form. Works with all\n     * form input elements.\n     *\n     * @return {array} options - Values of currently selected variants\n     */\n    _getCurrentOptions: function() {\n      var currentOptions = _.map(\n        $(this.singleOptionSelector, this.$container),\n        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\n      // remove any unchecked input values if using radio buttons or checkboxes\n      currentOptions = _.compact(currentOptions);\n\n      return currentOptions;\n    },\n\n    /**\n     * Find variant based on selected values.\n     *\n     * @param  {array} selectedValues - Values of variant inputs\n     * @return {object || undefined} found - Variant object from product.variants\n     */\n    _getVariantFromOptions: function() {\n      var selectedValues = this._getCurrentOptions();\n      var variants = this.product.variants;\n\n      var found = _.find(variants, function(variant) {\n        return selectedValues.every(function(values) {\n          return _.isEqual(variant[values.index], values.value);\n        });\n      });\n\n      return found;\n    },\n\n    /**\n     * Event handler for when a variant input changes.\n     */\n    _onSelectChange: function() {\n      var variant = this._getVariantFromOptions();\n\n      this.$container.trigger({\n        type: 'variantChange',\n        variant: variant\n      });\n\n      if (!variant) {\n        return;\n      }\n\n      this._updateMasterSelect(variant);\n      this._updateImages(variant);\n      this._updatePrice(variant);\n      this._updateSKU(variant);\n      this.currentVariant = variant;\n\n      if (this.enableHistoryState) {\n        this._updateHistoryState(variant);\n      }\n    },\n\n    /**\n     * Trigger event when variant image changes\n     *\n     * @param  {object} variant - Currently selected variant\n     * @return {event}  variantImageChange\n     */\n    _updateImages: function(variant) {\n      var variantImage = variant.featured_image || {};\n      var currentVariantImage = this.currentVariant.featured_image || {};\n\n      if (\n        !variant.featured_image ||\n        variantImage.src === currentVariantImage.src\n      ) {\n        return;\n      }\n\n      this.$container.trigger({\n        type: 'variantImageChange',\n        variant: variant\n      });\n    },\n\n    /**\n     * Trigger event when variant price changes.\n     *\n     * @param  {object} variant - Currently selected variant\n     * @return {event} variantPriceChange\n     */\n    _updatePrice: function(variant) {\n      if (\n        variant.price === this.currentVariant.price &&\n        variant.compare_at_price === this.currentVariant.compare_at_price\n      ) {\n        return;\n      }\n\n      this.$container.trigger({\n        type: 'variantPriceChange',\n        variant: variant\n      });\n    },\n\n    /**\n     * Trigger event when variant sku changes.\n     *\n     * @param  {object} variant - Currently selected variant\n     * @return {event} variantSKUChange\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    /**\n     * Update history state for product deeplinking\n     *\n     * @param  {variant} variant - Currently selected variant\n     * @return {k}         [description]\n     */\n    _updateHistoryState: function(variant) {\n      if (!history.replaceState || !variant) {\n        return;\n      }\n\n      var newurl =\n        window.location.protocol +\n        '//' +\n        window.location.host +\n        window.location.pathname +\n        '?variant=' +\n        variant.id;\n      window.history.replaceState({ path: newurl }, '', newurl);\n    },\n\n    /**\n     * Update hidden master select of variant change\n     *\n     * @param  {variant} variant - Currently selected variant\n     */\n    _updateMasterSelect: function(variant) {\n      $(this.originalSelectorId, this.$container).val(variant.id);\n    }\n  });\n\n  return Variants;\n})();\n\nthis.Shopify = this.Shopify || {};\nthis.Shopify.theme = this.Shopify.theme || {};\nthis.Shopify.theme.PredictiveSearch = (function() {\n  'use strict';\n\n  function validateQuery(query) {\n    var error;\n\n    if (query === null || query === undefined) {\n      error = new TypeError(\"'query' is missing\");\n      error.type = 'argument';\n      throw error;\n    }\n\n    if (typeof query !== 'string') {\n      error = new TypeError(\"'query' is not a string\");\n      error.type = 'argument';\n      throw error;\n    }\n  }\n\n  function GenericError() {\n    var error = Error.call(this);\n\n    error.name = 'Server error';\n    error.message = 'Something went wrong on the server';\n    error.status = 500;\n\n    return error;\n  }\n\n  function NotFoundError(status) {\n    var error = Error.call(this);\n\n    error.name = 'Not found';\n    error.message = 'Not found';\n    error.status = status;\n\n    return error;\n  }\n\n  function ServerError() {\n    var error = Error.call(this);\n\n    error.name = 'Server error';\n    error.message = 'Something went wrong on the server';\n    error.status = 500;\n\n    return error;\n  }\n\n  function ContentTypeError(status) {\n    var error = Error.call(this);\n\n    error.name = 'Content-Type error';\n    error.message = 'Content-Type was not provided or is of wrong type';\n    error.status = status;\n\n    return error;\n  }\n\n  function JsonParseError(status) {\n    var error = Error.call(this);\n\n    error.name = 'JSON parse error';\n    error.message = 'JSON syntax error';\n    error.status = status;\n\n    return error;\n  }\n\n  function ThrottledError(status, name, message, retryAfter) {\n    var error = Error.call(this);\n\n    error.name = name;\n    error.message = message;\n    error.status = status;\n    error.retryAfter = retryAfter;\n\n    return error;\n  }\n\n  function InvalidParameterError(status, name, message) {\n    var error = Error.call(this);\n\n    error.name = name;\n    error.message = message;\n    error.status = status;\n\n    return error;\n  }\n\n  function ExpectationFailedError(status, name, message) {\n    var error = Error.call(this);\n\n    error.name = name;\n    error.message = message;\n    error.status = status;\n\n    return error;\n  }\n\n  function request(configParams, query, onSuccess, onError) {\n    var xhr = new XMLHttpRequest();\n\n    xhr.onreadystatechange = function() {\n      if (xhr.readyState !== XMLHttpRequest.DONE) {\n        return;\n      }\n\n      var contentType = xhr.getResponseHeader('Content-Type');\n\n      if (xhr.status >= 500) {\n        onError(new ServerError());\n\n        return;\n      }\n\n      if (xhr.status === 404) {\n        onError(new NotFoundError(xhr.status));\n\n        return;\n      }\n\n      if (\n        typeof contentType !== 'string' ||\n        contentType.toLowerCase().match('application/json') === null\n      ) {\n        onError(new ContentTypeError(xhr.status));\n\n        return;\n      }\n\n      if (xhr.status === 417) {\n        try {\n          var invalidParameterJson = JSON.parse(xhr.responseText);\n\n          onError(\n            new InvalidParameterError(\n              xhr.status,\n              invalidParameterJson.message,\n              invalidParameterJson.description\n            )\n          );\n        } catch (error) {\n          onError(new JsonParseError(xhr.status));\n        }\n\n        return;\n      }\n\n      if (xhr.status === 422) {\n        try {\n          var expectationFailedJson = JSON.parse(xhr.responseText);\n\n          onError(\n            new ExpectationFailedError(\n              xhr.status,\n              expectationFailedJson.message,\n              expectationFailedJson.description\n            )\n          );\n        } catch (error) {\n          onError(new JsonParseError(xhr.status));\n        }\n\n        return;\n      }\n\n      if (xhr.status === 429) {\n        try {\n          var throttledJson = JSON.parse(xhr.responseText);\n\n          onError(\n            new ThrottledError(\n              xhr.status,\n              throttledJson.message,\n              throttledJson.description,\n              xhr.getResponseHeader('Retry-After')\n            )\n          );\n        } catch (error) {\n          onError(new JsonParseError(xhr.status));\n        }\n\n        return;\n      }\n\n      if (xhr.status === 200) {\n        try {\n          var res = JSON.parse(xhr.responseText);\n          res.query = query;\n          onSuccess(res);\n        } catch (error) {\n          onError(new JsonParseError(xhr.status));\n        }\n\n        return;\n      }\n\n      try {\n        var genericErrorJson = JSON.parse(xhr.responseText);\n        onError(\n          new GenericError(\n            xhr.status,\n            genericErrorJson.message,\n            genericErrorJson.description\n          )\n        );\n      } catch (error) {\n        onError(new JsonParseError(xhr.status));\n      }\n\n      return;\n    };\n\n    xhr.open(\n      'get',\n      '/search/suggest.json?q=' + encodeURIComponent(query) + '&' + configParams\n    );\n\n    xhr.setRequestHeader('Content-Type', 'application/json');\n\n    xhr.send();\n  }\n\n  function Cache(config) {\n    this._store = {};\n    this._keys = [];\n    if (config && config.bucketSize) {\n      this.bucketSize = config.bucketSize;\n    } else {\n      this.bucketSize = 20;\n    }\n  }\n\n  Cache.prototype.set = function(key, value) {\n    if (this.count() >= this.bucketSize) {\n      var deleteKey = this._keys.splice(0, 1);\n      this.delete(deleteKey);\n    }\n\n    this._keys.push(key);\n    this._store[key] = value;\n\n    return this._store;\n  };\n\n  Cache.prototype.get = function(key) {\n    return this._store[key];\n  };\n\n  Cache.prototype.has = function(key) {\n    return Boolean(this._store[key]);\n  };\n\n  Cache.prototype.count = function() {\n    return Object.keys(this._store).length;\n  };\n\n  Cache.prototype.delete = function(key) {\n    var exists = Boolean(this._store[key]);\n    delete this._store[key];\n    return exists && !this._store[key];\n  };\n\n  function Dispatcher() {\n    this.events = {};\n  }\n\n  Dispatcher.prototype.on = function(eventName, callback) {\n    var event = this.events[eventName];\n    if (!event) {\n      event = new DispatcherEvent(eventName);\n      this.events[eventName] = event;\n    }\n    event.registerCallback(callback);\n  };\n\n  Dispatcher.prototype.off = function(eventName, callback) {\n    var event = this.events[eventName];\n    if (event && event.callbacks.indexOf(callback) > -1) {\n      event.unregisterCallback(callback);\n      if (event.callbacks.length === 0) {\n        delete this.events[eventName];\n      }\n    }\n  };\n\n  Dispatcher.prototype.dispatch = function(eventName, payload) {\n    var event = this.events[eventName];\n    if (event) {\n      event.fire(payload);\n    }\n  };\n\n  function DispatcherEvent(eventName) {\n    this.eventName = eventName;\n    this.callbacks = [];\n  }\n\n  DispatcherEvent.prototype.registerCallback = function(callback) {\n    this.callbacks.push(callback);\n  };\n\n  DispatcherEvent.prototype.unregisterCallback = function(callback) {\n    var index = this.callbacks.indexOf(callback);\n    if (index > -1) {\n      this.callbacks.splice(index, 1);\n    }\n  };\n\n  DispatcherEvent.prototype.fire = function(payload) {\n    var callbacks = this.callbacks.slice(0);\n    callbacks.forEach(function(callback) {\n      callback(payload);\n    });\n  };\n\n  function debounce(func, wait) {\n    var timeout = null;\n    return function() {\n      var context = this;\n      var args = arguments;\n      clearTimeout(timeout);\n      timeout = setTimeout(function() {\n        timeout = null;\n        func.apply(context, args);\n      }, wait || 0);\n    };\n  }\n\n  function objectToQueryParams(obj, parentKey) {\n    var output = '';\n    parentKey = parentKey || null;\n\n    Object.keys(obj).forEach(function(key) {\n      var outputKey = key + '=';\n      if (parentKey) {\n        outputKey = parentKey + '[' + key + ']';\n      }\n\n      switch (trueTypeOf(obj[key])) {\n        case 'object':\n          output += objectToQueryParams(obj[key], parentKey ? outputKey : key);\n          break;\n        case 'array':\n          output += outputKey + '=' + obj[key].join(',') + '&';\n          break;\n        default:\n          if (parentKey) {\n            outputKey += '=';\n          }\n          output += outputKey + encodeURIComponent(obj[key]) + '&';\n          break;\n      }\n    });\n\n    return output;\n  }\n\n  function trueTypeOf(obj) {\n    return Object.prototype.toString\n      .call(obj)\n      .slice(8, -1)\n      .toLowerCase();\n  }\n\n  var DEBOUNCE_RATE = 10;\n  var requestDebounced = debounce(request, DEBOUNCE_RATE);\n\n  function PredictiveSearch(config) {\n    if (!config) {\n      throw new TypeError('No config object was specified');\n    }\n\n    this._retryAfter = null;\n    this._currentQuery = null;\n\n    this.dispatcher = new Dispatcher();\n    this.cache = new Cache({ bucketSize: 40 });\n    this.configParams = objectToQueryParams(config);\n  }\n\n  PredictiveSearch.TYPES = {\n    PRODUCT: 'product',\n    PAGE: 'page',\n    ARTICLE: 'article'\n  };\n\n  PredictiveSearch.FIELDS = {\n    AUTHOR: 'author',\n    BODY: 'body',\n    PRODUCT_TYPE: 'product_type',\n    TAG: 'tag',\n    TITLE: 'title',\n    VARIANTS_BARCODE: 'variants.barcode',\n    VARIANTS_SKU: 'variants.sku',\n    VARIANTS_TITLE: 'variants.title',\n    VENDOR: 'vendor'\n  };\n\n  PredictiveSearch.UNAVAILABLE_PRODUCTS = {\n    SHOW: 'show',\n    HIDE: 'hide',\n    LAST: 'last'\n  };\n\n  PredictiveSearch.prototype.query = function query(query) {\n    try {\n      validateQuery(query);\n    } catch (error) {\n      this.dispatcher.dispatch('error', error);\n      return;\n    }\n\n    if (query === '') {\n      return this;\n    }\n\n    this._currentQuery = normalizeQuery(query);\n    var cacheResult = this.cache.get(this._currentQuery);\n    if (cacheResult) {\n      this.dispatcher.dispatch('success', cacheResult);\n      return this;\n    }\n\n    requestDebounced(\n      this.configParams,\n      query,\n      function(result) {\n        this.cache.set(normalizeQuery(result.query), result);\n        if (normalizeQuery(result.query) === this._currentQuery) {\n          this._retryAfter = null;\n          this.dispatcher.dispatch('success', result);\n        }\n      }.bind(this),\n      function(error) {\n        if (error.retryAfter) {\n          this._retryAfter = error.retryAfter;\n        }\n        this.dispatcher.dispatch('error', error);\n      }.bind(this)\n    );\n\n    return this;\n  };\n\n  PredictiveSearch.prototype.on = function on(eventName, callback) {\n    this.dispatcher.on(eventName, callback);\n\n    return this;\n  };\n\n  PredictiveSearch.prototype.off = function on(eventName, callback) {\n    this.dispatcher.off(eventName, callback);\n\n    return this;\n  };\n\n  function normalizeQuery(query) {\n    if (typeof query !== 'string') {\n      return null;\n    }\n\n    return query\n      .trim()\n      .replace(' ', '-')\n      .toLowerCase();\n  }\n\n  return PredictiveSearch;\n})();\n\nthis.Shopify = this.Shopify || {};\nthis.Shopify.theme = this.Shopify.theme || {};\nthis.Shopify.theme.PredictiveSearchComponent = (function(PredictiveSearch) {\n  'use strict';\n\n  PredictiveSearch =\n    PredictiveSearch && PredictiveSearch.hasOwnProperty('default')\n      ? PredictiveSearch['default']\n      : PredictiveSearch;\n\n  var DEFAULT_PREDICTIVE_SEARCH_API_CONFIG = {\n    resources: {\n      type: [PredictiveSearch.TYPES.PRODUCT],\n      options: {\n        unavailable_products: PredictiveSearch.UNAVAILABLE_PRODUCTS.LAST,\n        fields: [\n          PredictiveSearch.FIELDS.TITLE,\n          PredictiveSearch.FIELDS.VENDOR,\n          PredictiveSearch.FIELDS.PRODUCT_TYPE,\n          PredictiveSearch.FIELDS.VARIANTS_TITLE\n        ]\n      }\n    }\n  };\n\n  function PredictiveSearchComponent(config) {\n    // validate config\n    if (\n      !config ||\n      !config.selectors ||\n      !config.selectors.input ||\n      !isString(config.selectors.input) ||\n      !config.selectors.result ||\n      !isString(config.selectors.result) ||\n      !config.resultTemplateFct ||\n      !isFunction(config.resultTemplateFct) ||\n      !config.numberOfResultsTemplateFct ||\n      !isFunction(config.numberOfResultsTemplateFct) ||\n      !config.loadingResultsMessageTemplateFct ||\n      !isFunction(config.loadingResultsMessageTemplateFct)\n    ) {\n      var error = new TypeError(\n        'PredictiveSearchComponent config is not valid'\n      );\n      error.type = 'argument';\n      throw error;\n    }\n\n    // Find nodes\n    this.nodes = findNodes(config.selectors);\n\n    // Validate nodes\n    if (!isValidNodes(this.nodes)) {\n      // eslint-disable-next-line no-console\n      console.warn('Could not find valid nodes');\n      return;\n    }\n\n    // Store the keyword that was used for the search\n    this._searchKeyword = '';\n\n    // Assign result template\n    this.resultTemplateFct = config.resultTemplateFct;\n\n    // Assign number of results template\n    this.numberOfResultsTemplateFct = config.numberOfResultsTemplateFct;\n\n    // Assign loading state template function\n    this.loadingResultsMessageTemplateFct =\n      config.loadingResultsMessageTemplateFct;\n\n    // Assign number of search results\n    this.numberOfResults = config.numberOfResults || 4;\n\n    // Set classes\n    this.classes = {\n      visibleVariant: config.visibleVariant\n        ? config.visibleVariant\n        : 'predictive-search-wrapper--visible',\n      itemSelected: config.itemSelectedClass\n        ? config.itemSelectedClass\n        : 'predictive-search-item--selected',\n      clearButtonVisible: config.clearButtonVisibleClass\n        ? config.clearButtonVisibleClass\n        : 'predictive-search__clear-button--visible'\n    };\n\n    this.selectors = {\n      searchResult: config.searchResult\n        ? config.searchResult\n        : '[data-search-result]'\n    };\n\n    // Assign callbacks\n    this.callbacks = assignCallbacks(config);\n\n    // Add input attributes\n    addInputAttributes(this.nodes.input);\n\n    // Add input event listeners\n    this._addInputEventListeners();\n\n    // Add body listener\n    this._addBodyEventListener();\n\n    // Add accessibility announcer\n    this._addAccessibilityAnnouncer();\n\n    // Display the reset button if the input is not empty\n    this._toggleClearButtonVisibility();\n\n    // Instantiate Predictive Search API\n    this.predictiveSearch = new PredictiveSearch(\n      config.PredictiveSearchAPIConfig\n        ? config.PredictiveSearchAPIConfig\n        : DEFAULT_PREDICTIVE_SEARCH_API_CONFIG\n    );\n\n    // Add predictive search success event listener\n    this.predictiveSearch.on(\n      'success',\n      this._handlePredictiveSearchSuccess.bind(this)\n    );\n\n    // Add predictive search error event listener\n    this.predictiveSearch.on(\n      'error',\n      this._handlePredictiveSearchError.bind(this)\n    );\n  }\n\n  /**\n   * Private methods\n   */\n  function findNodes(selectors) {\n    return {\n      input: document.querySelector(selectors.input),\n      reset: document.querySelector(selectors.reset),\n      result: document.querySelector(selectors.result)\n    };\n  }\n\n  function isValidNodes(nodes) {\n    if (\n      !nodes ||\n      !nodes.input ||\n      !nodes.result ||\n      nodes.input.tagName !== 'INPUT'\n    ) {\n      return false;\n    }\n\n    return true;\n  }\n\n  function assignCallbacks(config) {\n    return {\n      onBodyMousedown: config.onBodyMousedown,\n      onBeforeOpen: config.onBeforeOpen,\n      onOpen: config.onOpen,\n      onBeforeClose: config.onBeforeClose,\n      onClose: config.onClose,\n      onInputFocus: config.onInputFocus,\n      onInputKeyup: config.onInputKeyup,\n      onInputBlur: config.onInputBlur,\n      onInputReset: config.onInputReset,\n      onBeforeDestroy: config.onBeforeDestroy,\n      onDestroy: config.onDestroy\n    };\n  }\n\n  function addInputAttributes(input) {\n    input.setAttribute('autocorrect', 'off');\n    input.setAttribute('autocomplete', 'off');\n    input.setAttribute('autocapitalize', 'off');\n    input.setAttribute('spellcheck', 'false');\n  }\n\n  function removeInputAttributes(input) {\n    input.removeAttribute('autocorrect', 'off');\n    input.removeAttribute('autocomplete', 'off');\n    input.removeAttribute('autocapitalize', 'off');\n    input.removeAttribute('spellcheck', 'false');\n  }\n\n  /**\n   * Public variables\n   */\n  PredictiveSearchComponent.prototype.isResultVisible = false;\n  PredictiveSearchComponent.prototype.results = {};\n\n  /**\n   * \"Private\" variables\n   */\n  PredictiveSearchComponent.prototype._latencyTimer = null;\n  PredictiveSearchComponent.prototype._resultNodeClicked = false;\n\n  /**\n   * \"Private\" instance methods\n   */\n  PredictiveSearchComponent.prototype._addInputEventListeners = function() {\n    var input = this.nodes.input;\n    var reset = this.nodes.reset;\n\n    if (!input) {\n      return;\n    }\n\n    this._handleInputFocus = this._handleInputFocus.bind(this);\n    this._handleInputBlur = this._handleInputBlur.bind(this);\n    this._handleInputKeyup = this._handleInputKeyup.bind(this);\n    this._handleInputKeydown = this._handleInputKeydown.bind(this);\n\n    input.addEventListener('focus', this._handleInputFocus);\n    input.addEventListener('blur', this._handleInputBlur);\n    input.addEventListener('keyup', this._handleInputKeyup);\n    input.addEventListener('keydown', this._handleInputKeydown);\n\n    if (reset) {\n      this._handleInputReset = this._handleInputReset.bind(this);\n      reset.addEventListener('click', this._handleInputReset);\n    }\n  };\n\n  PredictiveSearchComponent.prototype._removeInputEventListeners = function() {\n    var input = this.nodes.input;\n\n    input.removeEventListener('focus', this._handleInputFocus);\n    input.removeEventListener('blur', this._handleInputBlur);\n    input.removeEventListener('keyup', this._handleInputKeyup);\n    input.removeEventListener('keydown', this._handleInputKeydown);\n  };\n\n  PredictiveSearchComponent.prototype._addBodyEventListener = function() {\n    this._handleBodyMousedown = this._handleBodyMousedown.bind(this);\n\n    document\n      .querySelector('body')\n      .addEventListener('mousedown', this._handleBodyMousedown);\n  };\n\n  PredictiveSearchComponent.prototype._removeBodyEventListener = function() {\n    document\n      .querySelector('body')\n      .removeEventListener('mousedown', this._handleBodyMousedown);\n  };\n\n  PredictiveSearchComponent.prototype._removeClearButtonEventListener = function() {\n    var reset = this.nodes.reset;\n\n    if (!reset) {\n      return;\n    }\n\n    reset.removeEventListener('click', this._handleInputReset);\n  };\n\n  /**\n   * Event handlers\n   */\n  PredictiveSearchComponent.prototype._handleBodyMousedown = function(evt) {\n    if (this.isResultVisible && this.nodes !== null) {\n      if (\n        evt.target.isEqualNode(this.nodes.input) ||\n        this.nodes.input.contains(evt.target) ||\n        evt.target.isEqualNode(this.nodes.result) ||\n        this.nodes.result.contains(evt.target)\n      ) {\n        this._resultNodeClicked = true;\n      } else {\n        if (isFunction(this.callbacks.onBodyMousedown)) {\n          var returnedValue = this.callbacks.onBodyMousedown(this.nodes);\n          if (isBoolean(returnedValue) && returnedValue) {\n            this.close();\n          }\n        } else {\n          this.close();\n        }\n      }\n    }\n  };\n\n  PredictiveSearchComponent.prototype._handleInputFocus = function(evt) {\n    if (isFunction(this.callbacks.onInputFocus)) {\n      var returnedValue = this.callbacks.onInputFocus(this.nodes);\n      if (isBoolean(returnedValue) && !returnedValue) {\n        return false;\n      }\n    }\n\n    if (evt.target.value.length > 0) {\n      this._search();\n    }\n\n    return true;\n  };\n\n  PredictiveSearchComponent.prototype._handleInputBlur = function() {\n    // This has to be done async, to wait for the focus to be on the next\n    // element and avoid closing the results.\n    // Example: Going from the input to the reset button.\n    setTimeout(\n      function() {\n        if (isFunction(this.callbacks.onInputBlur)) {\n          var returnedValue = this.callbacks.onInputBlur(this.nodes);\n          if (isBoolean(returnedValue) && !returnedValue) {\n            return false;\n          }\n        }\n\n        if (document.activeElement.isEqualNode(this.nodes.reset)) {\n          return false;\n        }\n\n        if (this._resultNodeClicked) {\n          this._resultNodeClicked = false;\n          return false;\n        }\n\n        this.close();\n      }.bind(this)\n    );\n\n    return true;\n  };\n\n  PredictiveSearchComponent.prototype._addAccessibilityAnnouncer = function() {\n    this._accessibilityAnnouncerDiv = window.document.createElement('div');\n\n    this._accessibilityAnnouncerDiv.setAttribute(\n      'style',\n      'position: absolute !important; overflow: hidden; clip: rect(0 0 0 0); height: 1px; width: 1px; margin: -1px; padding: 0; border: 0;'\n    );\n\n    this._accessibilityAnnouncerDiv.setAttribute('data-search-announcer', '');\n    this._accessibilityAnnouncerDiv.setAttribute('aria-live', 'polite');\n    this._accessibilityAnnouncerDiv.setAttribute('aria-atomic', 'true');\n\n    this.nodes.result.parentElement.appendChild(\n      this._accessibilityAnnouncerDiv\n    );\n  };\n\n  PredictiveSearchComponent.prototype._removeAccessibilityAnnouncer = function() {\n    this.nodes.result.parentElement.removeChild(\n      this._accessibilityAnnouncerDiv\n    );\n  };\n\n  PredictiveSearchComponent.prototype._updateAccessibilityAttributesAfterSelectingElement = function(\n    previousSelectedElement,\n    currentSelectedElement\n  ) {\n    // Update the active descendant on the search input\n    this.nodes.input.setAttribute(\n      'aria-activedescendant',\n      currentSelectedElement.id\n    );\n\n    // Unmark the previousSelected elemented as selected\n    if (previousSelectedElement) {\n      previousSelectedElement.removeAttribute('aria-selected');\n    }\n\n    // Mark the element as selected\n    currentSelectedElement.setAttribute('aria-selected', true);\n  };\n\n  PredictiveSearchComponent.prototype._clearAriaActiveDescendant = function() {\n    this.nodes.input.setAttribute('aria-activedescendant', '');\n  };\n\n  PredictiveSearchComponent.prototype._announceNumberOfResultsFound = function(\n    results\n  ) {\n    var currentAnnouncedMessage = this._accessibilityAnnouncerDiv.innerHTML;\n    var newMessage = this.numberOfResultsTemplateFct(results);\n\n    // If the messages are the same, they won't get announced\n    // add white space so it gets announced\n    if (currentAnnouncedMessage === newMessage) {\n      newMessage = newMessage + '&nbsp;';\n    }\n\n    this._accessibilityAnnouncerDiv.innerHTML = newMessage;\n  };\n\n  PredictiveSearchComponent.prototype._announceLoadingState = function() {\n    this._accessibilityAnnouncerDiv.innerHTML = this.loadingResultsMessageTemplateFct();\n  };\n\n  PredictiveSearchComponent.prototype._handleInputKeyup = function(evt) {\n    var UP_ARROW_KEY_CODE = 38;\n    var DOWN_ARROW_KEY_CODE = 40;\n    var RETURN_KEY_CODE = 13;\n    var ESCAPE_KEY_CODE = 27;\n\n    if (isFunction(this.callbacks.onInputKeyup)) {\n      var returnedValue = this.callbacks.onInputKeyup(this.nodes);\n      if (isBoolean(returnedValue) && !returnedValue) {\n        return false;\n      }\n    }\n\n    this._toggleClearButtonVisibility();\n\n    if (this.isResultVisible && this.nodes !== null) {\n      if (evt.keyCode === UP_ARROW_KEY_CODE) {\n        this._navigateOption(evt, 'UP');\n        return true;\n      }\n\n      if (evt.keyCode === DOWN_ARROW_KEY_CODE) {\n        this._navigateOption(evt, 'DOWN');\n        return true;\n      }\n\n      if (evt.keyCode === RETURN_KEY_CODE) {\n        this._selectOption();\n        return true;\n      }\n\n      if (evt.keyCode === ESCAPE_KEY_CODE) {\n        this.close();\n      }\n    }\n\n    if (evt.target.value.length <= 0) {\n      this.close();\n      this._setKeyword('');\n    } else if (evt.target.value.length > 0) {\n      this._search();\n    }\n\n    return true;\n  };\n\n  PredictiveSearchComponent.prototype._handleInputKeydown = function(evt) {\n    var RETURN_KEY_CODE = 13;\n    var UP_ARROW_KEY_CODE = 38;\n    var DOWN_ARROW_KEY_CODE = 40;\n\n    // Prevent the form default submission if there is a selected option\n    if (evt.keyCode === RETURN_KEY_CODE && this._getSelectedOption() !== null) {\n      evt.preventDefault();\n    }\n\n    // Prevent the cursor from moving in the input when using the up and down arrow keys\n    if (\n      evt.keyCode === UP_ARROW_KEY_CODE ||\n      evt.keyCode === DOWN_ARROW_KEY_CODE\n    ) {\n      evt.preventDefault();\n    }\n  };\n\n  PredictiveSearchComponent.prototype._handleInputReset = function(evt) {\n    evt.preventDefault();\n\n    if (isFunction(this.callbacks.onInputReset)) {\n      var returnedValue = this.callbacks.onInputReset(this.nodes);\n      if (isBoolean(returnedValue) && !returnedValue) {\n        return false;\n      }\n    }\n\n    this.nodes.input.value = '';\n    this.nodes.input.focus();\n    this._toggleClearButtonVisibility();\n    this.close();\n\n    return true;\n  };\n\n  PredictiveSearchComponent.prototype._navigateOption = function(\n    evt,\n    direction\n  ) {\n    var currentOption = this._getSelectedOption();\n\n    if (!currentOption) {\n      var firstOption = this.nodes.result.querySelector(\n        this.selectors.searchResult\n      );\n      firstOption.classList.add(this.classes.itemSelected);\n      this._updateAccessibilityAttributesAfterSelectingElement(\n        null,\n        firstOption\n      );\n    } else {\n      if (direction === 'DOWN') {\n        var nextOption = currentOption.nextElementSibling;\n        if (nextOption) {\n          currentOption.classList.remove(this.classes.itemSelected);\n          nextOption.classList.add(this.classes.itemSelected);\n          this._updateAccessibilityAttributesAfterSelectingElement(\n            currentOption,\n            nextOption\n          );\n        }\n      } else {\n        var previousOption = currentOption.previousElementSibling;\n        if (previousOption) {\n          currentOption.classList.remove(this.classes.itemSelected);\n          previousOption.classList.add(this.classes.itemSelected);\n          this._updateAccessibilityAttributesAfterSelectingElement(\n            currentOption,\n            previousOption\n          );\n        }\n      }\n    }\n  };\n\n  PredictiveSearchComponent.prototype._getSelectedOption = function() {\n    return this.nodes.result.querySelector('.' + this.classes.itemSelected);\n  };\n\n  PredictiveSearchComponent.prototype._selectOption = function() {\n    var selectedOption = this._getSelectedOption();\n\n    if (selectedOption) {\n      selectedOption.querySelector('a, button').click();\n    }\n  };\n\n  PredictiveSearchComponent.prototype._search = function() {\n    var newSearchKeyword = this.nodes.input.value;\n\n    if (this._searchKeyword === newSearchKeyword) {\n      return;\n    }\n\n    clearTimeout(this._latencyTimer);\n    this._latencyTimer = setTimeout(\n      function() {\n        this.results.isLoading = true;\n\n        // Annonuce that we're loading the results\n        this._announceLoadingState();\n\n        this.nodes.result.classList.add(this.classes.visibleVariant);\n        // NOTE: We could benifit in using DOMPurify.\n        // https://github.com/cure53/DOMPurify\n        this.nodes.result.innerHTML = this.resultTemplateFct(this.results);\n      }.bind(this),\n      500\n    );\n\n    this.predictiveSearch.query(newSearchKeyword);\n    this._setKeyword(newSearchKeyword);\n  };\n\n  PredictiveSearchComponent.prototype._handlePredictiveSearchSuccess = function(\n    json\n  ) {\n    clearTimeout(this._latencyTimer);\n    this.results = json.resources.results;\n\n    this.results.isLoading = false;\n    this.results.products = this.results.products.slice(\n      0,\n      this.numberOfResults\n    );\n    this.results.canLoadMore =\n      this.numberOfResults <= this.results.products.length;\n    this.results.searchQuery = this.nodes.input.value;\n\n    if (this.results.products.length > 0 || this.results.searchQuery) {\n      this.nodes.result.innerHTML = this.resultTemplateFct(this.results);\n      this._announceNumberOfResultsFound(this.results);\n      this.open();\n    } else {\n      this.nodes.result.innerHTML = '';\n\n      this._closeOnNoResults();\n    }\n  };\n\n  PredictiveSearchComponent.prototype._handlePredictiveSearchError = function() {\n    clearTimeout(this._latencyTimer);\n    this.nodes.result.innerHTML = '';\n\n    this._closeOnNoResults();\n  };\n\n  PredictiveSearchComponent.prototype._closeOnNoResults = function() {\n    if (this.nodes) {\n      this.nodes.result.classList.remove(this.classes.visibleVariant);\n    }\n\n    this.isResultVisible = false;\n  };\n\n  PredictiveSearchComponent.prototype._setKeyword = function(keyword) {\n    this._searchKeyword = keyword;\n  };\n\n  PredictiveSearchComponent.prototype._toggleClearButtonVisibility = function() {\n    if (!this.nodes.reset) {\n      return;\n    }\n\n    if (this.nodes.input.value.length > 0) {\n      this.nodes.reset.classList.add(this.classes.clearButtonVisible);\n    } else {\n      this.nodes.reset.classList.remove(this.classes.clearButtonVisible);\n    }\n  };\n\n  /**\n   * Public methods\n   */\n  PredictiveSearchComponent.prototype.open = function() {\n    if (this.isResultVisible) {\n      return;\n    }\n\n    if (isFunction(this.callbacks.onBeforeOpen)) {\n      var returnedValue = this.callbacks.onBeforeOpen(this.nodes);\n      if (isBoolean(returnedValue) && !returnedValue) {\n        return false;\n      }\n    }\n\n    this.nodes.result.classList.add(this.classes.visibleVariant);\n    this.nodes.input.setAttribute('aria-expanded', true);\n    this.isResultVisible = true;\n\n    if (isFunction(this.callbacks.onOpen)) {\n      return this.callbacks.onOpen(this.nodes) || true;\n    }\n\n    return true;\n  };\n\n  PredictiveSearchComponent.prototype.close = function() {\n    if (!this.isResultVisible) {\n      return true;\n    }\n\n    if (isFunction(this.callbacks.onBeforeClose)) {\n      var returnedValue = this.callbacks.onBeforeClose(this.nodes);\n      if (isBoolean(returnedValue) && !returnedValue) {\n        return false;\n      }\n    }\n\n    if (this.nodes) {\n      this.nodes.result.classList.remove(this.classes.visibleVariant);\n    }\n\n    this.nodes.input.setAttribute('aria-expanded', false);\n    this._clearAriaActiveDescendant();\n    this._setKeyword('');\n\n    if (isFunction(this.callbacks.onClose)) {\n      this.callbacks.onClose(this.nodes);\n    }\n\n    this.isResultVisible = false;\n    this.results = {};\n\n    return true;\n  };\n\n  PredictiveSearchComponent.prototype.destroy = function() {\n    this.close();\n\n    if (isFunction(this.callbacks.onBeforeDestroy)) {\n      var returnedValue = this.callbacks.onBeforeDestroy(this.nodes);\n      if (isBoolean(returnedValue) && !returnedValue) {\n        return false;\n      }\n    }\n\n    this.nodes.result.classList.remove(this.classes.visibleVariant);\n    removeInputAttributes(this.nodes.input);\n    this._removeInputEventListeners();\n    this._removeBodyEventListener();\n    this._removeAccessibilityAnnouncer();\n    this._removeClearButtonEventListener();\n\n    if (isFunction(this.callbacks.onDestroy)) {\n      this.callbacks.onDestroy(this.nodes);\n    }\n\n    return true;\n  };\n\n  PredictiveSearchComponent.prototype.clearAndClose = function() {\n    this.nodes.input.value = '';\n    this.close();\n  };\n\n  /**\n   * Utilities\n   */\n  function getTypeOf(value) {\n    return Object.prototype.toString.call(value);\n  }\n\n  function isString(value) {\n    return getTypeOf(value) === '[object String]';\n  }\n\n  function isBoolean(value) {\n    return getTypeOf(value) === '[object Boolean]';\n  }\n\n  function isFunction(value) {\n    return getTypeOf(value) === '[object Function]';\n  }\n\n  return PredictiveSearchComponent;\n})(Shopify.theme.PredictiveSearch);\n\n\n/* ================ GLOBAL ================ */\n/*============================================================================\n  Drawer modules\n==============================================================================*/\ntheme.Drawers = (function() {\n  function Drawer(id, position, options) {\n    var DEFAULT_OPEN_CLASS = 'js-drawer-open';\n    var DEFAULT_CLOSE_CLASS = 'js-drawer-close';\n\n    var defaults = {\n      selectors: {\n        openVariant: '.' + DEFAULT_OPEN_CLASS + '-' + position,\n        close: '.' + DEFAULT_CLOSE_CLASS\n      },\n      classes: {\n        open: DEFAULT_OPEN_CLASS,\n        openVariant: DEFAULT_OPEN_CLASS + '-' + position\n      },\n      withPredictiveSearch: false\n    };\n\n    this.nodes = {\n      $parent: $('html').add('body'),\n      $page: $('#PageContainer')\n    };\n\n    this.config = $.extend(defaults, options);\n    this.position = position;\n    this.$drawer = $('#' + id);\n\n    if (!this.$drawer.length) {\n      return false;\n    }\n\n    this.drawerIsOpen = false;\n    this.init();\n  }\n\n  Drawer.prototype.init = function() {\n    $(this.config.selectors.openVariant).on('click', $.proxy(this.open, this));\n    this.$drawer.on(\n      'click',\n      this.config.selectors.close,\n      $.proxy(this.close, this)\n    );\n  };\n\n  Drawer.prototype.open = function(evt) {\n    // Keep track if drawer was opened from a click, or called by another function\n    var externalCall = false;\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 drawer opens, the click event bubbles up to nodes.$page\n    // 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);\n    }\n\n    if (this.drawerIsOpen && !externalCall) {\n      return this.close();\n    }\n\n    // Add is-transitioning class to moved elements on open so drawer can have\n    // transition for close animation\n    if (!this.config.withPredictiveSearch) {\n      this.$drawer.prepareTransition();\n    }\n\n    this.nodes.$parent.addClass(\n      this.config.classes.open + ' ' + this.config.classes.openVariant\n    );\n    this.drawerIsOpen = true;\n\n    // Run function when draw opens if set\n    if (\n      this.config.onDrawerOpen &&\n      typeof this.config.onDrawerOpen === 'function'\n    ) {\n      if (!externalCall) {\n        this.config.onDrawerOpen();\n      }\n    }\n\n    if (this.$activeSource && this.$activeSource.attr('aria-expanded')) {\n      this.$activeSource.attr('aria-expanded', 'true');\n    }\n\n    // Set focus on drawer\n    var trapFocusConfig = {\n      $container: this.$drawer,\n      namespace: 'drawer_focus'\n    };\n    if (this.config.$elementToFocusOnOpen) {\n      trapFocusConfig.$elementToFocus = this.config.$elementToFocusOnOpen;\n    }\n\n    slate.a11y.trapFocus(trapFocusConfig);\n\n    this.bindEvents();\n\n    return this;\n  };\n\n  Drawer.prototype.close = function() {\n    if (!this.drawerIsOpen) {\n      // don't close a closed drawer\n      return;\n    }\n\n    // deselect any focused form elements\n    $(document.activeElement).trigger('blur');\n\n    // Ensure closing transition is applied to moved elements, like the nav\n    if (!this.config.withPredictiveSearch) {\n      this.$drawer.prepareTransition();\n    }\n\n    this.nodes.$parent.removeClass(\n      this.config.classes.open + ' ' + this.config.classes.openVariant\n    );\n\n    if (this.$activeSource && this.$activeSource.attr('aria-expanded')) {\n      this.$activeSource.attr('aria-expanded', 'false');\n    }\n\n    this.drawerIsOpen = false;\n\n    // Remove focus on drawer\n    slate.a11y.removeTrapFocus({\n      $container: this.$drawer,\n      namespace: 'drawer_focus'\n    });\n\n    this.unbindEvents();\n\n    // Run function when draw closes if set\n    if (\n      this.config.onDrawerClose &&\n      typeof this.config.onDrawerClose === 'function'\n    ) {\n      this.config.onDrawerClose();\n    }\n  };\n\n  Drawer.prototype.bindEvents = function() {\n    this.nodes.$parent.on(\n      'keyup.drawer',\n      $.proxy(function(evt) {\n        // close on 'esc' keypress\n        if (evt.keyCode === 27) {\n          this.close();\n          return false;\n        } else {\n          return true;\n        }\n      }, this)\n    );\n\n    // Lock scrolling on mobile\n    this.nodes.$page.on('touchmove.drawer', function() {\n      return false;\n    });\n\n    this.nodes.$page.on(\n      'click.drawer',\n      $.proxy(function() {\n        this.close();\n        return false;\n      }, this)\n    );\n  };\n\n  Drawer.prototype.unbindEvents = function() {\n    this.nodes.$page.off('.drawer');\n    this.nodes.$parent.off('.drawer');\n  };\n\n  return Drawer;\n})();\n\ntheme.Helpers = (function() {\n  var touchDevice = false;\n\n  function setTouch() {\n    touchDevice = true;\n  }\n\n  function isTouch() {\n    return touchDevice;\n  }\n  return {\n    setTouch: setTouch,\n    isTouch: isTouch\n  };\n})();\n\ntheme.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    plyrShopifyStyles: {\n      tagId: 'plyr-shopify-styles',\n      src: cloudCdn + 'shopify-plyr/v1.0/shopify-plyr.css',\n      type: types.link\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\n/* ================ MODULES ================ */\nwindow.theme = window.theme || {};\n\ntheme.Header = (function() {\n  var selectors = {\n    body: 'body',\n    navigation: '#AccessibleNav',\n    siteNavHasDropdown: '[data-has-dropdowns]',\n    siteNavChildLinks: '.site-nav__child-link',\n    siteNavActiveDropdown: '.site-nav--active-dropdown',\n    siteNavHasCenteredDropdown: '.site-nav--has-centered-dropdown',\n    siteNavCenteredDropdown: '.site-nav__dropdown--centered',\n    siteNavLinkMain: '.site-nav__link--main',\n    siteNavChildLink: '.site-nav__link--last',\n    siteNavDropdown: '.site-nav__dropdown',\n    siteHeader: '.site-header'\n  };\n\n  var config = {\n    activeClass: 'site-nav--active-dropdown',\n    childLinkClass: 'site-nav__child-link',\n    rightDropdownClass: 'site-nav__dropdown--right',\n    leftDropdownClass: 'site-nav__dropdown--left'\n  };\n\n  var cache = {};\n\n  function init() {\n    cacheSelectors();\n    styleDropdowns($(selectors.siteNavHasDropdown));\n    positionFullWidthDropdowns();\n\n    cache.$parents.on('click.siteNav', function() {\n      var $el = $(this);\n      $el.hasClass(config.activeClass) ? hideDropdown($el) : showDropdown($el);\n    });\n\n    // check when we're leaving a dropdown and close the active dropdown\n    $(selectors.siteNavChildLink).on('focusout.siteNav', function() {\n      setTimeout(function() {\n        if (\n          $(document.activeElement).hasClass(config.childLinkClass) ||\n          !cache.$activeDropdown.length\n        ) {\n          return;\n        }\n\n        hideDropdown(cache.$activeDropdown);\n      });\n    });\n\n    // close dropdowns when on top level nav\n    cache.$topLevel.on('focus.siteNav', function() {\n      if (cache.$activeDropdown.length) {\n        hideDropdown(cache.$activeDropdown);\n      }\n    });\n\n    cache.$subMenuLinks.on('click.siteNav', function(evt) {\n      // Prevent click on body from firing instead of link\n      evt.stopImmediatePropagation();\n    });\n\n    $(window).resize(\n      $.debounce(50, function() {\n        styleDropdowns($(selectors.siteNavHasDropdown));\n        positionFullWidthDropdowns();\n      })\n    );\n  }\n\n  function cacheSelectors() {\n    cache = {\n      $nav: $(selectors.navigation),\n      $topLevel: $(selectors.siteNavLinkMain),\n      $parents: $(selectors.navigation).find(selectors.siteNavHasDropdown),\n      $subMenuLinks: $(selectors.siteNavChildLinks),\n      $activeDropdown: $(selectors.siteNavActiveDropdown),\n      $siteHeader: $(selectors.siteHeader)\n    };\n  }\n\n  function showDropdown($el) {\n    $el.addClass(config.activeClass);\n\n    // close open dropdowns\n    if (cache.$activeDropdown.length) {\n      hideDropdown(cache.$activeDropdown);\n    }\n\n    cache.$activeDropdown = $el;\n\n    // set expanded on open dropdown\n    $el.find(selectors.siteNavLinkMain).attr('aria-expanded', 'true');\n\n    setTimeout(function() {\n      $(window).on('keyup.siteNav', function(evt) {\n        if (evt.keyCode === 27) {\n          hideDropdown($el);\n        }\n      });\n\n      $(selectors.body).on('click.siteNav', function() {\n        hideDropdown($el);\n      });\n    }, 250);\n  }\n\n  function hideDropdown($el) {\n    // remove aria on open dropdown\n    $el.find(selectors.siteNavLinkMain).attr('aria-expanded', 'false');\n    $el.removeClass(config.activeClass);\n\n    // reset active dropdown\n    cache.$activeDropdown = $(selectors.siteNavActiveDropdown);\n\n    $(selectors.body).off('click.siteNav');\n    $(window).off('keyup.siteNav');\n  }\n\n  function styleDropdowns($dropdownListItems) {\n    $dropdownListItems.each(function() {\n      var $dropdownLi = $(this).find(selectors.siteNavDropdown);\n      if (!$dropdownLi.length) {\n        return;\n      }\n      var isRightOfLogo =\n        Math.ceil($(this).offset().left) >\n        Math.floor(cache.$siteHeader.outerWidth()) / 2\n          ? true\n          : false;\n      if (isRightOfLogo) {\n        $dropdownLi\n          .removeClass(config.leftDropdownClass)\n          .addClass(config.rightDropdownClass);\n      } else {\n        $dropdownLi\n          .removeClass(config.rightDropdownClass)\n          .addClass(config.leftDropdownClass);\n      }\n    });\n  }\n\n  function positionFullWidthDropdowns() {\n    var $listWithCenteredDropdown = $(selectors.siteNavHasCenteredDropdown);\n\n    $listWithCenteredDropdown.each(function() {\n      var $hasCenteredDropdown = $(this);\n      var $fullWidthDropdown = $hasCenteredDropdown.find(\n        selectors.siteNavCenteredDropdown\n      );\n\n      var fullWidthDropdownOffset = $hasCenteredDropdown.position().top + 41;\n      $fullWidthDropdown.css('top', fullWidthDropdownOffset);\n    });\n  }\n\n  function unload() {\n    $(window).off('.siteNav');\n    cache.$parents.off('.siteNav');\n    cache.$subMenuLinks.off('.siteNav');\n    cache.$topLevel.off('.siteNav');\n    $(selectors.siteNavChildLink).off('.siteNav');\n    $(selectors.body).off('.siteNav');\n  }\n\n  return {\n    init: init,\n    unload: unload\n  };\n})();\n\nwindow.theme = window.theme || {};\n\ntheme.MobileNav = (function() {\n  var classes = {\n    mobileNavOpenIcon: 'mobile-nav--open',\n    mobileNavCloseIcon: 'mobile-nav--close',\n    navLinkWrapper: 'mobile-nav__item',\n    navLink: 'mobile-nav__link',\n    subNavLink: 'mobile-nav__sublist-link',\n    return: 'mobile-nav__return-btn',\n    subNavActive: 'is-active',\n    subNavClosing: 'is-closing',\n    navOpen: 'js-menu--is-open',\n    subNavShowing: 'sub-nav--is-open',\n    thirdNavShowing: 'third-nav--is-open',\n    subNavToggleBtn: 'js-toggle-submenu'\n  };\n  var cache = {};\n  var isTransitioning;\n  var $activeSubNav;\n  var $activeTrigger;\n  var menuLevel = 1;\n  // Breakpoints from src/stylesheets/global/variables.scss.liquid\n  var mediaQuerySmall = 'screen and (max-width: 749px)';\n\n  function init() {\n    cacheSelectors();\n\n    cache.$mobileNavToggle.on('click', toggleMobileNav);\n    cache.$subNavToggleBtn.on('click.subNav', toggleSubNav);\n\n    // Close mobile nav when unmatching mobile breakpoint\n    enquire.register(mediaQuerySmall, {\n      unmatch: function() {\n        if (cache.$mobileNavContainer.hasClass(classes.navOpen)) {\n          closeMobileNav();\n        }\n      }\n    });\n  }\n\n  function toggleMobileNav() {\n    if (cache.$mobileNavToggle.hasClass(classes.mobileNavCloseIcon)) {\n      closeMobileNav();\n    } else {\n      openMobileNav();\n    }\n  }\n\n  function cacheSelectors() {\n    cache = {\n      $pageContainer: $('#PageContainer'),\n      $siteHeader: $('.site-header'),\n      $mobileNavToggle: $('.js-mobile-nav-toggle'),\n      $mobileNavContainer: $('.mobile-nav-wrapper'),\n      $mobileNav: $('#MobileNav'),\n      $sectionHeader: $('#shopify-section-header'),\n      $subNavToggleBtn: $('.' + classes.subNavToggleBtn)\n    };\n  }\n\n  function openMobileNav() {\n    var translateHeaderHeight = cache.$siteHeader.outerHeight();\n\n    cache.$mobileNavContainer.prepareTransition().addClass(classes.navOpen);\n\n    cache.$mobileNavContainer.css({\n      transform: 'translateY(' + translateHeaderHeight + 'px)'\n    });\n\n    cache.$pageContainer.css({\n      transform:\n        'translate3d(0, ' + cache.$mobileNavContainer[0].scrollHeight + 'px, 0)'\n    });\n\n    slate.a11y.trapFocus({\n      $container: cache.$sectionHeader,\n      $elementToFocus: cache.$mobileNavToggle,\n      namespace: 'navFocus'\n    });\n\n    cache.$mobileNavToggle\n      .addClass(classes.mobileNavCloseIcon)\n      .removeClass(classes.mobileNavOpenIcon)\n      .attr('aria-expanded', true);\n\n    // close on escape\n    $(window).on('keyup.mobileNav', function(evt) {\n      if (evt.which === 27) {\n        closeMobileNav();\n      }\n    });\n  }\n\n  function closeMobileNav() {\n    cache.$mobileNavContainer.prepareTransition().removeClass(classes.navOpen);\n\n    cache.$mobileNavContainer.css({\n      transform: 'translateY(-100%)'\n    });\n\n    cache.$pageContainer.removeAttr('style');\n\n    slate.a11y.trapFocus({\n      $container: $('html'),\n      $elementToFocus: $('body')\n    });\n\n    cache.$mobileNavContainer.one(\n      'TransitionEnd.navToggle webkitTransitionEnd.navToggle transitionend.navToggle oTransitionEnd.navToggle',\n      function() {\n        slate.a11y.removeTrapFocus({\n          $container: cache.$mobileNav,\n          namespace: 'navFocus'\n        });\n      }\n    );\n\n    cache.$mobileNavToggle\n      .addClass(classes.mobileNavOpenIcon)\n      .removeClass(classes.mobileNavCloseIcon)\n      .attr('aria-expanded', false)\n      .focus();\n\n    $(window).off('keyup.mobileNav');\n\n    scrollTo(0, 0);\n  }\n\n  function toggleSubNav(evt) {\n    if (isTransitioning) {\n      return;\n    }\n\n    var $toggleBtn = $(evt.currentTarget);\n    var isReturn = $toggleBtn.hasClass(classes.return);\n    isTransitioning = true;\n\n    if (isReturn) {\n      // Close all subnavs by removing active class on buttons\n      $(\n        '.' + classes.subNavToggleBtn + '[data-level=\"' + (menuLevel - 1) + '\"]'\n      ).removeClass(classes.subNavActive);\n\n      if ($activeTrigger && $activeTrigger.length) {\n        $activeTrigger.removeClass(classes.subNavActive);\n      }\n    } else {\n      $toggleBtn.addClass(classes.subNavActive);\n    }\n\n    $activeTrigger = $toggleBtn;\n\n    goToSubnav($toggleBtn.data('target'));\n  }\n\n  function goToSubnav(target) {\n    /*eslint-disable shopify/jquery-dollar-sign-reference */\n\n    var $targetMenu = target\n      ? $('.mobile-nav__dropdown[data-parent=\"' + target + '\"]')\n      : cache.$mobileNav;\n\n    menuLevel = $targetMenu.data('level') ? $targetMenu.data('level') : 1;\n\n    if ($activeSubNav && $activeSubNav.length) {\n      $activeSubNav.prepareTransition().addClass(classes.subNavClosing);\n    }\n\n    $activeSubNav = $targetMenu;\n\n    /*eslint-enable shopify/jquery-dollar-sign-reference */\n\n    var translateMenuHeight = $targetMenu.outerHeight();\n\n    var openNavClass =\n      menuLevel > 2 ? classes.thirdNavShowing : classes.subNavShowing;\n\n    cache.$mobileNavContainer\n      .css('height', translateMenuHeight)\n      .removeClass(classes.thirdNavShowing)\n      .addClass(openNavClass);\n\n    if (!target) {\n      // Show top level nav\n      cache.$mobileNavContainer\n        .removeClass(classes.thirdNavShowing)\n        .removeClass(classes.subNavShowing);\n    }\n\n    /* if going back to first subnav, focus is on whole header */\n    var $container = menuLevel === 1 ? cache.$sectionHeader : $targetMenu;\n\n    var $menuTitle = $targetMenu.find('[data-menu-title=' + menuLevel + ']');\n    var $elementToFocus = $menuTitle ? $menuTitle : $targetMenu;\n\n    // Focusing an item in the subnav early forces element into view and breaks the animation.\n    cache.$mobileNavContainer.one(\n      'TransitionEnd.subnavToggle webkitTransitionEnd.subnavToggle transitionend.subnavToggle oTransitionEnd.subnavToggle',\n      function() {\n        slate.a11y.trapFocus({\n          $container: $container,\n          $elementToFocus: $elementToFocus,\n          namespace: 'subNavFocus'\n        });\n\n        cache.$mobileNavContainer.off('.subnavToggle');\n        isTransitioning = false;\n      }\n    );\n\n    // Match height of subnav\n    cache.$pageContainer.css({\n      transform: 'translateY(' + translateMenuHeight + 'px)'\n    });\n\n    $activeSubNav.removeClass(classes.subNavClosing);\n  }\n\n  return {\n    init: init,\n    closeMobileNav: closeMobileNav\n  };\n})(jQuery);\n\n(function() {\n  var selectors = {\n    backButton: '.return-link'\n  };\n\n  var $backButton = $(selectors.backButton);\n\n  if (!document.referrer || !$backButton.length || !window.history.length) {\n    return;\n  }\n\n  $backButton.one('click', function(evt) {\n    evt.preventDefault();\n\n    var referrerDomain = urlDomain(document.referrer);\n    var shopDomain = urlDomain(window.location.href);\n\n    if (shopDomain === referrerDomain) {\n      history.back();\n    }\n\n    return false;\n  });\n\n  function urlDomain(url) {\n    var anchor = document.createElement('a');\n    anchor.ref = url;\n\n    return anchor.hostname;\n  }\n})();\n\ntheme.Slideshow = (function() {\n  this.$slideshow = null;\n  var classes = {\n    slideshow: 'slideshow',\n    slickActiveMobile: 'slick-active-mobile',\n    controlsHover: 'slideshow__controls--hover',\n    isPaused: 'is-paused'\n  };\n\n  var selectors = {\n    section: '.shopify-section',\n    wrapper: '#SlideshowWrapper-',\n    slides: '.slideshow__slide',\n    textWrapperMobile: '.slideshow__text-wrap--mobile',\n    textContentMobile: '.slideshow__text-content--mobile',\n    controls: '.slideshow__controls',\n    pauseButton: '.slideshow__pause',\n    dots: '.slick-dots',\n    arrows: '.slideshow__arrows',\n    arrowsMobile: '.slideshow__arrows--mobile',\n    arrowLeft: '.slideshow__arrow-left',\n    arrowRight: '.slideshow__arrow-right'\n  };\n\n  function slideshow(el, sectionId) {\n    var $slideshow = (this.$slideshow = $(el));\n    this.adaptHeight = this.$slideshow.data('adapt-height');\n    this.$wrapper = this.$slideshow.closest(selectors.wrapper + sectionId);\n    this.$section = this.$wrapper.closest(selectors.section);\n    this.$controls = this.$wrapper.find(selectors.controls);\n    this.$arrows = this.$section.find(selectors.arrows);\n    this.$arrowsMobile = this.$section.find(selectors.arrowsMobile);\n    this.$pause = this.$controls.find(selectors.pauseButton);\n    this.$textWrapperMobile = this.$section.find(selectors.textWrapperMobile);\n    this.autorotate = this.$slideshow.data('autorotate');\n    var autoplaySpeed = this.$slideshow.data('speed');\n    var loadSlideA11yString = this.$slideshow.data('slide-nav-a11y');\n\n    this.settings = {\n      accessibility: true,\n      arrows: false,\n      dots: true,\n      fade: true,\n      draggable: true,\n      touchThreshold: 20,\n      autoplay: this.autorotate,\n      autoplaySpeed: autoplaySpeed,\n      // eslint-disable-next-line shopify/jquery-dollar-sign-reference\n      appendDots: this.$arrows,\n      customPaging: function(slick, index) {\n        return (\n          '<a href=\"' +\n          selectors.wrapper +\n          sectionId +\n          '\" aria-label=\"' +\n          loadSlideA11yString.replace('[slide_number]', index + 1) +\n          '\" data-slide-number=\"' +\n          index +\n          '\"></a>'\n        );\n      }\n    };\n\n    this.$slideshow.on('beforeChange', beforeChange.bind(this));\n    this.$slideshow.on('init', slideshowA11ySetup.bind(this));\n\n    // Add class to style mobile dots & show the correct text content for the\n    // first slide on mobile when the slideshow initialises\n    this.$slideshow.on(\n      'init',\n      function() {\n        this.$mobileDots\n          .find('li:first-of-type')\n          .addClass(classes.slickActiveMobile);\n        this.showMobileText(0);\n      }.bind(this)\n    );\n\n    // Stop the autorotate when you scroll past the mobile controls, resume when\n    // they are scrolled back into view\n    if (this.autorotate) {\n      $(document).scroll(\n        $.debounce(\n          250,\n          function() {\n            if (\n              this.$arrowsMobile.offset().top +\n                this.$arrowsMobile.outerHeight() <\n              window.pageYOffset\n            ) {\n              $slideshow.slick('slickPause');\n            } else if (!this.$pause.hasClass(classes.isPaused)) {\n              $slideshow.slick('slickPlay');\n            }\n          }.bind(this)\n        )\n      );\n    }\n\n    if (this.adaptHeight) {\n      this.setSlideshowHeight();\n      $(window).resize($.debounce(50, this.setSlideshowHeight.bind(this)));\n    }\n\n    this.$slideshow.slick(this.settings);\n\n    // This can't be called when the slick 'init' event fires due to how slick\n    // adds a11y features.\n    slideshowPostInitA11ySetup.bind(this)();\n\n    this.$arrows.find(selectors.arrowLeft).on('click', function() {\n      $slideshow.slick('slickPrev');\n    });\n    this.$arrows.find(selectors.arrowRight).on('click', function() {\n      $slideshow.slick('slickNext');\n    });\n\n    this.$pause.on('click', this.togglePause.bind(this));\n  }\n\n  function slideshowA11ySetup(event, obj) {\n    var $slider = obj.$slider;\n    var $list = obj.$list;\n    this.$dots = this.$section.find(selectors.dots);\n    this.$mobileDots = this.$dots.eq(1);\n\n    // Remove default Slick aria-live attr until slider is focused\n    $list.removeAttr('aria-live');\n\n    this.$wrapper.on('keyup', keyboardNavigation.bind(this));\n    this.$controls.on('keyup', keyboardNavigation.bind(this));\n    this.$textWrapperMobile.on('keyup', keyboardNavigation.bind(this));\n\n    // When an element in the slider is focused\n    // pause slideshow and set aria-live.\n    this.$wrapper\n      .on(\n        'focusin',\n        function(evt) {\n          if (!this.$wrapper.has(evt.target).length) {\n            return;\n          }\n\n          $list.attr('aria-live', 'polite');\n          if (this.autorotate) {\n            $slider.slick('slickPause');\n          }\n        }.bind(this)\n      )\n      .on(\n        'focusout',\n        function(evt) {\n          if (!this.$wrapper.has(evt.target).length) {\n            return;\n          }\n\n          $list.removeAttr('aria-live');\n          if (this.autorotate) {\n            // Only resume playing if the user hasn't paused using the pause\n            // button\n            if (!this.$pause.is('.is-paused')) {\n              $slider.slick('slickPlay');\n            }\n          }\n        }.bind(this)\n      );\n\n    // Add arrow key support when focused\n    if (this.$dots) {\n      this.$dots\n        .find('a')\n        .each(function() {\n          var $dot = $(this);\n          $dot.on('click keyup', function(evt) {\n            if (\n              evt.type === 'keyup' &&\n              evt.which !== slate.utils.keyboardKeys.ENTER\n            )\n              return;\n\n            evt.preventDefault();\n\n            var slideNumber = $(evt.target).data('slide-number');\n\n            $slider.attr('tabindex', -1).slick('slickGoTo', slideNumber);\n\n            if (evt.type === 'keyup') {\n              $slider.focus();\n            }\n          });\n        })\n        .eq(0)\n        .attr('aria-current', 'true');\n    }\n\n    this.$controls\n      .on('focusin', highlightControls.bind(this))\n      .on('focusout', unhighlightControls.bind(this));\n  }\n\n  function slideshowPostInitA11ySetup() {\n    var $slides = this.$slideshow.find(selectors.slides);\n\n    $slides.removeAttr('role').removeAttr('aria-labelledby');\n    this.$dots\n      .removeAttr('role')\n      .find('li')\n      .removeAttr('role')\n      .removeAttr('aria-selected')\n      .each(function() {\n        var $dot = $(this);\n        var ariaControls = $dot.attr('aria-controls');\n        $dot\n          .removeAttr('aria-controls')\n          .find('a')\n          .attr('aria-controls', ariaControls);\n      });\n  }\n\n  function beforeChange(event, slick, currentSlide, nextSlide) {\n    var $dotLinks = this.$dots.find('a');\n    var $mobileDotLinks = this.$mobileDots.find('li');\n\n    $dotLinks\n      .removeAttr('aria-current')\n      .eq(nextSlide)\n      .attr('aria-current', 'true');\n\n    $mobileDotLinks\n      .removeClass(classes.slickActiveMobile)\n      .eq(nextSlide)\n      .addClass(classes.slickActiveMobile);\n    this.showMobileText(nextSlide);\n  }\n\n  function keyboardNavigation() {\n    if (event.keyCode === slate.utils.keyboardKeys.LEFTARROW) {\n      this.$slideshow.slick('slickPrev');\n    }\n    if (event.keyCode === slate.utils.keyboardKeys.RIGHTARROW) {\n      this.$slideshow.slick('slickNext');\n    }\n  }\n\n  function highlightControls() {\n    this.$controls.addClass(classes.controlsHover);\n  }\n\n  function unhighlightControls() {\n    this.$controls.removeClass(classes.controlsHover);\n  }\n\n  slideshow.prototype.togglePause = function() {\n    var slideshowSelector = getSlideshowId(this.$pause);\n    if (this.$pause.hasClass(classes.isPaused)) {\n      this.$pause.removeClass(classes.isPaused).attr('aria-pressed', 'false');\n      if (this.autorotate) {\n        $(slideshowSelector).slick('slickPlay');\n      }\n    } else {\n      this.$pause.addClass(classes.isPaused).attr('aria-pressed', 'true');\n      if (this.autorotate) {\n        $(slideshowSelector).slick('slickPause');\n      }\n    }\n  };\n\n  slideshow.prototype.setSlideshowHeight = function() {\n    var minAspectRatio = this.$slideshow.data('min-aspect-ratio');\n    this.$slideshow.height($(document).width() / minAspectRatio);\n  };\n\n  slideshow.prototype.showMobileText = function(slideIndex) {\n    var $allTextContent = this.$textWrapperMobile.find(\n      selectors.textContentMobile\n    );\n    var currentTextContentSelector =\n      selectors.textContentMobile + '-' + slideIndex;\n    var $currentTextContent = this.$textWrapperMobile.find(\n      currentTextContentSelector\n    );\n    if (\n      !$currentTextContent.length &&\n      this.$slideshow.find(selectors.slides).length === 1\n    ) {\n      this.$textWrapperMobile.hide();\n    } else {\n      this.$textWrapperMobile.show();\n    }\n    $allTextContent.hide();\n    $currentTextContent.show();\n  };\n\n  function getSlideshowId($el) {\n    return '#Slideshow-' + $el.data('id');\n  }\n\n  return slideshow;\n})();\n\ntheme.Video = (function() {\n  var autoplayCheckComplete = false;\n  var playOnClickChecked = false;\n  var playOnClick = false;\n  var youtubeLoaded = false;\n  var videos = {};\n  var videoPlayers = [];\n  var videoOptions = {\n    ratio: 16 / 9,\n    scrollAnimationDuration: 400,\n    playerVars: {\n      // eslint-disable-next-line camelcase\n      iv_load_policy: 3,\n      modestbranding: 1,\n      autoplay: 0,\n      controls: 0,\n      wmode: 'opaque',\n      branding: 0,\n      autohide: 0,\n      rel: 0\n    },\n    events: {\n      onReady: onPlayerReady,\n      onStateChange: onPlayerChange\n    }\n  };\n  var classes = {\n    playing: 'video-is-playing',\n    paused: 'video-is-paused',\n    loading: 'video-is-loading',\n    loaded: 'video-is-loaded',\n    backgroundVideoWrapper: 'video-background-wrapper',\n    videoWithImage: 'video--image_with_play',\n    backgroundVideo: 'video--background',\n    userPaused: 'is-paused',\n    supportsAutoplay: 'autoplay',\n    supportsNoAutoplay: 'no-autoplay',\n    wrapperMinHeight: 'video-section-wrapper--min-height'\n  };\n\n  var selectors = {\n    section: '.video-section',\n    videoWrapper: '.video-section-wrapper',\n    playVideoBtn: '.video-control__play',\n    closeVideoBtn: '.video-control__close-wrapper',\n    pauseVideoBtn: '.video__pause',\n    pauseVideoStop: '.video__pause-stop',\n    pauseVideoResume: '.video__pause-resume',\n    fallbackText: '.icon__fallback-text'\n  };\n\n  /**\n   * Public functions\n   */\n  function init($video) {\n    if (!$video.length) {\n      return;\n    }\n\n    videos[$video.attr('id')] = {\n      id: $video.attr('id'),\n      videoId: $video.data('id'),\n      type: $video.data('type'),\n      status:\n        $video.data('type') === 'image_with_play' ? 'closed' : 'background', // closed, open, background\n      $video: $video,\n      $videoWrapper: $video.closest(selectors.videoWrapper),\n      $section: $video.closest(selectors.section),\n      controls: $video.data('type') === 'background' ? 0 : 1\n    };\n\n    if (!youtubeLoaded) {\n      // This code loads the IFrame Player API code asynchronously.\n      var tag = document.createElement('script');\n      tag.src = 'https://www.youtube.com/iframe_api';\n      var firstScriptTag = document.getElementsByTagName('script')[0];\n      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n    }\n\n    playOnClickCheck();\n  }\n\n  function customPlayVideo(playerId) {\n    // Make sure we have carried out the playOnClick check first\n    if (!playOnClickChecked && !playOnClick) {\n      return;\n    }\n\n    if (playerId && typeof videoPlayers[playerId].playVideo === 'function') {\n      privatePlayVideo(playerId);\n    }\n  }\n\n  function pauseVideo(playerId) {\n    if (\n      videoPlayers[playerId] &&\n      typeof videoPlayers[playerId].pauseVideo === 'function'\n    ) {\n      videoPlayers[playerId].pauseVideo();\n    }\n  }\n\n  function loadVideos() {\n    for (var key in videos) {\n      if (videos.hasOwnProperty(key)) {\n        createPlayer(key);\n      }\n    }\n\n    initEvents();\n    youtubeLoaded = true;\n  }\n\n  function editorLoadVideo(key) {\n    if (!youtubeLoaded) {\n      return;\n    }\n    createPlayer(key);\n\n    initEvents();\n  }\n\n  /**\n   * Private functions\n   */\n\n  function privatePlayVideo(id, clicked) {\n    var videoData = videos[id];\n    var player = videoPlayers[id];\n    var $videoWrapper = videoData.$videoWrapper;\n\n    if (playOnClick) {\n      // playOnClick means we are probably on mobile (no autoplay).\n      // setAsPlaying will show the iframe, requiring another click\n      // to play the video.\n      setAsPlaying(videoData);\n    } else if (clicked || autoplayCheckComplete) {\n      // Play if autoplay is available or clicked to play\n      $videoWrapper.removeClass(classes.loading);\n      setAsPlaying(videoData);\n      player.playVideo();\n      return;\n    } else {\n      player.playVideo();\n    }\n  }\n\n  function setAutoplaySupport(supported) {\n    var supportClass = supported\n      ? classes.supportsAutoplay\n      : classes.supportsNoAutoplay;\n    $(document.documentElement)\n      .removeClass(classes.supportsAutoplay)\n      .removeClass(classes.supportsNoAutoplay)\n      .addClass(supportClass);\n\n    if (!supported) {\n      playOnClick = true;\n    }\n\n    autoplayCheckComplete = true;\n  }\n\n  function playOnClickCheck() {\n    // Bail early for a few instances:\n    // - small screen\n    // - device sniff mobile browser\n\n    if (playOnClickChecked) {\n      return;\n    }\n\n    if (isMobile()) {\n      playOnClick = true;\n    }\n\n    if (playOnClick) {\n      // No need to also do the autoplay check\n      setAutoplaySupport(false);\n    }\n\n    playOnClickChecked = true;\n  }\n\n  // The API will call this function when each video player is ready\n  function onPlayerReady(evt) {\n    evt.target.setPlaybackQuality('hd1080');\n    var videoData = getVideoOptions(evt);\n    var videoTitle = evt.target.getVideoData().title;\n    playOnClickCheck();\n\n    // Prevent tabbing through YouTube player controls until visible\n    $('#' + videoData.id).attr('tabindex', '-1');\n\n    sizeBackgroundVideos();\n    setButtonLabels(videoData.$videoWrapper, videoTitle);\n\n    // Customize based on options from the video ID\n    if (videoData.type === 'background') {\n      evt.target.mute();\n      privatePlayVideo(videoData.id);\n    }\n\n    videoData.$videoWrapper.addClass(classes.loaded);\n  }\n\n  function onPlayerChange(evt) {\n    var videoData = getVideoOptions(evt);\n    if (\n      videoData.status === 'background' &&\n      !isMobile() &&\n      !autoplayCheckComplete &&\n      (evt.data === YT.PlayerState.PLAYING ||\n        evt.data === YT.PlayerState.BUFFERING)\n    ) {\n      setAutoplaySupport(true);\n      autoplayCheckComplete = true;\n      videoData.$videoWrapper.removeClass(classes.loading);\n    }\n    switch (evt.data) {\n      case YT.PlayerState.ENDED:\n        setAsFinished(videoData);\n        break;\n      case YT.PlayerState.PAUSED:\n        // Seeking on a YouTube video also fires a PAUSED state change,\n        // checking the state after a delay prevents us pausing the video when\n        // the user is seeking instead of pausing\n        setTimeout(function() {\n          if (evt.target.getPlayerState() === YT.PlayerState.PAUSED) {\n            setAsPaused(videoData);\n          }\n        }, 200);\n        break;\n    }\n  }\n\n  function setAsFinished(videoData) {\n    switch (videoData.type) {\n      case 'background':\n        videoPlayers[videoData.id].seekTo(0);\n        break;\n      case 'image_with_play':\n        closeVideo(videoData.id);\n        toggleExpandVideo(videoData.id, false);\n        break;\n    }\n  }\n\n  function setAsPlaying(videoData) {\n    var $videoWrapper = videoData.$videoWrapper;\n    var $pauseButton = $videoWrapper.find(selectors.pauseVideoBtn);\n\n    $videoWrapper.removeClass(classes.loading);\n\n    if ($pauseButton.hasClass(classes.userPaused)) {\n      $pauseButton.removeClass(classes.userPaused);\n    }\n\n    // Do not change element visibility if it is a background video\n    if (videoData.status === 'background') {\n      return;\n    }\n\n    $('#' + videoData.id).attr('tabindex', '0');\n\n    if (videoData.type === 'image_with_play') {\n      $videoWrapper.removeClass(classes.paused).addClass(classes.playing);\n    }\n\n    // Update focus to the close button so we stay within the video wrapper,\n    // allowing time for the scroll animation\n    setTimeout(function() {\n      $videoWrapper.find(selectors.closeVideoBtn).focus();\n    }, videoOptions.scrollAnimationDuration);\n  }\n\n  function setAsPaused(videoData) {\n    var $videoWrapper = videoData.$videoWrapper;\n\n    // YT's events fire after our click event. This status flag ensures\n    // we don't interact with a closed or background video.\n    if (videoData.type === 'image_with_play') {\n      if (videoData.status === 'closed') {\n        $videoWrapper.removeClass(classes.paused);\n      } else {\n        $videoWrapper.addClass(classes.paused);\n      }\n    }\n\n    $videoWrapper.removeClass(classes.playing);\n  }\n\n  function closeVideo(playerId) {\n    var videoData = videos[playerId];\n    var $videoWrapper = videoData.$videoWrapper;\n    var classesToRemove = [classes.paused, classes.playing].join(' ');\n\n    if (isMobile()) {\n      $videoWrapper.removeAttr('style');\n    }\n\n    $('#' + videoData.id).attr('tabindex', '-1');\n\n    videoData.status = 'closed';\n\n    switch (videoData.type) {\n      case 'image_with_play':\n        videoPlayers[playerId].stopVideo();\n        setAsPaused(videoData); // in case the video is already paused\n        break;\n      case 'background':\n        videoPlayers[playerId].mute();\n        setBackgroundVideo(playerId);\n        break;\n    }\n\n    $videoWrapper.removeClass(classesToRemove);\n  }\n\n  function getVideoOptions(evt) {\n    var id = evt.target.getIframe().id;\n    return videos[id];\n  }\n\n  function toggleExpandVideo(playerId, expand) {\n    var video = videos[playerId];\n    var elementTop = video.$videoWrapper.offset().top;\n    var $playButton = video.$videoWrapper.find(selectors.playVideoBtn);\n    var offset = 0;\n    var newHeight = 0;\n\n    if (isMobile()) {\n      video.$videoWrapper.parent().toggleClass('page-width', !expand);\n    }\n\n    if (expand) {\n      if (isMobile()) {\n        newHeight = $(window).width() / videoOptions.ratio;\n      } else {\n        newHeight = video.$videoWrapper.width() / videoOptions.ratio;\n      }\n      offset = ($(window).height() - newHeight) / 2;\n\n      video.$videoWrapper\n        .removeClass(classes.wrapperMinHeight)\n        .animate({ height: newHeight }, 600);\n\n      // Animate doesn't work in mobile editor, so we don't use it\n      if (!(isMobile() && Shopify.designMode)) {\n        $('html, body').animate(\n          {\n            scrollTop: elementTop - offset\n          },\n          videoOptions.scrollAnimationDuration\n        );\n      }\n    } else {\n      if (isMobile()) {\n        newHeight = video.$videoWrapper.data('mobile-height');\n      } else {\n        newHeight = video.$videoWrapper.data('desktop-height');\n      }\n\n      video.$videoWrapper\n        .height(video.$videoWrapper.width() / videoOptions.ratio)\n        .animate({ height: newHeight }, 600);\n      setTimeout(function() {\n        video.$videoWrapper.addClass(classes.wrapperMinHeight);\n      }, 600);\n      $playButton.focus();\n    }\n  }\n\n  function togglePause(playerId) {\n    var $pauseButton = videos[playerId].$videoWrapper.find(\n      selectors.pauseVideoBtn\n    );\n    var paused = $pauseButton.hasClass(classes.userPaused);\n    if (paused) {\n      $pauseButton.removeClass(classes.userPaused);\n      customPlayVideo(playerId);\n    } else {\n      $pauseButton.addClass(classes.userPaused);\n      pauseVideo(playerId);\n    }\n    $pauseButton.attr('aria-pressed', !paused);\n  }\n\n  function startVideoOnClick(playerId) {\n    var video = videos[playerId];\n\n    // add loading class to wrapper\n    video.$videoWrapper.addClass(classes.loading);\n\n    // Explicity set the video wrapper height (needed for height transition)\n    video.$videoWrapper.attr(\n      'style',\n      'height: ' + video.$videoWrapper.height() + 'px'\n    );\n\n    video.status = 'open';\n\n    switch (video.type) {\n      case 'image_with_play':\n        privatePlayVideo(playerId, true);\n        break;\n      case 'background':\n        unsetBackgroundVideo(playerId, video);\n        videoPlayers[playerId].unMute();\n        privatePlayVideo(playerId, true);\n        break;\n    }\n\n    toggleExpandVideo(playerId, true);\n\n    // esc to close video player\n    $(document).on('keydown.videoPlayer', function(evt) {\n      var playerId = $(document.activeElement).data('controls');\n      if (evt.keyCode !== slate.utils.keyboardKeys.ESCAPE || !playerId) {\n        return;\n      }\n\n      closeVideo(playerId);\n      toggleExpandVideo(playerId, false);\n    });\n  }\n\n  function sizeBackgroundVideos() {\n    $('.' + classes.backgroundVideo).each(function(index, el) {\n      sizeBackgroundVideo($(el));\n    });\n  }\n\n  function sizeBackgroundVideo($videoPlayer) {\n    if (!youtubeLoaded) {\n      return;\n    }\n\n    if (isMobile()) {\n      $videoPlayer.removeAttr('style');\n    } else {\n      var $videoWrapper = $videoPlayer.closest(selectors.videoWrapper);\n      var videoWidth = $videoWrapper.width();\n      var playerWidth = $videoPlayer.width();\n      var desktopHeight = $videoWrapper.data('desktop-height');\n\n      // when screen aspect ratio differs from video, video must center and underlay one dimension\n      if (videoWidth / videoOptions.ratio < desktopHeight) {\n        playerWidth = Math.ceil(desktopHeight * videoOptions.ratio); // get new player width\n        $videoPlayer\n          .width(playerWidth)\n          .height(desktopHeight)\n          .css({\n            left: (videoWidth - playerWidth) / 2,\n            top: 0\n          }); // player width is greater, offset left; reset top\n      } else {\n        // new video width < window width (gap to right)\n        desktopHeight = Math.ceil(videoWidth / videoOptions.ratio); // get new player height\n        $videoPlayer\n          .width(videoWidth)\n          .height(desktopHeight)\n          .css({\n            left: 0,\n            top: (desktopHeight - desktopHeight) / 2\n          }); // player height is greater, offset top; reset left\n      }\n\n      $videoPlayer.prepareTransition();\n      $videoWrapper.addClass(classes.loaded);\n    }\n  }\n\n  function unsetBackgroundVideo(playerId) {\n    // Switch the background video to a chrome-only player once played\n    $('#' + playerId)\n      .removeClass(classes.backgroundVideo)\n      .addClass(classes.videoWithImage);\n\n    setTimeout(function() {\n      $('#' + playerId).removeAttr('style');\n    }, 600);\n\n    videos[playerId].$videoWrapper\n      .removeClass(classes.backgroundVideoWrapper)\n      .addClass(classes.playing);\n\n    videos[playerId].status = 'open';\n  }\n\n  function setBackgroundVideo(playerId) {\n    $('#' + playerId)\n      .removeClass(classes.videoWithImage)\n      .addClass(classes.backgroundVideo);\n\n    videos[playerId].$videoWrapper.addClass(classes.backgroundVideoWrapper);\n\n    videos[playerId].status = 'background';\n    sizeBackgroundVideo($('#' + playerId));\n  }\n\n  function isMobile() {\n    return $(window).width() < 750 || window.mobileCheck();\n  }\n\n  function initEvents() {\n    $(document).on('click.videoPlayer', selectors.playVideoBtn, function(evt) {\n      var playerId = $(evt.currentTarget).data('controls');\n\n      startVideoOnClick(playerId);\n    });\n\n    $(document).on('click.videoPlayer', selectors.closeVideoBtn, function(evt) {\n      var playerId = $(evt.currentTarget).data('controls');\n\n      $(evt.currentTarget).blur();\n      closeVideo(playerId);\n      toggleExpandVideo(playerId, false);\n    });\n\n    $(document).on('click.videoPlayer', selectors.pauseVideoBtn, function(evt) {\n      var playerId = $(evt.currentTarget).data('controls');\n      togglePause(playerId);\n    });\n\n    // Listen to resize to keep a background-size:cover-like layout\n    $(window).on(\n      'resize.videoPlayer',\n      $.debounce(200, function() {\n        if (!youtubeLoaded) return;\n        var key;\n        var fullscreen = window.innerHeight === screen.height;\n\n        sizeBackgroundVideos();\n\n        if (isMobile()) {\n          for (key in videos) {\n            if (videos.hasOwnProperty(key)) {\n              if (videos[key].$videoWrapper.hasClass(classes.playing)) {\n                if (!fullscreen) {\n                  pauseVideo(key);\n                  setAsPaused(videos[key]);\n                }\n              }\n              videos[key].$videoWrapper.height(\n                $(document).width() / videoOptions.ratio\n              );\n            }\n          }\n          setAutoplaySupport(false);\n        } else {\n          setAutoplaySupport(true);\n          for (key in videos) {\n            if (\n              videos[key].$videoWrapper.find('.' + classes.videoWithImage)\n                .length\n            ) {\n              continue;\n            }\n            videoPlayers[key].playVideo();\n            setAsPlaying(videos[key]);\n          }\n        }\n      })\n    );\n\n    $(window).on(\n      'scroll.videoPlayer',\n      $.debounce(50, function() {\n        if (!youtubeLoaded) return;\n\n        for (var key in videos) {\n          if (videos.hasOwnProperty(key)) {\n            var $videoWrapper = videos[key].$videoWrapper;\n\n            // Close the video if more than 75% of it is scrolled out of view\n            if (\n              $videoWrapper.hasClass(classes.playing) &&\n              ($videoWrapper.offset().top + $videoWrapper.height() * 0.75 <\n                $(window).scrollTop() ||\n                $videoWrapper.offset().top + $videoWrapper.height() * 0.25 >\n                  $(window).scrollTop() + $(window).height())\n            ) {\n              closeVideo(key);\n              toggleExpandVideo(key, false);\n            }\n          }\n        }\n      })\n    );\n  }\n\n  function createPlayer(key) {\n    var args = $.extend({}, videoOptions, videos[key]);\n    args.playerVars.controls = args.controls;\n    videoPlayers[key] = new YT.Player(key, args);\n  }\n\n  function removeEvents() {\n    $(document).off('.videoPlayer');\n    $(window).off('.videoPlayer');\n  }\n\n  function setButtonLabels($videoWrapper, title) {\n    var $playButtons = $videoWrapper.find(selectors.playVideoBtn);\n    var $closeButton = $videoWrapper.find(selectors.closeVideoBtn);\n    var $pauseButton = $videoWrapper.find(selectors.pauseVideoBtn);\n    var $closeButtonText = $closeButton.find(selectors.fallbackText);\n    var $pauseButtonStopText = $pauseButton\n      .find(selectors.pauseVideoStop)\n      .find(selectors.fallbackText);\n    var $pauseButtonResumeText = $pauseButton\n      .find(selectors.pauseVideoResume)\n      .find(selectors.fallbackText);\n\n    // Insert the video title retrieved from YouTube into the instructional text\n    // for each button\n    $playButtons.each(function() {\n      var $playButton = $(this);\n      var $playButtonText = $playButton.find(selectors.fallbackText);\n\n      $playButtonText.text(\n        $playButtonText.text().replace('[video_title]', title)\n      );\n    });\n    $closeButtonText.text(\n      $closeButtonText.text().replace('[video_title]', title)\n    );\n    $pauseButtonStopText.text(\n      $pauseButtonStopText.text().replace('[video_title]', title)\n    );\n    $pauseButtonResumeText.text(\n      $pauseButtonResumeText.text().replace('[video_title]', title)\n    );\n  }\n\n  return {\n    init: init,\n    editorLoadVideo: editorLoadVideo,\n    loadVideos: loadVideos,\n    playVideo: customPlayVideo,\n    pauseVideo: pauseVideo,\n    removeEvents: removeEvents\n  };\n})();\n\ntheme.ProductVideo = (function() {\n  var videos = {};\n\n  var hosts = {\n    html5: 'html5',\n    youtube: 'youtube'\n  };\n\n  var selectors = {\n    productMediaWrapper: '[data-product-single-media-wrapper]'\n  };\n\n  var attributes = {\n    enableVideoLooping: 'enable-video-looping',\n    videoId: 'video-id'\n  };\n\n  function init(videoContainer, sectionId) {\n    if (!videoContainer.length) {\n      return;\n    }\n\n    var videoElement = videoContainer.find('iframe, video')[0];\n    var mediaId = videoContainer.data('mediaId');\n\n    if (!videoElement) {\n      return;\n    }\n\n    videos[mediaId] = {\n      mediaId: mediaId,\n      sectionId: sectionId,\n      host: hostFromVideoElement(videoElement),\n      container: videoContainer,\n      element: videoElement,\n      ready: function() {\n        createPlayer(this);\n      }\n    };\n\n    var video = videos[mediaId];\n\n    switch (video.host) {\n      case hosts.html5:\n        window.Shopify.loadFeatures([\n          {\n            name: 'video-ui',\n            version: '1.0',\n            onLoad: setupPlyrVideos\n          }\n        ]);\n        theme.LibraryLoader.load('plyrShopifyStyles');\n        break;\n      case hosts.youtube:\n        theme.LibraryLoader.load('youtubeSdk', setupYouTubeVideos);\n        break;\n    }\n  }\n\n  function setupPlyrVideos(errors) {\n    if (errors) {\n      fallbackToNativeVideo();\n      return;\n    }\n\n    loadVideos(hosts.html5);\n  }\n\n  function setupYouTubeVideos() {\n    if (!window.YT.Player) return;\n\n    loadVideos(hosts.youtube);\n  }\n\n  function createPlayer(video) {\n    if (video.player) {\n      return;\n    }\n\n    var productMediaWrapper = video.container.closest(\n      selectors.productMediaWrapper\n    );\n    var enableLooping = productMediaWrapper.data(attributes.enableVideoLooping);\n\n    switch (video.host) {\n      case hosts.html5:\n        // eslint-disable-next-line no-undef\n        video.player = new Shopify.Plyr(video.element, {\n          loop: { active: enableLooping }\n        });\n        break;\n      case hosts.youtube:\n        var videoId = productMediaWrapper.data(attributes.videoId);\n\n        video.player = new YT.Player(video.element, {\n          videoId: videoId,\n          events: {\n            onStateChange: function(event) {\n              if (event.data === 0 && enableLooping) event.target.seekTo(0);\n            }\n          }\n        });\n        break;\n    }\n\n    productMediaWrapper.on('mediaHidden xrLaunch', function() {\n      if (!video.player) return;\n\n      if (video.host === hosts.html5) {\n        video.player.pause();\n      }\n\n      if (video.host === hosts.youtube && video.player.pauseVideo) {\n        video.player.pauseVideo();\n      }\n    });\n\n    productMediaWrapper.on('mediaVisible', function() {\n      if (theme.Helpers.isTouch()) return;\n      if (!video.player) return;\n\n      if (video.host === hosts.html5) {\n        video.player.play();\n      }\n\n      if (video.host === hosts.youtube && video.player.playVideo) {\n        video.player.playVideo();\n      }\n    });\n  }\n\n  function hostFromVideoElement(video) {\n    if (video.tagName === 'VIDEO') {\n      return hosts.html5;\n    }\n\n    if (video.tagName === 'IFRAME') {\n      if (\n        /^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(\n          video.src\n        )\n      ) {\n        return hosts.youtube;\n      }\n    }\n    return null;\n  }\n\n  function loadVideos(host) {\n    for (var key in videos) {\n      if (videos.hasOwnProperty(key)) {\n        var video = videos[key];\n        if (video.host === host) {\n          video.ready();\n        }\n      }\n    }\n  }\n\n  function fallbackToNativeVideo() {\n    for (var key in videos) {\n      if (videos.hasOwnProperty(key)) {\n        var video = videos[key];\n\n        if (video.nativeVideo) continue;\n\n        if (video.host === hosts.html5) {\n          video.element.setAttribute('controls', 'controls');\n          video.nativeVideo = true;\n        }\n      }\n    }\n  }\n\n  function removeSectionVideos(sectionId) {\n    for (var key in videos) {\n      if (videos.hasOwnProperty(key)) {\n        var video = videos[key];\n\n        if (video.sectionId === sectionId) {\n          if (video.player) video.player.destroy();\n          delete videos[key];\n        }\n      }\n    }\n  }\n\n  return {\n    init: init,\n    hosts: hosts,\n    loadVideos: loadVideos,\n    removeSectionVideos: removeSectionVideos\n  };\n})();\n\ntheme.ProductModel = (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    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) {\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\n    model.$container.on('mediaVisible', function() {\n      xrButton.$element.attr('data-shopify-model3d-id', model.modelId);\n      if (theme.Helpers.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          models[key].modelViewerUi.destroy();\n          delete models[key];\n        }\n      }\n    }\n    delete modelJsonSections[sectionId];\n  }\n\n  return {\n    init: init,\n    removeSectionModels: removeSectionModels\n  };\n})();\n\nwindow.theme = window.theme || {};\n\ntheme.FormStatus = (function() {\n  var selectors = {\n    statusMessage: '[data-form-status]'\n  };\n\n  function init() {\n    this.$statusMessage = $(selectors.statusMessage);\n\n    if (!this.$statusMessage) return;\n\n    this.$statusMessage.attr('tabindex', -1).focus();\n\n    this.$statusMessage.on('blur', handleBlur.bind(this));\n  }\n\n  function handleBlur() {\n    this.$statusMessage.removeAttr('tabindex');\n  }\n\n  return {\n    init: init\n  };\n})();\n\ntheme.Hero = (function() {\n  var classes = {\n    indexSectionFlush: 'index-section--flush'\n  };\n\n  var selectors = {\n    heroFixedWidthContent: '.hero-fixed-width__content',\n    heroFixedWidthImage: '.hero-fixed-width__image'\n  };\n\n  function hero(el, sectionId) {\n    this.$hero = $(el);\n    this.layout = this.$hero.data('layout');\n    var $parentSection = $('#shopify-section-' + sectionId);\n    var $heroContent = $parentSection.find(selectors.heroFixedWidthContent);\n    var $heroImage = $parentSection.find(selectors.heroFixedWidthImage);\n\n    if (this.layout !== 'fixed_width') {\n      return;\n    }\n\n    $parentSection.removeClass(classes.indexSectionFlush);\n    heroFixedHeight();\n    $(window).resize(\n      $.debounce(50, function() {\n        heroFixedHeight();\n      })\n    );\n\n    function heroFixedHeight() {\n      var contentHeight = $heroContent.height() + 50;\n      var imageHeight = $heroImage.height();\n\n      if (contentHeight > imageHeight) {\n        $heroImage.css('min-height', contentHeight);\n      }\n    }\n  }\n\n  return hero;\n})();\n\n// prettier-ignore\nwindow.theme = window.theme || {};\n\ntheme.SearchResultsTemplate = (function() {\n  function renderResults(products, isLoading, searchQuery) {\n    return [\n      '<div class=\"predictive-search\">',\n      renderHeader(products, isLoading),\n      renderProducts(products, searchQuery),\n      '</div>'\n    ].join('');\n  }\n\n  function renderHeader(products, isLoading) {\n    if (products.length === 0) {\n      return '';\n    }\n\n    return [\n      '<div class=\"predictive-search-title\">',\n      '<h3 id=\"predictive-search\" class=\"predictive-search-title__content\">' +\n        theme.strings.products +\n        '</h3>',\n      '<span class=\"predictive-search-title__loading-spinner\">' +\n        (isLoading\n          ? '<span class= \"icon-predictive-search-spinner\" ></span >'\n          : '') +\n        '</span>',\n      '</div>'\n    ].join('');\n  }\n\n  function loadingState() {\n    return [\n      '<div class=\"predictive-search\">',\n      '<div class=\"predictive-search-loading\">',\n      '<span class=\"visually-hidden\">' + theme.strings.loading + '</span>',\n      '<span class=\"predictive-search-loading__icon\">',\n      '<span class=\"icon-predictive-search-spinner\"></span>',\n      '</span>',\n      '</div>',\n      '</div>'\n    ].join('');\n  }\n\n  function renderViewAll(searchQuery) {\n    return [\n      '<button type=\"submit\" class=\"predictive-search-view-all__button\" tabindex=\"-1\">',\n      theme.strings.searchFor +\n        '<span class=\"predictive-search-view-all__query\"> &ldquo;' +\n        _htmlEscape(searchQuery) +\n        '&rdquo;</span>',\n      '</button>'\n    ].join('');\n  }\n\n  function renderProducts(products, searchQuery) {\n    var resultsCount = products.length;\n\n    return [\n      '<ul id=\"predictive-search-results\" class=\"predictive-search__list\" role=\"listbox\" aria-labelledby=\"predictive-search\">',\n      products\n        .map(function(product, index) {\n          return renderProduct(normalizeProduct(product), index, resultsCount);\n        })\n        .join(''),\n      '<li id=\"search-all\" class=\"predictive-search-view-all\" role=\"option\" data-search-result>' +\n        renderViewAll(searchQuery) +\n        '</li>',\n      '</ul>'\n    ].join('');\n  }\n\n  function renderProduct(product, index, resultsCount) {\n    return [\n      '<li id=\"search-result-' +\n        index +\n        '\" class=\"predictive-search-item\" role=\"option\" data-search-result>',\n      '<a class=\"predictive-search-item__link\" href=\"' +\n        product.url +\n        '\" tabindex=\"-1\">',\n      '<div class=\"predictive-search__column predictive-search__column--image\" data-image-with-placeholder-wrapper>',\n      renderProductImage(product),\n      '</div>',\n      '<div class=\"predictive-search__column predictive-search__column--content ' +\n        (getDetailsCount() ? '' : 'predictive-search__column--center') +\n        '\">',\n      '<span class=\"predictive-search-item__title\">',\n      '<span class=\"predictive-search-item__title-text\">' +\n        product.title +\n        '</span>',\n      '</span>' + (getDetailsCount() ? renderProductDetails(product) : ''),\n      '<span class=\"visually-hidden\">, </span>',\n      '<span class=\"visually-hidden\">' +\n        getNumberOfResultsString(index + 1, resultsCount) +\n        '</span>',\n      '</div>',\n      '</a>',\n      '</li>'\n    ].join('');\n  }\n\n  function renderProductImage(product) {\n    if (product.image === null) {\n      return '';\n    }\n\n    return [\n      '<div class=\"placeholder-background placeholder-background--animation\" data-image-placeholder aria-hidden=\"true\"></div>',\n      '<img class=\"predictive-search-item__image lazyload\" src=\"' +\n        product.image.url +\n        '\" data-src=\"' +\n        product.image.url +\n        '\" data-image alt=\"' +\n        product.image.alt +\n        '\" />'\n    ].join('');\n  }\n\n  function renderProductDetails(product) {\n    return [\n      '<dl class=\"predictive-search-item__details price' +\n        (product.isOnSale ? ' price--on-sale' : '') +\n        (!product.available ? ' price--sold-out' : '') +\n        (!product.isPriceVaries && product.isCompareVaries\n          ? ' price--compare-price-hidden'\n          : '') +\n        '\">',\n      '<div class=\"predictive-search-item__detail\">',\n      renderVendor(product),\n      '</div>',\n      '<div class=\"predictive-search-item__detail predictive-search-item__detail--inline\">' +\n        renderProductPrice(product),\n      '</div>',\n      '</dl>'\n    ].join('');\n  }\n  function renderProductPrice(product) {\n    if (!theme.settings.predictiveSearchShowPrice) {\n      return '';\n    }\n\n    var accessibilityAnnounceComma = '<span class=\"visually-hidden\">, </span>';\n\n    var priceMarkup =\n      '<div class=\"price__regular\">' + renderPrice(product) + '</div>';\n\n    var salePriceMarkup =\n      '<div class=\"price__sale\">' + renderSalePrice(product) + '</div>';\n\n    return (\n      accessibilityAnnounceComma +\n      '<div class=\"price__pricing-group\">' +\n      (product.isOnSale ? salePriceMarkup : priceMarkup) +\n      '</div>'\n    );\n  }\n\n  function renderSalePrice(product) {\n    return [\n      '<dt>',\n      '<span class=\"visually-hidden\">' + theme.strings.salePrice + '</span>',\n      '</dt>',\n      '<dd>',\n      '<span class=\"predictive-search-item__price predictive-search-item__price--sale\">' +\n        (product.isPriceVaries\n          ? theme.strings.fromLowestPrice.replace('[price]', product.price)\n          : product.price) +\n        '</span>',\n      '</dd>',\n      '<div class=\"price__compare\">' + renderCompareAtPrice(product) + '</div>'\n    ].join('');\n  }\n\n  function renderCompareAtPrice(product) {\n    return [\n      '<dt>',\n      '<span class=\"visually-hidden\">' +\n        theme.strings.regularPrice +\n        '</span> ',\n      '</dt>',\n      '<dd>',\n      '<span class=\"predictive-search-item__price predictive-search-item__price--compare\">' +\n        product.compareAtPrice +\n        '</span>',\n      '</dd>'\n    ].join('');\n  }\n\n  function renderPrice(product) {\n    return [\n      '<dt>',\n      '<span class=\"visually-hidden\">' + theme.strings.regularPrice + '</span>',\n      '</dt>',\n      '<dd>',\n      '<span class=\"predictive-search-item__price\">' +\n        (product.isPriceVaries\n          ? theme.strings.fromLowestPrice.replace('[price]', product.price)\n          : product.price) +\n        '</span>',\n      '</dd>'\n    ].join('');\n  }\n\n  function renderVendor(product) {\n    if (!theme.settings.predictiveSearchShowVendor || product.vendor === '') {\n      return '';\n    }\n\n    return [\n      '<dt>',\n      '<span class=\"visually-hidden\">' + theme.strings.vendor + '</span>',\n      '</dt>',\n      '<dd class=\"predictive-search-item__vendor\">' + product.vendor + '</dd>'\n    ].join('');\n  }\n\n  function normalizeProduct(product) {\n    var productOrVariant =\n      product.variants.length > 0 ? product.variants[0] : product;\n\n    return {\n      url: productOrVariant.url,\n      image: getProductImage(product),\n      title: product.title,\n      vendor: product.vendor || '',\n      price: theme.Currency.formatMoney(product.price_min, theme.moneyFormat),\n      compareAtPrice: theme.Currency.formatMoney(\n        product.compare_at_price_min,\n        theme.moneyFormat\n      ),\n      available: product.available,\n      isOnSale: isOnSale(product),\n      isPriceVaries: isPriceVaries(product),\n      isCompareVaries: isCompareVaries(product)\n    };\n  }\n\n  function getProductImage(product) {\n    var image;\n    var featuredImage;\n\n    if (product.variants.length > 0 && product.variants[0].image !== null) {\n      featuredImage = product.variants[0].featured_image;\n    } else if (product.image) {\n      featuredImage = product.featured_image;\n    } else {\n      image = null;\n    }\n\n    if (image !== null) {\n      image = {\n        url: theme.Images.getSizedImageUrl(featuredImage.url, '100x'),\n        alt: featuredImage.alt\n      };\n    }\n\n    return image;\n  }\n\n  function isOnSale(product) {\n    return (\n      product.compare_at_price_min !== null &&\n      parseInt(product.compare_at_price_min, 10) >\n        parseInt(product.price_min, 10)\n    );\n  }\n\n  function isPriceVaries(product) {\n    return product.price_max !== product.price_min;\n  }\n\n  function isCompareVaries(product) {\n    return product.compare_at_price_max !== product.compare_at_price_min;\n  }\n\n  // Returns the number of optional product details to be shown,\n  // values of the detailsList need to be boolean.\n  function getDetailsCount() {\n    var detailsList = [\n      theme.settings.predictiveSearchShowPrice,\n      theme.settings.predictiveSearchShowVendor\n    ];\n\n    var detailsCount = detailsList.reduce(function(acc, detail) {\n      return acc + (detail ? 1 : 0);\n    }, 0);\n\n    return detailsCount;\n  }\n\n  function getNumberOfResultsString(resultNumber, resultsCount) {\n    return theme.strings.number_of_results\n      .replace('[result_number]', resultNumber)\n      .replace('[results_count]', resultsCount);\n  }\n\n  function _htmlEscape(input) {\n    return input\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&#39;');\n  }\n\n  return function(data) {\n    var products = data.products || [];\n    var isLoading = data.isLoading;\n    var searchQuery = data.searchQuery || '';\n\n    if (isLoading && products.length === 0) {\n      return loadingState();\n    }\n\n    return renderResults(products, isLoading, searchQuery);\n  };\n})();\n\nwindow.theme = window.theme || {};\n\n(function() {\n  // (a11y) This function will be used by the Predictive Search Component\n  // to announce the number of search results\n  function numberOfResultsTemplateFct(data) {\n    if (data.products.length === 1) {\n      return theme.strings.one_result_found;\n    } else {\n      return theme.strings.number_of_results_found.replace(\n        '[results_count]',\n        data.products.length\n      );\n    }\n  }\n\n  // (a11y) This function will be used by the Predictive Search Component\n  // to announce that it's loading results\n  function loadingResultsMessageTemplateFct() {\n    return theme.strings.loading;\n  }\n\n  function isPredictiveSearchSupported() {\n    var shopifyFeatures = JSON.parse($('#shopify-features').text());\n\n    return shopifyFeatures.predictiveSearch;\n  }\n\n  function isPredictiveSearchEnabled() {\n    return window.theme.settings.predictiveSearchEnabled;\n  }\n\n  function canInitializePredictiveSearch() {\n    return isPredictiveSearchSupported() && isPredictiveSearchEnabled();\n  }\n\n  // listen for search submits and validate query\n  function validateSearchHandler(searchEl, submitEl) {\n    submitEl.addEventListener(\n      'click',\n      validateSearchInput.bind(this, searchEl)\n    );\n  }\n\n  // if there is nothing in the search field, prevent submit\n  function validateSearchInput(searchEl, evt) {\n    var isInputValueEmpty = searchEl.value.trim().length === 0;\n    if (!isInputValueEmpty) {\n      return;\n    }\n\n    if (typeof evt !== 'undefined') {\n      evt.preventDefault();\n    }\n\n    searchEl.focus();\n  }\n\n  window.theme.SearchPage = (function() {\n    var selectors = {\n      searchReset: '[data-search-page-predictive-search-clear]',\n      searchInput: '[data-search-page-predictive-search-input]',\n      searchSubmit: '[data-search-page-predictive-search-submit]',\n      searchResults: '[data-predictive-search-mount=\"default\"]'\n    };\n\n    var componentInstance;\n    var searchInput = document.querySelector(selectors.searchInput);\n    var searchSubmit = document.querySelector(selectors.searchSubmit);\n\n    function init(config) {\n      componentInstance = new window.Shopify.theme.PredictiveSearchComponent({\n        selectors: {\n          input: selectors.searchInput,\n          reset: selectors.searchReset,\n          result: selectors.searchResults\n        },\n        resultTemplateFct: window.theme.SearchResultsTemplate,\n        numberOfResultsTemplateFct: numberOfResultsTemplateFct,\n        loadingResultsMessageTemplateFct: loadingResultsMessageTemplateFct,\n        onOpen: function(nodes) {\n          if (config.isTabletAndUp) {\n            return;\n          }\n\n          var searchInputBoundingRect = $(\n            selectors.searchInput\n          )[0].getBoundingClientRect();\n          var bodyHeight = $('body').height();\n          var offset = 50;\n          var resultsMaxHeight =\n            bodyHeight - searchInputBoundingRect.bottom - offset;\n          $(nodes.result).css({\n            maxHeight: resultsMaxHeight\n          });\n        },\n        onBeforeDestroy: function(nodes) {\n          // If the viewport width changes from mobile to tablet\n          // reset the top position of the results\n          $(nodes.result).css({\n            maxHeight: ''\n          });\n        }\n      });\n\n      validateSearchHandler(searchInput, searchSubmit);\n    }\n\n    function unload() {\n      if (!componentInstance) {\n        return;\n      }\n      componentInstance.destroy();\n      componentInstance = null;\n    }\n\n    return {\n      init: init,\n      unload: unload\n    };\n  })();\n\n  window.theme.SearchHeader = (function() {\n    var selectors = {\n      searchInput: '[data-predictive-search-drawer-input]',\n      searchResults: '[data-predictive-search-mount=\"drawer\"]',\n      searchFormContainer: '[data-search-form-container]',\n      searchSubmit: '[data-search-form-submit]'\n    };\n\n    var componentInstance;\n    var searchInput = document.querySelector(selectors.searchInput);\n    var searchSubmit = document.querySelector(selectors.searchSubmit);\n\n    function init(config) {\n      componentInstance = new window.Shopify.theme.PredictiveSearchComponent({\n        selectors: {\n          input: selectors.searchInput,\n          result: selectors.searchResults\n        },\n        resultTemplateFct: window.theme.SearchResultsTemplate,\n        numberOfResultsTemplateFct: numberOfResultsTemplateFct,\n        numberOfResults: config.numberOfResults,\n        loadingResultsMessageTemplateFct: loadingResultsMessageTemplateFct,\n        onInputBlur: function() {\n          return false;\n        },\n        onOpen: function(nodes) {\n          var searchInputBoundingRect = $(\n            searchInput\n          )[0].getBoundingClientRect();\n\n          // For tablet screens and up, stop the scroll area from extending past\n          // the bottom of the screen because we're locking the body scroll\n          var maxHeight =\n            window.innerHeight -\n            searchInputBoundingRect.bottom -\n            (config.isTabletAndUp ? 20 : 0);\n\n          $(nodes.result).css({\n            top: config.isTabletAndUp ? '' : searchInputBoundingRect.bottom,\n            maxHeight: maxHeight\n          });\n        },\n        onClose: function(nodes) {\n          $(nodes.result).css({\n            maxHeight: ''\n          });\n        },\n        onBeforeDestroy: function(nodes) {\n          // If the viewport width changes from mobile to tablet\n          // reset the top position of the results\n          $(nodes.result).css({\n            top: ''\n          });\n        }\n      });\n\n      validateSearchHandler(searchInput, searchSubmit);\n    }\n\n    function unload() {\n      if (!componentInstance) {\n        return;\n      }\n\n      componentInstance.destroy();\n      componentInstance = null;\n    }\n\n    function clearAndClose() {\n      if (!componentInstance) {\n        return;\n      }\n\n      componentInstance.clearAndClose();\n    }\n\n    return {\n      init: init,\n      unload: unload,\n      clearAndClose: clearAndClose\n    };\n  })();\n\n  window.theme.Search = (function() {\n    var classes = {\n      searchTemplate: 'template-search'\n    };\n    var selectors = {\n      siteHeader: '.site-header'\n    };\n    var mediaQueryList = {\n      mobile: window.matchMedia('(max-width: 749px)'),\n      tabletAndUp: window.matchMedia('(min-width: 750px)')\n    };\n\n    function init() {\n      if (!$(selectors.siteHeader).length) {\n        return;\n      }\n\n      if (!canInitializePredictiveSearch()) {\n        return;\n      }\n\n      Object.keys(mediaQueryList).forEach(function(device) {\n        mediaQueryList[device].addListener(initSearchAccordingToViewport);\n      });\n\n      initSearchAccordingToViewport();\n    }\n\n    function initSearchAccordingToViewport() {\n      theme.SearchDrawer.close();\n      theme.SearchHeader.unload();\n      theme.SearchPage.unload();\n\n      if (mediaQueryList.mobile.matches) {\n        theme.SearchHeader.init({\n          numberOfResults: 4,\n          isTabletAndUp: false\n        });\n\n        if (isSearchPage()) {\n          theme.SearchPage.init({ isTabletAndUp: false });\n        }\n      } else {\n        // Tablet and up\n        theme.SearchHeader.init({\n          numberOfResults: 4,\n          isTabletAndUp: true\n        });\n\n        if (isSearchPage()) {\n          theme.SearchPage.init({ isTabletAndUp: true });\n        }\n      }\n    }\n\n    function isSearchPage() {\n      return $('body').hasClass(classes.searchTemplate);\n    }\n\n    function unload() {\n      theme.SearchHeader.unload();\n      theme.SearchPage.unload();\n    }\n\n    return {\n      init: init,\n      unload: unload\n    };\n  })();\n})();\n\nwindow.theme = window.theme || {};\n\ntheme.SearchDrawer = (function() {\n  var selectors = {\n    headerSection: '[data-header-section]',\n    drawer: '[data-predictive-search-drawer]',\n    drawerOpenButton: '[data-predictive-search-open-drawer]',\n    headerSearchInput: '[data-predictive-search-drawer-input]',\n    predictiveSearchWrapper: '[data-predictive-search-mount=\"drawer\"]'\n  };\n\n  var drawerInstance;\n\n  function init() {\n    setAccessibilityProps();\n\n    drawerInstance = new theme.Drawers('SearchDrawer', 'top', {\n      onDrawerOpen: function() {\n        setHeight();\n        theme.MobileNav.closeMobileNav();\n        lockBodyScroll();\n      },\n      onDrawerClose: function() {\n        theme.SearchHeader.clearAndClose();\n        $(selectors.drawerOpenButton).focus();\n        unlockBodyScroll();\n      },\n      withPredictiveSearch: true,\n      $elementToFocusOnOpen: $(selectors.headerSearchInput)\n    });\n  }\n\n  function setAccessibilityProps() {\n    $(selectors.drawerOpenButton)\n      .attr('aria-controls', 'SearchDrawer')\n      .attr('aria-expanded', 'false')\n      .attr('aria-haspopup', 'dialog');\n  }\n\n  function setHeight() {\n    $(selectors.drawer).css({\n      height: $(selectors.headerSection).outerHeight()\n    });\n  }\n\n  function close() {\n    drawerInstance.close();\n  }\n\n  function lockBodyScroll() {\n    // Disable scroll except on the predictive search container.\n    window.bodyScrollLock.disableBodyScroll(\n      document.querySelector(selectors.predictiveSearchWrapper),\n      {\n        allowTouchMove: function(element) {\n          return (\n            // If the touch event is in an element under the predictive search\n            // we allow don't prevent default.\n            $(element).parents(selectors.predictiveSearchWrapper).length === 1\n          );\n        }\n      }\n    );\n  }\n\n  function unlockBodyScroll() {\n    window.bodyScrollLock.clearAllBodyScrollLocks();\n  }\n\n  return {\n    init: init,\n    close: close\n  };\n})();\n\ntheme.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 = _.assignIn({}, 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          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 !== slate.utils.keyboardKeys.ESCAPE) 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      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\n/* ================ TEMPLATES ================ */\n(function() {\n  var $filterBy = $('#BlogTagFilter');\n\n  if (!$filterBy.length) {\n    return;\n  }\n\n  slate.utils.resizeSelects($filterBy);\n\n  $filterBy.on('change', function() {\n    location.href = $(this).val();\n  });\n})();\n\nwindow.theme = theme || {};\n\ntheme.customerTemplates = (function() {\n  var selectors = {\n    RecoverHeading: '#RecoverHeading',\n    RecoverEmail: '#RecoverEmail',\n    LoginHeading: '#LoginHeading'\n  };\n\n  function initEventListeners() {\n    this.$RecoverHeading = $(selectors.RecoverHeading);\n    this.$RecoverEmail = $(selectors.RecoverEmail);\n    this.$LoginHeading = $(selectors.LoginHeading);\n\n    // Show reset password form\n    $('#RecoverPassword').on(\n      'click',\n      function(evt) {\n        evt.preventDefault();\n        showRecoverPasswordForm();\n        this.$RecoverHeading.attr('tabindex', '-1').focus();\n      }.bind(this)\n    );\n\n    // Hide reset password form\n    $('#HideRecoverPasswordLink').on(\n      'click',\n      function(evt) {\n        evt.preventDefault();\n        hideRecoverPasswordForm();\n        this.$LoginHeading.attr('tabindex', '-1').focus();\n      }.bind(this)\n    );\n\n    this.$RecoverHeading.on('blur', function() {\n      $(this).removeAttr('tabindex');\n    });\n\n    this.$LoginHeading.on('blur', function() {\n      $(this).removeAttr('tabindex');\n    });\n  }\n\n  /**\n   *\n   *  Show/Hide recover password form\n   *\n   */\n\n  function showRecoverPasswordForm() {\n    $('#RecoverPasswordForm').removeClass('hide');\n    $('#CustomerLoginForm').addClass('hide');\n\n    if (this.$RecoverEmail.attr('aria-invalid') === 'true') {\n      this.$RecoverEmail.focus();\n    }\n  }\n\n  function hideRecoverPasswordForm() {\n    $('#RecoverPasswordForm').addClass('hide');\n    $('#CustomerLoginForm').removeClass('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 submited.\n    if (!$formState.length) {\n      return;\n    }\n\n    // show success message\n    $('#ResetSuccess')\n      .removeClass('hide')\n      .focus();\n  }\n\n  /**\n   *\n   *  Show/hide customer address forms\n   *\n   */\n  function customerAddressForm() {\n    var $newAddressForm = $('#AddressNewForm');\n    var $newAddressFormButton = $('#AddressNewButton');\n\n    if (!$newAddressForm.length) {\n      return;\n    }\n\n    // Initialize observers on address selectors, defined in shopify_common.js\n    if (Shopify) {\n      // eslint-disable-next-line no-new\n      new Shopify.CountryProvinceSelector(\n        'AddressCountryNew',\n        'AddressProvinceNew',\n        {\n          hideElement: 'AddressProvinceContainerNew'\n        }\n      );\n    }\n\n    // Initialize each edit form's country/province selector\n    $('.address-country-option').each(function() {\n      var formId = $(this).data('form-id');\n      var countrySelector = 'AddressCountry_' + formId;\n      var provinceSelector = 'AddressProvince_' + formId;\n      var containerSelector = 'AddressProvinceContainer_' + formId;\n\n      // eslint-disable-next-line no-new\n      new Shopify.CountryProvinceSelector(countrySelector, provinceSelector, {\n        hideElement: containerSelector\n      });\n    });\n\n    // Toggle new/edit address forms\n    $('.address-new-toggle').on('click', function() {\n      var isExpanded = $newAddressFormButton.attr('aria-expanded') === 'true';\n\n      $newAddressForm.toggleClass('hide');\n      $newAddressFormButton.attr('aria-expanded', !isExpanded).focus();\n    });\n\n    $('.address-edit-toggle').on('click', function() {\n      var formId = $(this).data('form-id');\n      var $editButton = $('#EditFormButton_' + formId);\n      var $editAddress = $('#EditAddress_' + formId);\n      var isExpanded = $editButton.attr('aria-expanded') === 'true';\n\n      $editAddress.toggleClass('hide');\n      $editButton.attr('aria-expanded', !isExpanded).focus();\n    });\n\n    $('.address-delete').on('click', function() {\n      var $el = $(this);\n      var target = $el.data('target');\n      var confirmMessage = $el.data('confirm-message');\n\n      // eslint-disable-next-line no-alert\n      if (\n        confirm(\n          confirmMessage || 'Are you sure you wish to delete this address?'\n        )\n      ) {\n        Shopify.postLink(target, {\n          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      showRecoverPasswordForm.bind(this)();\n    }\n  }\n\n  return {\n    init: function() {\n      initEventListeners();\n      checkUrlHash();\n      resetPasswordSuccess();\n      customerAddressForm();\n    }\n  };\n})();\n\n\n/*================ SECTIONS ================*/\nwindow.theme = window.theme || {};\n\ntheme.Cart = (function() {\n  var selectors = {\n    cartCount: '[data-cart-count]',\n    cartCountBubble: '[data-cart-count-bubble]',\n    cartDiscount: '[data-cart-discount]',\n    cartDiscountTitle: '[data-cart-discount-title]',\n    cartDiscountAmount: '[data-cart-discount-amount]',\n    cartDiscountWrapper: '[data-cart-discount-wrapper]',\n    cartErrorMessage: '[data-cart-error-message]',\n    cartErrorMessageWrapper: '[data-cart-error-message-wrapper]',\n    cartItem: '[data-cart-item]',\n    cartItemDetails: '[data-cart-item-details]',\n    cartItemDiscount: '[data-cart-item-discount]',\n    cartItemDiscountedPriceGroup: '[data-cart-item-discounted-price-group]',\n    cartItemDiscountTitle: '[data-cart-item-discount-title]',\n    cartItemDiscountAmount: '[data-cart-item-discount-amount]',\n    cartItemDiscountList: '[data-cart-item-discount-list]',\n    cartItemFinalPrice: '[data-cart-item-final-price]',\n    cartItemImage: '[data-cart-item-image]',\n    cartItemLinePrice: '[data-cart-item-line-price]',\n    cartItemOriginalPrice: '[data-cart-item-original-price]',\n    cartItemPrice: '[data-cart-item-price]',\n    cartItemPriceList: '[data-cart-item-price-list]',\n    cartItemProperty: '[data-cart-item-property]',\n    cartItemPropertyName: '[data-cart-item-property-name]',\n    cartItemPropertyValue: '[data-cart-item-property-value]',\n    cartItemRegularPriceGroup: '[data-cart-item-regular-price-group]',\n    cartItemRegularPrice: '[data-cart-item-regular-price]',\n    cartItemTitle: '[data-cart-item-title]',\n    cartItemOption: '[data-cart-item-option]',\n    cartLineItems: '[data-cart-line-items]',\n    cartNote: '[data-cart-notes]',\n    cartQuantityErrorMessage: '[data-cart-quantity-error-message]',\n    cartQuantityErrorMessageWrapper:\n      '[data-cart-quantity-error-message-wrapper]',\n    cartRemove: '[data-cart-remove]',\n    cartStatus: '[data-cart-status]',\n    cartSubtotal: '[data-cart-subtotal]',\n    cartTableCell: '[data-cart-table-cell]',\n    cartWrapper: '[data-cart-wrapper]',\n    emptyPageContent: '[data-empty-page-content]',\n    quantityInput: '[data-quantity-input]',\n    quantityInputMobile: '[data-quantity-input-mobile]',\n    quantityInputDesktop: '[data-quantity-input-desktop]',\n    quantityLabelMobile: '[data-quantity-label-mobile]',\n    quantityLabelDesktop: '[data-quantity-label-desktop]',\n    inputQty: '[data-quantity-input]',\n    thumbnails: '.cart__image',\n    unitPrice: '[data-unit-price]',\n    unitPriceBaseUnit: '[data-unit-price-base-unit]',\n    unitPriceGroup: '[data-unit-price-group]'\n  };\n\n  var classes = {\n    cartNoCookies: 'cart--no-cookies',\n    cartRemovedProduct: 'cart__removed-product',\n    hide: 'hide',\n    inputError: 'input--error'\n  };\n\n  var attributes = {\n    cartItemIndex: 'data-cart-item-index',\n    cartItemKey: 'data-cart-item-key',\n    cartItemQuantity: 'data-cart-item-quantity',\n    cartItemTitle: 'data-cart-item-title',\n    cartItemUrl: 'data-cart-item-url',\n    quantityItem: 'data-quantity-item'\n  };\n\n  theme.breakpoints = theme.breakpoints || {};\n\n  if (\n    isNaN(theme.breakpoints.medium) ||\n    theme.breakpoints.medium === undefined\n  ) {\n    theme.breakpoints.medium = 750;\n  }\n\n  var mediumUpQuery = '(min-width: ' + theme.breakpoints.medium + 'px)';\n\n  function Cart(container) {\n    this.$container = $(container);\n    this.$thumbnails = $(selectors.thumbnails, this.$container);\n    this.ajaxEnabled = this.$container.data('ajax-enabled');\n\n    if (!this.cookiesEnabled()) {\n      this.$container.addClass(classes.cartNoCookies);\n    }\n\n    this.$thumbnails.css('cursor', 'pointer');\n    this.$container.on(\n      'click',\n      selectors.thumbnails,\n      this._handleThumbnailClick\n    );\n\n    this.$container.on(\n      'change',\n      selectors.inputQty,\n      $.debounce(500, this._handleInputQty.bind(this))\n    );\n\n    this.mql = window.matchMedia(mediumUpQuery);\n    this.mql.addListener(this.setQuantityFormControllers.bind(this));\n    this.setQuantityFormControllers();\n\n    if (this.ajaxEnabled) {\n      /**\n       * Because the entire cart is recreated when a cart item is updated,\n       * we cannot cache the elements in the cart. Instead, we add the event\n       * listeners on the cart's container to allow us to retain the event\n       * listeners after rebuilding the cart when an item is updated.\n       */\n\n      this.$container.on(\n        'change',\n        selectors.cartNote,\n        this._onNoteChange.bind(this)\n      );\n\n      this.$container.on(\n        'click',\n        selectors.cartRemove,\n        this._onRemoveItem.bind(this)\n      );\n\n      this._setupCartTemplates();\n    }\n  }\n\n  Cart.prototype = _.assignIn({}, Cart.prototype, {\n    _setupCartTemplates: function() {\n      this.$itemTemplate = $(selectors.cartItem, this.$container)\n        .first()\n        .clone();\n      this.$itemDiscountTemplate = $(\n        selectors.cartItemDiscount,\n        this.$itemTemplate\n      ).clone();\n      this.$itemOptionTemplate = $(\n        selectors.cartItemOption,\n        this.$itemTemplate\n      ).clone();\n      this.$itemPropertyTemplate = $(\n        selectors.cartItemProperty,\n        this.$itemTemplate\n      ).clone();\n      this.$itemPriceListTemplate = $(\n        selectors.cartItemPriceList,\n        this.$itemTemplate\n      ).clone();\n      this.$itemLinePriceTemplate = $(\n        selectors.cartItemLinePrice,\n        this.$itemTemplate\n      ).clone();\n      this.$cartDiscountTemplate = $(\n        selectors.cartDiscount,\n        this.$container\n      ).clone();\n    },\n\n    _handleInputQty: function(evt) {\n      var $input = $(evt.target);\n      var itemIndex = $input.data('quantity-item');\n      var $itemElement = $input.closest(selectors.cartItem);\n      var $itemQtyInputs = $('[data-quantity-item=' + itemIndex + ']');\n      var value = parseInt($input.val());\n      var isValidValue = !(value < 0 || isNaN(value));\n      $itemQtyInputs.val(value);\n\n      this._hideCartError();\n      this._hideQuantityErrorMessage();\n\n      if (!isValidValue) {\n        this._showQuantityErrorMessages($itemElement);\n        return;\n      }\n\n      if (isValidValue && this.ajaxEnabled) {\n        this._updateItemQuantity(\n          itemIndex,\n          $itemElement,\n          $itemQtyInputs,\n          value\n        );\n      }\n    },\n\n    _updateItemQuantity: function(\n      itemIndex,\n      $itemElement,\n      $itemQtyInputs,\n      value\n    ) {\n      var key = $itemElement.attr(attributes.cartItemKey);\n      var index = $itemElement.attr(attributes.cartItemIndex);\n\n      var params = {\n        url: '/cart/change.js',\n        data: { quantity: value, line: index },\n        dataType: 'json'\n      };\n\n      $.post(params)\n        .done(\n          function(state) {\n            if (state.item_count === 0) {\n              this._emptyCart();\n            } else {\n              this._createCart(state);\n\n              if (value === 0) {\n                this._showRemoveMessage($itemElement.clone());\n              } else {\n                var $lineItem = $('[data-cart-item-key=\"' + key + '\"]');\n                var item = this.getItem(key, state);\n\n                $(selectors.quantityInput, $lineItem).focus();\n                this._updateLiveRegion(item);\n              }\n            }\n\n            this._setCartCountBubble(state.item_count);\n          }.bind(this)\n        )\n        .fail(\n          function() {\n            this._showCartError($itemQtyInputs);\n          }.bind(this)\n        );\n    },\n\n    getItem: function(key, state) {\n      return state.items.find(function(item) {\n        return item.key === key;\n      });\n    },\n\n    _liveRegionText: function(item) {\n      // Dummy content for live region\n      var liveRegionText =\n        theme.strings.update +\n        ': [QuantityLabel]: [Quantity], [Regular] [$$] [DiscountedPrice] [$]. [PriceInformation]';\n\n      // Update Quantity\n      liveRegionText = liveRegionText\n        .replace('[QuantityLabel]', theme.strings.quantity)\n        .replace('[Quantity]', item.quantity);\n\n      // Update pricing information\n      var regularLabel = '';\n      var regularPrice = theme.Currency.formatMoney(\n        item.original_line_price,\n        theme.moneyFormat\n      );\n      var discountLabel = '';\n      var discountPrice = '';\n      var discountInformation = '';\n\n      if (item.original_line_price > item.final_line_price) {\n        regularLabel = theme.strings.regularTotal;\n\n        discountLabel = theme.strings.discountedTotal;\n        discountPrice = theme.Currency.formatMoney(\n          item.final_line_price,\n          theme.moneyFormat\n        );\n\n        discountInformation = theme.strings.priceColumn;\n      }\n\n      liveRegionText = liveRegionText\n        .replace('[Regular]', regularLabel)\n        .replace('[$$]', regularPrice)\n        .replace('[DiscountedPrice]', discountLabel)\n        .replace('[$]', discountPrice)\n        .replace('[PriceInformation]', discountInformation)\n        .trim();\n\n      return liveRegionText;\n    },\n\n    _updateLiveRegion: function(item) {\n      var $liveRegion = $(selectors.cartStatus);\n      $liveRegion.html(this._liveRegionText(item)).attr('aria-hidden', false);\n\n      // hide content from accessibility tree after announcement\n      setTimeout(function() {\n        $liveRegion.attr('aria-hidden', true);\n      }, 1000);\n    },\n\n    _createCart: function(state) {\n      var cartDiscountList = this._createCartDiscountList(state);\n\n      $(selectors.cartLineItems, this.$container).html(\n        this._createLineItemList(state)\n      );\n\n      this.setQuantityFormControllers();\n\n      $(selectors.cartNote, this.$container).val(state.note);\n\n      if (cartDiscountList.length === 0) {\n        $(selectors.cartDiscountWrapper, this.$container)\n          .html('')\n          .addClass(classes.hide);\n      } else {\n        $(selectors.cartDiscountWrapper, this.$container)\n          .html(cartDiscountList)\n          .removeClass(classes.hide);\n      }\n\n      $(selectors.cartSubtotal, this.$container).html(\n        theme.Currency.formatMoney(\n          state.total_price,\n          theme.moneyFormatWithCurrency\n        )\n      );\n    },\n\n    _createCartDiscountList: function(cart) {\n      return $.map(\n        cart.cart_level_discount_applications,\n        function(discount) {\n          var $discount = this.$cartDiscountTemplate.clone();\n          $discount.find(selectors.cartDiscountTitle).text(discount.title);\n          $discount\n            .find(selectors.cartDiscountAmount)\n            .html(\n              theme.Currency.formatMoney(\n                discount.total_allocated_amount,\n                theme.moneyFormat\n              )\n            );\n          return $discount[0];\n        }.bind(this)\n      );\n    },\n\n    _createLineItemList: function(state) {\n      return $.map(\n        state.items,\n        function(item, index) {\n          var $item = this.$itemTemplate.clone();\n          var $itemPriceList = this.$itemPriceListTemplate.clone();\n\n          this._setLineItemAttributes($item, item, index);\n          this._setLineItemImage($item, item.featured_image);\n\n          $(selectors.cartItemTitle, $item)\n            .text(item.product_title)\n            .attr('href', item.url);\n\n          var productDetailsList = this._createProductDetailsList(\n            item.product_has_only_default_variant,\n            item.options_with_values,\n            item.properties\n          );\n          this._setProductDetailsList($item, productDetailsList);\n\n          this._setItemRemove($item, item.title);\n\n          $itemPriceList.html(\n            this._createItemPrice(\n              item.original_price,\n              item.final_price,\n              this.$itemPriceListTemplate\n            )\n          );\n\n          if (item.unit_price_measurement) {\n            $itemPriceList.append(\n              this._createUnitPrice(\n                item.unit_price,\n                item.unit_price_measurement,\n                this.$itemPriceListTemplate\n              )\n            );\n          }\n\n          this._setItemPrice($item, $itemPriceList);\n\n          var itemDiscountList = this._createItemDiscountList(item);\n          this._setItemDiscountList($item, itemDiscountList);\n\n          this._setQuantityInputs($item, item, index);\n\n          var itemLinePrice = this._createItemPrice(\n            item.original_line_price,\n            item.final_line_price,\n            this.$itemLinePriceTemplate\n          );\n          this._setItemLinePrice($item, itemLinePrice);\n\n          return $item[0];\n        }.bind(this)\n      );\n    },\n\n    _setLineItemAttributes: function($item, item, index) {\n      $item\n        .attr(attributes.cartItemKey, item.key)\n        .attr(attributes.cartItemUrl, item.url)\n        .attr(attributes.cartItemTitle, item.title)\n        .attr(attributes.cartItemIndex, index + 1)\n        .attr(attributes.cartItemQuantity, item.quantity);\n    },\n\n    _setLineItemImage: function($item, featuredImage) {\n      var $image = $(selectors.cartItemImage, $item);\n\n      var sizedImageUrl =\n        featuredImage.url !== null\n          ? theme.Images.getSizedImageUrl(featuredImage.url, 'x190')\n          : null;\n\n      if (sizedImageUrl) {\n        $image\n          .attr('alt', featuredImage.alt)\n          .attr('src', sizedImageUrl)\n          .removeClass(classes.hide);\n      } else {\n        $image.remove();\n      }\n    },\n\n    _setProductDetailsList: function($item, productDetailsList) {\n      var $itemDetails = $(selectors.cartItemDetails, $item);\n\n      if (productDetailsList.length === 0) {\n        $itemDetails.addClass(classes.hide).text('');\n      } else {\n        $itemDetails.removeClass(classes.hide).html(productDetailsList);\n      }\n    },\n\n    _setItemPrice: function($item, price) {\n      $(selectors.cartItemPrice, $item).html(price);\n    },\n\n    _setItemDiscountList: function($item, discountList) {\n      var $itemDiscountList = $(selectors.cartItemDiscountList, $item);\n\n      if (discountList.length === 0) {\n        $itemDiscountList.html('').addClass(classes.hide);\n      } else {\n        $itemDiscountList.html(discountList).removeClass(classes.hide);\n      }\n    },\n\n    _setItemRemove: function($item, title) {\n      $(selectors.cartRemove, $item).attr(\n        'aria-label',\n        theme.strings.removeLabel.replace('[product]', title)\n      );\n    },\n\n    _setQuantityInputs: function($item, item, index) {\n      $(selectors.quantityInputMobile, $item)\n        .attr('id', 'updates_' + item.key)\n        .attr(attributes.quantityItem, index + 1)\n        .val(item.quantity);\n\n      $(selectors.quantityInputDesktop, $item)\n        .attr('id', 'updates_large_' + item.key)\n        .attr(attributes.quantityItem, index + 1)\n        .val(item.quantity);\n\n      $(selectors.quantityLabelMobile, $item).attr(\n        'for',\n        'updates_' + item.key\n      );\n\n      $(selectors.quantityLabelDesktop, $item).attr(\n        'for',\n        'updates_large_' + item.key\n      );\n    },\n\n    setQuantityFormControllers: function() {\n      if (this.mql.matches) {\n        $(selectors.quantityInputDesktop).attr('name', 'updates[]');\n        $(selectors.quantityInputMobile).removeAttr('name');\n      } else {\n        $(selectors.quantityInputMobile).attr('name', 'updates[]');\n        $(selectors.quantityInputDesktop).removeAttr('name');\n      }\n    },\n\n    _setItemLinePrice: function($item, price) {\n      $(selectors.cartItemLinePrice, $item).html(price);\n    },\n\n    _createProductDetailsList: function(\n      product_has_only_default_variant,\n      options,\n      properties\n    ) {\n      var optionsPropertiesHTML = [];\n\n      if (!product_has_only_default_variant) {\n        optionsPropertiesHTML = optionsPropertiesHTML.concat(\n          this._getOptionList(options)\n        );\n      }\n\n      if (properties !== null && Object.keys(properties).length !== 0) {\n        optionsPropertiesHTML = optionsPropertiesHTML.concat(\n          this._getPropertyList(properties)\n        );\n      }\n\n      return optionsPropertiesHTML;\n    },\n\n    _getOptionList: function(options) {\n      return $.map(\n        options,\n        function(option) {\n          var $optionElement = this.$itemOptionTemplate.clone();\n\n          $optionElement\n            .text(option.name + ': ' + option.value)\n            .removeClass(classes.hide);\n\n          return $optionElement[0];\n        }.bind(this)\n      );\n    },\n\n    _getPropertyList: function(properties) {\n      var propertiesArray =\n        properties !== null ? Object.entries(properties) : [];\n\n      return $.map(\n        propertiesArray,\n        function(property) {\n          var $propertyElement = this.$itemPropertyTemplate.clone();\n\n          // Line item properties prefixed with an underscore are not to be displayed\n          if (property[0].charAt(0) === '_') return;\n\n          // if the property value has a length of 0 (empty), don't display it\n          if (property[1].length === 0) return;\n\n          $propertyElement\n            .find(selectors.cartItemPropertyName)\n            .text(property[0]);\n\n          if (property[0].indexOf('/uploads/') === -1) {\n            $propertyElement\n              .find(selectors.cartItemPropertyValue)\n              .text(': ' + property[1]);\n          } else {\n            $propertyElement\n              .find(selectors.cartItemPropertyValue)\n              .html(\n                ': <a href=\"' +\n                  property[1] +\n                  '\"> ' +\n                  property[1].split('/').pop() +\n                  '</a>'\n              );\n          }\n\n          $propertyElement.removeClass(classes.hide);\n\n          return $propertyElement[0];\n        }.bind(this)\n      );\n    },\n\n    _createItemPrice: function(original_price, final_price, $priceTemplate) {\n      if (original_price !== final_price) {\n        var $discountedPrice = $(\n          selectors.cartItemDiscountedPriceGroup,\n          $priceTemplate\n        ).clone();\n\n        $(selectors.cartItemOriginalPrice, $discountedPrice).html(\n          theme.Currency.formatMoney(original_price, theme.moneyFormat)\n        );\n        $(selectors.cartItemFinalPrice, $discountedPrice).html(\n          theme.Currency.formatMoney(final_price, theme.moneyFormat)\n        );\n        $discountedPrice.removeClass(classes.hide);\n\n        return $discountedPrice[0];\n      } else {\n        var $regularPrice = $(\n          selectors.cartItemRegularPriceGroup,\n          $priceTemplate\n        ).clone();\n\n        $(selectors.cartItemRegularPrice, $regularPrice).html(\n          theme.Currency.formatMoney(original_price, theme.moneyFormat)\n        );\n\n        $regularPrice.removeClass(classes.hide);\n\n        return $regularPrice[0];\n      }\n    },\n\n    _createUnitPrice: function(\n      unitPrice,\n      unitPriceMeasurement,\n      $itemPriceGroup\n    ) {\n      var $unitPriceGroup = $(\n        selectors.unitPriceGroup,\n        $itemPriceGroup\n      ).clone();\n\n      var unitPriceBaseUnit =\n        (unitPriceMeasurement.reference_value !== 1\n          ? unitPriceMeasurement.reference_value\n          : '') + unitPriceMeasurement.reference_unit;\n\n      $(selectors.unitPriceBaseUnit, $unitPriceGroup).text(unitPriceBaseUnit);\n      $(selectors.unitPrice, $unitPriceGroup).html(\n        theme.Currency.formatMoney(unitPrice, theme.moneyFormat)\n      );\n\n      $unitPriceGroup.removeClass(classes.hide);\n\n      return $unitPriceGroup[0];\n    },\n\n    _createItemDiscountList: function(item) {\n      return $.map(\n        item.line_level_discount_allocations,\n        function(discount) {\n          var $discount = this.$itemDiscountTemplate.clone();\n          $discount\n            .find(selectors.cartItemDiscountTitle)\n            .text(discount.discount_application.title);\n          $discount\n            .find(selectors.cartItemDiscountAmount)\n            .html(\n              theme.Currency.formatMoney(discount.amount, theme.moneyFormat)\n            );\n          return $discount[0];\n        }.bind(this)\n      );\n    },\n\n    _showQuantityErrorMessages: function(itemElement) {\n      $(selectors.cartQuantityErrorMessage, itemElement).text(\n        theme.strings.quantityMinimumMessage\n      );\n\n      $(selectors.cartQuantityErrorMessageWrapper, itemElement).removeClass(\n        classes.hide\n      );\n\n      $(selectors.inputQty, itemElement)\n        .addClass(classes.inputError)\n        .focus();\n    },\n\n    _hideQuantityErrorMessage: function() {\n      var $errorMessages = $(\n        selectors.cartQuantityErrorMessageWrapper\n      ).addClass(classes.hide);\n\n      $(selectors.cartQuantityErrorMessage, $errorMessages).text('');\n\n      $(selectors.inputQty, this.$container).removeClass(classes.inputError);\n    },\n\n    _handleThumbnailClick: function(evt) {\n      var url = $(evt.target)\n        .closest(selectors.cartItem)\n        .data('cart-item-url');\n\n      window.location.href = url;\n    },\n\n    _onNoteChange: function(evt) {\n      var note = evt.currentTarget.value;\n      this._hideCartError();\n      this._hideQuantityErrorMessage();\n\n      var params = {\n        url: '/cart/update.js',\n        data: { note: note },\n        dataType: 'json'\n      };\n\n      $.post(params).fail(\n        function() {\n          this._showCartError(evt.currentTarget);\n        }.bind(this)\n      );\n    },\n\n    _showCartError: function(elementToFocus) {\n      $(selectors.cartErrorMessage).text(theme.strings.cartError);\n\n      $(selectors.cartErrorMessageWrapper).removeClass(classes.hide);\n\n      elementToFocus.focus();\n    },\n\n    _hideCartError: function() {\n      $(selectors.cartErrorMessageWrapper).addClass(classes.hide);\n      $(selectors.cartErrorMessage).text('');\n    },\n\n    _onRemoveItem: function(evt) {\n      evt.preventDefault();\n      var $remove = $(evt.target);\n      var $lineItem = $remove.closest(selectors.cartItem);\n      var index = $lineItem.attr(attributes.cartItemIndex);\n      this._hideCartError();\n\n      var params = {\n        url: '/cart/change.js',\n        data: { quantity: 0, line: index },\n        dataType: 'json'\n      };\n\n      $.post(params)\n        .done(\n          function(state) {\n            if (state.item_count === 0) {\n              this._emptyCart();\n            } else {\n              this._createCart(state);\n              this._showRemoveMessage($lineItem.clone());\n            }\n\n            this._setCartCountBubble(state.item_count);\n          }.bind(this)\n        )\n        .fail(\n          function() {\n            this._showCartError(null);\n          }.bind(this)\n        );\n    },\n\n    _showRemoveMessage: function(lineItem) {\n      var index = lineItem.data('cart-item-index');\n      var removeMessage = this._getRemoveMessage(lineItem);\n      var $lineItemAtIndex;\n\n      if (index - 1 === 0) {\n        $lineItemAtIndex = $('[data-cart-item-index=\"1\"]', this.$container);\n        $(removeMessage).insertBefore($lineItemAtIndex);\n      } else {\n        $lineItemAtIndex = $(\n          '[data-cart-item-index=\"' + (index - 1) + '\"]',\n          this.$container\n        );\n        removeMessage.insertAfter($lineItemAtIndex);\n      }\n      removeMessage.focus();\n    },\n\n    _getRemoveMessage: function(lineItem) {\n      var formattedMessage = this._formatRemoveMessage(lineItem);\n\n      var $tableCell = $(selectors.cartTableCell, lineItem).clone();\n      $tableCell\n        .removeClass()\n        .addClass(classes.cartRemovedProduct)\n        .attr('colspan', '4')\n        .html(formattedMessage);\n\n      lineItem\n        .attr('role', 'alert')\n        .html($tableCell)\n        .attr('tabindex', '-1');\n\n      return lineItem;\n    },\n\n    _formatRemoveMessage: function(lineItem) {\n      var quantity = lineItem.data('cart-item-quantity');\n      var url = lineItem.attr(attributes.cartItemUrl);\n      var title = lineItem.attr(attributes.cartItemTitle);\n\n      return theme.strings.removedItemMessage\n        .replace('[quantity]', quantity)\n        .replace(\n          '[link]',\n          '<a ' +\n            'href=\"' +\n            url +\n            '\" class=\"text-link text-link--accent\">' +\n            title +\n            '</a>'\n        );\n    },\n\n    _setCartCountBubble: function(quantity) {\n      this.$cartCountBubble =\n        this.$cartCountBubble || $(selectors.cartCountBubble);\n      this.$cartCount = this.$cartCount || $(selectors.cartCount);\n\n      if (quantity > 0) {\n        this.$cartCountBubble.removeClass(classes.hide);\n        this.$cartCount.html(quantity);\n      } else {\n        this.$cartCountBubble.addClass(classes.hide);\n        this.$cartCount.html('');\n      }\n    },\n\n    _emptyCart: function() {\n      this.$emptyPageContent =\n        this.$emptyPageContent ||\n        $(selectors.emptyPageContent, this.$container);\n      this.$cartWrapper =\n        this.$cartWrapper || $(selectors.cartWrapper, this.$container);\n\n      this.$emptyPageContent.removeClass(classes.hide);\n      this.$cartWrapper.addClass(classes.hide);\n    },\n\n    cookiesEnabled: function() {\n      var cookieEnabled = navigator.cookieEnabled;\n\n      if (!cookieEnabled) {\n        document.cookie = 'testcookie';\n        cookieEnabled = document.cookie.indexOf('testcookie') !== -1;\n      }\n      return cookieEnabled;\n    }\n  });\n\n  return Cart;\n})();\n\nwindow.theme = window.theme || {};\n\ntheme.Filters = (function() {\n  var settings = {\n    // Breakpoints from src/stylesheets/global/variables.scss.liquid\n    mediaQueryMediumUp: 'screen and (min-width: 750px)'\n  };\n\n  var selectors = {\n    mainContent: '#MainContent',\n    filterSelection: '#FilterTags',\n    sortSelection: '#SortBy'\n  };\n\n  var data = {\n    sortBy: 'data-default-sortby'\n  };\n\n  function Filters(container) {\n    var $container = (this.$container = $(container));\n\n    this.$filterSelect = $(selectors.filterSelection, $container);\n    this.$sortSelect = $(selectors.sortSelection, $container);\n    this.$selects = $(selectors.filterSelection, $container).add(\n      $(selectors.sortSelection, $container)\n    );\n\n    this.defaultSort = this._getDefaultSortValue();\n    this.$selects.removeClass('hidden');\n\n    this.$filterSelect.on('change', this._onFilterChange.bind(this));\n    this.$sortSelect.on('change', this._onSortChange.bind(this));\n    this._initBreakpoints();\n    this._initParams();\n  }\n\n  Filters.prototype = _.assignIn({}, Filters.prototype, {\n    _initBreakpoints: function() {\n      var self = this;\n\n      enquire.register(settings.mediaQueryMediumUp, {\n        match: function() {\n          slate.utils.resizeSelects(self.$selects);\n        }\n      });\n    },\n\n    _initParams: function() {\n      self.queryParams = {};\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            self.queryParams[\n              decodeURIComponent(aKeyValue[0])\n            ] = decodeURIComponent(aKeyValue[1]);\n          }\n        }\n      }\n    },\n\n    _onSortChange: function() {\n      self.queryParams.sort_by = this._getSortValue();\n\n      if (self.queryParams.page) {\n        delete self.queryParams.page;\n      }\n      window.location.search = decodeURIComponent($.param(self.queryParams));\n    },\n\n    _onFilterChange: function() {\n      document.location.href = this._getFilterValue();\n    },\n\n    _getFilterValue: function() {\n      return this.$filterSelect.val();\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    onUnload: function() {\n      this.$filterSelect.off('change', this._onFilterChange);\n      this.$sortSelect.off('change', this._onSortChange);\n    }\n  });\n\n  return Filters;\n})();\n\nwindow.theme = window.theme || {};\n\ntheme.HeaderSection = (function() {\n  function Header() {\n    theme.Header.init();\n    theme.MobileNav.init();\n    theme.SearchDrawer.init();\n    theme.Search.init();\n  }\n\n  Header.prototype = _.assignIn({}, Header.prototype, {\n    onUnload: function() {\n      theme.Header.unload();\n      theme.Search.unload();\n    }\n  });\n\n  return Header;\n})();\n\ntheme.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  // eslint-disable-next-line camelcase, no-unused-vars\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.$map = this.$container.find(selectors.map);\n    this.key = this.$map.data('api-key');\n\n    if (typeof this.key === 'undefined') {\n      return;\n    }\n\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') {\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  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 = _.assignIn({}, Map.prototype, {\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              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            //eslint-disable-next-line no-unused-vars\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    onUnload: function() {\n      if (this.$map.length === 0) {\n        return;\n      }\n      google.maps.event.clearListeners(this.map, 'resize');\n    }\n  });\n\n  return Map;\n})();\n\n/* eslint-disable no-new */\ntheme.Product = (function() {\n  function Product(container) {\n    var $container = (this.$container = $(container));\n    var sectionId = $container.attr('data-section-id');\n    this.ajaxEnabled = $container.data('ajax-enabled');\n\n    this.settings = {\n      // Breakpoints from src/stylesheets/global/variables.scss.liquid\n      mediaQueryMediumUp: 'screen and (min-width: 750px)',\n      mediaQuerySmall: 'screen and (max-width: 749px)',\n      bpSmall: false,\n      enableHistoryState: $container.data('enable-history-state') || false,\n      namespace: '.slideshow-' + sectionId,\n      sectionId: sectionId,\n      sliderActive: false,\n      zoomEnabled: false\n    };\n\n    this.selectors = {\n      addToCart: '[data-add-to-cart]',\n      addToCartText: '[data-add-to-cart-text]',\n      cartCount: '[data-cart-count]',\n      cartCountBubble: '[data-cart-count-bubble]',\n      cartPopup: '[data-cart-popup]',\n      cartPopupCartQuantity: '[data-cart-popup-cart-quantity]',\n      cartPopupClose: '[data-cart-popup-close]',\n      cartPopupDismiss: '[data-cart-popup-dismiss]',\n      cartPopupImage: '[data-cart-popup-image]',\n      cartPopupImageWrapper: '[data-cart-popup-image-wrapper]',\n      cartPopupImagePlaceholder: '[data-cart-popup-image-placeholder]',\n      cartPopupPlaceholderSize: '[data-placeholder-size]',\n      cartPopupProductDetails: '[data-cart-popup-product-details]',\n      cartPopupQuantity: '[data-cart-popup-quantity]',\n      cartPopupQuantityLabel: '[data-cart-popup-quantity-label]',\n      cartPopupTitle: '[data-cart-popup-title]',\n      cartPopupWrapper: '[data-cart-popup-wrapper]',\n      loader: '[data-loader]',\n      loaderStatus: '[data-loader-status]',\n      quantity: '[data-quantity-input]',\n      SKU: '.variant-sku',\n      productStatus: '[data-product-status]',\n      originalSelectorId: '#ProductSelect-' + sectionId,\n      productForm: '[data-product-form]',\n      errorMessage: '[data-error-message]',\n      errorMessageWrapper: '[data-error-message-wrapper]',\n      imageZoomWrapper: '[data-image-zoom-wrapper]',\n      productMediaWrapper: '[data-product-single-media-wrapper]',\n      productThumbImages: '.product-single__thumbnail--' + sectionId,\n      productThumbs: '.product-single__thumbnails-' + sectionId,\n      productThumbListItem: '.product-single__thumbnails-item',\n      productThumbsWrapper: '.thumbnails-wrapper',\n      saleLabel: '.product-price__sale-label-' + sectionId,\n      singleOptionSelector: '.single-option-selector-' + sectionId,\n      shopifyPaymentButton: '.shopify-payment-button',\n      productMediaTypeVideo: '[data-product-media-type-video]',\n      productMediaTypeModel: '[data-product-media-type-model]',\n      priceContainer: '[data-price]',\n      regularPrice: '[data-regular-price]',\n      salePrice: '[data-sale-price]',\n      unitPrice: '[data-unit-price]',\n      unitPriceBaseUnit: '[data-unit-price-base-unit]',\n      productPolicies: '[data-product-policies]'\n    };\n\n    this.classes = {\n      cartPopupWrapperHidden: 'cart-popup-wrapper--hidden',\n      hidden: 'hide',\n      visibilityHidden: 'visibility-hidden',\n      inputError: 'input--error',\n      jsZoomEnabled: 'js-zoom-enabled',\n      productOnSale: 'price--on-sale',\n      productUnitAvailable: 'price--unit-available',\n      productUnavailable: 'price--unavailable',\n      productSoldOut: 'price--sold-out',\n      cartImage: 'cart-popup-item__image',\n      productFormErrorMessageWrapperHidden:\n        'product-form__error-message-wrapper--hidden',\n      activeClass: 'active-thumb',\n      variantSoldOut: 'product-form--variant-sold-out'\n    };\n\n    this.$quantityInput = $(this.selectors.quantity, $container);\n    this.$errorMessageWrapper = $(\n      this.selectors.errorMessageWrapper,\n      $container\n    );\n    this.$addToCart = $(this.selectors.addToCart, $container);\n    this.$addToCartText = $(this.selectors.addToCartText, this.$addToCart);\n    this.$shopifyPaymentButton = $(\n      this.selectors.shopifyPaymentButton,\n      $container\n    );\n    this.$productPolicies = $(this.selectors.productPolicies, $container);\n\n    this.$loader = $(this.selectors.loader, this.$addToCart);\n    this.$loaderStatus = $(this.selectors.loaderStatus, $container);\n\n    // Stop parsing if we don't have the product json script tag when loading\n    // section in the Theme Editor\n    if (!$('#ProductJson-' + sectionId).html()) {\n      return;\n    }\n\n    this.productSingleObject = JSON.parse(\n      document.getElementById('ProductJson-' + sectionId).innerHTML\n    );\n\n    this.settings.zoomEnabled = $(this.selectors.imageZoomWrapper).hasClass(\n      this.classes.jsZoomEnabled\n    );\n\n    this._initBreakpoints();\n    this._stringOverrides();\n    this._initVariants();\n    this._initMediaSwitch();\n    this._initAddToCart();\n    this._setActiveThumbnail();\n    this._initProductVideo();\n    this._initModelViewerLibraries();\n    this._initShopifyXrLaunch();\n  }\n\n  Product.prototype = _.assignIn({}, Product.prototype, {\n    _stringOverrides: function() {\n      theme.productStrings = theme.productStrings || {};\n      $.extend(theme.strings, theme.productStrings);\n    },\n\n    _initBreakpoints: function() {\n      var self = this;\n\n      enquire.register(this.settings.mediaQuerySmall, {\n        match: function() {\n          // initialize thumbnail slider on mobile if more than four thumbnails\n          if ($(self.selectors.productThumbImages).length > 4) {\n            self._initThumbnailSlider();\n          }\n\n          // destroy image zooming if enabled\n          if (self.settings.zoomEnabled) {\n            $(self.selectors.imageZoomWrapper).each(function() {\n              _destroyZoom(this);\n            });\n          }\n\n          self.settings.bpSmall = true;\n        },\n        unmatch: function() {\n          if (self.settings.sliderActive) {\n            self._destroyThumbnailSlider();\n          }\n\n          self.settings.bpSmall = false;\n        }\n      });\n\n      enquire.register(this.settings.mediaQueryMediumUp, {\n        match: function() {\n          if (self.settings.zoomEnabled) {\n            $(self.selectors.imageZoomWrapper).each(function() {\n              _enableZoom(this);\n            });\n          }\n        }\n      });\n    },\n\n    _initVariants: function() {\n      var options = {\n        $container: this.$container,\n        enableHistoryState:\n          this.$container.data('enable-history-state') || false,\n        singleOptionSelector: this.selectors.singleOptionSelector,\n        originalSelectorId: this.selectors.originalSelectorId,\n        product: this.productSingleObject\n      };\n\n      this.variants = new slate.Variants(options);\n\n      this.$container.on(\n        'variantChange' + this.settings.namespace,\n        this._updateAvailability.bind(this)\n      );\n      this.$container.on(\n        'variantImageChange' + this.settings.namespace,\n        this._updateMedia.bind(this)\n      );\n      this.$container.on(\n        'variantPriceChange' + this.settings.namespace,\n        this._updatePrice.bind(this)\n      );\n      this.$container.on(\n        'variantSKUChange' + this.settings.namespace,\n        this._updateSKU.bind(this)\n      );\n    },\n\n    _initMediaSwitch: function() {\n      if (!$(this.selectors.productThumbImages).length) {\n        return;\n      }\n\n      var self = this;\n\n      $(this.selectors.productThumbImages)\n        .on('click', function(evt) {\n          evt.preventDefault();\n          var $el = $(this);\n\n          var mediaId = $el.data('thumbnail-id');\n\n          self._switchMedia(mediaId);\n          self._setActiveThumbnail(mediaId);\n        })\n        .on('keyup', self._handleMediaFocus.bind(self));\n    },\n\n    _initAddToCart: function() {\n      $(this.selectors.productForm, this.$container).on(\n        'submit',\n        function(evt) {\n          if (this.$addToCart.is('[aria-disabled]')) {\n            evt.preventDefault();\n            return;\n          }\n\n          if (!this.ajaxEnabled) return;\n\n          evt.preventDefault();\n\n          this.$previouslyFocusedElement = $(':focus');\n\n          var isInvalidQuantity = this.$quantityInput.val() <= 0;\n\n          if (isInvalidQuantity) {\n            this._showErrorMessage(theme.strings.quantityMinimumMessage);\n            return;\n          }\n\n          if (!isInvalidQuantity && this.ajaxEnabled) {\n            // disable the addToCart and dynamic checkout button while\n            // request/cart popup is loading and handle loading state\n            this._handleButtonLoadingState(true);\n            var $data = $(this.selectors.productForm, this.$container);\n            this._addItemToCart($data);\n            return;\n          }\n        }.bind(this)\n      );\n    },\n\n    _initProductVideo: function() {\n      var sectionId = this.settings.sectionId;\n\n      $(this.selectors.productMediaTypeVideo, this.$container).each(function() {\n        var $el = $(this);\n        theme.ProductVideo.init($el, sectionId);\n      });\n    },\n\n    _initModelViewerLibraries: function() {\n      var $modelViewerElements = $(\n        this.selectors.productMediaTypeModel,\n        this.$container\n      );\n      if ($modelViewerElements.length < 1) return;\n      theme.ProductModel.init($modelViewerElements, this.settings.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            self.classes.hidden +\n            ')',\n          self.$container\n        );\n        $currentMedia.trigger('xrLaunch');\n      });\n    },\n\n    _addItemToCart: function(data) {\n      var params = {\n        url: '/cart/add.js',\n        data: $(data).serialize(),\n        dataType: 'json'\n      };\n\n      $.post(params)\n        .done(\n          function(item) {\n            this._hideErrorMessage();\n            this._setupCartPopup(item);\n          }.bind(this)\n        )\n        .fail(\n          function(response) {\n            this.$previouslyFocusedElement.focus();\n            var errorMessage = response.responseJSON\n              ? response.responseJSON.description\n              : theme.strings.cartError;\n            this._showErrorMessage(errorMessage);\n            this._handleButtonLoadingState(false);\n          }.bind(this)\n        );\n    },\n\n    _handleButtonLoadingState: function(isLoading) {\n      if (isLoading) {\n        this.$addToCart.attr('aria-disabled', true);\n        this.$addToCartText.addClass(this.classes.hidden);\n        this.$loader.removeClass(this.classes.hidden);\n        this.$shopifyPaymentButton.attr('disabled', true);\n        this.$loaderStatus.attr('aria-hidden', false);\n      } else {\n        this.$addToCart.removeAttr('aria-disabled');\n        this.$addToCartText.removeClass(this.classes.hidden);\n        this.$loader.addClass(this.classes.hidden);\n        this.$shopifyPaymentButton.removeAttr('disabled');\n        this.$loaderStatus.attr('aria-hidden', true);\n      }\n    },\n\n    _showErrorMessage: function(errorMessage) {\n      $(this.selectors.errorMessage, this.$container).html(errorMessage);\n\n      if (this.$quantityInput.length !== 0) {\n        this.$quantityInput.addClass(this.classes.inputError);\n      }\n\n      this.$errorMessageWrapper\n        .removeClass(this.classes.productFormErrorMessageWrapperHidden)\n        .attr('aria-hidden', true)\n        .removeAttr('aria-hidden');\n    },\n\n    _hideErrorMessage: function() {\n      this.$errorMessageWrapper.addClass(\n        this.classes.productFormErrorMessageWrapperHidden\n      );\n\n      if (this.$quantityInput.length !== 0) {\n        this.$quantityInput.removeClass(this.classes.inputError);\n      }\n    },\n\n    _setupCartPopup: function(item) {\n      this.$cartPopup = this.$cartPopup || $(this.selectors.cartPopup);\n      this.$cartPopupWrapper =\n        this.$cartPopupWrapper || $(this.selectors.cartPopupWrapper);\n      this.$cartPopupTitle =\n        this.$cartPopupTitle || $(this.selectors.cartPopupTitle);\n      this.$cartPopupQuantity =\n        this.$cartPopupQuantity || $(this.selectors.cartPopupQuantity);\n      this.$cartPopupQuantityLabel =\n        this.$cartPopupQuantityLabel ||\n        $(this.selectors.cartPopupQuantityLabel);\n      this.$cartPopupClose =\n        this.$cartPopupClose || $(this.selectors.cartPopupClose);\n      this.$cartPopupDismiss =\n        this.$cartPopupDismiss || $(this.selectors.cartPopupDismiss);\n      this.$cartPopupImagePlaceholder =\n        this.$cartPopupImagePlaceholder ||\n        $(this.selectors.cartPopupImagePlaceholder);\n\n      this._setupCartPopupEventListeners();\n\n      this._updateCartPopupContent(item);\n    },\n\n    _updateCartPopupContent: function(item) {\n      var quantity = this.$quantityInput.length ? this.$quantityInput.val() : 1;\n\n      this.$cartPopupTitle.text(item.product_title);\n      this.$cartPopupQuantity.text(quantity);\n      this.$cartPopupQuantityLabel.text(\n        theme.strings.quantityLabel.replace('[count]', quantity)\n      );\n\n      this._setCartPopupPlaceholder(\n        item.featured_image.url,\n        item.featured_image.aspect_ratio\n      );\n      this._setCartPopupImage(item.featured_image.url, item.featured_image.alt);\n      this._setCartPopupProductDetails(\n        item.product_has_only_default_variant,\n        item.options_with_values,\n        item.properties\n      );\n\n      $.getJSON('/cart.js').then(\n        function(cart) {\n          this._setCartQuantity(cart.item_count);\n          this._setCartCountBubble(cart.item_count);\n          this._showCartPopup();\n        }.bind(this)\n      );\n    },\n\n    _setupCartPopupEventListeners: function() {\n      this.$cartPopupWrapper.on(\n        'keyup',\n        function(event) {\n          if (event.keyCode === slate.utils.keyboardKeys.ESCAPE) {\n            this._hideCartPopup(event);\n          }\n        }.bind(this)\n      );\n\n      this.$cartPopupClose.on('click', this._hideCartPopup.bind(this));\n      this.$cartPopupDismiss.on('click', this._hideCartPopup.bind(this));\n      $('body').on('click', this._onBodyClick.bind(this));\n    },\n\n    _setCartPopupPlaceholder: function(imageUrl, imageAspectRatio) {\n      this.$cartPopupImageWrapper =\n        this.$cartPopupImageWrapper || $(this.selectors.cartPopupImageWrapper);\n\n      if (imageUrl === null) {\n        this.$cartPopupImageWrapper.addClass(this.classes.hidden);\n        return;\n      }\n\n      var $placeholder = $(this.selectors.cartPopupPlaceholderSize);\n      var maxWidth = 95 * imageAspectRatio;\n      var heightRatio = 100 / imageAspectRatio;\n\n      this.$cartPopupImagePlaceholder.css('max-width', maxWidth);\n\n      $placeholder.css('padding-top', heightRatio + '%');\n    },\n\n    _setCartPopupImage: function(imageUrl, imageAlt) {\n      if (imageUrl === null) return;\n\n      this.$cartPopupImageWrapper.removeClass(this.classes.hidden);\n      var sizedImageUrl = theme.Images.getSizedImageUrl(imageUrl, '200x');\n      var image = document.createElement('img');\n      image.src = sizedImageUrl;\n      image.alt = imageAlt;\n      image.classList.add(this.classes.cartImage);\n      image.dataset.cartPopupImage = '';\n\n      image.onload = function() {\n        this.$cartPopupImagePlaceholder.addClass(this.classes.hidden);\n        this.$cartPopupImageWrapper.append(image);\n      }.bind(this);\n    },\n\n    _setCartPopupProductDetails: function(\n      product_has_only_default_variant,\n      options,\n      properties\n    ) {\n      this.$cartPopupProductDetails =\n        this.$cartPopupProductDetails ||\n        $(this.selectors.cartPopupProductDetails);\n      var variantPropertiesHTML = '';\n\n      if (!product_has_only_default_variant) {\n        variantPropertiesHTML =\n          variantPropertiesHTML + this._getVariantOptionList(options);\n      }\n\n      if (properties !== null && Object.keys(properties).length !== 0) {\n        variantPropertiesHTML =\n          variantPropertiesHTML + this._getPropertyList(properties);\n      }\n\n      if (variantPropertiesHTML.length === 0) {\n        this.$cartPopupProductDetails.html('');\n        this.$cartPopupProductDetails.attr('hidden', '');\n      } else {\n        this.$cartPopupProductDetails.html(variantPropertiesHTML);\n        this.$cartPopupProductDetails.removeAttr('hidden');\n      }\n    },\n\n    _getVariantOptionList: function(variantOptions) {\n      var variantOptionListHTML = '';\n\n      variantOptions.forEach(function(variantOption) {\n        variantOptionListHTML =\n          variantOptionListHTML +\n          '<li class=\"product-details__item product-details__item--variant-option\">' +\n          variantOption.name +\n          ': ' +\n          variantOption.value +\n          '</li>';\n      });\n\n      return variantOptionListHTML;\n    },\n\n    _getPropertyList: function(properties) {\n      var propertyListHTML = '';\n      var propertiesArray = Object.entries(properties);\n\n      propertiesArray.forEach(function(property) {\n        // Line item properties prefixed with an underscore are not to be displayed\n        if (property[0].charAt(0) === '_') return;\n\n        // if the property value has a length of 0 (empty), don't display it\n        if (property[1].length === 0) return;\n\n        propertyListHTML =\n          propertyListHTML +\n          '<li class=\"product-details__item product-details__item--property\">' +\n          '<span class=\"product-details__property-label\">' +\n          property[0] +\n          ': </span>' +\n          property[1];\n        ': ' + '</li>';\n      });\n\n      return propertyListHTML;\n    },\n\n    _setCartQuantity: function(quantity) {\n      this.$cartPopupCartQuantity =\n        this.$cartPopupCartQuantity || $(this.selectors.cartPopupCartQuantity);\n      var ariaLabel;\n\n      if (quantity === 1) {\n        ariaLabel = theme.strings.oneCartCount;\n      } else if (quantity > 1) {\n        ariaLabel = theme.strings.otherCartCount.replace('[count]', quantity);\n      }\n\n      this.$cartPopupCartQuantity.text(quantity).attr('aria-label', ariaLabel);\n    },\n\n    _setCartCountBubble: function(quantity) {\n      this.$cartCountBubble =\n        this.$cartCountBubble || $(this.selectors.cartCountBubble);\n      this.$cartCount = this.$cartCount || $(this.selectors.cartCount);\n\n      this.$cartCountBubble.removeClass(this.classes.hidden);\n      this.$cartCount.text(quantity);\n    },\n\n    _showCartPopup: function() {\n      this.$cartPopupWrapper\n        .prepareTransition()\n        .removeClass(this.classes.cartPopupWrapperHidden);\n      this._handleButtonLoadingState(false);\n\n      slate.a11y.trapFocus({\n        $container: this.$cartPopupWrapper,\n        $elementToFocus: this.$cartPopup,\n        namespace: 'cartPopupFocus'\n      });\n    },\n\n    _hideCartPopup: function(event) {\n      var setFocus = event.detail === 0 ? true : false;\n      this.$cartPopupWrapper\n        .prepareTransition()\n        .addClass(this.classes.cartPopupWrapperHidden);\n\n      $(this.selectors.cartPopupImage).remove();\n      this.$cartPopupImagePlaceholder.removeClass(this.classes.hidden);\n\n      slate.a11y.removeTrapFocus({\n        $container: this.$cartPopupWrapper,\n        namespace: 'cartPopupFocus'\n      });\n\n      if (setFocus) this.$previouslyFocusedElement[0].focus();\n\n      this.$cartPopupWrapper.off('keyup');\n      this.$cartPopupClose.off('click');\n      this.$cartPopupDismiss.off('click');\n      $('body').off('click');\n    },\n\n    _onBodyClick: function(event) {\n      var $target = $(event.target);\n\n      if (\n        $target[0] !== this.$cartPopupWrapper[0] &&\n        !$target.parents(this.selectors.cartPopup).length\n      ) {\n        this._hideCartPopup(event);\n      }\n    },\n\n    _setActiveThumbnail: function(mediaId) {\n      // If there is no element passed, find it by the current product image\n      if (typeof mediaId === 'undefined') {\n        mediaId = $(\n          this.selectors.productMediaWrapper + ':not(.hide)',\n          this.$container\n        ).data('media-id');\n      }\n\n      var $thumbnailWrappers = $(\n        this.selectors.productThumbListItem + ':not(.slick-cloned)',\n        this.$container\n      );\n\n      var $activeThumbnail = $thumbnailWrappers.find(\n        this.selectors.productThumbImages +\n          \"[data-thumbnail-id='\" +\n          mediaId +\n          \"']\"\n      );\n\n      $(this.selectors.productThumbImages)\n        .removeClass(this.classes.activeClass)\n        .removeAttr('aria-current');\n\n      $activeThumbnail.addClass(this.classes.activeClass);\n      $activeThumbnail.attr('aria-current', true);\n\n      if (!$thumbnailWrappers.hasClass('slick-slide')) {\n        return;\n      }\n\n      var slideIndex = $activeThumbnail.parent().data('slick-index');\n\n      $(this.selectors.productThumbs).slick('slickGoTo', slideIndex, true);\n    },\n\n    _switchMedia: function(mediaId) {\n      var $currentMedia = $(\n        this.selectors.productMediaWrapper +\n          ':not(.' +\n          this.classes.hidden +\n          ')',\n        this.$container\n      );\n\n      var $newMedia = $(\n        this.selectors.productMediaWrapper +\n          \"[data-media-id='\" +\n          mediaId +\n          \"']\",\n        this.$container\n      );\n\n      var $otherMedia = $(\n        this.selectors.productMediaWrapper +\n          \":not([data-media-id='\" +\n          mediaId +\n          \"'])\",\n        this.$container\n      );\n\n      $currentMedia.trigger('mediaHidden');\n      $newMedia.removeClass(this.classes.hidden).trigger('mediaVisible');\n      $otherMedia.addClass(this.classes.hidden);\n    },\n\n    _handleMediaFocus: function(evt) {\n      if (evt.keyCode !== slate.utils.keyboardKeys.ENTER) return;\n\n      var mediaId = $(evt.currentTarget).data('thumbnail-id');\n\n      $(\n        this.selectors.productMediaWrapper +\n          \"[data-media-id='\" +\n          mediaId +\n          \"']\",\n        this.$container\n      ).focus();\n    },\n\n    _initThumbnailSlider: function() {\n      var options = {\n        slidesToShow: 3,\n        slidesToScroll: 2,\n        infinite: false,\n        prevArrow: '.thumbnails-slider__prev--' + this.settings.sectionId,\n        nextArrow: '.thumbnails-slider__next--' + this.settings.sectionId\n      };\n\n      $(this.selectors.productThumbs).slick(options);\n\n      // Accessibility concerns not yet fixed in Slick Slider\n      $(this.selectors.productThumbsWrapper, this.$container)\n        .find('.slick-list')\n        .removeAttr('aria-live');\n      $(this.selectors.productThumbsWrapper, this.$container)\n        .find('.slick-disabled')\n        .removeAttr('aria-disabled');\n\n      this.settings.sliderActive = true;\n    },\n\n    _destroyThumbnailSlider: function() {\n      $(this.selectors.productThumbs).slick('unslick');\n      this.settings.sliderActive = false;\n\n      // Accessibility concerns not yet fixed in Slick Slider\n      $(this.selectors.productThumbsWrapper, this.$container)\n        .find('[tabindex=\"-1\"]')\n        .removeAttr('tabindex');\n    },\n\n    _liveRegionText: function(variant) {\n      // Dummy content for live region\n      var liveRegionText =\n        '[Availability] [Regular] [$$] [Sale] [$]. [UnitPrice] [$$$]';\n\n      if (!variant) {\n        liveRegionText = theme.strings.unavailable;\n        return liveRegionText;\n      }\n\n      // Update availability\n      var availability = variant.available ? '' : theme.strings.soldOut + ',';\n      liveRegionText = liveRegionText.replace('[Availability]', availability);\n\n      // Update pricing information\n      var regularLabel = '';\n      var regularPrice = theme.Currency.formatMoney(\n        variant.price,\n        theme.moneyFormat\n      );\n      var saleLabel = '';\n      var salePrice = '';\n      var unitLabel = '';\n      var unitPrice = '';\n\n      if (variant.compare_at_price > variant.price) {\n        regularLabel = theme.strings.regularPrice;\n        regularPrice =\n          theme.Currency.formatMoney(\n            variant.compare_at_price,\n            theme.moneyFormat\n          ) + ',';\n        saleLabel = theme.strings.sale;\n        salePrice = theme.Currency.formatMoney(\n          variant.price,\n          theme.moneyFormat\n        );\n      }\n\n      if (variant.unit_price) {\n        unitLabel = theme.strings.unitPrice;\n        unitPrice =\n          theme.Currency.formatMoney(variant.unit_price, theme.moneyFormat) +\n          ' ' +\n          theme.strings.unitPriceSeparator +\n          ' ' +\n          this._getBaseUnit(variant);\n      }\n\n      liveRegionText = liveRegionText\n        .replace('[Regular]', regularLabel)\n        .replace('[$$]', regularPrice)\n        .replace('[Sale]', saleLabel)\n        .replace('[$]', salePrice)\n        .replace('[UnitPrice]', unitLabel)\n        .replace('[$$$]', unitPrice)\n        .trim();\n\n      return liveRegionText;\n    },\n\n    _updateLiveRegion: function(evt) {\n      var variant = evt.variant;\n      var liveRegion = this.container.querySelector(\n        this.selectors.productStatus\n      );\n      liveRegion.innerHTML = this._liveRegionText(variant);\n      liveRegion.setAttribute('aria-hidden', false);\n\n      // hide content from accessibility tree after announcement\n      setTimeout(function() {\n        liveRegion.setAttribute('aria-hidden', true);\n      }, 1000);\n    },\n\n    _updateAddToCart: function(evt) {\n      var variant = evt.variant;\n\n      if (variant) {\n        if (variant.available) {\n          this.$addToCart\n            .removeAttr('aria-disabled')\n            .attr('aria-label', theme.strings.addToCart);\n          $(this.selectors.addToCartText, this.$container).text(\n            theme.strings.addToCart\n          );\n          $(this.selectors.productForm, this.container).removeClass(\n            this.classes.variantSoldOut\n          );\n        } else {\n          // Variant is sold out, disable submit button and change the text.\n          this.$addToCart\n            .attr('aria-disabled', true)\n            .attr('aria-label', theme.strings.soldOut);\n          $(this.selectors.addToCartText, this.$container).text(\n            theme.strings.soldOut\n          );\n          $(this.selectors.productForm, this.container).addClass(\n            this.classes.variantSoldOut\n          );\n        }\n      } else {\n        // The variant doesn't exist, disable submit button and change the text.\n        this.$addToCart\n          .attr('aria-disabled', true)\n          .attr('aria-label', theme.strings.unavailable);\n        $(this.selectors.addToCartText, this.$container).text(\n          theme.strings.unavailable\n        );\n        $(this.selectors.productForm, this.container).addClass(\n          this.classes.variantSoldOut\n        );\n      }\n    },\n\n    _updateAvailability: function(evt) {\n      // remove error message if one is showing\n      this._hideErrorMessage();\n\n      // update form submit\n      this._updateAddToCart(evt);\n      // update live region\n      this._updateLiveRegion(evt);\n\n      this._updatePrice(evt);\n    },\n\n    _updateMedia: function(evt) {\n      var variant = evt.variant;\n      var mediaId = variant.featured_media.id;\n      var sectionMediaId = this.settings.sectionId + '-' + mediaId;\n\n      this._switchMedia(sectionMediaId);\n      this._setActiveThumbnail(sectionMediaId);\n    },\n\n    _updatePrice: function(evt) {\n      var variant = evt.variant;\n\n      var $priceContainer = $(this.selectors.priceContainer, this.$container);\n      var $regularPrice = $(this.selectors.regularPrice, $priceContainer);\n      var $salePrice = $(this.selectors.salePrice, $priceContainer);\n      var $unitPrice = $(this.selectors.unitPrice, $priceContainer);\n      var $unitPriceBaseUnit = $(\n        this.selectors.unitPriceBaseUnit,\n        $priceContainer\n      );\n\n      // Reset product price state\n      $priceContainer\n        .removeClass(this.classes.productUnavailable)\n        .removeClass(this.classes.productOnSale)\n        .removeClass(this.classes.productUnitAvailable)\n        .removeClass(this.classes.productSoldOut)\n        .removeAttr('aria-hidden');\n\n      this.$productPolicies.removeClass(this.classes.visibilityHidden);\n\n      // Unavailable\n      if (!variant) {\n        $priceContainer\n          .addClass(this.classes.productUnavailable)\n          .attr('aria-hidden', true);\n\n        this.$productPolicies.addClass(this.classes.visibilityHidden);\n        return;\n      }\n\n      // Sold out\n      if (!variant.available) {\n        $priceContainer.addClass(this.classes.productSoldOut);\n      }\n\n      // On sale\n      if (variant.compare_at_price > variant.price) {\n        $regularPrice.html(\n          theme.Currency.formatMoney(\n            variant.compare_at_price,\n            theme.moneyFormat\n          )\n        );\n        $salePrice.html(\n          theme.Currency.formatMoney(variant.price, theme.moneyFormat)\n        );\n        $priceContainer.addClass(this.classes.productOnSale);\n      } else {\n        // Regular price\n        $regularPrice.html(\n          theme.Currency.formatMoney(variant.price, theme.moneyFormat)\n        );\n      }\n\n      // Unit price\n      if (variant.unit_price) {\n        $unitPrice.html(\n          theme.Currency.formatMoney(variant.unit_price, theme.moneyFormat)\n        );\n        $unitPriceBaseUnit.html(this._getBaseUnit(variant));\n        $priceContainer.addClass(this.classes.productUnitAvailable);\n      }\n    },\n\n    _getBaseUnit: function(variant) {\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    _updateSKU: function(evt) {\n      var variant = evt.variant;\n\n      // Update the sku\n      $(this.selectors.SKU).html(variant.sku);\n    },\n\n    onUnload: function() {\n      this.$container.off(this.settings.namespace);\n      theme.ProductVideo.removeSectionVideos(this.settings.sectionId);\n      theme.ProductModel.removeSectionModels(this.settings.sectionId);\n    }\n  });\n\n  function _enableZoom(el) {\n    var zoomUrl = $(el).data('zoom');\n    $(el).zoom({\n      url: zoomUrl\n    });\n  }\n\n  function _destroyZoom(el) {\n    $(el).trigger('zoom.destroy');\n  }\n\n  return Product;\n})();\n\ntheme.ProductRecommendations = (function() {\n  function ProductRecommendations(container) {\n    this.$container = $(container);\n\n    var baseUrl = this.$container.data('baseUrl');\n    var productId = this.$container.data('productId');\n    var recommendationsSectionUrl =\n      baseUrl +\n      '?section_id=product-recommendations&product_id=' +\n      productId +\n      '&limit=4';\n\n    $.get(recommendationsSectionUrl).then(\n      function(section) {\n        var recommendationsMarkup = $(section).html();\n        if (recommendationsMarkup.trim() !== '') {\n          this.$container.html(recommendationsMarkup);\n        }\n      }.bind(this)\n    );\n  }\n\n  return ProductRecommendations;\n})();\n\ntheme.Quotes = (function() {\n  var config = {\n    mediaQuerySmall: 'screen and (max-width: 749px)',\n    mediaQueryMediumUp: 'screen and (min-width: 750px)',\n    slideCount: 0\n  };\n  var defaults = {\n    accessibility: true,\n    arrows: false,\n    dots: true,\n    autoplay: false,\n    touchThreshold: 20,\n    slidesToShow: 3,\n    slidesToScroll: 3\n  };\n\n  function Quotes(container) {\n    var $container = (this.$container = $(container));\n    var sectionId = $container.attr('data-section-id');\n    var wrapper = (this.wrapper = '.quotes-wrapper');\n    var slider = (this.slider = '#Quotes-' + sectionId);\n    var $slider = $(slider, wrapper);\n\n    var sliderActive = false;\n    var mobileOptions = $.extend({}, defaults, {\n      slidesToShow: 1,\n      slidesToScroll: 1,\n      adaptiveHeight: true\n    });\n\n    config.slideCount = $slider.data('count');\n\n    // Override slidesToShow/Scroll if there are not enough blocks\n    if (config.slideCount < defaults.slidesToShow) {\n      defaults.slidesToShow = config.slideCount;\n      defaults.slidesToScroll = config.slideCount;\n    }\n\n    $slider.on('init', this.a11y.bind(this));\n\n    enquire.register(config.mediaQuerySmall, {\n      match: function() {\n        initSlider($slider, mobileOptions);\n      }\n    });\n\n    enquire.register(config.mediaQueryMediumUp, {\n      match: function() {\n        initSlider($slider, defaults);\n      }\n    });\n\n    function initSlider(sliderObj, args) {\n      if (sliderActive) {\n        sliderObj.slick('unslick');\n        sliderActive = false;\n      }\n\n      sliderObj.slick(args);\n      sliderActive = true;\n    }\n  }\n\n  Quotes.prototype = _.assignIn({}, Quotes.prototype, {\n    onUnload: function() {\n      enquire.unregister(config.mediaQuerySmall);\n      enquire.unregister(config.mediaQueryMediumUp);\n\n      $(this.slider, this.wrapper).slick('unslick');\n    },\n\n    onBlockSelect: function(evt) {\n      // Ignore the cloned version\n      var $slide = $(\n        '.quotes-slide--' + evt.detail.blockId + ':not(.slick-cloned)'\n      );\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    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 Quotes;\n})();\n\ntheme.slideshows = {};\n\ntheme.SlideshowSection = (function() {\n  function SlideshowSection(container) {\n    var $container = (this.$container = $(container));\n    var sectionId = $container.attr('data-section-id');\n    var slideshow = (this.slideshow = '#Slideshow-' + sectionId);\n\n    theme.slideshows[slideshow] = new theme.Slideshow(slideshow, sectionId);\n  }\n\n  return SlideshowSection;\n})();\n\ntheme.SlideshowSection.prototype = _.assignIn(\n  {},\n  theme.SlideshowSection.prototype,\n  {\n    onUnload: function() {\n      delete theme.slideshows[this.slideshow];\n    },\n\n    onBlockSelect: function(evt) {\n      var $slideshow = $(this.slideshow);\n      var adaptHeight = $slideshow.data('adapt-height');\n\n      if (adaptHeight) {\n        theme.slideshows[this.slideshow].setSlideshowHeight();\n      }\n\n      // Ignore the cloned version\n      var $slide = $(\n        '.slideshow__slide--' + evt.detail.blockId + ':not(.slick-cloned)'\n      );\n      var slideIndex = $slide.data('slick-index');\n\n      // Go to selected slide, pause auto-rotate\n      $slideshow.slick('slickGoTo', slideIndex).slick('slickPause');\n    },\n\n    onBlockDeselect: function() {\n      // Resume auto-rotate\n      $(this.slideshow).slick('slickPlay');\n    }\n  }\n);\n\ntheme.slideshows = {};\n\ntheme.VideoSection = (function() {\n  function VideoSection(container) {\n    var $container = (this.$container = $(container));\n\n    $('.video', $container).each(function() {\n      var $el = $(this);\n      theme.Video.init($el);\n      theme.Video.editorLoadVideo($el.attr('id'));\n    });\n  }\n\n  return VideoSection;\n})();\n\ntheme.VideoSection.prototype = _.assignIn({}, theme.VideoSection.prototype, {\n  onUnload: function() {\n    theme.Video.removeEvents();\n  }\n});\n\ntheme.heros = {};\n\ntheme.HeroSection = (function() {\n  function HeroSection(container) {\n    var $container = (this.$container = $(container));\n    var sectionId = $container.attr('data-section-id');\n    var hero = '#Hero-' + sectionId;\n    theme.heros[hero] = new theme.Hero(hero, sectionId);\n  }\n\n  return HeroSection;\n})();\n\nwindow.theme = window.theme || {};\n\nvar selectors = {\n  disclosureLocale: '[data-disclosure-locale]',\n  disclosureCurrency: '[data-disclosure-currency]'\n};\n\ntheme.FooterSection = (function() {\n  function Footer(container) {\n    this.$container = $(container);\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 = _.assignIn({}, 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\n$(document).ready(function() {\n  var sections = new theme.Sections();\n\n  sections.register('cart-template', theme.Cart);\n  sections.register('product', theme.Product);\n  sections.register('collection-template', theme.Filters);\n  sections.register('product-template', theme.Product);\n  sections.register('header-section', theme.HeaderSection);\n  sections.register('map', theme.Maps);\n  sections.register('slideshow-section', theme.SlideshowSection);\n  sections.register('video-section', theme.VideoSection);\n  sections.register('quotes', theme.Quotes);\n  sections.register('hero-section', theme.HeroSection);\n  sections.register('product-recommendations', theme.ProductRecommendations);\n  sections.register('footer-section', theme.FooterSection);\n});\n\ntheme.init = function() {\n  theme.customerTemplates.init();\n\n  // Theme-specific selectors to make tables scrollable\n  var tableSelectors = '.rte table,' + '.custom__item-inner--html table';\n\n  slate.rte.wrapTable({\n    $tables: $(tableSelectors),\n    tableWrapperClass: 'scrollable-wrapper'\n  });\n\n  // Theme-specific selectors to make iframes responsive\n  var iframeSelectors =\n    '.rte iframe[src*=\"youtube.com/embed\"],' +\n    '.rte iframe[src*=\"player.vimeo\"],' +\n    '.custom__item-inner--html iframe[src*=\"youtube.com/embed\"],' +\n    '.custom__item-inner--html iframe[src*=\"player.vimeo\"]';\n\n  slate.rte.wrapIframe({\n    $iframes: $(iframeSelectors),\n    iframeWrapperClass: 'video-wrapper'\n  });\n\n  // Common a11y fixes\n  slate.a11y.pageLinkFocus($(window.location.hash));\n\n  $('.in-page-link').on('click', function(evt) {\n    slate.a11y.pageLinkFocus($(evt.currentTarget.hash));\n  });\n\n  $('a[href=\"#\"]').on('click', function(evt) {\n    evt.preventDefault();\n  });\n\n  slate.a11y.accessibleLinks({\n    messages: {\n      newWindow: theme.strings.newWindow,\n      external: theme.strings.external,\n      newWindowExternal: theme.strings.newWindowExternal\n    },\n    $links: $('a[href]:not([aria-describedby], .product-single__thumbnail)')\n  });\n\n  theme.FormStatus.init();\n\n  var selectors = {\n    image: '[data-image]',\n    imagePlaceholder: '[data-image-placeholder]',\n    imageWithPlaceholderWrapper: '[data-image-with-placeholder-wrapper]',\n    lazyloaded: '.lazyloaded'\n  };\n\n  var classes = {\n    hidden: 'hide'\n  };\n\n  $(document).on('lazyloaded', function(e) {\n    var $target = $(e.target);\n\n    if ($target.data('bgset')) {\n      var $image = $target.find(selectors.lazyloaded);\n      if ($image.length) {\n        var alt = $target.data('alt');\n        var src = $image.data('src') ? $image.data('src') : $target.data('bg');\n\n        $image.attr('alt', alt ? alt : '');\n        $image.attr('src', src ? src : '');\n      }\n    }\n\n    if (!$target.is(selectors.image)) {\n      return;\n    }\n\n    $target\n      .closest(selectors.imageWithPlaceholderWrapper)\n      .find(selectors.imagePlaceholder)\n      .addClass(classes.hidden);\n  });\n\n  // When the theme loads, lazysizes might load images before the \"lazyloaded\"\n  // event listener has been attached. When this happens, the following function\n  // hides the loading placeholders.\n  function onLoadHideLazysizesAnimation() {\n    $(selectors.image + '.lazyloaded')\n      .closest(selectors.imageWithPlaceholderWrapper)\n      .find(selectors.imagePlaceholder)\n      .addClass(classes.hidden);\n  }\n\n  onLoadHideLazysizesAnimation();\n  $(document).one('touchstart', function() {\n    theme.Helpers.setTouch();\n  });\n};\n\n// Youtube API callback\n// eslint-disable-next-line no-unused-vars\nfunction onYouTubeIframeAPIReady() {\n  theme.Video.loadVideos();\n  theme.ProductVideo.loadVideos(theme.ProductVideo.hosts.youtube);\n}\n\n$(theme.init);\n"],
  "mappings": "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",
  "names": ["instance", "evt", "status", "event", "selectors", "playerId", "self"]
}
