Your IP : 216.73.216.158


Current Path : /home/megadansyp/www/media/com_eventgallery/dist/
Upload File :
Current File : /home/megadansyp/www/media/com_eventgallery/dist/eventgallery.js.map

{"version":3,"file":"eventgallery.js","mappings":"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","sources":["webpack://eventgallery/./common/js/Helpers.js","webpack://eventgallery/./frontend/js/glide_modules/anchor.js","webpack://eventgallery/./node_modules/@glidejs/glide/dist/glide.modular.esm.js","webpack://eventgallery/./frontend/js/slider/SliderTransformator.js","webpack://eventgallery/./frontend/js/utils/camelCaseConverter.js","webpack://eventgallery/./frontend/js/slider/SliderOptions.js","webpack://eventgallery/./frontend/js/utils/ElementSize.js","webpack://eventgallery/./frontend/js/EventgalleryLazyload.js","webpack://eventgallery/./frontend/js/slider/SliderStarter.js","webpack://eventgallery/./frontend/js/EventgalleryImage.js","webpack://eventgallery/./frontend/js/EventgalleryRow.js","webpack://eventgallery/./frontend/js/EventgalleryImageList.js","webpack://eventgallery/./frontend/js/EventgalleryEventsList.js","webpack://eventgallery/./frontend/js/EventgalleryEventsTiles.js","webpack://eventgallery/./frontend/js/EventgallerySquareList.js","webpack://eventgallery/./frontend/js/EventgalleryTilesCollection.js","webpack://eventgallery/./frontend/js/URLHelper.js","webpack://eventgallery/./frontend/js/EventgalleryGooglePhotosProcessor.js","webpack://eventgallery/./frontend/js/EventgalleryBehavior.js","webpack://eventgallery/./frontend/js/EventgallerySizeCalculator.js","webpack://eventgallery/./frontend/js/Overlay.js","webpack://eventgallery/./frontend/js/touch/Touch.ts","webpack://eventgallery/./frontend/js/jsgallery/EventgalleryJSGallery2.js","webpack://eventgallery/./frontend/js/jsgallery/index.js","webpack://eventgallery/./node_modules/photoswipe/dist/photoswipe.esm.js","webpack://eventgallery/./frontend/js/SlideShow.js","webpack://eventgallery/./frontend/js/photoswipe/SlideGenerator.js","webpack://eventgallery/./frontend/js/photoswipe/HistoryHandler.js","webpack://eventgallery/./frontend/js/photoswipe/PhotoSwipeGallery.js","webpack://eventgallery/./frontend/js/photoswipe/UrlHandling.js","webpack://eventgallery/./frontend/js/photoswipe/PhotoSwipeGallerySlide.js","webpack://eventgallery/./frontend/js/utils/units.ts","webpack://eventgallery/./frontend/js/utils/eventshandler.js","webpack://eventgallery/./frontend/js/Polyfill.ts","webpack://eventgallery/./frontend/js/minicart/CartEvents.ts","webpack://eventgallery/./frontend/js/minicart/MiniCart.ts","webpack://eventgallery/./frontend/js/minicart/Add2CartDialogContent.ts","webpack://eventgallery/./frontend/js/minicart/Add2CartButtonHandler.ts","webpack://eventgallery/./frontend/js/minicart/CartConnectorButtonHandler.ts","webpack://eventgallery/./frontend/js/minicart/CartProcessor.ts","webpack://eventgallery/./frontend/js/minicart/index.ts","webpack://eventgallery/./frontend/js/socialbutton/socialbutton.ts","webpack://eventgallery/./frontend/js/socialbutton/index.ts","webpack://eventgallery/webpack/bootstrap","webpack://eventgallery/webpack/runtime/define property getters","webpack://eventgallery/webpack/runtime/hasOwnProperty shorthand","webpack://eventgallery/webpack/runtime/make namespace object","webpack://eventgallery/./eventgallery.js"],"sourcesContent":["function removeElement(array, elm) {\r\n    const index = array.indexOf(elm);\r\n    if (index > -1) {\r\n        array.splice(index, 1);\r\n    }\r\n}\r\n\r\nfunction mergeObjects(defaults, options) {\r\n    if (options === null || defaults === null) {\r\n        return defaults;\r\n    }\r\n\r\n    for (let key in options) {\r\n        defaults[key] = options[key];\r\n    }\r\n\r\n    return defaults;\r\n}\r\n\r\n/**\r\n * returns the width of an element.\r\n * @param el HTMLElement\r\n * @return {number}\r\n */\r\nfunction  getElementWidth(el) {\r\n    if (!el) return 0;\r\n    return parseFloat(getComputedStyle(el, null).width.replace(\"px\", \"\"));\r\n}\r\n\r\n/**\r\n * returns the height of an element.\r\n * @param el HTMLElement\r\n * @return {number}\r\n */\r\nfunction  getElementHeight(el) {\r\n    if (!el) return 0;\r\n    return parseFloat(getComputedStyle(el, null).height.replace(\"px\", \"\"));\r\n}\r\n\r\n/**\r\n * calculates the border of the given elements with the given properties\r\n */\r\nfunction calcBorderWidth(elements, properties) {\r\n    let sum = 0;\r\n\r\n    for (let i=0; i<elements.length; i++) {\r\n        let cSSStyleDeclaration = getComputedStyle(elements[i], null);\r\n        for (let j=0; j<properties.length; j++) {\r\n            let value = parseFloat( cSSStyleDeclaration[properties[j]] );\r\n            if (!isNaN(value)) {\r\n                sum += value;\r\n            }\r\n        }\r\n    }\r\n\r\n    return sum;\r\n}\r\n\r\nfunction addUrlHashParameter(initialUrl, key, value) {\r\n    let url = removeUrlHashParameter(initialUrl, key),\r\n        fragments = url.split('#'),\r\n        urlpart = fragments[0],\r\n        hashparts = fragments.length>1? fragments[1].split(\"&\") : [],\r\n        result;\r\n\r\n    hashparts.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(value));\r\n\r\n    if (hashparts.length>0) {\r\n        result = urlpart + '#' + hashparts.join('&');\r\n    } else {\r\n        result = urlpart;\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\nfunction getUrlHashParameterValue(url, key) {\r\n    let fragments=url.split('#'),\r\n        hashparts = fragments.length>1? fragments[1].split(\"&\") : [],\r\n        result;\r\n\r\n    if (hashparts.length>0)\r\n    {\r\n        let prefix= encodeURIComponent(key)+'=';\r\n\r\n        for (let i=0; i<hashparts.length; i++) {\r\n            if (hashparts[i].indexOf(prefix, 0) === 0) {\r\n                result = hashparts[i].replace(prefix, '');\r\n            }\r\n        }\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\nfunction removeUrlHashParameter(url, key) {\r\n    let fragments=url.split('#'),\r\n        urlpart= fragments[0],\r\n        hashparts = fragments.length>1? fragments[1].split(\"&\") : [],\r\n        result;\r\n\r\n    if (hashparts.length>0)\r\n    {\r\n        let prefix= encodeURIComponent(key)+'=',\r\n            newHashParts = [];\r\n\r\n        for (let i=0; i<hashparts.length; i++) {\r\n            if (hashparts[i].indexOf(prefix, 0) === 0) {\r\n\r\n            } else {\r\n                newHashParts.push(hashparts[i]);\r\n            }\r\n        }\r\n        hashparts = newHashParts;\r\n    }\r\n\r\n    if (hashparts.length>0) {\r\n        result = urlpart + '#' + hashparts.join('&');\r\n    } else {\r\n        result = urlpart;\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\nfunction addUrlParameter(initialUrl, key, value) {\r\n    let url = removeUrlParameter(initialUrl, key),\r\n        fragments = url.split('#'),\r\n        urlparts= fragments[0].split('?'),\r\n        result;\r\n\r\n    if (urlparts.length === 1) {\r\n        result = urlparts[0] + '?' + encodeURIComponent(key) + \"=\" + encodeURIComponent(value);\r\n    } else {\r\n        result = urlparts.join('?') + '&' + encodeURIComponent(key) + \"=\" + encodeURIComponent(value);\r\n    }\r\n\r\n    if (fragments.length>1) {\r\n        return result + '#' + fragments[1];\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\nfunction removeUrlParameter(url, key) {\r\n    let fragments=url.split('#'),\r\n        urlparts= fragments[0].split('?'),\r\n        result;\r\n\r\n    if (urlparts.length>1)\r\n    {\r\n        let prefix= encodeURIComponent(key)+'=';\r\n        let pars= urlparts[1].split('&');\r\n\r\n        for (let i=0; i<pars.length; i++) {\r\n            if (pars[i].indexOf(prefix, 0) === 0) {\r\n                pars.splice(i, 1);\r\n            }\r\n        }\r\n        if (pars.length > 0) {\r\n            result = urlparts[0] + '?' + pars.join('&');\r\n        }\r\n        else {\r\n            result = urlparts[0];\r\n        }\r\n    }\r\n    else {\r\n        result =  urlparts[0];\r\n    }\r\n\r\n    if (fragments.length>1) {\r\n        return result + '#' + fragments[1];\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\nfunction setCSSStyle (nodes, style, value) {\r\n    for (let i=0; i<nodes.length; i++) {\r\n        nodes[i].style[style] = value;\r\n    }\r\n}\r\n\r\nfunction getOuterHeight(el) {\r\n    let height = el.offsetHeight;\r\n    let style = getComputedStyle(el);\r\n\r\n    height += parseInt(style.marginTop) + parseInt(style.marginBottom);\r\n    return height;\r\n}\r\n\r\n/**\r\n *\r\n * @param node HTMLElement\r\n * @return HTMLElement[]\r\n */\r\nfunction getParents(node) {\r\n    let parents = [];\r\n\r\n    if (node === null) {\r\n        return parents;\r\n    }\r\n\r\n    while(node.parentElement != null) {\r\n        let parent = node.parentElement;\r\n        parents.push(parent);\r\n        node = parent;\r\n    }\r\n    return parents;\r\n}\r\n\r\n/**\r\n * Search the parent matching a selector and return it.\r\n *\r\n * @param node HTMLElement\r\n * @param query string\r\n */\r\nfunction getParent(node, query) {\r\n    let nodes = getParents(node);\r\n    for (let i = 0; i < nodes.length; i++) {\r\n        if (nodes[i].matches(query)) {\r\n            return nodes[i];\r\n        }\r\n    }\r\n    return null;\r\n}\r\n\r\n/**\r\n * set the content as innerHTML and executes the includes Script-Tags\r\n *\r\n * @param htmlElement HTMLElement\r\n * @param newContent string\r\n */\r\nfunction insertAndExecute(htmlElement, newContent) {\r\n    htmlElement.innerHTML = newContent;\r\n    //we need a clone of that array.\r\n    let scripts = Array.prototype.slice.call(htmlElement.getElementsByTagName(\"script\"));\r\n    for (let i = 0; i < scripts.length; i++) {\r\n        if (scripts[i].src !== \"\") {\r\n            let tag = document.createElement(\"script\");\r\n            tag.src = scripts[i].src;\r\n            document.getElementsByTagName(\"head\")[0].appendChild(tag);\r\n        }\r\n        else {\r\n            try {\r\n                eval(scripts[i].innerHTML);\r\n            } catch (err) {\r\n                console.error(err);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * Loops over an array and executes the callback with it.\r\n *\r\n * @param elements array\r\n * @param callback Function\r\n * @return int number of executions of the callback method.\r\n */\r\nfunction forEach(elements, callback) {\r\n    if (!elements) {\r\n        return 0;\r\n    }\r\n    for(let i=0; i<elements.length; i++) {\r\n        callback(elements[i], i);\r\n    }\r\n\r\n    return elements.length\r\n}\r\n/*!\r\n * Serialize all form data into a query string\r\n * (c) 2018 Chris Ferdinandi, MIT License, https://gomakethings.com\r\n * Modified to use any HTML element instead of a form element.\r\n * @param  {Node}   form The form container to serialize\r\n * @return {String}      The serialized form data\r\n */\r\nvar serializeForm = function (form) {\r\n\r\n    // Setup our serialized data\r\n    var serialized = [];\r\n\r\n    let inputElements = form.querySelectorAll('input,select,textarea');\r\n    // Loop through each field in the form\r\n    for (var i = 0; i < inputElements.length; i++) {\r\n\r\n        var field = inputElements[i];\r\n\r\n        // Don't serialize fields without a name, submits, buttons, file and reset inputs, and disabled fields\r\n        if (!field.name || field.disabled || field.type === 'file' || field.type === 'reset' || field.type === 'submit' || field.type === 'button') continue;\r\n\r\n        // If a multi-select, get all selections\r\n        if (field.type === 'select-multiple') {\r\n            for (var n = 0; n < field.options.length; n++) {\r\n                if (!field.options[n].selected) continue;\r\n                serialized.push(encodeURIComponent(field.name) + \"=\" + encodeURIComponent(field.options[n].value));\r\n            }\r\n        }\r\n\r\n        // Convert field data to a query string\r\n        else if ((field.type !== 'checkbox' && field.type !== 'radio') || field.checked) {\r\n            serialized.push(encodeURIComponent(field.name) + \"=\" + encodeURIComponent(field.value));\r\n        }\r\n    }\r\n\r\n    return serialized.join('&');\r\n\r\n};\r\n\r\nexport { getOuterHeight, removeElement, addUrlHashParameter, calcBorderWidth, mergeObjects, getElementWidth, getElementHeight, addUrlParameter, getUrlHashParameterValue, removeUrlHashParameter, removeUrlParameter, setCSSStyle, getParents, serializeForm, getParent, insertAndExecute, forEach };\r\n","import EventsHandler from \"../utils/eventshandler\";\r\n\r\nexport default function (Glide, Components, Events) {\r\n    /**\r\n     * Instance of the binder for DOM Events.\r\n     *\r\n     * @type {EventsHandler}\r\n     */\r\n    const Binder = new EventsHandler();\r\n\r\n    /**\r\n     * Holds preventing status of anchors.\r\n     * If `true` redirection after click will be disabled.\r\n     *\r\n     * @private\r\n     * @type {Boolean}\r\n     */\r\n    let prevented = false;\r\n\r\n    let isSwiping = false;\r\n\r\n    const Anchors = {\r\n        /**\r\n         * Setups a initial state of anchors component.\r\n         *\r\n         */\r\n        mount () {\r\n            /**\r\n             * Holds collection of anchors elements.\r\n             *\r\n             * @private\r\n             * @type {HTMLCollection}\r\n             */\r\n            this._a = Components.Html.wrapper.querySelectorAll('a,span,img');\r\n\r\n            this.bind();\r\n            isSwiping = false;\r\n        },\r\n\r\n        /**\r\n         * Binds events to anchors inside a track.\r\n         *\r\n         */\r\n        bind () {\r\n            Binder.on('click', Components.Html.wrapper, this.click, true)\r\n        },\r\n\r\n        /**\r\n         * Unbinds events attached to anchors inside a track.\r\n         *\r\n         */\r\n        unbind () {\r\n            Binder.off('click', Components.Html.wrapper)\r\n        },\r\n\r\n        /**\r\n         * Handler for click event. Prevents clicks when glide is in `prevent` status.\r\n         *\r\n         * @param  {Object} event\r\n         */\r\n        click (event) {\r\n            if (prevented) {\r\n                event.stopPropagation();\r\n                event.preventDefault()\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Detaches anchors click event inside glide.\r\n         *\r\n         * @return {self}\r\n         */\r\n        detach () {\r\n            prevented = true;\r\n\r\n            return this\r\n        },\r\n\r\n        /**\r\n         * Attaches anchors click events inside glide.\r\n         *\r\n         * @return {self}\r\n         */\r\n        attach () {\r\n            prevented = false;\r\n\r\n            return this\r\n        }\r\n    };\r\n\r\n    Object.defineProperty(Anchors, 'items', {\r\n        /**\r\n         * Gets collection of the arrows HTML elements.\r\n         *\r\n         * @return {HTMLElement[]}\r\n         */\r\n        get () {\r\n            return Anchors._a\r\n        }\r\n    });\r\n\r\n    /**\r\n     * Detach anchors inside slides:\r\n     * - on swiping, so they won't redirect to its `href` attributes\r\n     */\r\n    Events.on('swipe.move', () => {\r\n        Anchors.detach();\r\n    });\r\n\r\n    /**\r\n     * Attach anchors inside slides:\r\n     * - after swiping and transitions ends, so they can redirect after click again\r\n     */\r\n    Events.on('swipe.end', () => {\r\n        Components.Transition.after(() => {\r\n            Anchors.attach()\r\n        });\r\n    });\r\n\r\n    /**\r\n     * Unbind anchors inside slides:\r\n     * - on destroying, to bring anchors to its initial state\r\n     */\r\n    Events.on('destroy', () => {\r\n        Anchors.attach();\r\n        Anchors.unbind();\r\n        Binder.destroy()\r\n    });\r\n\r\n    return Anchors\r\n}\r\n","/*!\n * Glide.js v3.6.0\n * (c) 2013-2022 Jędrzej Chałubek (https://github.com/jedrzejchalubek/)\n * Released under the MIT License.\n */\n\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nfunction _isNativeReflectConstruct() {\n  if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n  if (Reflect.construct.sham) return false;\n  if (typeof Proxy === \"function\") return true;\n\n  try {\n    Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n    return call;\n  } else if (call !== void 0) {\n    throw new TypeError(\"Derived constructors may only return object or undefined\");\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _createSuper(Derived) {\n  var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n  return function _createSuperInternal() {\n    var Super = _getPrototypeOf(Derived),\n        result;\n\n    if (hasNativeReflectConstruct) {\n      var NewTarget = _getPrototypeOf(this).constructor;\n\n      result = Reflect.construct(Super, arguments, NewTarget);\n    } else {\n      result = Super.apply(this, arguments);\n    }\n\n    return _possibleConstructorReturn(this, result);\n  };\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _get() {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(arguments.length < 3 ? target : receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get.apply(this, arguments);\n}\n\nvar defaults = {\n  /**\n   * Type of the movement.\n   *\n   * Available types:\n   * `slider` - Rewinds slider to the start/end when it reaches the first or last slide.\n   * `carousel` - Changes slides without starting over when it reaches the first or last slide.\n   *\n   * @type {String}\n   */\n  type: 'slider',\n\n  /**\n   * Start at specific slide number defined with zero-based index.\n   *\n   * @type {Number}\n   */\n  startAt: 0,\n\n  /**\n   * A number of slides visible on the single viewport.\n   *\n   * @type {Number}\n   */\n  perView: 1,\n\n  /**\n   * Focus currently active slide at a specified position in the track.\n   *\n   * Available inputs:\n   * `center` - Current slide will be always focused at the center of a track.\n   * `0,1,2,3...` - Current slide will be focused on the specified zero-based index.\n   *\n   * @type {String|Number}\n   */\n  focusAt: 0,\n\n  /**\n   * A size of the gap added between slides.\n   *\n   * @type {Number}\n   */\n  gap: 10,\n\n  /**\n   * Change slides after a specified interval. Use `false` for turning off autoplay.\n   *\n   * @type {Number|Boolean}\n   */\n  autoplay: false,\n\n  /**\n   * Stop autoplay on mouseover event.\n   *\n   * @type {Boolean}\n   */\n  hoverpause: true,\n\n  /**\n   * Allow for changing slides with left and right keyboard arrows.\n   *\n   * @type {Boolean}\n   */\n  keyboard: true,\n\n  /**\n   * Stop running `perView` number of slides from the end. Use this\n   * option if you don't want to have an empty space after\n   * a slider. Works only with `slider` type and a\n   * non-centered `focusAt` setting.\n   *\n   * @type {Boolean}\n   */\n  bound: false,\n\n  /**\n   * Minimal swipe distance needed to change the slide. Use `false` for turning off a swiping.\n   *\n   * @type {Number|Boolean}\n   */\n  swipeThreshold: 80,\n\n  /**\n   * Minimal mouse drag distance needed to change the slide. Use `false` for turning off a dragging.\n   *\n   * @type {Number|Boolean}\n   */\n  dragThreshold: 120,\n\n  /**\n   * A number of slides moved on single swipe.\n   *\n   * Available types:\n   * `` - Moves slider by one slide per swipe\n   * `|` - Moves slider between views per swipe (number of slides defined in `perView` options)\n   *\n   * @type {String}\n   */\n  perSwipe: '',\n\n  /**\n   * Moving distance ratio of the slides on a swiping and dragging.\n   *\n   * @type {Number}\n   */\n  touchRatio: 0.5,\n\n  /**\n   * Angle required to activate slides moving on swiping or dragging.\n   *\n   * @type {Number}\n   */\n  touchAngle: 45,\n\n  /**\n   * Duration of the animation in milliseconds.\n   *\n   * @type {Number}\n   */\n  animationDuration: 400,\n\n  /**\n   * Allows looping the `slider` type. Slider will rewind to the first/last slide when it's at the start/end.\n   *\n   * @type {Boolean}\n   */\n  rewind: true,\n\n  /**\n   * Duration of the rewinding animation of the `slider` type in milliseconds.\n   *\n   * @type {Number}\n   */\n  rewindDuration: 800,\n\n  /**\n   * Easing function for the animation.\n   *\n   * @type {String}\n   */\n  animationTimingFunc: 'cubic-bezier(.165, .840, .440, 1)',\n\n  /**\n   * Wait for the animation to finish until the next user input can be processed\n   *\n   * @type {boolean}\n   */\n  waitForTransition: true,\n\n  /**\n   * Throttle costly events at most once per every wait milliseconds.\n   *\n   * @type {Number}\n   */\n  throttle: 10,\n\n  /**\n   * Moving direction mode.\n   *\n   * Available inputs:\n   * - 'ltr' - left to right movement,\n   * - 'rtl' - right to left movement.\n   *\n   * @type {String}\n   */\n  direction: 'ltr',\n\n  /**\n   * The distance value of the next and previous viewports which\n   * have to peek in the current view. Accepts number and\n   * pixels as a string. Left and right peeking can be\n   * set up separately with a directions object.\n   *\n   * For example:\n   * `100` - Peek 100px on the both sides.\n   * { before: 100, after: 50 }` - Peek 100px on the left side and 50px on the right side.\n   *\n   * @type {Number|String|Object}\n   */\n  peek: 0,\n\n  /**\n   * Defines how many clones of current viewport will be generated.\n   *\n   * @type {Number}\n   */\n  cloningRatio: 1,\n\n  /**\n   * Collection of options applied at specified media breakpoints.\n   * For example: display two slides per view under 800px.\n   * `{\n   *   '800px': {\n   *     perView: 2\n   *   }\n   * }`\n   */\n  breakpoints: {},\n\n  /**\n   * Collection of internally used HTML classes.\n   *\n   * @todo Refactor `slider` and `carousel` properties to single `type: { slider: '', carousel: '' }` object\n   * @type {Object}\n   */\n  classes: {\n    swipeable: 'glide--swipeable',\n    dragging: 'glide--dragging',\n    direction: {\n      ltr: 'glide--ltr',\n      rtl: 'glide--rtl'\n    },\n    type: {\n      slider: 'glide--slider',\n      carousel: 'glide--carousel'\n    },\n    slide: {\n      clone: 'glide__slide--clone',\n      active: 'glide__slide--active'\n    },\n    arrow: {\n      disabled: 'glide__arrow--disabled'\n    },\n    nav: {\n      active: 'glide__bullet--active'\n    }\n  }\n};\n\n/**\n * Outputs warning message to the bowser console.\n *\n * @param  {String} msg\n * @return {Void}\n */\nfunction warn(msg) {\n  console.error(\"[Glide warn]: \".concat(msg));\n}\n\n/**\n * Converts value entered as number\n * or string to integer value.\n *\n * @param {String} value\n * @returns {Number}\n */\nfunction toInt(value) {\n  return parseInt(value);\n}\n/**\n * Converts value entered as number\n * or string to flat value.\n *\n * @param {String} value\n * @returns {Number}\n */\n\nfunction toFloat(value) {\n  return parseFloat(value);\n}\n/**\n * Indicates whether the specified value is a string.\n *\n * @param  {*}   value\n * @return {Boolean}\n */\n\nfunction isString(value) {\n  return typeof value === 'string';\n}\n/**\n * Indicates whether the specified value is an object.\n *\n * @param  {*} value\n * @return {Boolean}\n *\n * @see https://github.com/jashkenas/underscore\n */\n\nfunction isObject(value) {\n  var type = _typeof(value);\n\n  return type === 'function' || type === 'object' && !!value; // eslint-disable-line no-mixed-operators\n}\n/**\n * Indicates whether the specified value is a function.\n *\n * @param  {*} value\n * @return {Boolean}\n */\n\nfunction isFunction(value) {\n  return typeof value === 'function';\n}\n/**\n * Indicates whether the specified value is undefined.\n *\n * @param  {*} value\n * @return {Boolean}\n */\n\nfunction isUndefined(value) {\n  return typeof value === 'undefined';\n}\n/**\n * Indicates whether the specified value is an array.\n *\n * @param  {*} value\n * @return {Boolean}\n */\n\nfunction isArray(value) {\n  return value.constructor === Array;\n}\n\n/**\n * Creates and initializes specified collection of extensions.\n * Each extension receives access to instance of glide and rest of components.\n *\n * @param {Object} glide\n * @param {Object} extensions\n *\n * @returns {Object}\n */\n\nfunction mount(glide, extensions, events) {\n  var components = {};\n\n  for (var name in extensions) {\n    if (isFunction(extensions[name])) {\n      components[name] = extensions[name](glide, components, events);\n    } else {\n      warn('Extension must be a function');\n    }\n  }\n\n  for (var _name in components) {\n    if (isFunction(components[_name].mount)) {\n      components[_name].mount();\n    }\n  }\n\n  return components;\n}\n\n/**\n * Defines getter and setter property on the specified object.\n *\n * @param  {Object} obj         Object where property has to be defined.\n * @param  {String} prop        Name of the defined property.\n * @param  {Object} definition  Get and set definitions for the property.\n * @return {Void}\n */\nfunction define(obj, prop, definition) {\n  Object.defineProperty(obj, prop, definition);\n}\n/**\n * Sorts aphabetically object keys.\n *\n * @param  {Object} obj\n * @return {Object}\n */\n\nfunction sortKeys(obj) {\n  return Object.keys(obj).sort().reduce(function (r, k) {\n    r[k] = obj[k];\n    return r[k], r;\n  }, {});\n}\n/**\n * Merges passed settings object with default options.\n *\n * @param  {Object} defaults\n * @param  {Object} settings\n * @return {Object}\n */\n\nfunction mergeOptions(defaults, settings) {\n  var options = Object.assign({}, defaults, settings); // `Object.assign` do not deeply merge objects, so we\n  // have to do it manually for every nested object\n  // in options. Although it does not look smart,\n  // it's smaller and faster than some fancy\n  // merging deep-merge algorithm script.\n\n  if (settings.hasOwnProperty('classes')) {\n    options.classes = Object.assign({}, defaults.classes, settings.classes);\n\n    if (settings.classes.hasOwnProperty('direction')) {\n      options.classes.direction = Object.assign({}, defaults.classes.direction, settings.classes.direction);\n    }\n\n    if (settings.classes.hasOwnProperty('type')) {\n      options.classes.type = Object.assign({}, defaults.classes.type, settings.classes.type);\n    }\n\n    if (settings.classes.hasOwnProperty('slide')) {\n      options.classes.slide = Object.assign({}, defaults.classes.slide, settings.classes.slide);\n    }\n\n    if (settings.classes.hasOwnProperty('arrow')) {\n      options.classes.arrow = Object.assign({}, defaults.classes.arrow, settings.classes.arrow);\n    }\n\n    if (settings.classes.hasOwnProperty('nav')) {\n      options.classes.nav = Object.assign({}, defaults.classes.nav, settings.classes.nav);\n    }\n  }\n\n  if (settings.hasOwnProperty('breakpoints')) {\n    options.breakpoints = Object.assign({}, defaults.breakpoints, settings.breakpoints);\n  }\n\n  return options;\n}\n\nvar EventsBus = /*#__PURE__*/function () {\n  /**\n   * Construct a EventBus instance.\n   *\n   * @param {Object} events\n   */\n  function EventsBus() {\n    var events = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    _classCallCheck(this, EventsBus);\n\n    this.events = events;\n    this.hop = events.hasOwnProperty;\n  }\n  /**\n   * Adds listener to the specifed event.\n   *\n   * @param {String|Array} event\n   * @param {Function} handler\n   */\n\n\n  _createClass(EventsBus, [{\n    key: \"on\",\n    value: function on(event, handler) {\n      if (isArray(event)) {\n        for (var i = 0; i < event.length; i++) {\n          this.on(event[i], handler);\n        }\n\n        return;\n      } // Create the event's object if not yet created\n\n\n      if (!this.hop.call(this.events, event)) {\n        this.events[event] = [];\n      } // Add the handler to queue\n\n\n      var index = this.events[event].push(handler) - 1; // Provide handle back for removal of event\n\n      return {\n        remove: function remove() {\n          delete this.events[event][index];\n        }\n      };\n    }\n    /**\n     * Runs registered handlers for specified event.\n     *\n     * @param {String|Array} event\n     * @param {Object=} context\n     */\n\n  }, {\n    key: \"emit\",\n    value: function emit(event, context) {\n      if (isArray(event)) {\n        for (var i = 0; i < event.length; i++) {\n          this.emit(event[i], context);\n        }\n\n        return;\n      } // If the event doesn't exist, or there's no handlers in queue, just leave\n\n\n      if (!this.hop.call(this.events, event)) {\n        return;\n      } // Cycle through events queue, fire!\n\n\n      this.events[event].forEach(function (item) {\n        item(context || {});\n      });\n    }\n  }]);\n\n  return EventsBus;\n}();\n\nvar Glide$1 = /*#__PURE__*/function () {\n  /**\r\n   * Construct glide.\r\n   *\r\n   * @param  {String} selector\r\n   * @param  {Object} options\r\n   */\n  function Glide(selector) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    _classCallCheck(this, Glide);\n\n    this._c = {};\n    this._t = [];\n    this._e = new EventsBus();\n    this.disabled = false;\n    this.selector = selector;\n    this.settings = mergeOptions(defaults, options);\n    this.index = this.settings.startAt;\n  }\n  /**\r\n   * Initializes glide.\r\n   *\r\n   * @param {Object} extensions Collection of extensions to initialize.\r\n   * @return {Glide}\r\n   */\n\n\n  _createClass(Glide, [{\n    key: \"mount\",\n    value: function mount$1() {\n      var extensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      this._e.emit('mount.before');\n\n      if (isObject(extensions)) {\n        this._c = mount(this, extensions, this._e);\n      } else {\n        warn('You need to provide a object on `mount()`');\n      }\n\n      this._e.emit('mount.after');\n\n      return this;\n    }\n    /**\r\n     * Collects an instance `translate` transformers.\r\n     *\r\n     * @param  {Array} transformers Collection of transformers.\r\n     * @return {Void}\r\n     */\n\n  }, {\n    key: \"mutate\",\n    value: function mutate() {\n      var transformers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n      if (isArray(transformers)) {\n        this._t = transformers;\n      } else {\n        warn('You need to provide a array on `mutate()`');\n      }\n\n      return this;\n    }\n    /**\r\n     * Updates glide with specified settings.\r\n     *\r\n     * @param {Object} settings\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: \"update\",\n    value: function update() {\n      var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      this.settings = mergeOptions(this.settings, settings);\n\n      if (settings.hasOwnProperty('startAt')) {\n        this.index = settings.startAt;\n      }\n\n      this._e.emit('update');\n\n      return this;\n    }\n    /**\r\n     * Change slide with specified pattern. A pattern must be in the special format:\r\n     * `>` - Move one forward\r\n     * `<` - Move one backward\r\n     * `={i}` - Go to {i} zero-based slide (eq. '=1', will go to second slide)\r\n     * `>>` - Rewinds to end (last slide)\r\n     * `<<` - Rewinds to start (first slide)\r\n     * `|>` - Move one viewport forward\r\n     * `|<` - Move one viewport backward\r\n     *\r\n     * @param {String} pattern\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: \"go\",\n    value: function go(pattern) {\n      this._c.Run.make(pattern);\n\n      return this;\n    }\n    /**\r\n     * Move track by specified distance.\r\n     *\r\n     * @param {String} distance\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: \"move\",\n    value: function move(distance) {\n      this._c.Transition.disable();\n\n      this._c.Move.make(distance);\n\n      return this;\n    }\n    /**\r\n     * Destroy instance and revert all changes done by this._c.\r\n     *\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: \"destroy\",\n    value: function destroy() {\n      this._e.emit('destroy');\n\n      return this;\n    }\n    /**\r\n     * Start instance autoplaying.\r\n     *\r\n     * @param {Boolean|Number} interval Run autoplaying with passed interval regardless of `autoplay` settings\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: \"play\",\n    value: function play() {\n      var interval = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (interval) {\n        this.settings.autoplay = interval;\n      }\n\n      this._e.emit('play');\n\n      return this;\n    }\n    /**\r\n     * Stop instance autoplaying.\r\n     *\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: \"pause\",\n    value: function pause() {\n      this._e.emit('pause');\n\n      return this;\n    }\n    /**\r\n     * Sets glide into a idle status.\r\n     *\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: \"disable\",\n    value: function disable() {\n      this.disabled = true;\n      return this;\n    }\n    /**\r\n     * Sets glide into a active status.\r\n     *\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: \"enable\",\n    value: function enable() {\n      this.disabled = false;\n      return this;\n    }\n    /**\r\n     * Adds cuutom event listener with handler.\r\n     *\r\n     * @param  {String|Array} event\r\n     * @param  {Function} handler\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: \"on\",\n    value: function on(event, handler) {\n      this._e.on(event, handler);\n\n      return this;\n    }\n    /**\r\n     * Checks if glide is a precised type.\r\n     *\r\n     * @param  {String} name\r\n     * @return {Boolean}\r\n     */\n\n  }, {\n    key: \"isType\",\n    value: function isType(name) {\n      return this.settings.type === name;\n    }\n    /**\r\n     * Gets value of the core options.\r\n     *\r\n     * @return {Object}\r\n     */\n\n  }, {\n    key: \"settings\",\n    get: function get() {\n      return this._o;\n    }\n    /**\r\n     * Sets value of the core options.\r\n     *\r\n     * @param  {Object} o\r\n     * @return {Void}\r\n     */\n    ,\n    set: function set(o) {\n      if (isObject(o)) {\n        this._o = o;\n      } else {\n        warn('Options must be an `object` instance.');\n      }\n    }\n    /**\r\n     * Gets current index of the slider.\r\n     *\r\n     * @return {Object}\r\n     */\n\n  }, {\n    key: \"index\",\n    get: function get() {\n      return this._i;\n    }\n    /**\r\n     * Sets current index a slider.\r\n     *\r\n     * @return {Object}\r\n     */\n    ,\n    set: function set(i) {\n      this._i = toInt(i);\n    }\n    /**\r\n     * Gets type name of the slider.\r\n     *\r\n     * @return {String}\r\n     */\n\n  }, {\n    key: \"type\",\n    get: function get() {\n      return this.settings.type;\n    }\n    /**\r\n     * Gets value of the idle status.\r\n     *\r\n     * @return {Boolean}\r\n     */\n\n  }, {\n    key: \"disabled\",\n    get: function get() {\n      return this._d;\n    }\n    /**\r\n     * Sets value of the idle status.\r\n     *\r\n     * @return {Boolean}\r\n     */\n    ,\n    set: function set(status) {\n      this._d = !!status;\n    }\n  }]);\n\n  return Glide;\n}();\n\nfunction Run (Glide, Components, Events) {\n  var Run = {\n    /**\n     * Initializes autorunning of the glide.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      this._o = false;\n    },\n\n    /**\n     * Makes glides running based on the passed moving schema.\n     *\n     * @param {String} move\n     */\n    make: function make(move) {\n      var _this = this;\n\n      if (!Glide.disabled) {\n        !Glide.settings.waitForTransition || Glide.disable();\n        this.move = move;\n        Events.emit('run.before', this.move);\n        this.calculate();\n        Events.emit('run', this.move);\n        Components.Transition.after(function () {\n          if (_this.isStart()) {\n            Events.emit('run.start', _this.move);\n          }\n\n          if (_this.isEnd()) {\n            Events.emit('run.end', _this.move);\n          }\n\n          if (_this.isOffset()) {\n            _this._o = false;\n            Events.emit('run.offset', _this.move);\n          }\n\n          Events.emit('run.after', _this.move);\n          Glide.enable();\n        });\n      }\n    },\n\n    /**\n     * Calculates current index based on defined move.\n     *\n     * @return {Number|Undefined}\n     */\n    calculate: function calculate() {\n      var move = this.move,\n          length = this.length;\n      var steps = move.steps,\n          direction = move.direction; // By default assume that size of view is equal to one slide\n\n      var viewSize = 1; // While direction is `=` we want jump to\n      // a specified index described in steps.\n\n      if (direction === '=') {\n        // Check if bound is true, \n        // as we want to avoid whitespaces.\n        if (Glide.settings.bound && toInt(steps) > length) {\n          Glide.index = length;\n          return;\n        }\n\n        Glide.index = steps;\n        return;\n      } // When pattern is equal to `>>` we want\n      // fast forward to the last slide.\n\n\n      if (direction === '>' && steps === '>') {\n        Glide.index = length;\n        return;\n      } // When pattern is equal to `<<` we want\n      // fast forward to the first slide.\n\n\n      if (direction === '<' && steps === '<') {\n        Glide.index = 0;\n        return;\n      } // pagination movement\n\n\n      if (direction === '|') {\n        viewSize = Glide.settings.perView || 1;\n      } // we are moving forward\n\n\n      if (direction === '>' || direction === '|' && steps === '>') {\n        var index = calculateForwardIndex(viewSize);\n\n        if (index > length) {\n          this._o = true;\n        }\n\n        Glide.index = normalizeForwardIndex(index, viewSize);\n        return;\n      } // we are moving backward\n\n\n      if (direction === '<' || direction === '|' && steps === '<') {\n        var _index = calculateBackwardIndex(viewSize);\n\n        if (_index < 0) {\n          this._o = true;\n        }\n\n        Glide.index = normalizeBackwardIndex(_index, viewSize);\n        return;\n      }\n\n      warn(\"Invalid direction pattern [\".concat(direction).concat(steps, \"] has been used\"));\n    },\n\n    /**\n     * Checks if we are on the first slide.\n     *\n     * @return {Boolean}\n     */\n    isStart: function isStart() {\n      return Glide.index <= 0;\n    },\n\n    /**\n     * Checks if we are on the last slide.\n     *\n     * @return {Boolean}\n     */\n    isEnd: function isEnd() {\n      return Glide.index >= this.length;\n    },\n\n    /**\n     * Checks if we are making a offset run.\n     *\n     * @param {String} direction\n     * @return {Boolean}\n     */\n    isOffset: function isOffset() {\n      var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;\n\n      if (!direction) {\n        return this._o;\n      }\n\n      if (!this._o) {\n        return false;\n      } // did we view to the right?\n\n\n      if (direction === '|>') {\n        return this.move.direction === '|' && this.move.steps === '>';\n      } // did we view to the left?\n\n\n      if (direction === '|<') {\n        return this.move.direction === '|' && this.move.steps === '<';\n      }\n\n      return this.move.direction === direction;\n    },\n\n    /**\n     * Checks if bound mode is active\n     *\n     * @return {Boolean}\n     */\n    isBound: function isBound() {\n      return Glide.isType('slider') && Glide.settings.focusAt !== 'center' && Glide.settings.bound;\n    }\n  };\n  /**\n   * Returns index value to move forward/to the right\n   *\n   * @param viewSize\n   * @returns {Number}\n   */\n\n  function calculateForwardIndex(viewSize) {\n    var index = Glide.index;\n\n    if (Glide.isType('carousel')) {\n      return index + viewSize;\n    }\n\n    return index + (viewSize - index % viewSize);\n  }\n  /**\n   * Normalizes the given forward index based on glide settings, preventing it to exceed certain boundaries\n   *\n   * @param index\n   * @param length\n   * @param viewSize\n   * @returns {Number}\n   */\n\n\n  function normalizeForwardIndex(index, viewSize) {\n    var length = Run.length;\n\n    if (index <= length) {\n      return index;\n    }\n\n    if (Glide.isType('carousel')) {\n      return index - (length + 1);\n    }\n\n    if (Glide.settings.rewind) {\n      // bound does funny things with the length, therefor we have to be certain\n      // that we are on the last possible index value given by bound\n      if (Run.isBound() && !Run.isEnd()) {\n        return length;\n      }\n\n      return 0;\n    }\n\n    if (Run.isBound()) {\n      return length;\n    }\n\n    return Math.floor(length / viewSize) * viewSize;\n  }\n  /**\n   * Calculates index value to move backward/to the left\n   *\n   * @param viewSize\n   * @returns {Number}\n   */\n\n\n  function calculateBackwardIndex(viewSize) {\n    var index = Glide.index;\n\n    if (Glide.isType('carousel')) {\n      return index - viewSize;\n    } // ensure our back navigation results in the same index as a forward navigation\n    // to experience a homogeneous paging\n\n\n    var view = Math.ceil(index / viewSize);\n    return (view - 1) * viewSize;\n  }\n  /**\n   * Normalizes the given backward index based on glide settings, preventing it to exceed certain boundaries\n   *\n   * @param index\n   * @param length\n   * @param viewSize\n   * @returns {*}\n   */\n\n\n  function normalizeBackwardIndex(index, viewSize) {\n    var length = Run.length;\n\n    if (index >= 0) {\n      return index;\n    }\n\n    if (Glide.isType('carousel')) {\n      return index + (length + 1);\n    }\n\n    if (Glide.settings.rewind) {\n      // bound does funny things with the length, therefor we have to be certain\n      // that we are on first possible index value before we to rewind to the length given by bound\n      if (Run.isBound() && Run.isStart()) {\n        return length;\n      }\n\n      return Math.floor(length / viewSize) * viewSize;\n    }\n\n    return 0;\n  }\n\n  define(Run, 'move', {\n    /**\n     * Gets value of the move schema.\n     *\n     * @returns {Object}\n     */\n    get: function get() {\n      return this._m;\n    },\n\n    /**\n     * Sets value of the move schema.\n     *\n     * @returns {Object}\n     */\n    set: function set(value) {\n      var step = value.substr(1);\n      this._m = {\n        direction: value.substr(0, 1),\n        steps: step ? toInt(step) ? toInt(step) : step : 0\n      };\n    }\n  });\n  define(Run, 'length', {\n    /**\n     * Gets value of the running distance based\n     * on zero-indexing number of slides.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      var settings = Glide.settings;\n      var length = Components.Html.slides.length; // If the `bound` option is active, a maximum running distance should be\n      // reduced by `perView` and `focusAt` settings. Running distance\n      // should end before creating an empty space after instance.\n\n      if (this.isBound()) {\n        return length - 1 - (toInt(settings.perView) - 1) + toInt(settings.focusAt);\n      }\n\n      return length - 1;\n    }\n  });\n  define(Run, 'offset', {\n    /**\n     * Gets status of the offsetting flag.\n     *\n     * @return {Boolean}\n     */\n    get: function get() {\n      return this._o;\n    }\n  });\n  return Run;\n}\n\n/**\n * Returns a current time.\n *\n * @return {Number}\n */\nfunction now() {\n  return new Date().getTime();\n}\n\n/**\n * Returns a function, that, when invoked, will only be triggered\n * at most once during a given window of time.\n *\n * @param {Function} func\n * @param {Number} wait\n * @param {Object=} options\n * @return {Function}\n *\n * @see https://github.com/jashkenas/underscore\n */\n\nfunction throttle(func, wait, options) {\n  var timeout, context, args, result;\n  var previous = 0;\n  if (!options) options = {};\n\n  var later = function later() {\n    previous = options.leading === false ? 0 : now();\n    timeout = null;\n    result = func.apply(context, args);\n    if (!timeout) context = args = null;\n  };\n\n  var throttled = function throttled() {\n    var at = now();\n    if (!previous && options.leading === false) previous = at;\n    var remaining = wait - (at - previous);\n    context = this;\n    args = arguments;\n\n    if (remaining <= 0 || remaining > wait) {\n      if (timeout) {\n        clearTimeout(timeout);\n        timeout = null;\n      }\n\n      previous = at;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    } else if (!timeout && options.trailing !== false) {\n      timeout = setTimeout(later, remaining);\n    }\n\n    return result;\n  };\n\n  throttled.cancel = function () {\n    clearTimeout(timeout);\n    previous = 0;\n    timeout = context = args = null;\n  };\n\n  return throttled;\n}\n\nvar MARGIN_TYPE = {\n  ltr: ['marginLeft', 'marginRight'],\n  rtl: ['marginRight', 'marginLeft']\n};\nfunction Gaps (Glide, Components, Events) {\n  var Gaps = {\n    /**\n     * Applies gaps between slides. First and last\n     * slides do not receive it's edge margins.\n     *\n     * @param {HTMLCollection} slides\n     * @return {Void}\n     */\n    apply: function apply(slides) {\n      for (var i = 0, len = slides.length; i < len; i++) {\n        var style = slides[i].style;\n        var direction = Components.Direction.value;\n\n        if (i !== 0) {\n          style[MARGIN_TYPE[direction][0]] = \"\".concat(this.value / 2, \"px\");\n        } else {\n          style[MARGIN_TYPE[direction][0]] = '';\n        }\n\n        if (i !== slides.length - 1) {\n          style[MARGIN_TYPE[direction][1]] = \"\".concat(this.value / 2, \"px\");\n        } else {\n          style[MARGIN_TYPE[direction][1]] = '';\n        }\n      }\n    },\n\n    /**\n     * Removes gaps from the slides.\n     *\n     * @param {HTMLCollection} slides\n     * @returns {Void}\n    */\n    remove: function remove(slides) {\n      for (var i = 0, len = slides.length; i < len; i++) {\n        var style = slides[i].style;\n        style.marginLeft = '';\n        style.marginRight = '';\n      }\n    }\n  };\n  define(Gaps, 'value', {\n    /**\n     * Gets value of the gap.\n     *\n     * @returns {Number}\n     */\n    get: function get() {\n      return toInt(Glide.settings.gap);\n    }\n  });\n  define(Gaps, 'grow', {\n    /**\n     * Gets additional dimensions value caused by gaps.\n     * Used to increase width of the slides wrapper.\n     *\n     * @returns {Number}\n     */\n    get: function get() {\n      return Gaps.value * Components.Sizes.length;\n    }\n  });\n  define(Gaps, 'reductor', {\n    /**\n     * Gets reduction value caused by gaps.\n     * Used to subtract width of the slides.\n     *\n     * @returns {Number}\n     */\n    get: function get() {\n      var perView = Glide.settings.perView;\n      return Gaps.value * (perView - 1) / perView;\n    }\n  });\n  /**\n   * Apply calculated gaps:\n   * - after building, so slides (including clones) will receive proper margins\n   * - on updating via API, to recalculate gaps with new options\n   */\n\n  Events.on(['build.after', 'update'], throttle(function () {\n    Gaps.apply(Components.Html.wrapper.children);\n  }, 30));\n  /**\n   * Remove gaps:\n   * - on destroying to bring markup to its inital state\n   */\n\n  Events.on('destroy', function () {\n    Gaps.remove(Components.Html.wrapper.children);\n  });\n  return Gaps;\n}\n\n/**\n * Finds siblings nodes of the passed node.\n *\n * @param  {Element} node\n * @return {Array}\n */\nfunction siblings(node) {\n  if (node && node.parentNode) {\n    var n = node.parentNode.firstChild;\n    var matched = [];\n\n    for (; n; n = n.nextSibling) {\n      if (n.nodeType === 1 && n !== node) {\n        matched.push(n);\n      }\n    }\n\n    return matched;\n  }\n\n  return [];\n}\n/**\n * Checks if passed node exist and is a valid element.\n *\n * @param  {Element} node\n * @return {Boolean}\n */\n\nfunction exist(node) {\n  if (node && node instanceof window.HTMLElement) {\n    return true;\n  }\n\n  return false;\n}\n/**\n * Coerces a NodeList to an Array.\n *\n * @param  {NodeList} nodeList\n * @return {Array}\n */\n\nfunction toArray(nodeList) {\n  return Array.prototype.slice.call(nodeList);\n}\n\nvar TRACK_SELECTOR = '[data-glide-el=\"track\"]';\nfunction Html (Glide, Components, Events) {\n  var Html = {\n    /**\n     * Setup slider HTML nodes.\n     *\n     * @param {Glide} glide\n     */\n    mount: function mount() {\n      this.root = Glide.selector;\n      this.track = this.root.querySelector(TRACK_SELECTOR);\n      this.collectSlides();\n    },\n\n    /**\n     * Collect slides\n     */\n    collectSlides: function collectSlides() {\n      this.slides = toArray(this.wrapper.children).filter(function (slide) {\n        return !slide.classList.contains(Glide.settings.classes.slide.clone);\n      });\n    }\n  };\n  define(Html, 'root', {\n    /**\n     * Gets node of the glide main element.\n     *\n     * @return {Object}\n     */\n    get: function get() {\n      return Html._r;\n    },\n\n    /**\n     * Sets node of the glide main element.\n     *\n     * @return {Object}\n     */\n    set: function set(r) {\n      if (isString(r)) {\n        r = document.querySelector(r);\n      }\n\n      if (exist(r)) {\n        Html._r = r;\n      } else {\n        warn('Root element must be a existing Html node');\n      }\n    }\n  });\n  define(Html, 'track', {\n    /**\n     * Gets node of the glide track with slides.\n     *\n     * @return {Object}\n     */\n    get: function get() {\n      return Html._t;\n    },\n\n    /**\n     * Sets node of the glide track with slides.\n     *\n     * @return {Object}\n     */\n    set: function set(t) {\n      if (exist(t)) {\n        Html._t = t;\n      } else {\n        warn(\"Could not find track element. Please use \".concat(TRACK_SELECTOR, \" attribute.\"));\n      }\n    }\n  });\n  define(Html, 'wrapper', {\n    /**\n     * Gets node of the slides wrapper.\n     *\n     * @return {Object}\n     */\n    get: function get() {\n      return Html.track.children[0];\n    }\n  });\n  /**\n   * Add/remove/reorder dynamic slides\n   */\n\n  Events.on('update', function () {\n    Html.collectSlides();\n  });\n  return Html;\n}\n\nfunction Peek (Glide, Components, Events) {\n  var Peek = {\n    /**\n     * Setups how much to peek based on settings.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      this.value = Glide.settings.peek;\n    }\n  };\n  define(Peek, 'value', {\n    /**\n     * Gets value of the peek.\n     *\n     * @returns {Number|Object}\n     */\n    get: function get() {\n      return Peek._v;\n    },\n\n    /**\n     * Sets value of the peek.\n     *\n     * @param {Number|Object} value\n     * @return {Void}\n     */\n    set: function set(value) {\n      if (isObject(value)) {\n        value.before = toInt(value.before);\n        value.after = toInt(value.after);\n      } else {\n        value = toInt(value);\n      }\n\n      Peek._v = value;\n    }\n  });\n  define(Peek, 'reductor', {\n    /**\n     * Gets reduction value caused by peek.\n     *\n     * @returns {Number}\n     */\n    get: function get() {\n      var value = Peek.value;\n      var perView = Glide.settings.perView;\n\n      if (isObject(value)) {\n        return value.before / perView + value.after / perView;\n      }\n\n      return value * 2 / perView;\n    }\n  });\n  /**\n   * Recalculate peeking sizes on:\n   * - when resizing window to update to proper percents\n   */\n\n  Events.on(['resize', 'update'], function () {\n    Peek.mount();\n  });\n  return Peek;\n}\n\nfunction Move (Glide, Components, Events) {\n  var Move = {\n    /**\n     * Constructs move component.\n     *\n     * @returns {Void}\n     */\n    mount: function mount() {\n      this._o = 0;\n    },\n\n    /**\n     * Calculates a movement value based on passed offset and currently active index.\n     *\n     * @param  {Number} offset\n     * @return {Void}\n     */\n    make: function make() {\n      var _this = this;\n\n      var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n      this.offset = offset;\n      Events.emit('move', {\n        movement: this.value\n      });\n      Components.Transition.after(function () {\n        Events.emit('move.after', {\n          movement: _this.value\n        });\n      });\n    }\n  };\n  define(Move, 'offset', {\n    /**\n     * Gets an offset value used to modify current translate.\n     *\n     * @return {Object}\n     */\n    get: function get() {\n      return Move._o;\n    },\n\n    /**\n     * Sets an offset value used to modify current translate.\n     *\n     * @return {Object}\n     */\n    set: function set(value) {\n      Move._o = !isUndefined(value) ? toInt(value) : 0;\n    }\n  });\n  define(Move, 'translate', {\n    /**\n     * Gets a raw movement value.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      return Components.Sizes.slideWidth * Glide.index;\n    }\n  });\n  define(Move, 'value', {\n    /**\n     * Gets an actual movement value corrected by offset.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      var offset = this.offset;\n      var translate = this.translate;\n\n      if (Components.Direction.is('rtl')) {\n        return translate + offset;\n      }\n\n      return translate - offset;\n    }\n  });\n  /**\n   * Make movement to proper slide on:\n   * - before build, so glide will start at `startAt` index\n   * - on each standard run to move to newly calculated index\n   */\n\n  Events.on(['build.before', 'run'], function () {\n    Move.make();\n  });\n  return Move;\n}\n\nfunction Sizes (Glide, Components, Events) {\n  var Sizes = {\n    /**\n     * Setups dimensions of slides.\n     *\n     * @return {Void}\n     */\n    setupSlides: function setupSlides() {\n      var width = \"\".concat(this.slideWidth, \"px\");\n      var slides = Components.Html.slides;\n\n      for (var i = 0; i < slides.length; i++) {\n        slides[i].style.width = width;\n      }\n    },\n\n    /**\n     * Setups dimensions of slides wrapper.\n     *\n     * @return {Void}\n     */\n    setupWrapper: function setupWrapper() {\n      Components.Html.wrapper.style.width = \"\".concat(this.wrapperSize, \"px\");\n    },\n\n    /**\n     * Removes applied styles from HTML elements.\n     *\n     * @returns {Void}\n     */\n    remove: function remove() {\n      var slides = Components.Html.slides;\n\n      for (var i = 0; i < slides.length; i++) {\n        slides[i].style.width = '';\n      }\n\n      Components.Html.wrapper.style.width = '';\n    }\n  };\n  define(Sizes, 'length', {\n    /**\n     * Gets count number of the slides.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      return Components.Html.slides.length;\n    }\n  });\n  define(Sizes, 'width', {\n    /**\n     * Gets width value of the slider (visible area).\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      return Components.Html.track.offsetWidth;\n    }\n  });\n  define(Sizes, 'wrapperSize', {\n    /**\n     * Gets size of the slides wrapper.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      return Sizes.slideWidth * Sizes.length + Components.Gaps.grow + Components.Clones.grow;\n    }\n  });\n  define(Sizes, 'slideWidth', {\n    /**\n     * Gets width value of a single slide.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      return Sizes.width / Glide.settings.perView - Components.Peek.reductor - Components.Gaps.reductor;\n    }\n  });\n  /**\n   * Apply calculated glide's dimensions:\n   * - before building, so other dimensions (e.g. translate) will be calculated propertly\n   * - when resizing window to recalculate sildes dimensions\n   * - on updating via API, to calculate dimensions based on new options\n   */\n\n  Events.on(['build.before', 'resize', 'update'], function () {\n    Sizes.setupSlides();\n    Sizes.setupWrapper();\n  });\n  /**\n   * Remove calculated glide's dimensions:\n   * - on destoting to bring markup to its inital state\n   */\n\n  Events.on('destroy', function () {\n    Sizes.remove();\n  });\n  return Sizes;\n}\n\nfunction Build (Glide, Components, Events) {\n  var Build = {\n    /**\n     * Init glide building. Adds classes, sets\n     * dimensions and setups initial state.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      Events.emit('build.before');\n      this.typeClass();\n      this.activeClass();\n      Events.emit('build.after');\n    },\n\n    /**\n     * Adds `type` class to the glide element.\n     *\n     * @return {Void}\n     */\n    typeClass: function typeClass() {\n      Components.Html.root.classList.add(Glide.settings.classes.type[Glide.settings.type]);\n    },\n\n    /**\n     * Sets active class to current slide.\n     *\n     * @return {Void}\n     */\n    activeClass: function activeClass() {\n      var classes = Glide.settings.classes;\n      var slide = Components.Html.slides[Glide.index];\n\n      if (slide) {\n        slide.classList.add(classes.slide.active);\n        siblings(slide).forEach(function (sibling) {\n          sibling.classList.remove(classes.slide.active);\n        });\n      }\n    },\n\n    /**\n     * Removes HTML classes applied at building.\n     *\n     * @return {Void}\n     */\n    removeClasses: function removeClasses() {\n      var _Glide$settings$class = Glide.settings.classes,\n          type = _Glide$settings$class.type,\n          slide = _Glide$settings$class.slide;\n      Components.Html.root.classList.remove(type[Glide.settings.type]);\n      Components.Html.slides.forEach(function (sibling) {\n        sibling.classList.remove(slide.active);\n      });\n    }\n  };\n  /**\n   * Clear building classes:\n   * - on destroying to bring HTML to its initial state\n   * - on updating to remove classes before remounting component\n   */\n\n  Events.on(['destroy', 'update'], function () {\n    Build.removeClasses();\n  });\n  /**\n   * Remount component:\n   * - on resizing of the window to calculate new dimensions\n   * - on updating settings via API\n   */\n\n  Events.on(['resize', 'update'], function () {\n    Build.mount();\n  });\n  /**\n   * Swap active class of current slide:\n   * - after each move to the new index\n   */\n\n  Events.on('move.after', function () {\n    Build.activeClass();\n  });\n  return Build;\n}\n\nfunction Clones (Glide, Components, Events) {\n  var Clones = {\n    /**\n     * Create pattern map and collect slides to be cloned.\n     */\n    mount: function mount() {\n      this.items = [];\n\n      if (Glide.isType('carousel')) {\n        this.items = this.collect();\n      }\n    },\n\n    /**\n     * Collect clones with pattern.\n     *\n     * @return {[]}\n     */\n    collect: function collect() {\n      var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n      var slides = Components.Html.slides;\n      var _Glide$settings = Glide.settings,\n          perView = _Glide$settings.perView,\n          classes = _Glide$settings.classes,\n          cloningRatio = _Glide$settings.cloningRatio;\n\n      if (slides.length !== 0) {\n        var peekIncrementer = +!!Glide.settings.peek;\n        var cloneCount = perView + peekIncrementer + Math.round(perView / 2);\n        var append = slides.slice(0, cloneCount).reverse();\n        var prepend = slides.slice(cloneCount * -1);\n\n        for (var r = 0; r < Math.max(cloningRatio, Math.floor(perView / slides.length)); r++) {\n          for (var i = 0; i < append.length; i++) {\n            var clone = append[i].cloneNode(true);\n            clone.classList.add(classes.slide.clone);\n            items.push(clone);\n          }\n\n          for (var _i = 0; _i < prepend.length; _i++) {\n            var _clone = prepend[_i].cloneNode(true);\n\n            _clone.classList.add(classes.slide.clone);\n\n            items.unshift(_clone);\n          }\n        }\n      }\n\n      return items;\n    },\n\n    /**\n     * Append cloned slides with generated pattern.\n     *\n     * @return {Void}\n     */\n    append: function append() {\n      var items = this.items;\n      var _Components$Html = Components.Html,\n          wrapper = _Components$Html.wrapper,\n          slides = _Components$Html.slides;\n      var half = Math.floor(items.length / 2);\n      var prepend = items.slice(0, half).reverse();\n      var append = items.slice(half * -1).reverse();\n      var width = \"\".concat(Components.Sizes.slideWidth, \"px\");\n\n      for (var i = 0; i < append.length; i++) {\n        wrapper.appendChild(append[i]);\n      }\n\n      for (var _i2 = 0; _i2 < prepend.length; _i2++) {\n        wrapper.insertBefore(prepend[_i2], slides[0]);\n      }\n\n      for (var _i3 = 0; _i3 < items.length; _i3++) {\n        items[_i3].style.width = width;\n      }\n    },\n\n    /**\n     * Remove all cloned slides.\n     *\n     * @return {Void}\n     */\n    remove: function remove() {\n      var items = this.items;\n\n      for (var i = 0; i < items.length; i++) {\n        Components.Html.wrapper.removeChild(items[i]);\n      }\n    }\n  };\n  define(Clones, 'grow', {\n    /**\n     * Gets additional dimensions value caused by clones.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      return (Components.Sizes.slideWidth + Components.Gaps.value) * Clones.items.length;\n    }\n  });\n  /**\n   * Append additional slide's clones:\n   * - while glide's type is `carousel`\n   */\n\n  Events.on('update', function () {\n    Clones.remove();\n    Clones.mount();\n    Clones.append();\n  });\n  /**\n   * Append additional slide's clones:\n   * - while glide's type is `carousel`\n   */\n\n  Events.on('build.before', function () {\n    if (Glide.isType('carousel')) {\n      Clones.append();\n    }\n  });\n  /**\n   * Remove clones HTMLElements:\n   * - on destroying, to bring HTML to its initial state\n   */\n\n  Events.on('destroy', function () {\n    Clones.remove();\n  });\n  return Clones;\n}\n\nvar EventsBinder = /*#__PURE__*/function () {\n  /**\n   * Construct a EventsBinder instance.\n   */\n  function EventsBinder() {\n    var listeners = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    _classCallCheck(this, EventsBinder);\n\n    this.listeners = listeners;\n  }\n  /**\n   * Adds events listeners to arrows HTML elements.\n   *\n   * @param  {String|Array} events\n   * @param  {Element|Window|Document} el\n   * @param  {Function} closure\n   * @param  {Boolean|Object} capture\n   * @return {Void}\n   */\n\n\n  _createClass(EventsBinder, [{\n    key: \"on\",\n    value: function on(events, el, closure) {\n      var capture = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n      if (isString(events)) {\n        events = [events];\n      }\n\n      for (var i = 0; i < events.length; i++) {\n        this.listeners[events[i]] = closure;\n        el.addEventListener(events[i], this.listeners[events[i]], capture);\n      }\n    }\n    /**\n     * Removes event listeners from arrows HTML elements.\n     *\n     * @param  {String|Array} events\n     * @param  {Element|Window|Document} el\n     * @param  {Boolean|Object} capture\n     * @return {Void}\n     */\n\n  }, {\n    key: \"off\",\n    value: function off(events, el) {\n      var capture = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      if (isString(events)) {\n        events = [events];\n      }\n\n      for (var i = 0; i < events.length; i++) {\n        el.removeEventListener(events[i], this.listeners[events[i]], capture);\n      }\n    }\n    /**\n     * Destroy collected listeners.\n     *\n     * @returns {Void}\n     */\n\n  }, {\n    key: \"destroy\",\n    value: function destroy() {\n      delete this.listeners;\n    }\n  }]);\n\n  return EventsBinder;\n}();\n\nfunction Resize (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n  var Resize = {\n    /**\n     * Initializes window bindings.\n     */\n    mount: function mount() {\n      this.bind();\n    },\n\n    /**\n     * Binds `rezsize` listener to the window.\n     * It's a costly event, so we are debouncing it.\n     *\n     * @return {Void}\n     */\n    bind: function bind() {\n      Binder.on('resize', window, throttle(function () {\n        Events.emit('resize');\n      }, Glide.settings.throttle));\n    },\n\n    /**\n     * Unbinds listeners from the window.\n     *\n     * @return {Void}\n     */\n    unbind: function unbind() {\n      Binder.off('resize', window);\n    }\n  };\n  /**\n   * Remove bindings from window:\n   * - on destroying, to remove added EventListener\n   */\n\n  Events.on('destroy', function () {\n    Resize.unbind();\n    Binder.destroy();\n  });\n  return Resize;\n}\n\nvar VALID_DIRECTIONS = ['ltr', 'rtl'];\nvar FLIPED_MOVEMENTS = {\n  '>': '<',\n  '<': '>',\n  '=': '='\n};\nfunction Direction (Glide, Components, Events) {\n  var Direction = {\n    /**\n     * Setups gap value based on settings.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      this.value = Glide.settings.direction;\n    },\n\n    /**\n     * Resolves pattern based on direction value\n     *\n     * @param {String} pattern\n     * @returns {String}\n     */\n    resolve: function resolve(pattern) {\n      var token = pattern.slice(0, 1);\n\n      if (this.is('rtl')) {\n        return pattern.split(token).join(FLIPED_MOVEMENTS[token]);\n      }\n\n      return pattern;\n    },\n\n    /**\n     * Checks value of direction mode.\n     *\n     * @param {String} direction\n     * @returns {Boolean}\n     */\n    is: function is(direction) {\n      return this.value === direction;\n    },\n\n    /**\n     * Applies direction class to the root HTML element.\n     *\n     * @return {Void}\n     */\n    addClass: function addClass() {\n      Components.Html.root.classList.add(Glide.settings.classes.direction[this.value]);\n    },\n\n    /**\n     * Removes direction class from the root HTML element.\n     *\n     * @return {Void}\n     */\n    removeClass: function removeClass() {\n      Components.Html.root.classList.remove(Glide.settings.classes.direction[this.value]);\n    }\n  };\n  define(Direction, 'value', {\n    /**\n     * Gets value of the direction.\n     *\n     * @returns {Number}\n     */\n    get: function get() {\n      return Direction._v;\n    },\n\n    /**\n     * Sets value of the direction.\n     *\n     * @param {String} value\n     * @return {Void}\n     */\n    set: function set(value) {\n      if (VALID_DIRECTIONS.indexOf(value) > -1) {\n        Direction._v = value;\n      } else {\n        warn('Direction value must be `ltr` or `rtl`');\n      }\n    }\n  });\n  /**\n   * Clear direction class:\n   * - on destroy to bring HTML to its initial state\n   * - on update to remove class before reappling bellow\n   */\n\n  Events.on(['destroy', 'update'], function () {\n    Direction.removeClass();\n  });\n  /**\n   * Remount component:\n   * - on update to reflect changes in direction value\n   */\n\n  Events.on('update', function () {\n    Direction.mount();\n  });\n  /**\n   * Apply direction class:\n   * - before building to apply class for the first time\n   * - on updating to reapply direction class that may changed\n   */\n\n  Events.on(['build.before', 'update'], function () {\n    Direction.addClass();\n  });\n  return Direction;\n}\n\n/**\n * Reflects value of glide movement.\n *\n * @param  {Object} Glide\n * @param  {Object} Components\n * @return {Object}\n */\nfunction Rtl (Glide, Components) {\n  return {\n    /**\n     * Negates the passed translate if glide is in RTL option.\n     *\n     * @param  {Number} translate\n     * @return {Number}\n     */\n    modify: function modify(translate) {\n      if (Components.Direction.is('rtl')) {\n        return -translate;\n      }\n\n      return translate;\n    }\n  };\n}\n\n/**\n * Updates glide movement with a `gap` settings.\n *\n * @param  {Object} Glide\n * @param  {Object} Components\n * @return {Object}\n */\nfunction Gap (Glide, Components) {\n  return {\n    /**\n     * Modifies passed translate value with number in the `gap` settings.\n     *\n     * @param  {Number} translate\n     * @return {Number}\n     */\n    modify: function modify(translate) {\n      var multiplier = Math.floor(translate / Components.Sizes.slideWidth);\n      return translate + Components.Gaps.value * multiplier;\n    }\n  };\n}\n\n/**\n * Updates glide movement with width of additional clones width.\n *\n * @param  {Object} Glide\n * @param  {Object} Components\n * @return {Object}\n */\nfunction Grow (Glide, Components) {\n  return {\n    /**\n     * Adds to the passed translate width of the half of clones.\n     *\n     * @param  {Number} translate\n     * @return {Number}\n     */\n    modify: function modify(translate) {\n      return translate + Components.Clones.grow / 2;\n    }\n  };\n}\n\n/**\n * Updates glide movement with a `peek` settings.\n *\n * @param  {Object} Glide\n * @param  {Object} Components\n * @return {Object}\n */\n\nfunction Peeking (Glide, Components) {\n  return {\n    /**\n     * Modifies passed translate value with a `peek` setting.\n     *\n     * @param  {Number} translate\n     * @return {Number}\n     */\n    modify: function modify(translate) {\n      if (Glide.settings.focusAt >= 0) {\n        var peek = Components.Peek.value;\n\n        if (isObject(peek)) {\n          return translate - peek.before;\n        }\n\n        return translate - peek;\n      }\n\n      return translate;\n    }\n  };\n}\n\n/**\n * Updates glide movement with a `focusAt` settings.\n *\n * @param  {Object} Glide\n * @param  {Object} Components\n * @return {Object}\n */\nfunction Focusing (Glide, Components) {\n  return {\n    /**\n     * Modifies passed translate value with index in the `focusAt` setting.\n     *\n     * @param  {Number} translate\n     * @return {Number}\n     */\n    modify: function modify(translate) {\n      var gap = Components.Gaps.value;\n      var width = Components.Sizes.width;\n      var focusAt = Glide.settings.focusAt;\n      var slideWidth = Components.Sizes.slideWidth;\n\n      if (focusAt === 'center') {\n        return translate - (width / 2 - slideWidth / 2);\n      }\n\n      return translate - slideWidth * focusAt - gap * focusAt;\n    }\n  };\n}\n\n/**\n * Applies diffrent transformers on translate value.\n *\n * @param  {Object} Glide\n * @param  {Object} Components\n * @return {Object}\n */\n\nfunction mutator (Glide, Components, Events) {\n  /**\n   * Merge instance transformers with collection of default transformers.\n   * It's important that the Rtl component be last on the list,\n   * so it reflects all previous transformations.\n   *\n   * @type {Array}\n   */\n  var TRANSFORMERS = [Gap, Grow, Peeking, Focusing].concat(Glide._t, [Rtl]);\n  return {\n    /**\n     * Piplines translate value with registered transformers.\n     *\n     * @param  {Number} translate\n     * @return {Number}\n     */\n    mutate: function mutate(translate) {\n      for (var i = 0; i < TRANSFORMERS.length; i++) {\n        var transformer = TRANSFORMERS[i];\n\n        if (isFunction(transformer) && isFunction(transformer().modify)) {\n          translate = transformer(Glide, Components, Events).modify(translate);\n        } else {\n          warn('Transformer should be a function that returns an object with `modify()` method');\n        }\n      }\n\n      return translate;\n    }\n  };\n}\n\nfunction Translate (Glide, Components, Events) {\n  var Translate = {\n    /**\n     * Sets value of translate on HTML element.\n     *\n     * @param {Number} value\n     * @return {Void}\n     */\n    set: function set(value) {\n      var transform = mutator(Glide, Components).mutate(value);\n      var translate3d = \"translate3d(\".concat(-1 * transform, \"px, 0px, 0px)\");\n      Components.Html.wrapper.style.mozTransform = translate3d; // needed for supported Firefox 10-15\n\n      Components.Html.wrapper.style.webkitTransform = translate3d; // needed for supported Chrome 10-35, Safari 5.1-8, and Opera 15-22\n\n      Components.Html.wrapper.style.transform = translate3d;\n    },\n\n    /**\n     * Removes value of translate from HTML element.\n     *\n     * @return {Void}\n     */\n    remove: function remove() {\n      Components.Html.wrapper.style.transform = '';\n    },\n\n    /**\n     * @return {number}\n     */\n    getStartIndex: function getStartIndex() {\n      var length = Components.Sizes.length;\n      var index = Glide.index;\n      var perView = Glide.settings.perView;\n\n      if (Components.Run.isOffset('>') || Components.Run.isOffset('|>')) {\n        return length + (index - perView);\n      } // \"modulo length\" converts an index that equals length to zero\n\n\n      return (index + perView) % length;\n    },\n\n    /**\n     * @return {number}\n     */\n    getTravelDistance: function getTravelDistance() {\n      var travelDistance = Components.Sizes.slideWidth * Glide.settings.perView;\n\n      if (Components.Run.isOffset('>') || Components.Run.isOffset('|>')) {\n        // reverse travel distance so that we don't have to change subtract operations\n        return travelDistance * -1;\n      }\n\n      return travelDistance;\n    }\n  };\n  /**\n   * Set new translate value:\n   * - on move to reflect index change\n   * - on updating via API to reflect possible changes in options\n   */\n\n  Events.on('move', function (context) {\n    if (!Glide.isType('carousel') || !Components.Run.isOffset()) {\n      return Translate.set(context.movement);\n    }\n\n    Components.Transition.after(function () {\n      Events.emit('translate.jump');\n      Translate.set(Components.Sizes.slideWidth * Glide.index);\n    });\n    var startWidth = Components.Sizes.slideWidth * Components.Translate.getStartIndex();\n    return Translate.set(startWidth - Components.Translate.getTravelDistance());\n  });\n  /**\n   * Remove translate:\n   * - on destroying to bring markup to its inital state\n   */\n\n  Events.on('destroy', function () {\n    Translate.remove();\n  });\n  return Translate;\n}\n\nfunction Transition (Glide, Components, Events) {\n  /**\n   * Holds inactivity status of transition.\n   * When true transition is not applied.\n   *\n   * @type {Boolean}\n   */\n  var disabled = false;\n  var Transition = {\n    /**\n     * Composes string of the CSS transition.\n     *\n     * @param {String} property\n     * @return {String}\n     */\n    compose: function compose(property) {\n      var settings = Glide.settings;\n\n      if (!disabled) {\n        return \"\".concat(property, \" \").concat(this.duration, \"ms \").concat(settings.animationTimingFunc);\n      }\n\n      return \"\".concat(property, \" 0ms \").concat(settings.animationTimingFunc);\n    },\n\n    /**\n     * Sets value of transition on HTML element.\n     *\n     * @param {String=} property\n     * @return {Void}\n     */\n    set: function set() {\n      var property = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'transform';\n      Components.Html.wrapper.style.transition = this.compose(property);\n    },\n\n    /**\n     * Removes value of transition from HTML element.\n     *\n     * @return {Void}\n     */\n    remove: function remove() {\n      Components.Html.wrapper.style.transition = '';\n    },\n\n    /**\n     * Runs callback after animation.\n     *\n     * @param  {Function} callback\n     * @return {Void}\n     */\n    after: function after(callback) {\n      setTimeout(function () {\n        callback();\n      }, this.duration);\n    },\n\n    /**\n     * Enable transition.\n     *\n     * @return {Void}\n     */\n    enable: function enable() {\n      disabled = false;\n      this.set();\n    },\n\n    /**\n     * Disable transition.\n     *\n     * @return {Void}\n     */\n    disable: function disable() {\n      disabled = true;\n      this.set();\n    }\n  };\n  define(Transition, 'duration', {\n    /**\n     * Gets duration of the transition based\n     * on currently running animation type.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      var settings = Glide.settings;\n\n      if (Glide.isType('slider') && Components.Run.offset) {\n        return settings.rewindDuration;\n      }\n\n      return settings.animationDuration;\n    }\n  });\n  /**\n   * Set transition `style` value:\n   * - on each moving, because it may be cleared by offset move\n   */\n\n  Events.on('move', function () {\n    Transition.set();\n  });\n  /**\n   * Disable transition:\n   * - before initial build to avoid transitioning from `0` to `startAt` index\n   * - while resizing window and recalculating dimensions\n   * - on jumping from offset transition at start and end edges in `carousel` type\n   */\n\n  Events.on(['build.before', 'resize', 'translate.jump'], function () {\n    Transition.disable();\n  });\n  /**\n   * Enable transition:\n   * - on each running, because it may be disabled by offset move\n   */\n\n  Events.on('run', function () {\n    Transition.enable();\n  });\n  /**\n   * Remove transition:\n   * - on destroying to bring markup to its inital state\n   */\n\n  Events.on('destroy', function () {\n    Transition.remove();\n  });\n  return Transition;\n}\n\n/**\n * Test via a getter in the options object to see\n * if the passive property is accessed.\n *\n * @see https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection\n */\nvar supportsPassive = false;\n\ntry {\n  var opts = Object.defineProperty({}, 'passive', {\n    get: function get() {\n      supportsPassive = true;\n    }\n  });\n  window.addEventListener('testPassive', null, opts);\n  window.removeEventListener('testPassive', null, opts);\n} catch (e) {}\n\nvar supportsPassive$1 = supportsPassive;\n\nvar START_EVENTS = ['touchstart', 'mousedown'];\nvar MOVE_EVENTS = ['touchmove', 'mousemove'];\nvar END_EVENTS = ['touchend', 'touchcancel', 'mouseup', 'mouseleave'];\nvar MOUSE_EVENTS = ['mousedown', 'mousemove', 'mouseup', 'mouseleave'];\nfunction swipe (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n  var swipeSin = 0;\n  var swipeStartX = 0;\n  var swipeStartY = 0;\n  var disabled = false;\n  var capture = supportsPassive$1 ? {\n    passive: true\n  } : false;\n  var Swipe = {\n    /**\n     * Initializes swipe bindings.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      this.bindSwipeStart();\n    },\n\n    /**\n     * Handler for `swipestart` event. Calculates entry points of the user's tap.\n     *\n     * @param {Object} event\n     * @return {Void}\n     */\n    start: function start(event) {\n      if (!disabled && !Glide.disabled) {\n        this.disable();\n        var swipe = this.touches(event);\n        swipeSin = null;\n        swipeStartX = toInt(swipe.pageX);\n        swipeStartY = toInt(swipe.pageY);\n        this.bindSwipeMove();\n        this.bindSwipeEnd();\n        Events.emit('swipe.start');\n      }\n    },\n\n    /**\n     * Handler for `swipemove` event. Calculates user's tap angle and distance.\n     *\n     * @param {Object} event\n     */\n    move: function move(event) {\n      if (!Glide.disabled) {\n        var _Glide$settings = Glide.settings,\n            touchAngle = _Glide$settings.touchAngle,\n            touchRatio = _Glide$settings.touchRatio,\n            classes = _Glide$settings.classes;\n        var swipe = this.touches(event);\n        var subExSx = toInt(swipe.pageX) - swipeStartX;\n        var subEySy = toInt(swipe.pageY) - swipeStartY;\n        var powEX = Math.abs(subExSx << 2);\n        var powEY = Math.abs(subEySy << 2);\n        var swipeHypotenuse = Math.sqrt(powEX + powEY);\n        var swipeCathetus = Math.sqrt(powEY);\n        swipeSin = Math.asin(swipeCathetus / swipeHypotenuse);\n\n        if (swipeSin * 180 / Math.PI < touchAngle) {\n          event.stopPropagation();\n          Components.Move.make(subExSx * toFloat(touchRatio));\n          Components.Html.root.classList.add(classes.dragging);\n          Events.emit('swipe.move');\n        } else {\n          return false;\n        }\n      }\n    },\n\n    /**\n     * Handler for `swipeend` event. Finitializes user's tap and decides about glide move.\n     *\n     * @param {Object} event\n     * @return {Void}\n     */\n    end: function end(event) {\n      if (!Glide.disabled) {\n        var _Glide$settings2 = Glide.settings,\n            perSwipe = _Glide$settings2.perSwipe,\n            touchAngle = _Glide$settings2.touchAngle,\n            classes = _Glide$settings2.classes;\n        var swipe = this.touches(event);\n        var threshold = this.threshold(event);\n        var swipeDistance = swipe.pageX - swipeStartX;\n        var swipeDeg = swipeSin * 180 / Math.PI;\n        this.enable();\n\n        if (swipeDistance > threshold && swipeDeg < touchAngle) {\n          Components.Run.make(Components.Direction.resolve(\"\".concat(perSwipe, \"<\")));\n        } else if (swipeDistance < -threshold && swipeDeg < touchAngle) {\n          Components.Run.make(Components.Direction.resolve(\"\".concat(perSwipe, \">\")));\n        } else {\n          // While swipe don't reach distance apply previous transform.\n          Components.Move.make();\n        }\n\n        Components.Html.root.classList.remove(classes.dragging);\n        this.unbindSwipeMove();\n        this.unbindSwipeEnd();\n        Events.emit('swipe.end');\n      }\n    },\n\n    /**\n     * Binds swipe's starting event.\n     *\n     * @return {Void}\n     */\n    bindSwipeStart: function bindSwipeStart() {\n      var _this = this;\n\n      var _Glide$settings3 = Glide.settings,\n          swipeThreshold = _Glide$settings3.swipeThreshold,\n          dragThreshold = _Glide$settings3.dragThreshold;\n\n      if (swipeThreshold) {\n        Binder.on(START_EVENTS[0], Components.Html.wrapper, function (event) {\n          _this.start(event);\n        }, capture);\n      }\n\n      if (dragThreshold) {\n        Binder.on(START_EVENTS[1], Components.Html.wrapper, function (event) {\n          _this.start(event);\n        }, capture);\n      }\n    },\n\n    /**\n     * Unbinds swipe's starting event.\n     *\n     * @return {Void}\n     */\n    unbindSwipeStart: function unbindSwipeStart() {\n      Binder.off(START_EVENTS[0], Components.Html.wrapper, capture);\n      Binder.off(START_EVENTS[1], Components.Html.wrapper, capture);\n    },\n\n    /**\n     * Binds swipe's moving event.\n     *\n     * @return {Void}\n     */\n    bindSwipeMove: function bindSwipeMove() {\n      var _this2 = this;\n\n      Binder.on(MOVE_EVENTS, Components.Html.wrapper, throttle(function (event) {\n        _this2.move(event);\n      }, Glide.settings.throttle), capture);\n    },\n\n    /**\n     * Unbinds swipe's moving event.\n     *\n     * @return {Void}\n     */\n    unbindSwipeMove: function unbindSwipeMove() {\n      Binder.off(MOVE_EVENTS, Components.Html.wrapper, capture);\n    },\n\n    /**\n     * Binds swipe's ending event.\n     *\n     * @return {Void}\n     */\n    bindSwipeEnd: function bindSwipeEnd() {\n      var _this3 = this;\n\n      Binder.on(END_EVENTS, Components.Html.wrapper, function (event) {\n        _this3.end(event);\n      });\n    },\n\n    /**\n     * Unbinds swipe's ending event.\n     *\n     * @return {Void}\n     */\n    unbindSwipeEnd: function unbindSwipeEnd() {\n      Binder.off(END_EVENTS, Components.Html.wrapper);\n    },\n\n    /**\n     * Normalizes event touches points accorting to different types.\n     *\n     * @param {Object} event\n     */\n    touches: function touches(event) {\n      if (MOUSE_EVENTS.indexOf(event.type) > -1) {\n        return event;\n      }\n\n      return event.touches[0] || event.changedTouches[0];\n    },\n\n    /**\n     * Gets value of minimum swipe distance settings based on event type.\n     *\n     * @return {Number}\n     */\n    threshold: function threshold(event) {\n      var settings = Glide.settings;\n\n      if (MOUSE_EVENTS.indexOf(event.type) > -1) {\n        return settings.dragThreshold;\n      }\n\n      return settings.swipeThreshold;\n    },\n\n    /**\n     * Enables swipe event.\n     *\n     * @return {self}\n     */\n    enable: function enable() {\n      disabled = false;\n      Components.Transition.enable();\n      return this;\n    },\n\n    /**\n     * Disables swipe event.\n     *\n     * @return {self}\n     */\n    disable: function disable() {\n      disabled = true;\n      Components.Transition.disable();\n      return this;\n    }\n  };\n  /**\n   * Add component class:\n   * - after initial building\n   */\n\n  Events.on('build.after', function () {\n    Components.Html.root.classList.add(Glide.settings.classes.swipeable);\n  });\n  /**\n   * Remove swiping bindings:\n   * - on destroying, to remove added EventListeners\n   */\n\n  Events.on('destroy', function () {\n    Swipe.unbindSwipeStart();\n    Swipe.unbindSwipeMove();\n    Swipe.unbindSwipeEnd();\n    Binder.destroy();\n  });\n  return Swipe;\n}\n\nfunction images (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n  var Images = {\n    /**\n     * Binds listener to glide wrapper.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      this.bind();\n    },\n\n    /**\n     * Binds `dragstart` event on wrapper to prevent dragging images.\n     *\n     * @return {Void}\n     */\n    bind: function bind() {\n      Binder.on('dragstart', Components.Html.wrapper, this.dragstart);\n    },\n\n    /**\n     * Unbinds `dragstart` event on wrapper.\n     *\n     * @return {Void}\n     */\n    unbind: function unbind() {\n      Binder.off('dragstart', Components.Html.wrapper);\n    },\n\n    /**\n     * Event handler. Prevents dragging.\n     *\n     * @return {Void}\n     */\n    dragstart: function dragstart(event) {\n      event.preventDefault();\n    }\n  };\n  /**\n   * Remove bindings from images:\n   * - on destroying, to remove added EventListeners\n   */\n\n  Events.on('destroy', function () {\n    Images.unbind();\n    Binder.destroy();\n  });\n  return Images;\n}\n\nfunction anchors (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n  /**\n   * Holds detaching status of anchors.\n   * Prevents detaching of already detached anchors.\n   *\n   * @private\n   * @type {Boolean}\n   */\n\n  var detached = false;\n  /**\n   * Holds preventing status of anchors.\n   * If `true` redirection after click will be disabled.\n   *\n   * @private\n   * @type {Boolean}\n   */\n\n  var prevented = false;\n  var Anchors = {\n    /**\n     * Setups a initial state of anchors component.\n     *\n     * @returns {Void}\n     */\n    mount: function mount() {\n      /**\n       * Holds collection of anchors elements.\n       *\n       * @private\n       * @type {HTMLCollection}\n       */\n      this._a = Components.Html.wrapper.querySelectorAll('a');\n      this.bind();\n    },\n\n    /**\n     * Binds events to anchors inside a track.\n     *\n     * @return {Void}\n     */\n    bind: function bind() {\n      Binder.on('click', Components.Html.wrapper, this.click);\n    },\n\n    /**\n     * Unbinds events attached to anchors inside a track.\n     *\n     * @return {Void}\n     */\n    unbind: function unbind() {\n      Binder.off('click', Components.Html.wrapper);\n    },\n\n    /**\n     * Handler for click event. Prevents clicks when glide is in `prevent` status.\n     *\n     * @param  {Object} event\n     * @return {Void}\n     */\n    click: function click(event) {\n      if (prevented) {\n        event.stopPropagation();\n        event.preventDefault();\n      }\n    },\n\n    /**\n     * Detaches anchors click event inside glide.\n     *\n     * @return {self}\n     */\n    detach: function detach() {\n      prevented = true;\n\n      if (!detached) {\n        for (var i = 0; i < this.items.length; i++) {\n          this.items[i].draggable = false;\n        }\n\n        detached = true;\n      }\n\n      return this;\n    },\n\n    /**\n     * Attaches anchors click events inside glide.\n     *\n     * @return {self}\n     */\n    attach: function attach() {\n      prevented = false;\n\n      if (detached) {\n        for (var i = 0; i < this.items.length; i++) {\n          this.items[i].draggable = true;\n        }\n\n        detached = false;\n      }\n\n      return this;\n    }\n  };\n  define(Anchors, 'items', {\n    /**\n     * Gets collection of the arrows HTML elements.\n     *\n     * @return {HTMLElement[]}\n     */\n    get: function get() {\n      return Anchors._a;\n    }\n  });\n  /**\n   * Detach anchors inside slides:\n   * - on swiping, so they won't redirect to its `href` attributes\n   */\n\n  Events.on('swipe.move', function () {\n    Anchors.detach();\n  });\n  /**\n   * Attach anchors inside slides:\n   * - after swiping and transitions ends, so they can redirect after click again\n   */\n\n  Events.on('swipe.end', function () {\n    Components.Transition.after(function () {\n      Anchors.attach();\n    });\n  });\n  /**\n   * Unbind anchors inside slides:\n   * - on destroying, to bring anchors to its initial state\n   */\n\n  Events.on('destroy', function () {\n    Anchors.attach();\n    Anchors.unbind();\n    Binder.destroy();\n  });\n  return Anchors;\n}\n\nvar NAV_SELECTOR = '[data-glide-el=\"controls[nav]\"]';\nvar CONTROLS_SELECTOR = '[data-glide-el^=\"controls\"]';\nvar PREVIOUS_CONTROLS_SELECTOR = \"\".concat(CONTROLS_SELECTOR, \" [data-glide-dir*=\\\"<\\\"]\");\nvar NEXT_CONTROLS_SELECTOR = \"\".concat(CONTROLS_SELECTOR, \" [data-glide-dir*=\\\">\\\"]\");\nfunction controls (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n  var capture = supportsPassive$1 ? {\n    passive: true\n  } : false;\n  var Controls = {\n    /**\n     * Inits arrows. Binds events listeners\n     * to the arrows HTML elements.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      /**\n       * Collection of navigation HTML elements.\n       *\n       * @private\n       * @type {HTMLCollection}\n       */\n      this._n = Components.Html.root.querySelectorAll(NAV_SELECTOR);\n      /**\n       * Collection of controls HTML elements.\n       *\n       * @private\n       * @type {HTMLCollection}\n       */\n\n      this._c = Components.Html.root.querySelectorAll(CONTROLS_SELECTOR);\n      /**\n       * Collection of arrow control HTML elements.\n       *\n       * @private\n       * @type {Object}\n       */\n\n      this._arrowControls = {\n        previous: Components.Html.root.querySelectorAll(PREVIOUS_CONTROLS_SELECTOR),\n        next: Components.Html.root.querySelectorAll(NEXT_CONTROLS_SELECTOR)\n      };\n      this.addBindings();\n    },\n\n    /**\n     * Sets active class to current slide.\n     *\n     * @return {Void}\n     */\n    setActive: function setActive() {\n      for (var i = 0; i < this._n.length; i++) {\n        this.addClass(this._n[i].children);\n      }\n    },\n\n    /**\n     * Removes active class to current slide.\n     *\n     * @return {Void}\n     */\n    removeActive: function removeActive() {\n      for (var i = 0; i < this._n.length; i++) {\n        this.removeClass(this._n[i].children);\n      }\n    },\n\n    /**\n     * Toggles active class on items inside navigation.\n     *\n     * @param  {HTMLElement} controls\n     * @return {Void}\n     */\n    addClass: function addClass(controls) {\n      var settings = Glide.settings;\n      var item = controls[Glide.index];\n\n      if (!item) {\n        return;\n      }\n\n      if (item) {\n        item.classList.add(settings.classes.nav.active);\n        siblings(item).forEach(function (sibling) {\n          sibling.classList.remove(settings.classes.nav.active);\n        });\n      }\n    },\n\n    /**\n     * Removes active class from active control.\n     *\n     * @param  {HTMLElement} controls\n     * @return {Void}\n     */\n    removeClass: function removeClass(controls) {\n      var item = controls[Glide.index];\n\n      if (item) {\n        item.classList.remove(Glide.settings.classes.nav.active);\n      }\n    },\n\n    /**\n     * Calculates, removes or adds `Glide.settings.classes.disabledArrow` class on the control arrows\n     */\n    setArrowState: function setArrowState() {\n      if (Glide.settings.rewind) {\n        return;\n      }\n\n      var next = Controls._arrowControls.next;\n      var previous = Controls._arrowControls.previous;\n      this.resetArrowState(next, previous);\n\n      if (Glide.index === 0) {\n        this.disableArrow(previous);\n      }\n\n      if (Glide.index === Components.Run.length) {\n        this.disableArrow(next);\n      }\n    },\n\n    /**\n     * Removes `Glide.settings.classes.disabledArrow` from given NodeList elements\n     *\n     * @param {NodeList[]} lists\n     */\n    resetArrowState: function resetArrowState() {\n      var settings = Glide.settings;\n\n      for (var _len = arguments.length, lists = new Array(_len), _key = 0; _key < _len; _key++) {\n        lists[_key] = arguments[_key];\n      }\n\n      lists.forEach(function (list) {\n        toArray(list).forEach(function (element) {\n          element.classList.remove(settings.classes.arrow.disabled);\n        });\n      });\n    },\n\n    /**\n     * Adds `Glide.settings.classes.disabledArrow` to given NodeList elements\n     *\n     * @param {NodeList[]} lists\n     */\n    disableArrow: function disableArrow() {\n      var settings = Glide.settings;\n\n      for (var _len2 = arguments.length, lists = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        lists[_key2] = arguments[_key2];\n      }\n\n      lists.forEach(function (list) {\n        toArray(list).forEach(function (element) {\n          element.classList.add(settings.classes.arrow.disabled);\n        });\n      });\n    },\n\n    /**\n     * Adds handles to the each group of controls.\n     *\n     * @return {Void}\n     */\n    addBindings: function addBindings() {\n      for (var i = 0; i < this._c.length; i++) {\n        this.bind(this._c[i].children);\n      }\n    },\n\n    /**\n     * Removes handles from the each group of controls.\n     *\n     * @return {Void}\n     */\n    removeBindings: function removeBindings() {\n      for (var i = 0; i < this._c.length; i++) {\n        this.unbind(this._c[i].children);\n      }\n    },\n\n    /**\n     * Binds events to arrows HTML elements.\n     *\n     * @param {HTMLCollection} elements\n     * @return {Void}\n     */\n    bind: function bind(elements) {\n      for (var i = 0; i < elements.length; i++) {\n        Binder.on('click', elements[i], this.click);\n        Binder.on('touchstart', elements[i], this.click, capture);\n      }\n    },\n\n    /**\n     * Unbinds events binded to the arrows HTML elements.\n     *\n     * @param {HTMLCollection} elements\n     * @return {Void}\n     */\n    unbind: function unbind(elements) {\n      for (var i = 0; i < elements.length; i++) {\n        Binder.off(['click', 'touchstart'], elements[i]);\n      }\n    },\n\n    /**\n     * Handles `click` event on the arrows HTML elements.\n     * Moves slider in direction given via the\n     * `data-glide-dir` attribute.\n     *\n     * @param {Object} event\n     * @return {void}\n     */\n    click: function click(event) {\n      if (!supportsPassive$1 && event.type === 'touchstart') {\n        event.preventDefault();\n      }\n\n      var direction = event.currentTarget.getAttribute('data-glide-dir');\n      Components.Run.make(Components.Direction.resolve(direction));\n    }\n  };\n  define(Controls, 'items', {\n    /**\n     * Gets collection of the controls HTML elements.\n     *\n     * @return {HTMLElement[]}\n     */\n    get: function get() {\n      return Controls._c;\n    }\n  });\n  /**\n   * Swap active class of current navigation item:\n   * - after mounting to set it to initial index\n   * - after each move to the new index\n   */\n\n  Events.on(['mount.after', 'move.after'], function () {\n    Controls.setActive();\n  });\n  /**\n   * Add or remove disabled class of arrow elements\n   */\n\n  Events.on(['mount.after', 'run'], function () {\n    Controls.setArrowState();\n  });\n  /**\n   * Remove bindings and HTML Classes:\n   * - on destroying, to bring markup to its initial state\n   */\n\n  Events.on('destroy', function () {\n    Controls.removeBindings();\n    Controls.removeActive();\n    Binder.destroy();\n  });\n  return Controls;\n}\n\nfunction keyboard (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n  var Keyboard = {\n    /**\n     * Binds keyboard events on component mount.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      if (Glide.settings.keyboard) {\n        this.bind();\n      }\n    },\n\n    /**\n     * Adds keyboard press events.\n     *\n     * @return {Void}\n     */\n    bind: function bind() {\n      Binder.on('keyup', document, this.press);\n    },\n\n    /**\n     * Removes keyboard press events.\n     *\n     * @return {Void}\n     */\n    unbind: function unbind() {\n      Binder.off('keyup', document);\n    },\n\n    /**\n     * Handles keyboard's arrows press and moving glide foward and backward.\n     *\n     * @param  {Object} event\n     * @return {Void}\n     */\n    press: function press(event) {\n      var perSwipe = Glide.settings.perSwipe;\n\n      if (event.code === 'ArrowRight') {\n        Components.Run.make(Components.Direction.resolve(\"\".concat(perSwipe, \">\")));\n      }\n\n      if (event.code === 'ArrowLeft') {\n        Components.Run.make(Components.Direction.resolve(\"\".concat(perSwipe, \"<\")));\n      }\n    }\n  };\n  /**\n   * Remove bindings from keyboard:\n   * - on destroying to remove added events\n   * - on updating to remove events before remounting\n   */\n\n  Events.on(['destroy', 'update'], function () {\n    Keyboard.unbind();\n  });\n  /**\n   * Remount component\n   * - on updating to reflect potential changes in settings\n   */\n\n  Events.on('update', function () {\n    Keyboard.mount();\n  });\n  /**\n   * Destroy binder:\n   * - on destroying to remove listeners\n   */\n\n  Events.on('destroy', function () {\n    Binder.destroy();\n  });\n  return Keyboard;\n}\n\nfunction autoplay (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n  var Autoplay = {\n    /**\n     * Initializes autoplaying and events.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      this.enable();\n      this.start();\n\n      if (Glide.settings.hoverpause) {\n        this.bind();\n      }\n    },\n\n    /**\n     * Enables autoplaying\n     *\n     * @returns {Void}\n     */\n    enable: function enable() {\n      this._e = true;\n    },\n\n    /**\n     * Disables autoplaying.\n     *\n     * @returns {Void}\n     */\n    disable: function disable() {\n      this._e = false;\n    },\n\n    /**\n     * Starts autoplaying in configured interval.\n     *\n     * @param {Boolean|Number} force Run autoplaying with passed interval regardless of `autoplay` settings\n     * @return {Void}\n     */\n    start: function start() {\n      var _this = this;\n\n      if (!this._e) {\n        return;\n      }\n\n      this.enable();\n\n      if (Glide.settings.autoplay) {\n        if (isUndefined(this._i)) {\n          this._i = setInterval(function () {\n            _this.stop();\n\n            Components.Run.make('>');\n\n            _this.start();\n\n            Events.emit('autoplay');\n          }, this.time);\n        }\n      }\n    },\n\n    /**\n     * Stops autorunning of the glide.\n     *\n     * @return {Void}\n     */\n    stop: function stop() {\n      this._i = clearInterval(this._i);\n    },\n\n    /**\n     * Stops autoplaying while mouse is over glide's area.\n     *\n     * @return {Void}\n     */\n    bind: function bind() {\n      var _this2 = this;\n\n      Binder.on('mouseover', Components.Html.root, function () {\n        if (_this2._e) {\n          _this2.stop();\n        }\n      });\n      Binder.on('mouseout', Components.Html.root, function () {\n        if (_this2._e) {\n          _this2.start();\n        }\n      });\n    },\n\n    /**\n     * Unbind mouseover events.\n     *\n     * @returns {Void}\n     */\n    unbind: function unbind() {\n      Binder.off(['mouseover', 'mouseout'], Components.Html.root);\n    }\n  };\n  define(Autoplay, 'time', {\n    /**\n     * Gets time period value for the autoplay interval. Prioritizes\n     * times in `data-glide-autoplay` attrubutes over options.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      var autoplay = Components.Html.slides[Glide.index].getAttribute('data-glide-autoplay');\n\n      if (autoplay) {\n        return toInt(autoplay);\n      }\n\n      return toInt(Glide.settings.autoplay);\n    }\n  });\n  /**\n   * Stop autoplaying and unbind events:\n   * - on destroying, to clear defined interval\n   * - on updating via API to reset interval that may changed\n   */\n\n  Events.on(['destroy', 'update'], function () {\n    Autoplay.unbind();\n  });\n  /**\n   * Stop autoplaying:\n   * - before each run, to restart autoplaying\n   * - on pausing via API\n   * - on destroying, to clear defined interval\n   * - while starting a swipe\n   * - on updating via API to reset interval that may changed\n   */\n\n  Events.on(['run.before', 'swipe.start', 'update'], function () {\n    Autoplay.stop();\n  });\n  Events.on(['pause', 'destroy'], function () {\n    Autoplay.disable();\n    Autoplay.stop();\n  });\n  /**\n   * Start autoplaying:\n   * - after each run, to restart autoplaying\n   * - on playing via API\n   * - while ending a swipe\n   */\n\n  Events.on(['run.after', 'swipe.end'], function () {\n    Autoplay.start();\n  });\n  /**\n   * Start autoplaying:\n   * - after each run, to restart autoplaying\n   * - on playing via API\n   * - while ending a swipe\n   */\n\n  Events.on(['play'], function () {\n    Autoplay.enable();\n    Autoplay.start();\n  });\n  /**\n   * Remount autoplaying:\n   * - on updating via API to reset interval that may changed\n   */\n\n  Events.on('update', function () {\n    Autoplay.mount();\n  });\n  /**\n   * Destroy a binder:\n   * - on destroying glide instance to clearup listeners\n   */\n\n  Events.on('destroy', function () {\n    Binder.destroy();\n  });\n  return Autoplay;\n}\n\n/**\n * Sorts keys of breakpoint object so they will be ordered from lower to bigger.\n *\n * @param {Object} points\n * @returns {Object}\n */\n\nfunction sortBreakpoints(points) {\n  if (isObject(points)) {\n    return sortKeys(points);\n  } else {\n    warn(\"Breakpoints option must be an object\");\n  }\n\n  return {};\n}\n\nfunction breakpoints (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n  /**\n   * Holds reference to settings.\n   *\n   * @type {Object}\n   */\n\n  var settings = Glide.settings;\n  /**\n   * Holds reference to breakpoints object in settings. Sorts breakpoints\n   * from smaller to larger. It is required in order to proper\n   * matching currently active breakpoint settings.\n   *\n   * @type {Object}\n   */\n\n  var points = sortBreakpoints(settings.breakpoints);\n  /**\n   * Cache initial settings before overwritting.\n   *\n   * @type {Object}\n   */\n\n  var defaults = Object.assign({}, settings);\n  var Breakpoints = {\n    /**\n     * Matches settings for currectly matching media breakpoint.\n     *\n     * @param {Object} points\n     * @returns {Object}\n     */\n    match: function match(points) {\n      if (typeof window.matchMedia !== 'undefined') {\n        for (var point in points) {\n          if (points.hasOwnProperty(point)) {\n            if (window.matchMedia(\"(max-width: \".concat(point, \"px)\")).matches) {\n              return points[point];\n            }\n          }\n        }\n      }\n\n      return defaults;\n    }\n  };\n  /**\n   * Overwrite instance settings with currently matching breakpoint settings.\n   * This happens right after component initialization.\n   */\n\n  Object.assign(settings, Breakpoints.match(points));\n  /**\n   * Update glide with settings of matched brekpoint:\n   * - window resize to update slider\n   */\n\n  Binder.on('resize', window, throttle(function () {\n    Glide.settings = mergeOptions(settings, Breakpoints.match(points));\n  }, Glide.settings.throttle));\n  /**\n   * Resort and update default settings:\n   * - on reinit via API, so breakpoint matching will be performed with options\n   */\n\n  Events.on('update', function () {\n    points = sortBreakpoints(points);\n    defaults = Object.assign({}, settings);\n  });\n  /**\n   * Unbind resize listener:\n   * - on destroying, to bring markup to its initial state\n   */\n\n  Events.on('destroy', function () {\n    Binder.off('resize', window);\n  });\n  return Breakpoints;\n}\n\nvar COMPONENTS = {\n  Html: Html,\n  Translate: Translate,\n  Transition: Transition,\n  Direction: Direction,\n  Peek: Peek,\n  Sizes: Sizes,\n  Gaps: Gaps,\n  Move: Move,\n  Clones: Clones,\n  Resize: Resize,\n  Build: Build,\n  Run: Run\n};\n\nvar Glide = /*#__PURE__*/function (_Core) {\n  _inherits(Glide, _Core);\n\n  var _super = _createSuper(Glide);\n\n  function Glide() {\n    _classCallCheck(this, Glide);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(Glide, [{\n    key: \"mount\",\n    value: function mount() {\n      var extensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      return _get(_getPrototypeOf(Glide.prototype), \"mount\", this).call(this, Object.assign({}, COMPONENTS, extensions));\n    }\n  }]);\n\n  return Glide;\n}(Glide$1);\n\nexport { anchors as Anchors, autoplay as Autoplay, breakpoints as Breakpoints, controls as Controls, images as Images, keyboard as Keyboard, swipe as Swipe, Glide as default };\n","import Polyfill from \"../Polyfill\";\r\n\r\nconst sliderRootSelector = '.glide';\r\nconst sliderGroupSelector = '.glide__slides';\r\nconst basicMarkup = `\r\n<div class=\"glide\">\r\n    <div class=\"glide__track\" data-glide-el=\"track\">\r\n        <ul class=\"glide__slides\">            \r\n        </ul>\r\n    </div>\r\n    <div class=\"glide__arrows\" data-glide-el=\"controls\">\r\n        <button class=\"glide__arrow glide__arrow--left\" data-glide-dir=\"<\">prev</button>\r\n        <button class=\"glide__arrow glide__arrow--right\" data-glide-dir=\">\">next</button>\r\n    </div>\r\n</div>`;\r\n\r\nexport default class SliderTransformator {\r\n\r\n    constructor(sourceGroupElement, sourceElementSelector, doShowNav) {\r\n        this.elementSelector = sourceElementSelector;\r\n        this.sourceGroupElement = sourceGroupElement;\r\n        this.doShowNav = doShowNav;\r\n        this.sourceElements = this.getSourceElements();\r\n    }\r\n\r\n    getSourceElements() {\r\n        if (this.sourceGroupElement === null) {\r\n            return null;\r\n        }\r\n        return this.sourceGroupElement.querySelectorAll(this.elementSelector);\r\n    }\r\n\r\n    transform(numberOfItemsPerSlide) {\r\n        if (this.sourceGroupElement === null || this.sourceElements === null) {\r\n            return null;\r\n        }\r\n\r\n        if (this.sourceElements.length === 0) {\r\n            return null;\r\n        }\r\n        // cleanup\r\n        let sliderRoot = this.sourceGroupElement.querySelector(sliderRootSelector);\r\n\r\n        if (sliderRoot !== null) {\r\n            sliderRoot.remove();\r\n        }\r\n        // transformation\r\n\r\n        let sliderMarkup = document.createRange().createContextualFragment(basicMarkup);\r\n        if (!this.doShowNav) {\r\n\r\n            let controlElement = sliderMarkup.querySelector('.glide__arrows');\r\n\r\n            Polyfill.removeHtmlElementNode(controlElement);\r\n        }\r\n        let sliderGroupElement = sliderMarkup.querySelector(sliderGroupSelector);\r\n        let currentSliderElement = null;\r\n\r\n        for(let index=0; index<this.sourceElements.length; index++) {\r\n            let element = this.sourceElements[index];\r\n            if (index % numberOfItemsPerSlide === 0) {\r\n                currentSliderElement = document.createElement('li');\r\n                currentSliderElement.className = 'glide__slide';\r\n                sliderGroupElement.appendChild(currentSliderElement);\r\n            }\r\n            currentSliderElement.appendChild(element);\r\n        }\r\n\r\n        this.sourceGroupElement.appendChild(sliderMarkup);\r\n\r\n        return this.sourceGroupElement.querySelector(sliderRootSelector);\r\n\r\n    }\r\n\r\n}\r\n","export default class CamelCaseConverter {\r\n\r\n    static toCamelCase(str) {\r\n        return str.replace(/-([a-z])/g, function (m, w) {\r\n            return w.toUpperCase();\r\n        });\r\n    }\r\n}\r\n","import CamelCaseConverter from \"../utils/camelCaseConverter\";\r\n\r\nconst prefix = \"data-slider-\";\r\n\r\nexport default class SliderOptions {\r\n\r\n    constructor(element) {\r\n        this.element = element;\r\n        this.options = Object.assign({\r\n            autoplay: false,\r\n            slidesElementsSelector: '',\r\n            numberOfRowsPerSlide: 1,\r\n            showNav: 'true',\r\n        }, SliderOptions._parseOptions(element));\r\n    }\r\n\r\n\r\n    /**\r\n     *\r\n     * @param element HTMLElement\r\n     * @private\r\n     */\r\n    static _parseOptions(element) {\r\n        let options = {};\r\n\r\n        let attributes = element.attributes;\r\n        for (let i =0; i< attributes.length; i++) {\r\n            if (attributes[i].name.indexOf(prefix) === 0) {\r\n                options[CamelCaseConverter.toCamelCase(attributes[i].name.replace(prefix,''))] = attributes[i].value;\r\n            }\r\n        }\r\n\r\n        return options;\r\n    }\r\n\r\n    getAutoPlay() {\r\n\r\n        if (this.options.autoplay === false) {\r\n            return false;\r\n        }\r\n        return parseInt(this.options.autoplay);\r\n    }\r\n\r\n    getSlidesElementsSelector() {\r\n        return this.options.slidesElementsSelector;\r\n    }\r\n\r\n    doShowNav() {\r\n        return this.options.showNav === 'true';\r\n    }\r\n\r\n    getNumberOfRowsPerSlide() {\r\n        return parseInt(this.options.numberOfRowsPerSlide);\r\n    }\r\n}\r\n","export default class ElementSize {\r\n    /**\r\n     *\r\n     * @param element\r\n     * @returns float\r\n     */\r\n    static getOuterWidth(element) {\r\n        var domRect = element.getBoundingClientRect();\r\n        let computedStyle = getComputedStyle(element);\r\n        let marginLeft = parseFloat(computedStyle.marginLeft);\r\n        let marginRight = parseFloat(computedStyle.marginRight);\r\n        return domRect.width + marginLeft + marginRight;\r\n    }\r\n\r\n    /**\r\n     * Tries to find out, how many elements we can fit into the container so\r\n     * they do not wrap.\r\n     *\r\n     * @param containerElement\r\n     * @param element\r\n     * @param numberOfRows\r\n     * @returns {number}\r\n     */\r\n    static calclateNumberOfFittingItemsPerSlide(containerElement, element, numberOfRows) {\r\n\r\n        if (null == element || containerElement == null) {\r\n            return 1;\r\n        }\r\n\r\n        var domRect = containerElement.getBoundingClientRect();\r\n        let numberOfItemsPerSlide = Math.floor(domRect.width / ElementSize.getOuterWidth(element)) * numberOfRows;\r\n\r\n\r\n        if (numberOfItemsPerSlide < 1) {\r\n            numberOfItemsPerSlide = 1 * numberOfRows;\r\n        }\r\n\r\n        return numberOfItemsPerSlide;\r\n    }\r\n}\r\n","export default class EventgalleryLazyload {\r\n\r\n    static instance = null;\r\n    static knownImageUrls = [];\r\n\r\n    constructor() {\r\n        this.options = {\r\n            elementSelector: 'img.eventgallery-lazyme',\r\n            classForLoaded: 'eventgallery-lazyload-loaded',\r\n            classForLoading: 'eventgallery-lazyload-loading'\r\n        }\r\n\r\n        if ('IntersectionObserver' in window &&\r\n            'IntersectionObserverEntry' in window &&\r\n            'intersectionRatio' in window.IntersectionObserverEntry.prototype) {\r\n\r\n            // Minimal polyfill for Edge 15's lack of `isIntersecting`\r\n            // See: https://github.com/w3c/IntersectionObserver/issues/211\r\n            if (!('isIntersecting' in window.IntersectionObserverEntry.prototype)) {\r\n                Object.defineProperty(window.IntersectionObserverEntry.prototype,\r\n                    'isIntersecting', {\r\n                        get: function () {\r\n                            return this.intersectionRatio > 0;\r\n                        }\r\n                    });\r\n            }\r\n\r\n\r\n            this.imageObserver = new IntersectionObserver((entries, imgObserver) => {\r\n                entries.forEach((entry) => {\r\n                    if (entry.isIntersecting) {\r\n                        const lazyImage = entry.target;\r\n                        if (lazyImage.dataset.src) {\r\n                            lazyImage.setAttribute('srcset', lazyImage.dataset.src);\r\n\r\n                            if (!EventgalleryLazyload.knownImageUrls.includes(lazyImage.dataset.src)) {\r\n                                EventgalleryLazyload.knownImageUrls.push(lazyImage.dataset.src);\r\n                                lazyImage.classList.add('eventgallery-lazyload-loading');\r\n                                lazyImage.classList.remove('eventgallery-lazyload-loaded');\r\n\r\n                                let img = document.createElement('img');\r\n                                img.src = lazyImage.dataset.src;\r\n                                img.onload = () => {\r\n                                    lazyImage.classList.remove('eventgallery-lazyload-loading');\r\n                                    lazyImage.classList.add('eventgallery-lazyload-loaded');\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                })\r\n            });\r\n        }\r\n    }\r\n\r\n    static watchImages() {\r\n        if (!EventgalleryLazyload.instance) {\r\n            EventgalleryLazyload.instance = new EventgalleryLazyload();\r\n        } else {\r\n            return;\r\n        }\r\n\r\n        let lazyImages = document.querySelectorAll(EventgalleryLazyload.instance.options.elementSelector);\r\n\r\n        for (let i = 0; i < lazyImages.length; i++) {\r\n            let lazyImage = lazyImages[i];\r\n\r\n            if (lazyImage.dataset.src) {\r\n                if (EventgalleryLazyload.instance.imageObserver) {\r\n                    EventgalleryLazyload.instance.imageObserver.observe(lazyImage);\r\n                } else {\r\n                    lazyImage.setAttribute('srcset', lazyImage.dataset.src);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n","import Anchor from \"../glide_modules/anchor\"\r\nimport Glide, { Controls, Breakpoints, Swipe, Autoplay, Images  } from '@glidejs/glide/dist/glide.modular.esm'\r\nimport SliderTransformator from \"./SliderTransformator\";\r\nimport SliderOptions from \"./SliderOptions\";\r\nimport ElementSize from \"../utils/ElementSize\";\r\nimport EventgalleryLazyload from \"../EventgalleryLazyload\";\r\n\r\nexport default class SliderStarter {\r\n\r\n    constructor(sourceGroupElement) {\r\n        this.sourceGroupElement = sourceGroupElement;\r\n        this.sliderTransformator = null;\r\n    }\r\n\r\n    start() {\r\n\r\n        this.sliderOptions = SliderStarter._loadOptions(this.sourceGroupElement);\r\n\r\n        let sourceElementSelector = this.sliderOptions.getSlidesElementsSelector();\r\n        let autoplay = this.sliderOptions.getAutoPlay();\r\n        let doShowNav = this.sliderOptions.doShowNav();\r\n        let numberOfItemsPerSlide = ElementSize.calclateNumberOfFittingItemsPerSlide(this.sourceGroupElement, this.sourceGroupElement.querySelector(sourceElementSelector), this.sliderOptions.getNumberOfRowsPerSlide());\r\n\r\n        if (null == this.sliderTransformator) {\r\n            this.sliderTransformator = new SliderTransformator(this.sourceGroupElement, sourceElementSelector, doShowNav);\r\n        }\r\n        let rootElement = this.sliderTransformator.transform(numberOfItemsPerSlide);\r\n\r\n        if (rootElement === null) {\r\n            return;\r\n        }\r\n\r\n        EventgalleryLazyload.watchImages();\r\n\r\n        let glide = new Glide(rootElement, {\r\n            type: 'carousel',\r\n            perView: 1,\r\n            gap: 15,\r\n            keyboard: false,\r\n            autoplay: autoplay\r\n        });\r\n\r\n        glide.mount({ Swipe, Controls, Breakpoints, Autoplay, Anchor, Images  });\r\n\r\n    }\r\n\r\n    static _loadOptions(element) {\r\n        return new SliderOptions(element);\r\n    }\r\n\r\n\r\n}\r\n","/*\r\n     Class to manage an image. This can be the img tag or a container. It has to manage glue itself.\r\n     */\r\n\r\nimport {calcBorderWidth, getElementHeight, getElementWidth, mergeObjects} from \"../../common/js/Helpers\";\r\nimport SizeCalculator from \"./EventgallerySizeCalculator\";\r\n\r\nexport default class Image{\r\n    constructor(image, index, newOptions) {\r\n        this.options = mergeObjects(this.options, newOptions);\r\n        /**\r\n         * HTMLElement\r\n         */\r\n        this.imageTagContainer = image;\r\n        this.index = index;\r\n        this.calculatedWidth = 0;\r\n        this.calcSize();\r\n    }\r\n\r\n    calcSize() {\r\n        // glue includes everything but the image width/heigt: margin, padding, border\r\n        let image = this.imageTagContainer.querySelector('img');\r\n\r\n        if (!image) {\r\n            return;\r\n        }\r\n\r\n        let elements = [this.imageTagContainer, image];\r\n\r\n        this.glueLeft = calcBorderWidth(elements, ['paddingLeft', 'marginLeft', 'borderLeftWidth']);\r\n        this.glueRight = calcBorderWidth(elements, ['paddingRight', 'marginRight', 'borderRightWidth']);\r\n        this.glueTop = calcBorderWidth(elements, ['paddingTop', 'marginTop', 'borderTopWidth']);\r\n        this.glueBottom = calcBorderWidth(elements, ['paddingBottom', 'marginBottom', 'borderBottomWidth']);\r\n\r\n        // get image size from data- attributes\r\n\r\n        this.width = parseInt(image.getAttribute(\"data-width\"));\r\n        this.height = parseInt(image.getAttribute(\"data-height\"));\r\n\r\n        // fallback of data- attributes are not there\r\n        if (this.width === undefined) {\r\n            this.width = getElementWidth(this.imageTagContainer) - this.glueLeft - this.glueRight;\r\n        }\r\n\r\n        if (this.height === undefined) {\r\n            this.height = getElementHeight(this.imageTagContainer) - this.glueTop - this.glueBottom;\r\n        }\r\n    };\r\n\r\n    /**\r\n     * calculates the height of that image container. This includes the image and the gap on top/bottom\r\n     *\r\n     * @returns number\r\n     */\r\n    getImageTagHeight() {\r\n        return parseFloat(window.getComputedStyle(this.imageTagContainer).height) + this.glueTop + this.glueBottom;\r\n    };\r\n\r\n    setSize(width, height) {\r\n\r\n        let isFlickr = false;\r\n        let newWidth = width - this.glueLeft - this.glueRight;\r\n        let newHeight = height - this.glueTop - this.glueBottom;\r\n\r\n        let ratio = this.width / this.height;\r\n\r\n        //console.log(\"the size of the image should be: \"+width+\"x\"+height+\" so I have to set it to: \"+newWidth+\"x\"+newHeight);\r\n        //adjust background images\r\n        let image = this.imageTagContainer.querySelector('img');\r\n        if (!image) {\r\n            return;\r\n        }\r\n\r\n        let sizeCalculator = new SizeCalculator();\r\n\r\n        let dataSrc = image.getAttribute('data-src');\r\n        if (!dataSrc) {\r\n            dataSrc = \"\";\r\n        }\r\n\r\n        let secret = image.getAttribute('data-secret');\r\n\r\n        if (secret !== null) {\r\n            let secret_o = image.getAttribute('data-secret_o');\r\n            let secret_h = image.getAttribute('data-secret_h');\r\n            let secret_k = image.getAttribute('data-secret_k');\r\n            let farm = image.getAttribute('data-farm');\r\n            let server = image.getAttribute('data-server');\r\n            let id = image.getAttribute('data-id');\r\n            let imageUrl = sizeCalculator.getFlickrURL(farm, server, secret, secret_h, secret_k, secret_o, id, newWidth, newHeight, this.width, this.height);\r\n\r\n            dataSrc = imageUrl;\r\n\r\n            isFlickr = true;\r\n\r\n        } else {\r\n            let googleWidth = sizeCalculator.getSize(newWidth, newHeight, ratio);\r\n            dataSrc = sizeCalculator.adjustImageURL(dataSrc, googleWidth);\r\n        }\r\n\r\n        image.setAttribute('data-src', dataSrc);\r\n        image.setAttribute('srcset', dataSrc);\r\n        image.style.display = 'block';\r\n        image.style.margin = 'auto';\r\n\r\n        // IE8 fix: check the width/height first\r\n        if (newWidth>0) {\r\n            image.style.width = newWidth + 'px';\r\n        }\r\n        if (newHeight>0) {\r\n            image.style.height = newHeight + 'px' ;\r\n        }\r\n    };\r\n\r\n    hide() {\r\n        this.imageTagContainer.style.display = 'none';\r\n    }\r\n\r\n    show() {\r\n        this.imageTagContainer.style.display = 'block';\r\n    }\r\n}\r\n\r\n","import {mergeObjects} from \"../../common/js/Helpers\";\r\n\r\nexport default class Row {\r\n\r\n    /* processes a row is a image list */\r\n    constructor(newOptions) {\r\n\r\n        this.options = {\r\n            maxWidth: 960,\r\n            maxHeight: 250,\r\n            heightJitter: 0,\r\n            adjustHeight: true,\r\n            doFillLastRow: true\r\n        };\r\n        this.options = mergeObjects(this.options, newOptions);\r\n        this.isLastRow = false;\r\n        this.images = [];\r\n        this.width = 0;\r\n        if (this.options.heightJitter > 0) {\r\n            this.options.maxHeight = Math.floor(this.options.maxHeight + (Math.random() * 2 * this.options.heightJitter) - this.options.heightJitter);\r\n        }\r\n    };\r\n\r\n    add(eventgalleryImage) {\r\n        let imageWidth = Math.floor(eventgalleryImage.width / eventgalleryImage.height * this.options.maxHeight);\r\n\r\n        // determine the number of images per line. return false if the row is full.\r\n        let addThisImage = this.width + imageWidth <= this.options.maxWidth || this.images.length === 0;\r\n\r\n        if (!addThisImage) {\r\n            let gap = Math.abs(this.options.maxWidth - this.width - imageWidth) / this.options.maxWidth;\r\n            if (gap < 0.2) {\r\n                addThisImage = true;\r\n            }\r\n        }\r\n\r\n        // determine the number of images per line. return false if the row if full.\r\n        if (addThisImage) {\r\n            this.images.push(eventgalleryImage);\r\n            eventgalleryImage.calculatedWidth = imageWidth;\r\n            this.width = this.width + imageWidth;\r\n            return true;\r\n        } else {\r\n            return false;\r\n        }\r\n    };\r\n\r\n    processRow() {\r\n        let gap, rowHeight, i;\r\n\r\n        gap = this.options.maxWidth - this.width;\r\n\r\n        // if there is no gap to fill, we need to resize the last row to fit the image.\r\n        if (this.isLastRow && this.options.doFillLastRow === false && gap >= 0) {\r\n            if (gap >= 0) {\r\n                gap = 0;\r\n            }\r\n            rowHeight = this.options.maxHeight;\r\n        } else {\r\n\r\n            rowHeight = this.options.maxHeight / (this.width / this.options.maxWidth);\r\n        }\r\n\r\n        if (this.options.adjustHeight === false) {\r\n            rowHeight = this.options.maxHeight;\r\n        }\r\n\r\n        for (i = 0; i < this.images.length; i++) {\r\n            var image = this.images[i];\r\n\r\n            var calculatedWidth = image.calculatedWidth;\r\n\r\n            // how much of the gap does this element need to fill?\r\n            var gapToClose = (calculatedWidth / this.width) * gap;\r\n\r\n            image.setSize(calculatedWidth + gapToClose, rowHeight);\r\n        }\r\n    }\r\n\r\n}\r\n","import {forEach, getElementWidth, mergeObjects} from \"../../common/js/Helpers\";\r\nimport Image from \"./EventgalleryImage\";\r\nimport Row from \"./EventgalleryRow\";\r\n\r\nexport default class Imagelist {\r\n\r\n    constructor(newOptions) {\r\n\r\n        this.options = {\r\n            rowHeightPercentage: 100,\r\n            rowHeight: 150,\r\n            rowHeightJitter: 0,\r\n            minImageWidth: 150,\r\n            // resize the last image to full width\r\n            doFillLastRow: false,\r\n            // the object where we try to get the width from\r\n            imagesetContainer: null,\r\n            // the object containing all the images elements. Usually they are retieved with a selector like '.imagelist a',\r\n            imageset: null,\r\n            firstImageRowHeight: 2,\r\n            initComplete: function () {\r\n            },\r\n            resizeStart: function () {\r\n            },\r\n            resizeComplete: function () {\r\n            }\r\n        };\r\n        this.images = [];\r\n        // used to compare for width changes\r\n        this.eventgalleryPageWidth = 0;\r\n        // the width of the container. This is kind of tricky since there can be many containers or just one.\r\n        this.width = null;\r\n        this.options = mergeObjects(this.options, newOptions);\r\n        if (undefined !== newOptions) {\r\n            this.initialize();\r\n        }\r\n    };\r\n\r\n    initialize() {\r\n\r\n        this.width = getElementWidth(this.options.imagesetContainer);\r\n\r\n        // save the current width so we don't react on an resize event if not necessary\r\n        this.eventgalleryPageWidth = this.width;\r\n\r\n        this.images = [];\r\n\r\n        forEach(this.options.imageset, (item, index) => {\r\n            this.images.push(new Image(item, index));\r\n        })\r\n\r\n        window.addEventListener('resize', () => {\r\n            window.clearTimeout(this.eventgalleryTimer);\r\n\r\n            this.eventgalleryTimer = setTimeout(() => {\r\n                let new_width = getElementWidth(this.options.imagesetContainer);\r\n                this.width = new_width;\r\n                if (this.eventgalleryPageWidth !== new_width) {\r\n                    this.options.resizeStart();\r\n                    this.eventgalleryPageWidth = new_width;\r\n\r\n                    this.options.imagesetContainer.style.minHeight = (this.options.rowHeight * this.images.length) + 'px';\r\n\r\n                    this.processList();\r\n\r\n                    this.options.imagesetContainer.style.minHeight = '0px';\r\n\r\n                    this.options.resizeComplete();\r\n                }\r\n            }, 500);\r\n\r\n        });\r\n\r\n        this.options.imagesetContainer.style.minHeight = (this.options.rowHeight * this.images.length) + 'px';\r\n\r\n        this.processList();\r\n\r\n        this.options.imagesetContainer.style.minHeight = '0px';\r\n\r\n        //add a tiny timeout. This prevents some issue with lazyload\r\n        //where images didn't load since the offset was wrong.\r\n        window.setTimeout(this.options.initComplete, 1);\r\n    };\r\n\r\n    /*calculated the with of an element*/\r\n    getRowWidth() {\r\n        var rowWidth = this.width;\r\n\r\n        /* fix for the internet explorer if width if 45.666% == 699.87px*/\r\n        if (window.getComputedStyle) {\r\n            rowWidth = Math.floor(parseFloat(window.getComputedStyle(this.options.imagesetContainer).width)) - 1;\r\n        } else {\r\n            rowWidth = rowWidth - 1;\r\n        }\r\n\r\n        return rowWidth;\r\n    };\r\n\r\n    /* processes the image list*/\r\n    processList() {\r\n        let options;\r\n\r\n        /* find out how much space we have*/\r\n        let rowWidth = this.getRowWidth();\r\n\r\n\r\n        /* get a copy of the image list because we will pop the image during iteration*/\r\n        let imagesToProcess = this.images.slice(0);\r\n\r\n        if (imagesToProcess.length === 0) {\r\n            return;\r\n        }\r\n\r\n        /* display the first image larger */\r\n        if (this.options.firstImageRowHeight > 1) {\r\n            let image = imagesToProcess.shift();\r\n\r\n            /*if we have a large image, we have to hide it to get the real available space*/\r\n            image.hide();\r\n            rowWidth = this.getRowWidth();\r\n            image.show();\r\n\r\n            let imageHeight = this.options.firstImageRowHeight * this.options.rowHeight;\r\n            let imageWidth = Math.floor(image.width / image.height * imageHeight);\r\n\r\n            if (imageWidth + this.options.minImageWidth >= rowWidth) {\r\n                imageWidth = rowWidth;\r\n            }\r\n\r\n            image.setSize(imageWidth, imageHeight);\r\n\r\n            let rowHeightForRightSideImages = this.options.rowHeight;\r\n\r\n            // in case the browser zooms to 110%, we need to make sure, the first image is smaller thand\r\n            // the images to the right. We do this by checking if there is a height difference between the\r\n            // height we want to get and the actual height. If there is one, we add a pixel to the rows\r\n            // on the right side.\r\n\r\n            // even if the left side is smaller than the right side, the browsers still have an issue with floating.\r\n            // Example: left: 499.98px, right: 249,98px*2=499.96 => issue! So we make the left side a tiny bit bigger.\r\n            rowHeightForRightSideImages = (imageHeight + 0.05) / this.options.firstImageRowHeight;\r\n            if (imageHeight > image.getImageTagHeight()) {\r\n                rowHeightForRightSideImages = (imageHeight + 1) / this.options.firstImageRowHeight;\r\n            }\r\n\r\n            options = {\r\n                maxWidth: rowWidth - imageWidth,\r\n                maxHeight: rowHeightForRightSideImages,\r\n                adjustHeight: false\r\n            };\r\n\r\n            if (options.maxWidth > 0) {\r\n                this.generateRows(imagesToProcess, this.options.firstImageRowHeight, options, false);\r\n            }\r\n        }\r\n\r\n        options = {\r\n            maxWidth: rowWidth,\r\n            maxHeight: this.options.rowHeight,\r\n            heightJitter: this.options.rowHeightJitter,\r\n            doFillLastRow: this.options.doFillLastRow\r\n        };\r\n\r\n        this.generateRows(imagesToProcess, 99999, options, true);\r\n\r\n    };\r\n\r\n    /**\r\n     * @param imagesToProcess\r\n     * @param numberOfRowsToCreate\r\n     * @param options\r\n     * @param finalRows\r\n     */\r\n     generateRows(imagesToProcess, numberOfRowsToCreate, options, finalRows) {\r\n        let currentRow = new Row(options);\r\n\r\n        while (imagesToProcess.length > 0 && numberOfRowsToCreate > 0) {\r\n            let addSuccessfull = currentRow.add(imagesToProcess[0]);\r\n            if (addSuccessfull) {\r\n                imagesToProcess.shift();\r\n            } else {\r\n                currentRow.processRow();\r\n                numberOfRowsToCreate--;\r\n                if (numberOfRowsToCreate === 0) break;\r\n                currentRow = new Row(options);\r\n            }\r\n        }\r\n\r\n        if (finalRows) {\r\n            currentRow.isLastRow = true;\r\n        }\r\n        currentRow.processRow();\r\n    };\r\n\r\n}\r\n","import Imagelist from \"./EventgalleryImageList\";\r\nimport {forEach} from \"../../common/js/Helpers\";\r\n\r\nexport default class EventsList extends Imagelist{\r\n    constructor(newOptions) {\r\n        super(newOptions);\r\n    }\r\n\r\n    processList() {\r\n        let width = this.width;\r\n        forEach(this.images, (image) => {\r\n            let height = Math.ceil(width * this.options.rowHeightPercentage / 100);\r\n            image.setSize(width, height);\r\n        })\r\n\r\n    };\r\n}\r\n","import Imagelist from \"./EventgalleryImageList\";\r\nimport {forEach} from \"../../common/js/Helpers\";\r\n\r\n/* processes a list of images and tries to resize separately*/\r\nexport default class EventsTiles extends Imagelist {\r\n    constructor(newOptions) {\r\n        super(newOptions);\r\n    }\r\n\r\n    processList() {\r\n        let width = this.width;\r\n        forEach(this.images, (image) => {\r\n            let newHeight = Math.round(image.height / image.width * width);\r\n            let newWidth = width;\r\n            if (this.options.adjustMode == \"height\" && image.height > image.width) {\r\n                newHeight = width;\r\n                newWidth = Math.round(image.width / image.height * newHeight);\r\n            }\r\n            image.setSize(newWidth, newHeight);\r\n\r\n        });\r\n    }\r\n};\r\n","import Imagelist from \"./EventgalleryImageList\";\r\nimport {forEach} from \"../../common/js/Helpers\";\r\n\r\n/**\r\n * Formats a list of images to appear square sized. This class is doing something like the Grid layout for events.\r\n * @param newOptions\r\n * @constructor\r\n */\r\nexport default class SquareList extends Imagelist {\r\n    constructor(newOptions) {\r\n        super(newOptions);\r\n    }\r\n\r\n    processList() {\r\n        var width = this.width;\r\n        forEach(this.images, (image) => {\r\n            image.setSize(width, width);\r\n        });\r\n    };\r\n}\r\n","import {forEach, mergeObjects} from \"../../common/js/Helpers\";\r\n\r\n// create a tile layout and centers images in a tile\r\nexport default class TilesCollection {\r\n\r\n    constructor(newOptions) {\r\n\r\n        this.options = {\r\n            tiles: null, // document.querySelector('#events-tiles .event')\r\n            tilesContainer: [] //'#events-tiles .event-tiles'\r\n        };\r\n\r\n        this.options = mergeObjects(this.options, newOptions);\r\n        this.tiles = this.options.tiles;\r\n        this.tilesContainer = this.options.tilesContainer;\r\n    };\r\n\r\n\r\n    calculate() {\r\n        let tilesPerRow = 1;\r\n\r\n        // reset grid to support resize and media queries\r\n        forEach(this.tiles, (tile) => {\r\n            tile.style.visibility = 'hidden';\r\n            tile.style.position = 'static';\r\n            tile.style.float = 'left';\r\n        })\r\n\r\n        let firstExampleTile = this.tiles[0];\r\n        let columnWidth = firstExampleTile.offsetWidth;\r\n        let y = firstExampleTile.offsetTop;\r\n\r\n        for (let i = 1; i < this.tiles.length; i++) {\r\n            if (this.tiles[i].offsetTop !== y) {\r\n                break;\r\n            }\r\n            tilesPerRow++;\r\n        }\r\n\r\n        // create array of height values for the columns\r\n        let columnHeight = [];\r\n        for (let i = 0; i < tilesPerRow; i++) {\r\n            columnHeight.push(0);\r\n        }\r\n\r\n        forEach(this.tiles, (tile)=> {\r\n            let smallestColumn = this.getSmallestColumn(columnHeight);\r\n            tile.style.left = smallestColumn * columnWidth + 'px';\r\n            tile.style.top = columnHeight[smallestColumn] + 'px';\r\n            columnHeight[smallestColumn] = columnHeight[smallestColumn] + tile.offsetHeight;\r\n\r\n            tile.style.visibility = 'visible';\r\n            tile.style.position = 'absolute';\r\n            tile.style.float = 'none';\r\n        });\r\n\r\n        this.tilesContainer.style.height = columnHeight[this.getHighestColumn(columnHeight)] + 'px';\r\n    };\r\n\r\n    /*\r\n    * returns the position of the smallest value in the array\r\n    */\r\n    getSmallestColumn(columnHeight) {\r\n\r\n        let smallestColumnValue = columnHeight[0];\r\n        let smallestColumnNumber = 0;\r\n\r\n        for (let i = 0; i < columnHeight.length; i++) {\r\n            if (smallestColumnValue > columnHeight[i]) {\r\n                smallestColumnValue = columnHeight[i];\r\n                smallestColumnNumber = i;\r\n            }\r\n\r\n        }\r\n        return smallestColumnNumber;\r\n\r\n    };\r\n\r\n    /*\r\n    * returns the position of the highest value in the array\r\n    */\r\n    getHighestColumn(columnHeight) {\r\n\r\n        let columnValue = columnHeight[0];\r\n        let columnNumber = 0;\r\n\r\n        for (let i = 0; i < columnHeight.length; i++) {\r\n            if (columnValue < columnHeight[i]) {\r\n                columnValue = columnHeight[i];\r\n                columnNumber = i;\r\n            }\r\n\r\n        }\r\n        return columnNumber;\r\n\r\n    };\r\n}\r\n","export default class URLHelper {\r\n\r\n    constructor() {\r\n    }\r\n\r\n    /**\r\n     * splits a URL parameter like foo=bar&1=2 into a parameter map\r\n     *\r\n     * @param urlParameterString\r\n     * @returns {Map<any, any>}\r\n     */\r\n    static parseURLParameter(urlParameterString) {\r\n        let pairs = urlParameterString.split('&');\r\n        let parameters = new Map();\r\n\r\n        pairs.forEach(pair => {\r\n            let splittedPair = pair.split('=');\r\n            if (splittedPair.length === 2) {\r\n                parameters.set(splittedPair[0], splittedPair[1]);\r\n            }\r\n        });\r\n\r\n        return parameters;\r\n    }\r\n\r\n    /**\r\n     * returns a map of the query string of an full url\r\n     *\r\n     * @param urlSring\r\n     * @returns {URLSearchParams}\r\n     */\r\n    static getParameters(urlSring) {\r\n        let parts = urlSring.split('?');\r\n        if (parts.length < 2) {\r\n            return new Map();\r\n        }\r\n        let queryParts = parts[1].split('#');\r\n        return URLHelper.parseURLParameter(queryParts[0]);\r\n    }\r\n\r\n    /**\r\n     * returns the url from strings like \"url ('foobar.jpg')\"\r\n     *\r\n     * @param urlString\r\n     * @returns {*}\r\n     */\r\n    static extractBackgroudUrl(urlString) {\r\n        return urlString.replace(/(url\\(|\\)|\"|')/g, '');\r\n    }\r\n};\r\n\r\n\r\n","import URLHelper from \"./URLHelper\";\r\n\r\nconst LOADING_MATCHER = 'gp.svg';\r\nconst MARKER_IMAGE_IS_IN_PROGRESS_ATTRIBUTE = 'data-eg-gp-processing';\r\n\r\nexport default class GooglePhotosProcessor {\r\n\r\n\r\n\r\n    constructor() {\r\n\r\n        this.albumUrl = \"\";\r\n        this.albumsUrl = \"\";\r\n\r\n        // noinspection JSUnresolvedVariable\r\n        if (window.EventGalleryGooglePhotosConfiguration) {\r\n            this.albumUrl = window.EventGalleryGooglePhotosConfiguration.albumUrl;\r\n            this.albumsUrl = window.EventGalleryGooglePhotosConfiguration.albumsUrl;\r\n        }\r\n\r\n        this.imageAddedCallback = (e) => this.processImages(e);\r\n        document.addEventListener(\"eventgallery-images-added\", this.imageAddedCallback, true);\r\n    };\r\n\r\n    destroy() {\r\n        document.removeEventListener(\"eventgallery-images-added\", this.imageAddedCallback, true);\r\n    }\r\n\r\n    // noinspection JSUnusedGlobalSymbols\r\n    processImages(e) {\r\n        let doReloadLightbox = true;\r\n        if (e?.detail?.isOverlay) {\r\n            doReloadLightbox = false;\r\n        }\r\n        let albums = this._groupByAlbum(this._collectHTMLElements());\r\n        this._markImagesAsInProgress(albums);\r\n        this._getMainImageDataFromServer(albums, doReloadLightbox);\r\n    }\r\n\r\n    // noinspection JSMethodCanBeStatic\r\n    /**\r\n     * Grabs IMG tag items from the DOM for Google Photos image placeholder.\r\n     *\r\n     * @returns <Element>[]\r\n     * @private\r\n     */\r\n     _collectHTMLElements() {\r\n        let htmlCollection = document.getElementsByTagName('IMG');\r\n\r\n        let foundImageHTMLElements = /** @type {HTMLElement} */[...htmlCollection];\r\n\r\n        let result = foundImageHTMLElements.filter(img => {\r\n            let imageSrcSet = img.getAttribute('srcset');\r\n            let dataSrc = img.getAttribute('data-src');\r\n            let src = img.src;\r\n\r\n            if (img.getAttribute(MARKER_IMAGE_IS_IN_PROGRESS_ATTRIBUTE) === '1') {\r\n                return false;\r\n            }\r\n\r\n            return (imageSrcSet && imageSrcSet.indexOf(LOADING_MATCHER)>0)\r\n                || (dataSrc && dataSrc.indexOf(LOADING_MATCHER)>0)\r\n                || (src && src.indexOf(LOADING_MATCHER)>0);\r\n        });\r\n\r\n        htmlCollection = document.getElementsByTagName('A');\r\n        let foundLinkHTMLElements = /** @type {HTMLElement} */[...htmlCollection];\r\n        result = result.concat(foundLinkHTMLElements.filter(a => {\r\n            let dataSrc = a.getAttribute('data-src');\r\n            let rel = a.getAttribute('rel');\r\n            let href = a.getAttribute('href');\r\n\r\n            if (a.getAttribute(MARKER_IMAGE_IS_IN_PROGRESS_ATTRIBUTE) === '1') {\r\n                return false;\r\n            }\r\n            return (href && href.indexOf(LOADING_MATCHER)>0)\r\n                || (dataSrc && dataSrc.indexOf(LOADING_MATCHER)>0)\r\n                || (rel && rel.indexOf(LOADING_MATCHER)>0);\r\n        }));\r\n\r\n        return result;\r\n\r\n    }\r\n\r\n    /**\r\n     *\r\n     * @param albums {Map<any, any>}\r\n     * @private\r\n     */\r\n    _markImagesAsInProgress(albums) {\r\n        for (let [foldername, album] of albums) {\r\n            /**\r\n             * @var ParsedHTMLElement parsedHTMLElement\r\n             */\r\n            album.forEach(parsedHTMLElement => {\r\n              parsedHTMLElement.getHTMLElement().setAttribute(MARKER_IMAGE_IS_IN_PROGRESS_ATTRIBUTE, 1);\r\n            })\r\n        }\r\n    }\r\n\r\n    /**\r\n     * sorts all found images into a map: key=folder, value=array of\r\n     *\r\n     * @param htmlElements\r\n     * @returns {Map<any, any>}\r\n     * @private\r\n     */\r\n    _groupByAlbum(htmlElements) {\r\n        let albums = new Map();\r\n        htmlElements.forEach((imageHTMLElement) => {\r\n           let parsedHTMLElement = this._parseHTMLElement(imageHTMLElement);\r\n            parsedHTMLElement.updateParameters();\r\n           let folder = parsedHTMLElement.parameters.get('folder');\r\n\r\n           if (!albums.get(folder)) {\r\n             albums.set(folder, []);\r\n           }\r\n\r\n           albums.get(folder).push(parsedHTMLElement);\r\n        });\r\n\r\n        return albums;\r\n    }\r\n\r\n    // noinspection JSMethodCanBeStatic\r\n    /**\r\n     *\r\n     * @param htmlElement\r\n     * @returns {ParsedHTMLElement}\r\n     * @private\r\n     */\r\n    _parseHTMLElement(htmlElement) {\r\n        if (htmlElement.tagName === 'IMG') {\r\n            return new ParsedImageHTMLElement(htmlElement);\r\n        }\r\n        return new ParsedLinkHTMLElement(htmlElement);\r\n    }\r\n\r\n\r\n    /**\r\n     * starts several requests to the server to determine\r\n     *\r\n     * @param albums\r\n     * @private\r\n     */\r\n    _getAlbumDataFromServer(albums, doReloadLightbox) {\r\n        for (let [foldername, album] of albums) {\r\n            this._doAlbumRequest(foldername, album, doReloadLightbox);\r\n        }\r\n    }\r\n\r\n    _doAlbumRequest(foldername, album, doReloadLightbox) {\r\n        if (!this.albumUrl || !foldername) return;\r\n        fetch(this.albumUrl + '&folder=' + foldername)\r\n            .then(response => response.json())\r\n            .then(data => this._processAlbumResult(album, data, doReloadLightbox));\r\n    }\r\n\r\n    _processAlbumResult(album, data, doReloadLightbox) {\r\n        this._replaceImages(album, data, doReloadLightbox);\r\n    }\r\n\r\n    _getMainImageDataFromServer(albums, doReloadLightbox) {\r\n        let albumsWithMainImagesOnly = this._filterForAlbumsWithMainImageOnly(albums);\r\n\r\n        if (albumsWithMainImagesOnly.size > 0) {\r\n            this._doAlbumsRequest(albumsWithMainImagesOnly, albums, doReloadLightbox);\r\n            for (let [foldername, album] of albumsWithMainImagesOnly) {\r\n                albums.delete(foldername);\r\n            }\r\n        }\r\n\r\n        this._getAlbumDataFromServer(albums, doReloadLightbox);\r\n    }\r\n\r\n    _doAlbumsRequest(albumsWithMainImagesOnly, albums, doReloadLightbox) {\r\n        if (!this.albumsUrl) return;\r\n        fetch(this.albumsUrl)\r\n            .then(response => response.json())\r\n            .then(data => this._processAlbumsResult(albumsWithMainImagesOnly, albums, data, doReloadLightbox));\r\n    }\r\n\r\n    _processAlbumsResult(albumsWithMainImagesOnly, albums, data, doReloadLightbox) {\r\n        for (let [key, album] of albumsWithMainImagesOnly) {\r\n            this._replaceImages(album, data[key], doReloadLightbox);\r\n        }\r\n        this._getAlbumDataFromServer(albums, doReloadLightbox);\r\n    }\r\n\r\n    // noinspection JSMethodCanBeStatic\r\n    _filterForAlbumsWithMainImageOnly(albums) {\r\n        let newAlbums = new Map();\r\n        for(let [key, album] of albums) {\r\n            let mainImages = album.filter(image => image.isMainImage());\r\n\r\n            if (mainImages.length> 0 && mainImages.length === album.length) {\r\n                newAlbums.set(key, album);\r\n            }\r\n        }\r\n        return newAlbums;\r\n    }\r\n\r\n    _replaceImages(album, serverResult, doReloadLightbox) {\r\n        if (album === undefined || serverResult === undefined) {\r\n            return;\r\n        }\r\n\r\n        album.forEach(parsedImageHTMLElement => {\r\n            let imageUrl = serverResult[parsedImageHTMLElement.getFile()];\r\n            if (imageUrl === undefined) {\r\n                return false;\r\n            }\r\n\r\n            parsedImageHTMLElement.updateParameters();\r\n            parsedImageHTMLElement.replaceElementLinks(imageUrl);\r\n            parsedImageHTMLElement.getHTMLElement().setAttribute(MARKER_IMAGE_IS_IN_PROGRESS_ATTRIBUTE, 0);\r\n\r\n        });\r\n\r\n        if (doReloadLightbox && window.Eventgallery?.lightbox) {\r\n            if (Eventgallery.lightbox.isOpen()) {\r\n                let link = Eventgallery.lightbox.getCurrentSlide().thumbEl;\r\n                Eventgallery.lightbox._gallery.close();\r\n                setTimeout(()=>link.click(),500);\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\nclass ParsedHTMLElement {\r\n    constructor(htmlElement) {\r\n        this.htmlElement = htmlElement;\r\n        this.parameters = null;\r\n        this.attributeNames = new Set();\r\n    }\r\n\r\n    updateParametersWithUrl(url) {\r\n        let parameterString = url.substring(url.indexOf('#')+1);\r\n        this.parameters = URLHelper.parseURLParameter(parameterString);\r\n    }\r\n\r\n    updateParameters() {\r\n        for(let n of this.attributeNames) {\r\n            let url = this.getHTMLElement().getAttribute(n);\r\n            if (url && url.indexOf(LOADING_MATCHER)>0) {\r\n                this.updateParametersWithUrl(url);\r\n                return;\r\n            }\r\n        }\r\n    }\r\n\r\n\r\n    replaceElementLinks(imageUrl) {\r\n\r\n        for(let n of this.attributeNames) {\r\n            let url = this.getHTMLElement().getAttribute(n);\r\n            if (url && url.indexOf(LOADING_MATCHER)>0) {\r\n                this.getHTMLElement().setAttribute(n, this.getImageUrl(imageUrl, this.getWidth(url)));\r\n            }\r\n        }\r\n    }\r\n\r\n    getHTMLElement() {\r\n        return this.htmlElement;\r\n    }\r\n\r\n    getFolder() {\r\n        return this.parameters.get('folder');\r\n    }\r\n\r\n    getFile() {\r\n        return this.parameters.get('file');\r\n    }\r\n\r\n\r\n    getWidth(url) {\r\n        return URLHelper.parseURLParameter(url).get('width');\r\n    }\r\n\r\n    getImageUrl(imageUrl, width) {\r\n        return imageUrl + '=w' + width;\r\n    }\r\n\r\n    isMainImage() {\r\n        return this.parameters.get('m') === '1';\r\n    }\r\n}\r\n\r\nclass ParsedLinkHTMLElement extends ParsedHTMLElement {\r\n\r\n    constructor(htmlElement) {\r\n        super(htmlElement);\r\n        this.attributeNames = new Set(['href', 'data-src', 'rel']);\r\n    }\r\n\r\n}\r\n\r\nclass ParsedImageHTMLElement extends ParsedHTMLElement{\r\n\r\n    constructor(htmlElement) {\r\n        super(htmlElement);\r\n        this.attributeNames = new Set(['src', 'data-src', 'srcset']);\r\n    }\r\n}\r\n","import PhotoSwipeGallery from \"./photoswipe/PhotoSwipeGallery\";\r\nimport Overlay from \"./Overlay\";\r\nimport SliderStarter from \"./slider/SliderStarter\";\r\nimport Polyfill from \"./Polyfill\";\r\nimport EventgalleryLazyload from \"./EventgalleryLazyload\";\r\nimport {forEach} from \"../../common/js/Helpers\";\r\nimport EventsList from \"./EventgalleryEventsList\";\r\nimport Imagelist from \"./EventgalleryImageList\";\r\nimport EventsTiles from \"./EventgalleryEventsTiles\";\r\nimport SquareList from \"./EventgallerySquareList\";\r\nimport TilesCollection from \"./EventgalleryTilesCollection\";\r\nimport GooglePhotosProcessor from \"./EventgalleryGooglePhotosProcessor\";\r\n\r\n(function(Eventgallery){\r\n\t\"use strict\";\r\n\tdocument.addEventListener('DOMContentLoaded', () =>{\r\n\r\n\t\t/*\r\n\t\t* GRID LIST OF EVENTS\r\n\t\t*/\r\n\r\n\t\tfunction triggerLazyLoading() {\r\n\t\t\tEventgalleryLazyload.watchImages();\r\n\t\t}\r\n\r\n\t\tforEach(document.querySelectorAll('.eventgallery-events-gridlist'), (container) => {\r\n\t\t\tlet thumbnails = container.querySelectorAll('.event-thumbnails .event-thumbnail');\r\n\r\n\t        let options = {\r\n\t            rowHeightPercentage: 100,\r\n\t            imagesetContainer: container.querySelector('.event-thumbnails'),\r\n\t            imageset: thumbnails,\r\n\t            initComplete: function () {\r\n                    triggerLazyLoading();\r\n\t            },\r\n\t            resizeStart: function () {\r\n\r\n\t            },\r\n\t            resizeComplete: function () {\r\n\t\t\t\t\tdocument.dispatchEvent(Polyfill.createNewEvent('scroll', null));\r\n\t            }\r\n\t        };\r\n\r\n\t        // initialize the imagelist\r\n\r\n\t        if (thumbnails.length>0) {\r\n\t        \tnew EventsList(options);\r\n\t        }\r\n        });\r\n\r\n\r\n\t\t/*\r\n\t\t* TILE LIST OF EVENTS\r\n\t\t*/\r\n\t\tforEach(document.querySelectorAll('.eventgallery-events-tiles-list'), (container) => {\r\n\r\n\t        var options = {\r\n\t            imagesetContainer: container.querySelector('.event-thumbnails'),\r\n\t            imageset: container.querySelectorAll('.event-thumbnail'),\r\n\t            eventgalleryTilesCollection: null,\r\n\t            initComplete: function () {\r\n\t\t\t\t\ttriggerLazyLoading();\r\n\r\n\t                var tilesOptions = {\r\n\t                    tiles: container.querySelectorAll('.eventgallery-tiles .eventgallery-tile'),\r\n\t                    tilesContainer: container.querySelector('.eventgallery-tiles')\r\n\t                };\r\n\t                options.eventgalleryTilesCollection = new TilesCollection(tilesOptions);\r\n\t                options.eventgalleryTilesCollection.calculate();\r\n\t                // we need to recalculate the whole thing because it might happen that a font loads\r\n\t                // and the size of a tile changes.\r\n\t\t\t\t\twindow.addEventListener('load', function(){\r\n\t                    options.eventgalleryTilesCollection.calculate();\r\n\t                });\r\n\r\n\t            },\r\n\t            resizeStart: function () {\r\n\r\n\t            },\r\n\t            resizeComplete: function () {\r\n\t                options.eventgalleryTilesCollection.calculate();\r\n\t\t\t\t\tdocument.dispatchEvent(Polyfill.createNewEvent('scroll', null));\r\n\t            }\r\n\t        };\r\n\r\n\t        // initialize the imagelist\r\n\t        new EventsTiles(options);\r\n\r\n\t    });\r\n\r\n\t\t/*\r\n\t\t* TILES LIST OF IMAGES\r\n\t\t*/\r\n\t\tforEach(document.querySelectorAll('.eventgallery-event-tiles-list'), (container) => {\r\n\t        let options = {\r\n\t            imagesetContainer: container.querySelector('.event-thumbnails'),\r\n\t            imageset: container.querySelectorAll('.event-thumbnail'),\r\n\t            adjustMode: 'width',\r\n\t            eventgalleryTilesCollection: null,\r\n\t            initComplete: function () {\r\n\r\n\t                let tilesOptions = {\r\n\t                    tiles: container.querySelectorAll('.eventgallery-tiles .eventgallery-tile'),\r\n\t                    tilesContainer: container.querySelector('.eventgallery-tiles')\r\n\t                };\r\n\r\n                    options.eventgalleryTilesCollection = new TilesCollection(tilesOptions);\r\n                    options.eventgalleryTilesCollection.calculate();\r\n\r\n\t                // we need to recalculate the whole thing because it might happen that a font loads\r\n\t                // and the size of a tile changes.\r\n\t                window.addEventListener('load', function(){\r\n\t                    options.eventgalleryTilesCollection.calculate();\r\n\t                });\r\n\r\n\t\t\t\t\ttriggerLazyLoading();\r\n\r\n\t            },\r\n\t            resizeStart: function () {\r\n\r\n\t            },\r\n\t            resizeComplete: function () {\r\n\t                options.eventgalleryTilesCollection.calculate();\r\n\t                document.dispatchEvent(Polyfill.createNewEvent('scroll', null));\r\n\t            }\r\n\t        };\r\n\r\n\t        // initialize the imagelist\r\n\t        new EventsTiles(options);\r\n    \t});\r\n\r\n\t\t/*\r\n\t\t* SIMPLE IMAGE LIST\r\n\t\t*/\r\n\t\tforEach(document.querySelectorAll('.eventgallery-event-gridlist'), (container) => {\r\n\t\t\tlet options = {\r\n                imagesetContainer: container.querySelector('.event-thumbnails'),\r\n                imageset: container.querySelectorAll('.event-thumbnail'),\r\n                adjustMode: 'height',\r\n                initComplete: function () {\r\n\t\t\t\t\ttriggerLazyLoading();\r\n                },\r\n                resizeStart: function () {\r\n\r\n                },\r\n                resizeComplete: function () {\r\n                    document.dispatchEvent(Polyfill.createNewEvent('scroll', null));\r\n                }\r\n            };\r\n\r\n            // initialize the imagelist\r\n            new EventsTiles(options);\r\n\t\t});\r\n\r\n\t\t/*\r\n\t\t* IMAGE LIST\r\n\t\t*/\r\n\t\tforEach(document.querySelectorAll('.eventgallery-imagelist'), (container) => {\r\n            let options = {\r\n                rowHeight: parseInt(container.getAttribute('data-rowheight')),\r\n                rowHeightJitter: parseInt(container.getAttribute('data-rowheightjitter')),\r\n                firstImageRowHeight: parseInt(container.getAttribute('data-firstimagerowheight')),\r\n                doFillLastRow: container.getAttribute('data-dofilllastrow') === 'true',\r\n                imagesetContainer: container,\r\n                imageset: container.querySelectorAll('.thumbnail'),\r\n\r\n                initComplete: function () {\r\n\t\t\t\t\ttriggerLazyLoading();\r\n                },\r\n                resizeStart: function () {\r\n\r\n                },\r\n                resizeComplete: function () {\r\n                    document.dispatchEvent(Polyfill.createNewEvent('scroll', null));\r\n                }\r\n            };\r\n\r\n            // initialize the imagelist\r\n            new Imagelist(options);\r\n        });\r\n\r\n\t\t/*\r\n\t\t * SQUARE SIZED LIST OF IMAGES\r\n\t\t */\r\n\t\tforEach(document.querySelectorAll('.eventgallery-event-square-list'), (container) => {\r\n\t\t\tlet options = {\r\n\t\t\t\timagesetContainer: container.querySelector('.event-thumbnails'),\r\n\t\t\t\timageset: container.querySelectorAll('.event-thumbnail'),\r\n\t\t\t\tadjustMode: 'width',\r\n\t\t\t\tinitComplete: function () {\r\n\t\t\t\t\ttriggerLazyLoading();\r\n\t\t\t\t},\r\n\t\t\t\tresizeStart: function () {\r\n\r\n\t\t\t\t},\r\n\t\t\t\tresizeComplete: function () {\r\n\t\t\t\t\tdocument.dispatchEvent(Polyfill.createNewEvent('scroll', null));\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t// initialize the imagelist\r\n\t\t\tnew SquareList(options);\r\n\t\t});\r\n\r\n\r\n        /**\r\n\t\t * Lightbox init\r\n         * @type {PhotoSwipeGallery}\r\n         */\r\n        Eventgallery.lightbox = new PhotoSwipeGallery();\r\n        Eventgallery.lightbox.initPhotoSwipe();\r\n\r\n        /**\r\n\t\t * Single Image Page\r\n         */\r\n\t\tforEach(document.querySelectorAll('.singleimage-zoom'), (e) => {\r\n\t\t\te.addEventListener('click', (e) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tdocument.getElementById('bigimagelink').click();\r\n\t\t\t})\r\n\t\t})\r\n\r\n        /**\r\n\t\t * content overlay (example: checkout review page)\r\n         */\r\n\t\tforEach(document.querySelectorAll('a[data-eventgallery-overlay]'), (el) => {\r\n\t\t\tlet contentId = el.getAttribute('href');\r\n\t\t\tel.addEventListener('click', (e) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tlet overlay = new Overlay();\r\n\t\t\t\toverlay.openOverlay(document.getElementById(contentId.replace('#', '')).innerHTML);\r\n\t\t\t});\r\n\t\t})\r\n\r\n        let googlePhotosProcessor = new GooglePhotosProcessor();\r\n        document.dispatchEvent(Polyfill.createNewEvent('eventgallery-images-added'));\r\n\r\n\r\n        let sliderElements = document.querySelectorAll('div[data-slider=\"1\"]');\r\n\r\n\r\n        for(let i=0; i<sliderElements.length; i++) {\r\n            let sliderStarter = new SliderStarter(sliderElements[i]);\r\n            let timer = null;\r\n            sliderStarter.start();\r\n\r\n            window.addEventListener(\"resize\", () => {\r\n            \tif (timer != null) {\r\n            \t\tclearTimeout(timer);\r\n\t\t\t\t}\r\n            \ttimer = setTimeout(() => sliderStarter.start(), 1000);\r\n            }, false);\r\n        }\r\n\r\n\r\n\r\n    }); //end domready\r\n})(Eventgallery);\r\n\r\n","\r\n/* determines the size of an image so a image server can deliver it. */\r\n\r\nimport {mergeObjects} from \"../../common/js/Helpers\";\r\n\r\nexport default class SizeCalculator {\r\n    constructor(newOptions) {\r\n        this.options = {\r\n            // to be able to handle internal and google picasa images, we need to restrict the availabe image sizes.\r\n            availableSizes: [48, 104, 160, 288, 320, 400, 512, 640, 720, 800, 1024, 1280, 1440],\r\n            flickrSizes:   {100 : 't', 240 : 'm', 320 : 'n', 500 : '-', 640 : 'z', 800 : 'c', 1024 : 'b', 1600 : 'h', 2048 : 'k'}\r\n\r\n        };\r\n        this.options = mergeObjects(this.options, newOptions);\r\n    }\r\n\r\n    adjustImageURL(url, size) {\r\n\r\n        // only needed for Google Photos\r\n        url = url.replace(/=w(\\d+)$/, '=w' + size);\r\n\r\n        // neded for Picasa\r\n        url = url.replace(/\\/s(\\d*)\\//, '/s' + size + '/');\r\n        url = url.replace(/\\/s(\\d*)-c\\//, '/s' + size + '-c/');\r\n\r\n        // used by Event Gallery\r\n        url = url.replace(/width=(\\d+)/, 'width=' + size);\r\n        url = url.replace(/\\/mainimage_nocrop_(\\d+)_/, '/mainimage_nocrop_' + size + '_');\r\n        url = url.replace(/\\/nocrop_(\\d+)_/, '/nocrop_' + size + '_');\r\n\r\n        return url;\r\n    };\r\n\r\n\r\n    getFlickrURL(farm, server, secret,  secret_h, secret_k, secret_o, id, width, height, originalwidth, originalheight) {\r\n        let longSideSize,\r\n            originalLongSideSize,\r\n            sizeCode,\r\n            secretString,\r\n            sizeString;\r\n\r\n        let minSizes = this.getMinSizes(width, height, originalwidth, originalheight);\r\n\r\n\r\n        if (minSizes.width > minSizes.height) {\r\n            longSideSize = minSizes.width;\r\n            originalLongSideSize = originalwidth;\r\n        } else {\r\n            longSideSize = minSizes.height;\r\n            originalLongSideSize = originalheight;\r\n        }\r\n\r\n        sizeCode = 'o';\r\n\r\n        if (originalLongSideSize >= longSideSize) {\r\n            for (let size in this.options.flickrSizes) {\r\n                if (size > longSideSize) {\r\n                    sizeCode = this.options.flickrSizes[size];\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (sizeCode === 'o' && secret_o === '') {\r\n            sizeCode = 'k'\r\n        }\r\n\r\n        if (sizeCode === 'k' && secret_k === '') {\r\n            sizeCode = 'h'\r\n        }\r\n\r\n        if (sizeCode === 'h' && secret_h === '') {\r\n            sizeCode = 'b'\r\n        }\r\n\r\n        switch (sizeCode) {\r\n            case \"o\":\r\n                secretString = secret_o;\r\n                break;\r\n            case \"h\":\r\n                secretString = secret_h;\r\n                break;\r\n            case \"k\":\r\n                secretString = secret_k;\r\n                break;\r\n            default:\r\n                secretString = secret;\r\n        }\r\n\r\n        sizeString = sizeCode == '-' ? '' : '_' + sizeCode;\r\n        return 'https://farm' + farm + '.staticflickr.com/' + server + '/' + id + '_' + secretString + sizeString + '.jpg';\r\n    };\r\n\r\n    getSize(width, height, ratio) {\r\n\r\n        let googleWidth = this.options.availableSizes[0];\r\n\r\n        for(let index=0; index < this.options.availableSizes.length; index++) {\r\n            let item = \tthis.options.availableSizes[index];\r\n            let widthOkay;\r\n            let heightOkay;\r\n\r\n            if (googleWidth > this.options.availableSizes[0]){\r\n                break;\r\n            }\r\n\r\n            let lastItem = index == this.options.availableSizes.length - 1;\r\n\r\n            if (ratio >= 1) {\r\n                widthOkay = item > width;\r\n                heightOkay = item / ratio > height;\r\n\r\n                if ((widthOkay && heightOkay) || lastItem) {\r\n                    googleWidth = item;\r\n                }\r\n            } else {\r\n                heightOkay = item > height;\r\n                widthOkay = item * ratio > width;\r\n\r\n                if ((widthOkay && heightOkay) || lastItem) {\r\n                    googleWidth = item;\r\n                }\r\n            }\r\n        }\r\n\r\n        return googleWidth;\r\n    };\r\n\r\n    /**\r\n     * returns the minimum values for height and width to fill the given box size.\r\n     * @param boxWidth\r\n     * @param boxHeight\r\n     * @param originalWidth\r\n     * @param originalHeight\r\n     */\r\n    getMinSizes(boxWidth, boxHeight, originalWidth, originalHeight) {\r\n\r\n\r\n          let ratio = originalWidth / originalHeight;\r\n\r\n          let height, width;\r\n\r\n          if (originalWidth > originalHeight) {\r\n              if (boxWidth > boxHeight) {\r\n                  width = boxWidth;\r\n                  height = boxWidth / ratio;\r\n                  if (height < boxHeight) {\r\n                      height = boxHeight;\r\n                      width = boxHeight * ratio;\r\n                  }\r\n              } else {\r\n                  height = boxHeight;\r\n                  width = boxHeight * ratio;\r\n                  if (width < boxWidth) {\r\n                      width = boxWidth;\r\n                      height = boxHeight * ratio;\r\n                  }\r\n              }\r\n          } else {\r\n              if (boxWidth > boxHeight) {\r\n                  width = boxWidth;\r\n                  height = boxWidth / ratio;\r\n                  if (height < boxHeight) {\r\n                      height = boxHeight;\r\n                      width = boxHeight * ratio;\r\n                  }\r\n              } else {\r\n                  height = boxHeight;\r\n                  width = boxHeight * ratio;\r\n                  if (width < boxWidth) {\r\n                      width = boxWidth;\r\n                      height = boxWidth / ratio;\r\n                  }\r\n              }\r\n          }\r\n\r\n          return {width: Math.ceil(width), height: Math.ceil(height)};\r\n    };\r\n}\r\n","import Polyfill from \"./Polyfill\";\r\nimport {insertAndExecute} from \"../../common/js/Helpers\";\r\n\r\n\r\n/**\r\n * this class is the basic modal of Event Gallery.\r\n */\r\nexport default class Overlay {\r\n\r\n    constructor() {\r\n        this.isOpen = false;\r\n        this.myDiv = null;\r\n        this.background = null;\r\n        this.body = document.body;\r\n        this.onClosed = undefined;\r\n        this.onLoad = undefined;\r\n        this.repositionTimer = null;\r\n        this.windowWidth = 0;\r\n        this.onResizeOverlay = () => {\r\n            this._setRositionTimer(false);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * opens an overlay. The content can be a url or content.\r\n     * Url start with http or /\r\n     *\r\n     * @param dataUrl\r\n     */\r\n    openOverlay(dataUrl) {\r\n\r\n        this.isOpen = true;\r\n        this.myDiv = document.createElement('div');\r\n        this.myDiv.id = 'eventgallery-overlay';\r\n        this.myDiv.innerHTML = '<i class=\"egfa egfa-2x egfa-cog egfa-spin\"></i>';\r\n        this.myDiv.style.opacity = '1 !important';\r\n        this.myDiv.style.position = 'absolute';\r\n        this.myDiv.style.maxWidth = '100%';\r\n\r\n        this.background = document.createElement('div');\r\n        this.background.id = 'eventgallery-overlay-background';\r\n        this.background.addEventListener('click', () => {\r\n            this.closeOverlay()\r\n        });\r\n\r\n        this.body.append(this.background);\r\n        this.body.append(this.myDiv);\r\n\r\n        this.reposition(true);\r\n\r\n        if (dataUrl.startsWith('http') || dataUrl.startsWith('/')) {\r\n            Overlay._getRemoteData(dataUrl, (data) => {\r\n                this._addContent(data);\r\n            })\r\n        } else {\r\n            this._addContent(`<button class=\"btn-close-overlay eventgallery-close-overlay\"><i class=\"egfa egfa-2x egfa-times-circle\"></i></button>` + dataUrl);\r\n        }\r\n\r\n        window.addEventListener('resize', this.onResizeOverlay);\r\n    }\r\n\r\n    /**\r\n     * triggers a timeout for the repositioning. This will avoid too much flickering.\r\n     *\r\n     * @param force\r\n     * @private\r\n     */\r\n    _setRositionTimer(force) {\r\n        if (this.repositionTimer) {\r\n            clearTimeout(this.repositionTimer)\r\n        }\r\n        this.repositionTimer = setTimeout(() => this.reposition(force), 500);\r\n    }\r\n\r\n    static _getRemoteData(url, callback) {\r\n        fetch(url)\r\n            .then(response => response.text())\r\n            .then(data => callback(data));\r\n    }\r\n\r\n    /**\r\n     * moves the given content into the content overlay. Executes the onload method when finished.\r\n     *\r\n     * @param content\r\n     * @private\r\n     */\r\n    _addContent(content) {\r\n        insertAndExecute(this.myDiv, content);\r\n\r\n        let elements = this.myDiv.getElementsByClassName('eventgallery-close-overlay');\r\n        for(let i=0; i<elements.length;i++) {\r\n            elements[i].addEventListener('click', (e) => {\r\n                e.preventDefault();\r\n                this.closeOverlay()\r\n            });\r\n        }\r\n\r\n        this.reposition(true);\r\n\r\n        if (this.onLoad !== undefined) {\r\n            this.onLoad();\r\n        }\r\n\r\n        document.dispatchEvent(Polyfill.createNewEvent('eventgallery-images-added', {isOverlay: true}));\r\n    }\r\n\r\n    /**\r\n     * Closes the overlay and fires the onclose method if defined.\r\n     */\r\n    closeOverlay() {\r\n        this.isOpen = false;\r\n\r\n        window.removeEventListener('resize', this.onResizeOverlay);\r\n\r\n        Polyfill.removeHtmlElementNode(this.myDiv);\r\n        Polyfill.removeHtmlElementNode(this.background);\r\n        if (this.onClosed !== undefined) {\r\n            this.onClosed();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Move the overlay to a good position.\r\n     *\r\n     * @param force defines if we force the reposition. If set to false, we do it only in case the width of the window changed.\r\n     */\r\n    reposition(force) {\r\n\r\n        if (this.repositionTimer !== null) {\r\n            clearTimeout(this.repositionTimer);\r\n        }\r\n\r\n        let maxWidth = document.body.clientWidth;\r\n\r\n        if (!force) {\r\n            if (this.windowWidth === maxWidth) {\r\n                return;\r\n            }\r\n        }\r\n\r\n        this.windowWidth = maxWidth;\r\n\r\n        this.myDiv.style.opacity = 0;\r\n        this.myDiv.style.top = 0;\r\n        this.myDiv.style.left = 0;\r\n\r\n\r\n        let maxHeight = window.innerHeight,\r\n            width = this.myDiv.offsetWidth,\r\n            height = this.myDiv.offsetHeight,\r\n            scrollTop = window.pageYOffset,\r\n            left = 0,\r\n            top = scrollTop;\r\n\r\n        if (maxWidth - width > 0) {\r\n            left = (maxWidth - width) / 2;\r\n        }\r\n\r\n        if (maxHeight - height > 0) {\r\n            top = scrollTop + (maxHeight - height) / 2;\r\n        }\r\n\r\n        this.myDiv.style.top = top + 'px';\r\n        // there is a margin of 3px in overlay.less => we should not set this more to the left.\r\n        if (left > 3) {\r\n            this.myDiv.style.left = left + 'px';\r\n        }\r\n\r\n        this.myDiv.style.opacity = 1;\r\n    };\r\n}\r\n","import EventsHandler from \"../utils/eventshandler\";\r\nlet eventsHandler = new EventsHandler();\r\n\r\nexport function addTouch(element:HTMLElement, leftAction:Function, rightAction:Function, tabAction:Function, bottomAction:Function) {\r\n\r\n    let hDistance:number;\r\n    let vDistance:number;\r\n\r\n\r\n    let vSwipe = false;\r\n    let hSwipe = false;\r\n    let hSwipMinDistance = 50;\r\n    let vSwipMinDistance = 50;\r\n    let swipMinDistanceForClick = 5;\r\n    let startCoords: Touch;\r\n    let endCoords: Touch;\r\n\r\n    eventsHandler.off('touchstart', element);\r\n    eventsHandler.off( 'touchend', element);\r\n\r\n    eventsHandler.on('touchstart', element, (event:TouchEvent)=>{\r\n        startCoords = event.targetTouches[0];\r\n    }, false, true);\r\n\r\n\r\n    eventsHandler.on('touchend', element, (event:TouchEvent)=>{\r\n\r\n        endCoords = event.changedTouches[0];\r\n        if (!endCoords) {\r\n            return false;\r\n        }\r\n\r\n        vDistance = endCoords.pageY - startCoords.pageY;\r\n        hDistance = endCoords.pageX - startCoords.pageX;\r\n\r\n\r\n        vDistance = endCoords.pageY - startCoords.pageY;\r\n        if ( Math.abs( vDistance ) >= vSwipMinDistance ) {\r\n            vSwipe = true;\r\n        }\r\n\r\n        hDistance = endCoords.pageX - startCoords.pageX;\r\n\r\n        if ( ! vSwipe && Math.abs( hDistance ) >= hSwipMinDistance ) {\r\n            hSwipe = true;\r\n        }\r\n\r\n        // Swipe to bottom to close\r\n        if ( vSwipe ) {\r\n            vSwipe = false;\r\n            if ( Math.abs( vDistance ) >= 2 * vSwipMinDistance ) {\r\n                bottomAction && bottomAction();\r\n            }\r\n\r\n        } else if ( hSwipe ) {\r\n\r\n            hSwipe = false;\r\n\r\n            // swipeLeft\r\n            if( hDistance >= hSwipMinDistance) {\r\n                leftAction && leftAction();\r\n            // swipeRight\r\n            } else if ( hDistance <= -hSwipMinDistance) {\r\n                rightAction && rightAction();\r\n            }\r\n\r\n        } else if (Math.abs(vDistance)<swipMinDistanceForClick && Math.abs(hDistance)<swipMinDistanceForClick) {\r\n            if (undefined !== tabAction)\r\n            {\r\n                tabAction();\r\n            } else {\r\n                let target:HTMLElement = event.target as HTMLElement;\r\n                target.click();\r\n            }\r\n        }\r\n        return true;\r\n\r\n    }, false, true);\r\n\r\n\r\n\r\n}\r\n\r\n\r\n","import Polyfill from \"../Polyfill\";\r\nimport {Events} from \"../minicart/CartEvents\";\r\nimport {addTouch} from \"../touch/Touch\";\r\nimport Overlay from \"../Overlay\";\r\nimport {\r\n    addUrlHashParameter,\r\n    forEach, getElementHeight,\r\n    getElementWidth,\r\n    getUrlHashParameterValue,\r\n    mergeObjects\r\n} from \"../../../common/js/Helpers\";\r\nimport SizeCalculator from \"../EventgallerySizeCalculator\";\r\n\r\n    /*\r\n     *    Constructor. Starts up the whole thing :-)\r\n     *\r\n     *    This script is free to use. It has been created by http://www.aplusmedia.de and\r\n     *    can be downloaded on http://www.esteak.net.\r\n     *    License: GNU GPL 2.0: http://creativecommons.org/licenses/GPL/2.0/\r\n     *    Example on: http://blog.aplusmedia.de/moo-gallery2\r\n     *    Known issues:\r\n     *    - preloading does not care about initialIndex param\r\n     *    - hovering to a control over the border of the big image will make the other one flickering\r\n     *    - if you enter and leave the control area very quickly, the control flickers sometimes\r\n     *    - does not work in IE6\r\n     *\r\n     *    @param {HTMLelement] The main gallery element\r\n     *    @param {Array} thumbs, An array of HTML elements\r\n     *    @param {HTMLelement} bigImageContainer, the full size image\r\n     *    @param {HTMLelement} pageContainer, If you have several pages, put them in this container\r\n     *    @param {Object} options, You have to pass imagesPerPage if you have more than one!\r\n     */\r\nexport class JSGallery2 {\r\n    constructor(galleryElement, thumbs, bigImageContainer, pageContainer, newOptions) {\r\n        this.options = {\r\n            'prevHandle': null,\t\t\t//if you pass a previous page handle in here, it will be hidden if it's not needed\r\n            'nextHandle': null,\t\t\t//like above, but for next page\r\n            'countHandle': null,\t\t//handle of the counter variable\r\n            'titleTarget': null,\t\t//target HTML element where image texts are copied into\r\n            'initialIndex': -1,\t\t\t//which thumb to select after init. you could create deep links with it.\r\n            'maxOpacity': 0.8,\t\t\t//maximum opacity before cursor reaches prev/next control, then it will be set to 1 instantly.\r\n            'showSocialMediaButton': true,\r\n            'showCartButton': true,\r\n            'showCartConnector': false,\r\n            'cartConnectorLinkRel': '',\r\n            'activeClass': 'thumbnail-active', // the css class for the active thumbnail\r\n            'lightboxRel': 'lightbo2', // the trigger rel for the lightbox script\r\n            'touchContainerSelector' : '#bigimageContainer'\r\n        };\r\n\r\n        this.galleryElement = galleryElement;\r\n        this.nav = galleryElement.querySelector('.navigation');\r\n        this.image = galleryElement.querySelector('.image');\r\n\r\n        this.options = mergeObjects(this.options, newOptions);\r\n\r\n        let pages = pageContainer.children;\r\n\r\n        // defines if thumbs are currently running\r\n        this.running = false;\r\n        this.currentPageNumber = 0;\r\n\r\n        this.blockKeys = false;\r\n        this.imagesPerFirstPage = pages[0].querySelectorAll('div.ajax-thumbnail-container').length;\r\n        this.imagesPerPage = this.imagesPerFirstPage;\r\n\r\n        if (pages.length>1 && pages[1].querySelectorAll('div.ajax-thumbnail-container').length>0)  {\r\n            this.imagesPerPage = pages[1].querySelectorAll('div.ajax-thumbnail-container').length;\r\n        }\r\n\r\n        this.thumbs = [];\r\n        for (let i=0; i<thumbs.length; i++) {\r\n            this.thumbs.push(thumbs[i]);\r\n        }\r\n        this.bigImageContainer = bigImageContainer;\r\n        this.bigImage = bigImageContainer.querySelector('img');\r\n        this.pageContainer = pageContainer;\r\n\r\n        this.convertThumbs();\r\n\r\n        this.lastPage = Math.ceil((this.thumbs.length - this.imagesPerFirstPage) / this.imagesPerPage) + 1;\r\n\r\n        let url = document.location.href;\r\n        this.initialIndex = parseInt(getUrlHashParameterValue(url, 'imageno'));\r\n        if (isNaN(this.initialIndex)) {\r\n            this.initialIndex = 0;\r\n        }\r\n\r\n        this.createControls();\r\n\r\n        this.createGallerySlides();\r\n        this.adjustWidth();\r\n        this.adjustPageHeight();\r\n        this.adjustImageSize();\r\n\r\n        this.gotoPage(0);\r\n\r\n        if (this.options.initialIndex !== -1) {\r\n            this.unBlockKeys();\r\n            this.selectByIndex(this.options.initialIndex);\r\n        } else if (this.initialIndex !== 0) {\r\n\r\n            this.unBlockKeys();\r\n            this.selectByIndex(this.initialIndex);\r\n        }\r\n\r\n        window.addEventListener('load', () => {this.resizePage()});\r\n        window.addEventListener('resize', () => {this.resizePage()});\r\n    }\r\n\r\n    adjustWidth() {\r\n        let width = this.nav.offsetWidth;\r\n        forEach(this.galleryElement.querySelectorAll('.navigation .page'), (e) => {\r\n            e.style.width = width + 2 + \"px\";\r\n        })\r\n    };\r\n\r\n    /* Method to bring the thumb rel attribute to the right size */\r\n    adjustImageSize() {\r\n        let sizeCalculator = new SizeCalculator();\r\n        let width = getElementWidth(this.bigImageContainer);\r\n\r\n        forEach(this.nav.querySelectorAll('#thumbs .ajax-thumbnail'), (thumbnail, index) =>  {\r\n\r\n\r\n            let originalwidth = thumbnail.getAttribute('data-width');\r\n            let originalheight = thumbnail.getAttribute('data-height');\r\n            let     ratio = originalwidth / originalheight;\r\n            let     height = Math.round(width / ratio);\r\n            let     secret = thumbnail.getAttribute('data-secret');\r\n\r\n            let imageUrl\r\n            if (secret !== null) {\r\n                let secret_o = thumbnail.getAttribute('data-secret_o');\r\n                let secret_h = thumbnail.getAttribute('data-secret_h');\r\n                let secret_k = thumbnail.getAttribute('data-secret_k');\r\n                let farm = thumbnail.getAttribute('data-farm');\r\n                let server = thumbnail.getAttribute('data-server');\r\n                let id = thumbnail.getAttribute('data-file');\r\n\r\n                 imageUrl = sizeCalculator.getFlickrURL(farm, server, secret, secret_h, secret_k, secret_o, id, width, height, originalwidth, originalheight);\r\n            } else {\r\n                let googleWidth = sizeCalculator.getSize(width, height, ratio);\r\n                imageUrl = sizeCalculator.adjustImageURL(thumbnail.getAttribute('rel'), googleWidth);\r\n            }\r\n            thumbnail.setAttribute('rel', imageUrl);\r\n        });\r\n    };\r\n\r\n    /* Method which handles the case the window got resized */\r\n    resizePage() {\r\n        window.clearTimeout(this.eventgalleryAjaxResizeTimer);\r\n\r\n        this.eventgalleryAjaxResizeTimer = setTimeout(() => {\r\n            this.adjustWidth();\r\n            this.adjustImageSize();\r\n            this.resetThumbs();\r\n            this.gotoPage(this.currentPageNumber);\r\n            this.adjustPageHeight();\r\n\r\n        }, 500);\r\n    };\r\n\r\n\r\n    createGallerySlides() {\r\n        this.slides = [];\r\n        forEach(this.thumbs, (thumbContainer) => {\r\n            let lightboxLinkElement = thumbContainer.getElementsByTagName('A')[0];\r\n            let title =  decodeURIComponent(lightboxLinkElement.getAttribute('data-description'));\r\n            let slide =    {\r\n                w: lightboxLinkElement.getAttribute('data-width'),\r\n                h: lightboxLinkElement.getAttribute('data-height'),\r\n                src: lightboxLinkElement.getAttribute('href'),\r\n                title: title\r\n            };\r\n            this.slides.push(slide)\r\n        })\r\n    };\r\n\r\n    createControls() {\r\n        this.prevLink = document.createElement('a');\r\n        this.prevLink.href='#';\r\n        this.prevLink.classList.add('link','jsgallery-prev');\r\n        this.prevLink.addEventListener('click', (e)=> this.prevImage(e));\r\n        this.prevLink.addEventListener('mouseleave', () => this.mouseLeaveHandler())\r\n        this.prevLink.addEventListener('mouseover', (e) => this.focusControl(e, this.prevLink));\r\n\r\n        this.zoomLink = document.createElement('a');\r\n        this.zoomLink.href='#';\r\n        this.zoomLink.classList.add('link','jsgallery-zoom');\r\n        this.zoomLink.addEventListener('click', (e) => this.bigImageClickHandler(e));\r\n        this.zoomLink.addEventListener('mouseleave', (e) => this.mouseLeaveHandler());\r\n        this.zoomLink.addEventListener('mouseover', (e) => this.focusControl(e, this.zoomLink));\r\n\r\n        this.nextLink = document.createElement('a');\r\n        this.nextLink.href = '#';\r\n        this.nextLink.classList.add('link','jsgallery-next');\r\n        this.nextLink.addEventListener('click', (e) => this.nextImage(e));\r\n        this.nextLink.addEventListener('mouseleave', () => this.mouseLeaveHandler())\r\n        this.nextLink.addEventListener('mouseover', (e) => this.focusControl(e, this.nextLink));\r\n\r\n\t\tthis.bigImage.parentElement.appendChild(this.prevLink);\r\n        this.bigImage.parentElement.appendChild(this.zoomLink);\r\n        this.bigImage.parentElement.appendChild(this.nextLink);\r\n\r\n        this.bigImage.addEventListener('load', ()=>this.showBigImage());\r\n\r\n        if (this.options.showCartButton) {\r\n            this.add2cartLink = document.createElement('a');\r\n            this.add2cartLink.href = '#';\r\n            this.add2cartLink.classList.add('eventgallery-add2cart','eventgallery-openAdd2cart','jsgallery-add2cart');\r\n            this.add2cartLink.innerHTML = '<i class=\"egfa egfa-2x egfa-cart-plus\"></i>';\r\n            this.bigImage.parentElement.appendChild(this.add2cartLink);\r\n            document.dispatchEvent(Polyfill.createNewEvent(Events.rebindAdd2CartButtons, null));\r\n        }\r\n\r\n        if (this.options.showCartConnector) {\r\n\r\n            this.cartConnectorLink = document.createElement('a');\r\n            this.cartConnectorLink.href = '#';\r\n            this.cartConnectorLink.id = 'ajax-cartconnector';\r\n            this.cartConnectorLink.classList.add('button-cart-connector','jsgallery-cartconnector');\r\n            this.cartConnectorLink.innerHTML = '<i class=\"egfa egfa-2x egfa-cart-plus\"></i>';\r\n            this.cartConnectorLink.setAttribute('rel', this.options.cartConnectorLinkRel);\r\n            this.bigImage.parentElement.appendChild(this.cartConnectorLink);\r\n        }\r\n\r\n        if (this.options.showSocialMediaButton) {\r\n            let div = document.createElement('div');\r\n            div.innerHTML = '<a id=\"ajax-social-media-button\" class=\"social-share-button jsgallery-socialmedia\" rel=\"nofollow\" href=\"#\"><i class=\"egfa egfa-2x egfa-share-alt-square\"></i></a>';\r\n            this.socialmediabutton = div.firstChild;\r\n            this.socialmediabutton.addEventListener('click', e => {\r\n                e.preventDefault();\r\n                let href = this.socialmediabutton.getAttribute('data-href');\r\n                let overlay = new Overlay();\r\n                overlay.openOverlay(href);\r\n            });\r\n            this.bigImage.parentElement.appendChild(this.socialmediabutton);\r\n        }\r\n\r\n        document.addEventListener('keydown', (e) => this.keyboardHandler(e));\r\n\r\n\t\tlet swipeleft =  (e) => {\r\n\t\t    this.nextImage(e);\r\n\t\t};\r\n\r\n\t\tlet swiperight = (e) => {\r\n\t\t    this.prevImage(e);\r\n\t\t};\r\n\r\n        let tabaction = (e) => {\r\n            this.bigImage.click();\r\n        };\r\n\r\n        addTouch(document.querySelector(this.options.touchContainerSelector),\r\n            swiperight,\r\n            swipeleft,\r\n            tabaction,\r\n            null,\r\n        );\r\n\r\n        this.mouseLeaveHandler();\r\n    };\r\n\r\n    /**\r\n     * Focuses one control\r\n     *\r\n     * @param {Event} event\r\n     * @param {HTMLElement} control\r\n    */\r\n    focusControl(event, control) {\r\n        control.style.opacity = '1';\r\n    };\r\n\r\n    /**\r\n     * Hides the controls.\r\n     */\r\n    mouseLeaveHandler() {\r\n        this.nextLink.style.opacity = '0';\r\n        this.prevLink.style.opacity = '0';\r\n        this.zoomLink.style.opacity = '0';\r\n    };\r\n\r\n    /**\r\n     * Handles keyboard interactions.\r\n     * @param {Event} event\r\n     */\r\n    keyboardHandler(event) {\r\n\r\n\r\n        if (!this.blockKeys && Eventgallery.lightbox?.isOpen() !== true) {\r\n            if (event.keyCode >= 49 && event.keyCode <= 57) {\r\n                this.gotoPage(event.key - 1);\r\n            } else if (event.keyCode == 37) {\r\n                this.prevImage(event);\r\n            } else if (event.keyCode == 39) {\r\n                this.nextImage(event);\r\n            }\r\n        }\r\n    };\r\n\r\n    adjustPageHeight() {\r\n        // fix height of the page-container\r\n        let maxHeight = 0;\r\n        forEach(this.pageContainer.children, (page) => {\r\n            let height = page.offsetHeight;\r\n            if (height > maxHeight) {\r\n                maxHeight = height;\r\n            }\r\n        })\r\n\r\n        this.pageContainer.style.height = maxHeight +'px';\r\n        this.nav.style.opacity = 1;\r\n    }\r\n\r\n    resetThumbs() {\r\n       \tthis.running = false;\r\n\r\n\t\tthis.convertThumbs();\r\n\r\n        //if we like to select another image on that page than the first one\r\n        this.select(this.selectedContainer, true);\r\n    };\r\n\r\n    /**\r\n     *    Adds the border to the thumbs and so on. (conversion of static thumbs)\r\n     */\r\n    convertThumbs() {\r\n        forEach(this.thumbs, (thumbContainer, count)=>{\r\n            this.convertThumb(thumbContainer, count);\r\n        })\r\n    };\r\n\r\n    /**\r\n     * Converts one single thumb.\r\n     * @param {HTMLElement} thumbContainer\r\n     * @param {Integer} count\r\n     */\r\n    convertThumb(thumbContainer, count) {\r\n\r\n        if (thumbContainer === undefined) {\r\n            return;\r\n        }\r\n\r\n        thumbContainer.addEventListener('click', (e) => {\r\n            e.preventDefault();\r\n            this.select(thumbContainer);\r\n        });\r\n\r\n\r\n        thumbContainer.style.position =  'relative';\r\n        thumbContainer.setAttribute('data-counter', count);\r\n        thumbContainer.setAttribute('href', '#');\r\n    };\r\n\r\n    /**\r\n     *    Removes key blocking.\r\n     */\r\n    unBlockKeys() {\r\n        this.blockKeys = false;\r\n    };\r\n\r\n    /**\r\n     *    Selects a certain image. (You have to pass the outer container of the image)\r\n     *    @param container\r\n     *    @param forceReload\r\n     */\r\n    select(container, forceReload) {\r\n        forceReload = typeof forceReload !== 'undefined' ? forceReload : false;\r\n\r\n        if (this.blockKeys || container === null) {\r\n            return false;\r\n        }\r\n\r\n\r\n        this.blockKeys = true;\r\n        if ( this.selectedContainer !== undefined ) {\r\n            //this prevents an ugly effect if you click on the currently selected item\r\n            if (container == this.selectedContainer && !forceReload) {\r\n                this.unBlockKeys();\r\n                return false;\r\n            }\r\n            this.deselect(this.selectedContainer);\r\n        }\r\n\r\n        // handle URL\r\n        if (history && history.pushState) {\r\n            history.pushState('', '', addUrlHashParameter(window.location.href, 'imageno', this.thumbs.indexOf(container)));\r\n        }\r\n        //if target image is not on current page, we have to go there first\r\n        let targetPage = Math.floor((container.getAttribute('data-counter') - this.imagesPerFirstPage) / this.imagesPerPage) + 1;\r\n\r\n        if (this.currentPageNumber != targetPage) {\r\n            this.gotoPage(targetPage, container);\r\n        }\r\n        this.selectedContainer = container;\r\n\r\n        container.classList.add(this.options.activeClass);\r\n\r\n        //first link in the container\r\n        let source = container.children[0];\r\n\r\n\r\n        // prepare the add2cart button\r\n        if (this.options.showCartButton) {\r\n            this.add2cartLink.setAttribute('data-id', source.getAttribute('data-id'));\r\n        }\r\n\r\n        if (this.options.showCartConnector) {\r\n            this.cartConnectorLink.setAttribute('data-folder', source.getAttribute('data-folder'));\r\n            this.cartConnectorLink.setAttribute('data-file', source.getAttribute('data-file'));\r\n            this.cartConnectorLink.setAttribute('href', decodeURIComponent(source.getAttribute('data-cart-connector-link')));\r\n        }\r\n\r\n        if (this.options.showSocialMediaButton) {\r\n            this.socialmediabutton.setAttribute('data-href', decodeURIComponent(source.getAttribute('data-social-sharing-link')) );\r\n        }\r\n\r\n        document.dispatchEvent(Polyfill.createNewEvent(Events.rebindAdd2CartButtons, null));\r\n\r\n        // now lets set the image\r\n        this.setImage(source);\r\n    };\r\n\r\n\r\n    /**\r\n     * Selects an image by its thumbnail index.\r\n     * @param {integer} index of the thumbnail, starting with 0\r\n     */\r\n    selectByIndex(index) {\r\n        //this.mouseLeaveHandler();\r\n        if (index < 0 || this.thumbs.length <= index) {\r\n            index = 0;\r\n        }\r\n        this.select(this.thumbs[index]);\r\n    };\r\n\r\n    /**\r\n     *    Opposite to method above.\r\n     *    @param {HTMLHtmlElement} container\r\n     */\r\n    deselect(container) {\r\n        container.classList.remove(this.options.activeClass);\r\n    };\r\n\r\n    bigImageClickHandler(e) {\r\n        this.createGallerySlides();\r\n        let currentIndex = this.thumbs.indexOf(this.selectedContainer);\r\n        Eventgallery.lightbox.openPhotoSwipe(\r\n            currentIndex, this.slides, true, false, false\r\n        );\r\n        Eventgallery.lightbox.setAfterChangeEventListener(() => {\r\n            let gid = Eventgallery.lightbox.getCurrentSlide().gid;\r\n            if (this.slides.length>0 && gid === this.slides[0].gid) {\r\n                this.selectByIndex(Eventgallery.lightbox.getCurrentIndex());\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     *    Changes the full size image to given one.\r\n     *    @param lightboxLinkElement\r\n     */\r\n    setImage(lightboxLinkElement) {\r\n\r\n            this.bigImage.style.opacity = '0.1';\r\n            let newSrc = lightboxLinkElement.getAttribute('rel');\r\n            let title =  decodeURIComponent(lightboxLinkElement.getAttribute('data-description'));\r\n\r\n            let currentIndex = this.thumbs.indexOf(this.selectedContainer);\r\n\r\n\r\n            if (Eventgallery.lightbox?.isOpen() === true) {\r\n               Eventgallery.lightbox.gotoSlide(currentIndex);\r\n            }\r\n\r\n            this.galleryElement.querySelector(this.options.titleTarget).innerHTML = title;\r\n\r\n            this.bigImage.setAttribute('src', newSrc);\r\n            this.unBlockKeys();\r\n    };\r\n\r\n    showBigImage() {\r\n        this.image.style.opacity = 1;\r\n        this.bigImage.style.opacity = 1;\r\n    };\r\n\r\n    /**\r\n     *    Navigates to previous page.\r\n     */\r\n    prevPage() {\r\n        this.gotoPage(this.currentPageNumber - 1);\r\n    };\r\n    /**\r\n     *    Navigates to next page.\r\n     */\r\n    nextPage() {\r\n        this.gotoPage(this.currentPageNumber + 1);\r\n    };\r\n    /**\r\n     *    Selects the previous image.\r\n     */\r\n    prevImage(e) {\r\n        if (e !== undefined) {\r\n            e.preventDefault();\r\n        }\r\n        this.selectByIndex(this.thumbs.indexOf(this.selectedContainer) - 1);\r\n    };\r\n    /**\r\n     *    Selects the next image.\r\n     */\r\n    nextImage(e) {\r\n        if (e !== undefined) {\r\n            e.preventDefault();\r\n        }\r\n        this.selectByIndex(this.thumbs.indexOf(this.selectedContainer) + 1);\r\n    };\r\n\r\n    /**\r\n     * Zooms an image\r\n     */\r\n    zoomImage(e) {\r\n        if (e !== undefined) {\r\n            e.preventDefault();\r\n        }\r\n    };\r\n\r\n    /**\r\n     *    Navigates to given page and selects the first image of it.\r\n     *    Also hides the handles (if set).\r\n     *    @param {Integer} pageNumber, index of the target page (0-n)\r\n     *  @param {HTMLElement} selectImage, optionally receives a particular image to select\r\n     */\r\n    gotoPage(pageNumber, selectImage) {\r\n        //if we like to select another image on that page than the first one\r\n        if (pageNumber === 0) {\r\n            selectImage = selectImage === undefined ? this.thumbs[0] : selectImage;\r\n        } else {\r\n            let i = (pageNumber - 1) * this.imagesPerPage + this.imagesPerFirstPage;\r\n            selectImage = this.thumbs[i] === undefined ? selectImage : this.thumbs[i];\r\n        }\r\n\r\n        if (pageNumber >= 0 && pageNumber < this.lastPage) {\r\n            this.pageContainer.style.marginLeft = (getElementWidth(this.pageContainer.children[0]) * pageNumber * -1) + 'px';\r\n            this.currentPageNumber = pageNumber;\r\n            this.select(selectImage);\r\n            this.updateHandles();\r\n        }\r\n    };\r\n\r\n    updateHandles() {\r\n        //update handles\r\n\r\n        if (this.options.prevHandle) {\r\n            this.currentPageNumber === 0 ? this.options.prevHandle.style.opacity = 0:this.options.prevHandle.style.opacity = 1;\r\n        }\r\n        if (this.options.nextHandle) {\r\n            this.currentPageNumber == this.lastPage - 1 ? this.options.nextHandle.style.opacity = 0:this.options.nextHandle.style.opacity = 1;\r\n        }\r\n\r\n        if (this.options.countHandle) {\r\n            this.updatePagingBar(this.currentPageNumber, this.lastPage);\r\n        }\r\n\r\n    };\r\n\r\n    updatePagingBar(currentPage, pageCount) {\r\n        if (pageCount <= 1 ) {\r\n            return;\r\n        }\r\n\r\n        //init the pagingbar\r\n        if (pageCount > 1 && this.options.countHandle.innerHTML === '') {\r\n\r\n            for (let i = 0; i < pageCount; i++) {\r\n                this.createCountLink(i);\r\n            }\r\n        }\r\n\r\n        let pageSpeed = this.options.pageSpeed;\r\n\r\n\r\n        if (pageCount > 9) {\r\n\r\n            for (let i = 0; i < pageCount; i++) {\r\n                this.galleryElement.querySelector('#count' + i).style.display = inline;\r\n            }\r\n\r\n            let skipFromRight = pageCount;\r\n            let skipFromLeft = 0;\r\n\r\n            let spaceToRight = pageCount - currentPage - 1;\r\n            let spaceToLeft = currentPage;\r\n\r\n            if (spaceToLeft > 4 && spaceToRight > 4) {\r\n                skipFromLeft = currentPage - 4;\r\n                skipFromRight = currentPage + 5;\r\n            } else {\r\n                if (spaceToLeft <= 4) {\r\n                    skipFromLeft = 0;\r\n                    skipFromRight = currentPage + 5 + (4 - spaceToLeft);\r\n                }\r\n                if (spaceToRight <= 4) {\r\n                    skipFromLeft = currentPage - 4 - (4 - spaceToRight);\r\n                    skipFromRight = pageCount;\r\n                }\r\n            }\r\n\r\n            for (let i = 0; i < skipFromLeft; i++) {\r\n                this.galleryElement.querySelector('#count' + i).style.display = 'none';\r\n            }\r\n\r\n            for (let i = skipFromRight; i < pageCount; i++) {\r\n                this.galleryElement.querySelector('#count' + i).style.display = 'none';\r\n\r\n            }\r\n        }\r\n\r\n        forEach(this.options.countHandle.children, (child) => child.classList.remove('active'));\r\n        this.galleryElement.querySelector('#count' + currentPage).classList.add('active');\r\n\r\n    };\r\n\r\n    createCountLink(currentPageNumber) {\r\n\r\n        let myAnchor = document.createElement('A');\r\n        myAnchor.href = '#';\r\n        myAnchor.classList.add('page-link');\r\n        myAnchor.innerText = currentPageNumber + 1;\r\n\r\n        myAnchor.addEventListener('click',(e) => {\r\n            e.preventDefault();\r\n            this.gotoPage(currentPageNumber, null);\r\n            return false;\r\n        });\r\n\r\n        let myListItem = document.createElement('LI');\r\n        myListItem.classList.add('count');\r\n        myListItem.classList.add('page-item');\r\n        myListItem.id = 'count' + currentPageNumber;\r\n\r\n        myListItem.appendChild(myAnchor);\r\n\r\n        this.options.countHandle.appendChild(myListItem);\r\n    }\r\n}\r\n\r\n\r\n","const {forEach} = require(\"../../../common/js/Helpers\");\r\nconst {JSGallery2} = require(\"./EventgalleryJSGallery2\");\r\n\r\n\r\n/* start the eventgallery*/\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n\r\n    let galleryElements = document.querySelectorAll('.ajaxpaging');\r\n    for(let i=0; i<galleryElements.length; i++) {\r\n        let galleryElement = galleryElements[i];\r\n\r\n        new JSGallery2(\r\n            galleryElement,\r\n            galleryElement.querySelectorAll('.ajax-thumbnail-container'),\r\n            galleryElement.querySelector('#bigimageContainer'),\r\n            galleryElement.querySelector('#pageContainer'),\r\n            {\r\n                'prevHandle': galleryElement.querySelector('#prev'),\r\n                'nextHandle': galleryElement.querySelector('#next'),\r\n                'countHandle': galleryElement.querySelector('#count'),\r\n                'titleTarget': '#bigImageDescription',\r\n                'showSocialMediaButton': galleryElement.getAttribute('data-showSocialMediaButton')=='true',\r\n                'showCartButton': galleryElement.getAttribute('data-showCartButton')=='true',\r\n                'showCartConnector': galleryElement.getAttribute('data-showCartConnector')=='true',\r\n                'cartConnectorLinkRel': galleryElement.getAttribute('data-cartConnectorLinkRel'),\r\n                'lightboxRel': 'gallery'\r\n            });\r\n\r\n    }\r\n});\r\n","/*!\n  * PhotoSwipe 5.3.4 - https://photoswipe.com\n  * (c) 2022 Dmytro Semenov\n  */\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n\r\n/** @typedef {undefined | null | false | '' | 0} Falsy */\r\n/** @typedef {keyof HTMLElementTagNameMap} HTMLElementTagName */\r\n\r\n/**\r\n * @template {HTMLElementTagName | Falsy} [T=\"div\"]\r\n * @template {Node | undefined} [NodeToAppendElementTo=undefined]\r\n * @param {string=} className\r\n * @param {T=} [tagName]\r\n * @param {NodeToAppendElementTo=} appendToEl\r\n * @returns {T extends HTMLElementTagName ? HTMLElementTagNameMap[T] : HTMLElementTagNameMap['div']}\r\n */\r\nfunction createElement(className, tagName, appendToEl) {\r\n  const el = document.createElement(tagName || 'div');\r\n  if (className) {\r\n    el.className = className;\r\n  }\r\n  if (appendToEl) {\r\n    appendToEl.appendChild(el);\r\n  }\r\n  // @ts-expect-error\r\n  return el;\r\n}\r\n\r\n/**\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nfunction equalizePoints(p1, p2) {\r\n  p1.x = p2.x;\r\n  p1.y = p2.y;\r\n  if (p2.id !== undefined) {\r\n    p1.id = p2.id;\r\n  }\r\n  return p1;\r\n}\r\n\r\n/**\r\n * @param {Point} p\r\n */\r\nfunction roundPoint(p) {\r\n  p.x = Math.round(p.x);\r\n  p.y = Math.round(p.y);\r\n}\r\n\r\n/**\r\n * Returns distance between two points.\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nfunction getDistanceBetween(p1, p2) {\r\n  const x = Math.abs(p1.x - p2.x);\r\n  const y = Math.abs(p1.y - p2.y);\r\n  return Math.sqrt((x * x) + (y * y));\r\n}\r\n\r\n/**\r\n * Whether X and Y positions of points are qual\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nfunction pointsEqual(p1, p2) {\r\n  return p1.x === p2.x && p1.y === p2.y;\r\n}\r\n\r\n/**\r\n * The float result between the min and max values.\r\n *\r\n * @param {number} val\r\n * @param {number} min\r\n * @param {number} max\r\n */\r\nfunction clamp(val, min, max) {\r\n  return Math.min(Math.max(val, min), max);\r\n}\r\n\r\n/**\r\n * Get transform string\r\n *\r\n * @param {number} x\r\n * @param {number=} y\r\n * @param {number=} scale\r\n */\r\nfunction toTransformString(x, y, scale) {\r\n  let propValue = 'translate3d('\r\n    + x + 'px,' + (y || 0) + 'px'\r\n    + ',0)';\r\n\r\n  if (scale !== undefined) {\r\n    propValue += ' scale3d('\r\n      + scale + ',' + scale\r\n      + ',1)';\r\n  }\r\n\r\n  return propValue;\r\n}\r\n\r\n/**\r\n * Apply transform:translate(x, y) scale(scale) to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {number} x\r\n * @param {number=} y\r\n * @param {number=} scale\r\n */\r\nfunction setTransform(el, x, y, scale) {\r\n  el.style.transform = toTransformString(x, y, scale);\r\n}\r\n\r\nconst defaultCSSEasing = 'cubic-bezier(.4,0,.22,1)';\r\n\r\n/**\r\n * Apply CSS transition to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string=} prop CSS property to animate\r\n * @param {number=} duration in ms\r\n * @param {string=} ease CSS easing function\r\n */\r\nfunction setTransitionStyle(el, prop, duration, ease) {\r\n  // inOut: 'cubic-bezier(.4, 0, .22, 1)', // for \"toggle state\" transitions\r\n  // out: 'cubic-bezier(0, 0, .22, 1)', // for \"show\" transitions\r\n  // in: 'cubic-bezier(.4, 0, 1, 1)'// for \"hide\" transitions\r\n  el.style.transition = prop\r\n    ? (prop + ' ' + duration + 'ms ' + (ease || defaultCSSEasing))\r\n    : 'none';\r\n}\r\n\r\n/**\r\n * Apply width and height CSS properties to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string | number} w\r\n * @param {string | number} h\r\n */\r\nfunction setWidthHeight(el, w, h) {\r\n  el.style.width = (typeof w === 'number') ? (w + 'px') : w;\r\n  el.style.height = (typeof h === 'number') ? (h + 'px') : h;\r\n}\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n */\r\nfunction removeTransitionStyle(el) {\r\n  setTransitionStyle(el);\r\n}\r\n\r\n/**\r\n * @param {HTMLImageElement} img\r\n * @returns {Promise<HTMLImageElement | void>}\r\n */\r\nfunction decodeImage(img) {\r\n  if ('decode' in img) {\r\n    return img.decode().catch(() => {});\r\n  }\r\n\r\n  if (img.complete) {\r\n    return Promise.resolve(img);\r\n  }\r\n\r\n  return new Promise((resolve, reject) => {\r\n    img.onload = () => resolve(img);\r\n    img.onerror = reject;\r\n  });\r\n}\r\n\r\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\r\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\r\nconst LOAD_STATE = {\r\n  IDLE: 'idle',\r\n  LOADING: 'loading',\r\n  LOADED: 'loaded',\r\n  ERROR: 'error',\r\n};\r\n\r\n\r\n/**\r\n * Check if click or keydown event was dispatched\r\n * with a special key or via mouse wheel.\r\n *\r\n * @param {MouseEvent | KeyboardEvent} e\r\n */\r\nfunction specialKeyUsed(e) {\r\n  if (e.which === 2 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) {\r\n    return true;\r\n  }\r\n}\r\n\r\n/**\r\n * Parse `gallery` or `children` options.\r\n *\r\n * @param {import('../photoswipe.js').ElementProvider} option\r\n * @param {string=} legacySelector\r\n * @param {HTMLElement | Document} [parent]\r\n * @returns HTMLElement[]\r\n */\r\nfunction getElementsFromOption(option, legacySelector, parent = document) {\r\n  /** @type {HTMLElement[]} */\r\n  let elements = [];\r\n\r\n  if (option instanceof Element) {\r\n    elements = [option];\r\n  } else if (option instanceof NodeList || Array.isArray(option)) {\r\n    elements = Array.from(option);\r\n  } else {\r\n    const selector = typeof option === 'string' ? option : legacySelector;\r\n    if (selector) {\r\n      elements = Array.from(parent.querySelectorAll(selector));\r\n    }\r\n  }\r\n\r\n  return elements;\r\n}\r\n\r\n/**\r\n * Check if browser is Safari\r\n *\r\n * @returns {boolean}\r\n */\r\nfunction isSafari() {\r\n  return !!(navigator.vendor && navigator.vendor.match(/apple/i));\r\n}\n\n// Detect passive event listener support\r\nlet supportsPassive = false;\r\n/* eslint-disable */\r\ntry {\r\n  window.addEventListener('test', null, Object.defineProperty({}, 'passive', {\r\n    get: () => {\r\n      supportsPassive = true;\r\n    }\r\n  }));\r\n} catch (e) {}\r\n/* eslint-enable */\r\n\r\n\r\n/**\r\n * @typedef {Object} PoolItem\r\n * @prop {HTMLElement | Window | Document} target\r\n * @prop {string} type\r\n * @prop {(e: any) => void} listener\r\n * @prop {boolean} passive\r\n */\r\n\r\nclass DOMEvents {\r\n  constructor() {\r\n    /**\r\n     * @type {PoolItem[]}\r\n     * @private\r\n     */\r\n    this._pool = [];\r\n  }\r\n\r\n  /**\r\n   * Adds event listeners\r\n   *\r\n   * @param {HTMLElement | Window | Document} target\r\n   * @param {string} type Can be multiple, separated by space.\r\n   * @param {(e: any) => void} listener\r\n   * @param {boolean=} passive\r\n   */\r\n  add(target, type, listener, passive) {\r\n    this._toggleListener(target, type, listener, passive);\r\n  }\r\n\r\n  /**\r\n   * Removes event listeners\r\n   *\r\n   * @param {HTMLElement | Window | Document} target\r\n   * @param {string} type\r\n   * @param {(e: any) => void} listener\r\n   * @param {boolean=} passive\r\n   */\r\n  remove(target, type, listener, passive) {\r\n    this._toggleListener(target, type, listener, passive, true);\r\n  }\r\n\r\n  /**\r\n   * Removes all bound events\r\n   */\r\n  removeAll() {\r\n    this._pool.forEach((poolItem) => {\r\n      this._toggleListener(\r\n        poolItem.target,\r\n        poolItem.type,\r\n        poolItem.listener,\r\n        poolItem.passive,\r\n        true,\r\n        true\r\n      );\r\n    });\r\n    this._pool = [];\r\n  }\r\n\r\n  /**\r\n   * Adds or removes event\r\n   *\r\n   * @param {HTMLElement | Window | Document} target\r\n   * @param {string} type\r\n   * @param {(e: any) => void} listener\r\n   * @param {boolean} passive\r\n   * @param {boolean=} unbind Whether the event should be added or removed\r\n   * @param {boolean=} skipPool Whether events pool should be skipped\r\n   */\r\n  _toggleListener(target, type, listener, passive, unbind, skipPool) {\r\n    if (!target) {\r\n      return;\r\n    }\r\n\r\n    const methodName = unbind ? 'removeEventListener' : 'addEventListener';\r\n    const types = type.split(' ');\r\n    types.forEach((eType) => {\r\n      if (eType) {\r\n        // Events pool is used to easily unbind all events when PhotoSwipe is closed,\r\n        // so developer doesn't need to do this manually\r\n        if (!skipPool) {\r\n          if (unbind) {\r\n            // Remove from the events pool\r\n            this._pool = this._pool.filter((poolItem) => {\r\n              return poolItem.type !== eType\r\n                || poolItem.listener !== listener\r\n                || poolItem.target !== target;\r\n            });\r\n          } else {\r\n            // Add to the events pool\r\n            this._pool.push({\r\n              target,\r\n              type: eType,\r\n              listener,\r\n              passive\r\n            });\r\n          }\r\n        }\r\n\r\n\r\n        // most PhotoSwipe events call preventDefault,\r\n        // and we do not need browser to scroll the page\r\n        const eventOptions = supportsPassive ? { passive: (passive || false) } : false;\r\n\r\n        target[methodName](\r\n          eType,\r\n          listener,\r\n          eventOptions\r\n        );\r\n      }\r\n    });\r\n  }\r\n}\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {PhotoSwipe} pswp\r\n */\r\nfunction getViewportSize(options, pswp) {\r\n  if (options.getViewportSizeFn) {\r\n    const newViewportSize = options.getViewportSizeFn(options, pswp);\r\n    if (newViewportSize) {\r\n      return newViewportSize;\r\n    }\r\n  }\r\n\r\n  return {\r\n    x: document.documentElement.clientWidth,\r\n\r\n    // TODO: height on mobile is very incosistent due to toolbar\r\n    // find a way to improve this\r\n    //\r\n    // document.documentElement.clientHeight - doesn't seem to work well\r\n    y: window.innerHeight\r\n  };\r\n}\r\n\r\n/**\r\n * Parses padding option.\r\n * Supported formats:\r\n *\r\n * // Object\r\n * padding: {\r\n *  top: 0,\r\n *  bottom: 0,\r\n *  left: 0,\r\n *  right: 0\r\n * }\r\n *\r\n * // A function that returns the object\r\n * paddingFn: (viewportSize, itemData, index) => {\r\n *  return {\r\n *    top: 0,\r\n *    bottom: 0,\r\n *    left: 0,\r\n *    right: 0\r\n *  };\r\n * }\r\n *\r\n * // Legacy variant\r\n * paddingLeft: 0,\r\n * paddingRight: 0,\r\n * paddingTop: 0,\r\n * paddingBottom: 0,\r\n *\r\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {{ x?: number; y?: number }} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index Slide index\r\n * @returns {number}\r\n */\r\nfunction parsePaddingOption(prop, options, viewportSize, itemData, index) {\r\n  /** @type {number} */\r\n  let paddingValue;\r\n\r\n  if (options.paddingFn) {\r\n    paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\r\n  } else if (options.padding) {\r\n    paddingValue = options.padding[prop];\r\n  } else {\r\n    const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1);\r\n    // @ts-expect-error\r\n    if (options[legacyPropName]) {\r\n      // @ts-expect-error\r\n      paddingValue = options[legacyPropName];\r\n    }\r\n  }\r\n\r\n  return paddingValue || 0;\r\n}\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {{ x?: number; y?: number }} viewportSize\r\n * @param {SlideData} itemData\r\n * @param {number} index\r\n */\r\nfunction getPanAreaSize(options, viewportSize, itemData, index) {\r\n  return {\r\n    x: viewportSize.x\r\n      - parsePaddingOption('left', options, viewportSize, itemData, index)\r\n      - parsePaddingOption('right', options, viewportSize, itemData, index),\r\n    y: viewportSize.y\r\n      - parsePaddingOption('top', options, viewportSize, itemData, index)\r\n      - parsePaddingOption('bottom', options, viewportSize, itemData, index)\r\n  };\r\n}\n\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n/** @typedef {'x' | 'y'} Axis */\r\n\r\n/**\r\n * Calculates minimum, maximum and initial (center) bounds of a slide\r\n */\r\nclass PanBounds {\r\n  /**\r\n   * @param {Slide} slide\r\n   */\r\n  constructor(slide) {\r\n    this.slide = slide;\r\n\r\n    this.currZoomLevel = 1;\r\n\r\n    /** @type {Point} */\r\n    this.center = {};\r\n    /** @type {Point} */\r\n    this.max = {};\r\n    /** @type {Point} */\r\n    this.min = {};\r\n\r\n    this.reset();\r\n  }\r\n\r\n  /**\r\n   * _getItemBounds\r\n   *\r\n   * @param {number} currZoomLevel\r\n   */\r\n  update(currZoomLevel) {\r\n    this.currZoomLevel = currZoomLevel;\r\n\r\n    if (!this.slide.width) {\r\n      this.reset();\r\n    } else {\r\n      this._updateAxis('x');\r\n      this._updateAxis('y');\r\n      this.slide.pswp.dispatch('calcBounds', { slide: this.slide });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * _calculateItemBoundsForAxis\r\n   *\r\n   * @param {Axis} axis\r\n   */\r\n  _updateAxis(axis) {\r\n    const { pswp } = this.slide;\r\n    const elSize = this.slide[axis === 'x' ? 'width' : 'height'] * this.currZoomLevel;\r\n    const paddingProp = axis === 'x' ? 'left' : 'top';\r\n    const padding = parsePaddingOption(\r\n      paddingProp,\r\n      pswp.options,\r\n      pswp.viewportSize,\r\n      this.slide.data,\r\n      this.slide.index\r\n    );\r\n\r\n    const panAreaSize = this.slide.panAreaSize[axis];\r\n\r\n    // Default position of element.\r\n    // By defaul it is center of viewport:\r\n    this.center[axis] = Math.round((panAreaSize - elSize) / 2) + padding;\r\n\r\n    // maximum pan position\r\n    this.max[axis] = (elSize > panAreaSize)\r\n      ? Math.round(panAreaSize - elSize) + padding\r\n      : this.center[axis];\r\n\r\n    // minimum pan position\r\n    this.min[axis] = (elSize > panAreaSize)\r\n      ? padding\r\n      : this.center[axis];\r\n  }\r\n\r\n  // _getZeroBounds\r\n  reset() {\r\n    this.center.x = 0;\r\n    this.center.y = 0;\r\n    this.max.x = 0;\r\n    this.max.y = 0;\r\n    this.min.x = 0;\r\n    this.min.y = 0;\r\n  }\r\n\r\n  /**\r\n   * Correct pan position if it's beyond the bounds\r\n   *\r\n   * @param {Axis} axis x or y\r\n   * @param {number} panOffset\r\n   */\r\n  correctPan(axis, panOffset) { // checkPanBounds\r\n    return clamp(panOffset, this.max[axis], this.min[axis]);\r\n  }\r\n}\n\nconst MAX_IMAGE_WIDTH = 4000;\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\r\n\r\n/**\r\n * Calculates zoom levels for specific slide.\r\n * Depends on viewport size and image size.\r\n */\r\nclass ZoomLevel {\r\n  /**\r\n   * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n   * @param {SlideData} itemData Slide data\r\n   * @param {number} index Slide index\r\n   * @param {PhotoSwipe=} pswp PhotoSwipe instance, can be undefined if not initialized yet\r\n   */\r\n  constructor(options, itemData, index, pswp) {\r\n    this.pswp = pswp;\r\n    this.options = options;\r\n    this.itemData = itemData;\r\n    this.index = index;\r\n  }\r\n\r\n  /**\r\n   * Calculate initial, secondary and maximum zoom level for the specified slide.\r\n   *\r\n   * It should be called when either image or viewport size changes.\r\n   *\r\n   * @param {number} maxWidth\r\n   * @param {number} maxHeight\r\n   * @param {{ x?: number; y?: number }} panAreaSize\r\n   */\r\n  update(maxWidth, maxHeight, panAreaSize) {\r\n    this.elementSize = {\r\n      x: maxWidth,\r\n      y: maxHeight\r\n    };\r\n\r\n    this.panAreaSize = panAreaSize;\r\n\r\n    const hRatio = this.panAreaSize.x / this.elementSize.x;\r\n    const vRatio = this.panAreaSize.y / this.elementSize.y;\r\n\r\n    this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\r\n    this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio);\r\n\r\n    // zoom.vFill defines zoom level of the image\r\n    // when it has 100% of viewport vertical space (height)\r\n    this.vFill = Math.min(1, vRatio);\r\n\r\n    this.initial = this._getInitial();\r\n    this.secondary = this._getSecondary();\r\n    this.max = Math.max(\r\n      this.initial,\r\n      this.secondary,\r\n      this._getMax()\r\n    );\r\n\r\n    this.min = Math.min(\r\n      this.fit,\r\n      this.initial,\r\n      this.secondary\r\n    );\r\n\r\n    if (this.pswp) {\r\n      this.pswp.dispatch('zoomLevelsUpdate', { zoomLevels: this, slideData: this.itemData });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Parses user-defined zoom option.\r\n   *\r\n   * @private\r\n   * @param {'initial' | 'secondary' | 'max'} optionPrefix Zoom level option prefix (initial, secondary, max)\r\n   */\r\n  _parseZoomLevelOption(optionPrefix) {\r\n    // eslint-disable-next-line max-len\r\n    const optionName = /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */ (optionPrefix + 'ZoomLevel');\r\n    const optionValue = this.options[optionName];\r\n\r\n    if (!optionValue) {\r\n      return;\r\n    }\r\n\r\n    if (typeof optionValue === 'function') {\r\n      return optionValue(this);\r\n    }\r\n\r\n    if (optionValue === 'fill') {\r\n      return this.fill;\r\n    }\r\n\r\n    if (optionValue === 'fit') {\r\n      return this.fit;\r\n    }\r\n\r\n    return Number(optionValue);\r\n  }\r\n\r\n  /**\r\n   * Get zoom level to which image will be zoomed after double-tap gesture,\r\n   * or when user clicks on zoom icon,\r\n   * or mouse-click on image itself.\r\n   * If you return 1 image will be zoomed to its original size.\r\n   *\r\n   * @private\r\n   * @return {number}\r\n   */\r\n  _getSecondary() {\r\n    let currZoomLevel = this._parseZoomLevelOption('secondary');\r\n\r\n    if (currZoomLevel) {\r\n      return currZoomLevel;\r\n    }\r\n\r\n    // 3x of \"fit\" state, but not larger than original\r\n    currZoomLevel = Math.min(1, this.fit * 3);\r\n\r\n    if (currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\r\n      currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\r\n    }\r\n\r\n    return currZoomLevel;\r\n  }\r\n\r\n  /**\r\n   * Get initial image zoom level.\r\n   *\r\n   * @private\r\n   * @return {number}\r\n   */\r\n  _getInitial() {\r\n    return this._parseZoomLevelOption('initial') || this.fit;\r\n  }\r\n\r\n  /**\r\n   * Maximum zoom level when user zooms\r\n   * via zoom/pinch gesture,\r\n   * via cmd/ctrl-wheel or via trackpad.\r\n   *\r\n   * @private\r\n   * @return {number}\r\n   */\r\n  _getMax() {\r\n    const currZoomLevel = this._parseZoomLevelOption('max');\r\n\r\n    if (currZoomLevel) {\r\n      return currZoomLevel;\r\n    }\r\n\r\n    // max zoom level is x4 from \"fit state\",\r\n    // used for zoom gesture and ctrl/trackpad zoom\r\n    return Math.max(1, this.fit * 4);\r\n  }\r\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n * Renders and allows to control a single slide\r\n */\r\nclass Slide {\r\n  /**\r\n   * @param {SlideData} data\r\n   * @param {number} index\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(data, index, pswp) {\r\n    this.data = data;\r\n    this.index = index;\r\n    this.pswp = pswp;\r\n    this.isActive = (index === pswp.currIndex);\r\n    this.currentResolution = 0;\r\n    /** @type {Point} */\r\n    this.panAreaSize = {};\r\n\r\n    this.isFirstSlide = (this.isActive && !pswp.opener.isOpen);\r\n\r\n    this.zoomLevels = new ZoomLevel(pswp.options, data, index, pswp);\r\n\r\n    this.pswp.dispatch('gettingData', {\r\n      slide: this,\r\n      data: this.data,\r\n      index\r\n    });\r\n\r\n    this.pan = {\r\n      x: 0,\r\n      y: 0\r\n    };\r\n\r\n    this.content = this.pswp.contentLoader.getContentBySlide(this);\r\n    this.container = createElement('pswp__zoom-wrap');\r\n\r\n    this.currZoomLevel = 1;\r\n    /** @type {number} */\r\n    this.width = this.content.width;\r\n    /** @type {number} */\r\n    this.height = this.content.height;\r\n\r\n    this.bounds = new PanBounds(this);\r\n\r\n    this.prevDisplayedWidth = -1;\r\n    this.prevDisplayedHeight = -1;\r\n\r\n    this.pswp.dispatch('slideInit', { slide: this });\r\n  }\r\n\r\n  /**\r\n   * If this slide is active/current/visible\r\n   *\r\n   * @param {boolean} isActive\r\n   */\r\n  setIsActive(isActive) {\r\n    if (isActive && !this.isActive) {\r\n      // slide just became active\r\n      this.activate();\r\n    } else if (!isActive && this.isActive) {\r\n      // slide just became non-active\r\n      this.deactivate();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Appends slide content to DOM\r\n   *\r\n   * @param {HTMLElement} holderElement\r\n   */\r\n  append(holderElement) {\r\n    this.holderElement = holderElement;\r\n\r\n    this.container.style.transformOrigin = '0 0';\r\n\r\n    // Slide appended to DOM\r\n    if (!this.data) {\r\n      return;\r\n    }\r\n\r\n    this.calculateSize();\r\n\r\n    this.load();\r\n    this.updateContentSize();\r\n    this.appendHeavy();\r\n\r\n    this.holderElement.appendChild(this.container);\r\n\r\n    this.zoomAndPanToInitial();\r\n\r\n    this.pswp.dispatch('firstZoomPan', { slide: this });\r\n\r\n    this.applyCurrentZoomPan();\r\n\r\n    this.pswp.dispatch('afterSetContent', { slide: this });\r\n\r\n    if (this.isActive) {\r\n      this.activate();\r\n    }\r\n  }\r\n\r\n  load() {\r\n    this.content.load();\r\n    this.pswp.dispatch('slideLoad', { slide: this });\r\n  }\r\n\r\n  /**\r\n   * Append \"heavy\" DOM elements\r\n   *\r\n   * This may depend on a type of slide,\r\n   * but generally these are large images.\r\n   */\r\n  appendHeavy() {\r\n    const { pswp } = this;\r\n    const appendHeavyNearby = true; // todo\r\n\r\n    // Avoid appending heavy elements during animations\r\n    if (this.heavyAppended\r\n        || !pswp.opener.isOpen\r\n        || pswp.mainScroll.isShifted()\r\n        || (!this.isActive && !appendHeavyNearby)) {\r\n      return;\r\n    }\r\n\r\n    if (this.pswp.dispatch('appendHeavy', { slide: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    this.heavyAppended = true;\r\n\r\n    this.content.append();\r\n\r\n    this.pswp.dispatch('appendHeavyContent', { slide: this });\r\n  }\r\n\r\n  /**\r\n   * Triggered when this slide is active (selected).\r\n   *\r\n   * If it's part of opening/closing transition -\r\n   * activate() will trigger after the transition is ended.\r\n   */\r\n  activate() {\r\n    this.isActive = true;\r\n    this.appendHeavy();\r\n    this.content.activate();\r\n    this.pswp.dispatch('slideActivate', { slide: this });\r\n  }\r\n\r\n  /**\r\n   * Triggered when this slide becomes inactive.\r\n   *\r\n   * Slide can become inactive only after it was active.\r\n   */\r\n  deactivate() {\r\n    this.isActive = false;\r\n    this.content.deactivate();\r\n\r\n    if (this.currZoomLevel !== this.zoomLevels.initial) {\r\n      // allow filtering\r\n      this.calculateSize();\r\n    }\r\n\r\n    // reset zoom level\r\n    this.currentResolution = 0;\r\n    this.zoomAndPanToInitial();\r\n    this.applyCurrentZoomPan();\r\n    this.updateContentSize();\r\n\r\n    this.pswp.dispatch('slideDeactivate', { slide: this });\r\n  }\r\n\r\n  /**\r\n   * The slide should destroy itself, it will never be used again.\r\n   * (unbind all events and destroy internal components)\r\n   */\r\n  destroy() {\r\n    this.content.hasSlide = false;\r\n    this.content.remove();\r\n    this.container.remove();\r\n    this.pswp.dispatch('slideDestroy', { slide: this });\r\n  }\r\n\r\n  resize() {\r\n    if (this.currZoomLevel === this.zoomLevels.initial || !this.isActive) {\r\n      // Keep initial zoom level if it was before the resize,\r\n      // as well as when this slide is not active\r\n\r\n      // Reset position and scale to original state\r\n      this.calculateSize();\r\n      this.currentResolution = 0;\r\n      this.zoomAndPanToInitial();\r\n      this.applyCurrentZoomPan();\r\n      this.updateContentSize();\r\n    } else {\r\n      // readjust pan position if it's beyond the bounds\r\n      this.calculateSize();\r\n      this.bounds.update(this.currZoomLevel);\r\n      this.panTo(this.pan.x, this.pan.y);\r\n    }\r\n  }\r\n\r\n\r\n  /**\r\n   * Apply size to current slide content,\r\n   * based on the current resolution and scale.\r\n   *\r\n   * @param {boolean=} force if size should be updated even if dimensions weren't changed\r\n   */\r\n  updateContentSize(force) {\r\n    // Use initial zoom level\r\n    // if resolution is not defined (user didn't zoom yet)\r\n    const scaleMultiplier = this.currentResolution || this.zoomLevels.initial;\r\n\r\n    if (!scaleMultiplier) {\r\n      return;\r\n    }\r\n\r\n    const width = Math.round(this.width * scaleMultiplier) || this.pswp.viewportSize.x;\r\n    const height = Math.round(this.height * scaleMultiplier) || this.pswp.viewportSize.y;\r\n\r\n    if (!this.sizeChanged(width, height) && !force) {\r\n      return;\r\n    }\r\n    this.content.setDisplayedSize(width, height);\r\n  }\r\n\r\n  /**\r\n   * @param {number} width\r\n   * @param {number} height\r\n   */\r\n  sizeChanged(width, height) {\r\n    if (width !== this.prevDisplayedWidth\r\n        || height !== this.prevDisplayedHeight) {\r\n      this.prevDisplayedWidth = width;\r\n      this.prevDisplayedHeight = height;\r\n      return true;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  getPlaceholderElement() {\r\n    if (this.content.placeholder) {\r\n      return this.content.placeholder.element;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Zoom current slide image to...\r\n   *\r\n   * @param {number} destZoomLevel Destination zoom level.\r\n   * @param {{ x?: number; y?: number }} centerPoint\r\n   * Transform origin center point, or false if viewport center should be used.\r\n   * @param {number | false} [transitionDuration] Transition duration, may be set to 0.\r\n   * @param {boolean=} ignoreBounds Minimum and maximum zoom levels will be ignored.\r\n   * @return {boolean=} Returns true if animated.\r\n   */\r\n  zoomTo(destZoomLevel, centerPoint, transitionDuration, ignoreBounds) {\r\n    const { pswp } = this;\r\n    if (!this.isZoomable()\r\n        || pswp.mainScroll.isShifted()) {\r\n      return;\r\n    }\r\n\r\n    pswp.dispatch('beforeZoomTo', {\r\n      destZoomLevel, centerPoint, transitionDuration\r\n    });\r\n\r\n    // stop all pan and zoom transitions\r\n    pswp.animations.stopAllPan();\r\n\r\n    // if (!centerPoint) {\r\n    //   centerPoint = pswp.getViewportCenterPoint();\r\n    // }\r\n\r\n    const prevZoomLevel = this.currZoomLevel;\r\n\r\n    if (!ignoreBounds) {\r\n      destZoomLevel = clamp(destZoomLevel, this.zoomLevels.min, this.zoomLevels.max);\r\n    }\r\n\r\n    // if (transitionDuration === undefined) {\r\n    //   transitionDuration = this.pswp.options.zoomAnimationDuration;\r\n    // }\r\n\r\n    this.setZoomLevel(destZoomLevel);\r\n    this.pan.x = this.calculateZoomToPanOffset('x', centerPoint, prevZoomLevel);\r\n    this.pan.y = this.calculateZoomToPanOffset('y', centerPoint, prevZoomLevel);\r\n    roundPoint(this.pan);\r\n\r\n    const finishTransition = () => {\r\n      this._setResolution(destZoomLevel);\r\n      this.applyCurrentZoomPan();\r\n    };\r\n\r\n    if (!transitionDuration) {\r\n      finishTransition();\r\n    } else {\r\n      pswp.animations.startTransition({\r\n        isPan: true,\r\n        name: 'zoomTo',\r\n        target: this.container,\r\n        transform: this.getCurrentTransform(),\r\n        onComplete: finishTransition,\r\n        duration: transitionDuration,\r\n        easing: pswp.options.easing\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {{ x?: number, y?: number }} [centerPoint]\r\n   */\r\n  toggleZoom(centerPoint) {\r\n    this.zoomTo(\r\n      this.currZoomLevel === this.zoomLevels.initial\r\n        ? this.zoomLevels.secondary : this.zoomLevels.initial,\r\n      centerPoint,\r\n      this.pswp.options.zoomAnimationDuration\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Updates zoom level property and recalculates new pan bounds,\r\n   * unlike zoomTo it does not apply transform (use applyCurrentZoomPan)\r\n   *\r\n   * @param {number} currZoomLevel\r\n   */\r\n  setZoomLevel(currZoomLevel) {\r\n    this.currZoomLevel = currZoomLevel;\r\n    this.bounds.update(this.currZoomLevel);\r\n  }\r\n\r\n  /**\r\n   * Get pan position after zoom at a given `point`.\r\n   *\r\n   * Always call setZoomLevel(newZoomLevel) beforehand to recalculate\r\n   * pan bounds according to the new zoom level.\r\n   *\r\n   * @param {'x' | 'y'} axis\r\n   * @param {{ x?: number; y?: number }} [point]\r\n   * point based on which zoom is performed, usually refers to the current mouse position,\r\n   * if false - viewport center will be used.\r\n   * @param {number=} prevZoomLevel Zoom level before new zoom was applied.\r\n   */\r\n  calculateZoomToPanOffset(axis, point, prevZoomLevel) {\r\n    const totalPanDistance = this.bounds.max[axis] - this.bounds.min[axis];\r\n    if (totalPanDistance === 0) {\r\n      return this.bounds.center[axis];\r\n    }\r\n\r\n    if (!point) {\r\n      point = this.pswp.getViewportCenterPoint();\r\n    }\r\n\r\n    const zoomFactor = this.currZoomLevel / prevZoomLevel;\r\n    return this.bounds.correctPan(\r\n      axis,\r\n      (this.pan[axis] - point[axis]) * zoomFactor + point[axis]\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Apply pan and keep it within bounds.\r\n   *\r\n   * @param {number} panX\r\n   * @param {number} panY\r\n   */\r\n  panTo(panX, panY) {\r\n    this.pan.x = this.bounds.correctPan('x', panX);\r\n    this.pan.y = this.bounds.correctPan('y', panY);\r\n    this.applyCurrentZoomPan();\r\n  }\r\n\r\n  /**\r\n   * If the slide in the current state can be panned by the user\r\n   */\r\n  isPannable() {\r\n    return this.width && (this.currZoomLevel > this.zoomLevels.fit);\r\n  }\r\n\r\n  /**\r\n   * If the slide can be zoomed\r\n   */\r\n  isZoomable() {\r\n    return this.width && this.content.isZoomable();\r\n  }\r\n\r\n  /**\r\n   * Apply transform and scale based on\r\n   * the current pan position (this.pan) and zoom level (this.currZoomLevel)\r\n   */\r\n  applyCurrentZoomPan() {\r\n    this._applyZoomTransform(this.pan.x, this.pan.y, this.currZoomLevel);\r\n    if (this === this.pswp.currSlide) {\r\n      this.pswp.dispatch('zoomPanUpdate', { slide: this });\r\n    }\r\n  }\r\n\r\n  zoomAndPanToInitial() {\r\n    this.currZoomLevel = this.zoomLevels.initial;\r\n\r\n    // pan according to the zoom level\r\n    this.bounds.update(this.currZoomLevel);\r\n    equalizePoints(this.pan, this.bounds.center);\r\n    this.pswp.dispatch('initialZoomPan', { slide: this });\r\n  }\r\n\r\n  /**\r\n   * Set translate and scale based on current resolution\r\n   *\r\n   * @param {number} x\r\n   * @param {number} y\r\n   * @param {number} zoom\r\n   */\r\n  _applyZoomTransform(x, y, zoom) {\r\n    zoom /= this.currentResolution || this.zoomLevels.initial;\r\n    setTransform(this.container, x, y, zoom);\r\n  }\r\n\r\n  calculateSize() {\r\n    const { pswp } = this;\r\n\r\n    equalizePoints(\r\n      this.panAreaSize,\r\n      getPanAreaSize(pswp.options, pswp.viewportSize, this.data, this.index)\r\n    );\r\n\r\n    this.zoomLevels.update(this.width, this.height, this.panAreaSize);\r\n\r\n    pswp.dispatch('calcSlideSize', {\r\n      slide: this\r\n    });\r\n  }\r\n\r\n  getCurrentTransform() {\r\n    const scale = this.currZoomLevel / (this.currentResolution || this.zoomLevels.initial);\r\n    return toTransformString(this.pan.x, this.pan.y, scale);\r\n  }\r\n\r\n  /**\r\n   * Set resolution and re-render the image.\r\n   *\r\n   * For example, if the real image size is 2000x1500,\r\n   * and resolution is 0.5 - it will be rendered as 1000x750.\r\n   *\r\n   * Image with zoom level 2 and resolution 0.5 is\r\n   * the same as image with zoom level 1 and resolution 1.\r\n   *\r\n   * Used to optimize animations and make\r\n   * sure that browser renders image in highest quality.\r\n   * Also used by responsive images to load the correct one.\r\n   *\r\n   * @param {number} newResolution\r\n   */\r\n  _setResolution(newResolution) {\r\n    if (newResolution === this.currentResolution) {\r\n      return;\r\n    }\r\n\r\n    this.currentResolution = newResolution;\r\n    this.updateContentSize();\r\n\r\n    this.pswp.dispatch('resolutionChanged');\r\n  }\r\n}\n\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n/** @typedef {import('./gestures.js').default} Gestures */\r\n\r\nconst PAN_END_FRICTION = 0.35;\r\nconst VERTICAL_DRAG_FRICTION = 0.6;\r\n\r\n// 1 corresponds to the third of viewport height\r\nconst MIN_RATIO_TO_CLOSE = 0.4;\r\n\r\n// Minimum speed required to navigate\r\n// to next or previous slide\r\nconst MIN_NEXT_SLIDE_SPEED = 0.5;\r\n\r\n/**\r\n * @param {number} initialVelocity\r\n * @param {number} decelerationRate\r\n */\r\nfunction project(initialVelocity, decelerationRate) {\r\n  return initialVelocity * decelerationRate / (1 - decelerationRate);\r\n}\r\n\r\n/**\r\n * Handles single pointer dragging\r\n */\r\nclass DragHandler {\r\n  /**\r\n   * @param {Gestures} gestures\r\n   */\r\n  constructor(gestures) {\r\n    this.gestures = gestures;\r\n    this.pswp = gestures.pswp;\r\n    /** @type {Point} */\r\n    this.startPan = {};\r\n  }\r\n\r\n  start() {\r\n    equalizePoints(this.startPan, this.pswp.currSlide.pan);\r\n    this.pswp.animations.stopAll();\r\n  }\r\n\r\n  change() {\r\n    const { p1, prevP1, dragAxis, pswp } = this.gestures;\r\n    const { currSlide } = pswp;\r\n\r\n    if (dragAxis === 'y'\r\n        && pswp.options.closeOnVerticalDrag\r\n        && currSlide.currZoomLevel <= currSlide.zoomLevels.fit\r\n        && !this.gestures.isMultitouch) {\r\n      // Handle vertical drag to close\r\n      const panY = currSlide.pan.y + (p1.y - prevP1.y);\r\n      if (!pswp.dispatch('verticalDrag', { panY }).defaultPrevented) {\r\n        this._setPanWithFriction('y', panY, VERTICAL_DRAG_FRICTION);\r\n        const bgOpacity = 1 - Math.abs(this._getVerticalDragRatio(currSlide.pan.y));\r\n        pswp.applyBgOpacity(bgOpacity);\r\n        currSlide.applyCurrentZoomPan();\r\n      }\r\n    } else {\r\n      const mainScrollChanged = this._panOrMoveMainScroll('x');\r\n      if (!mainScrollChanged) {\r\n        this._panOrMoveMainScroll('y');\r\n\r\n        roundPoint(currSlide.pan);\r\n        currSlide.applyCurrentZoomPan();\r\n      }\r\n    }\r\n  }\r\n\r\n  end() {\r\n    const { pswp, velocity } = this.gestures;\r\n    const { mainScroll } = pswp;\r\n    let indexDiff = 0;\r\n\r\n    pswp.animations.stopAll();\r\n\r\n    // Handle main scroll if it's shifted\r\n    if (mainScroll.isShifted()) {\r\n      // Position of the main scroll relative to the viewport\r\n      const mainScrollShiftDiff = mainScroll.x - mainScroll.getCurrSlideX();\r\n\r\n      // Ratio between 0 and 1:\r\n      // 0 - slide is not visible at all,\r\n      // 0.5 - half of the slide is vicible\r\n      // 1 - slide is fully visible\r\n      const currentSlideVisibilityRatio = (mainScrollShiftDiff / pswp.viewportSize.x);\r\n\r\n      // Go next slide.\r\n      //\r\n      // - if velocity and its direction is matched\r\n      //   and we see at least tiny part of the next slide\r\n      //\r\n      // - or if we see less than 50% of the current slide\r\n      //   and velocity is close to 0\r\n      //\r\n      if ((velocity.x < -MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio < 0)\r\n          || (velocity.x < 0.1 && currentSlideVisibilityRatio < -0.5)) {\r\n        // Go to next slide\r\n        indexDiff = 1;\r\n        velocity.x = Math.min(velocity.x, 0);\r\n      } else if ((velocity.x > MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio > 0)\r\n          || (velocity.x > -0.1 && currentSlideVisibilityRatio > 0.5)) {\r\n        // Go to prev slide\r\n        indexDiff = -1;\r\n        velocity.x = Math.max(velocity.x, 0);\r\n      }\r\n\r\n      mainScroll.moveIndexBy(indexDiff, true, velocity.x);\r\n    }\r\n\r\n    // Restore zoom level\r\n    if (pswp.currSlide.currZoomLevel > pswp.currSlide.zoomLevels.max\r\n        || this.gestures.isMultitouch) {\r\n      this.gestures.zoomLevels.correctZoomPan(true);\r\n    } else {\r\n      // we run two animations instead of one,\r\n      // as each axis has own pan boundaries and thus different spring function\r\n      // (correctZoomPan does not have this functionality,\r\n      //  it animates all properties with single timing function)\r\n      this._finishPanGestureForAxis('x');\r\n      this._finishPanGestureForAxis('y');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {'x' | 'y'} axis\r\n   */\r\n  _finishPanGestureForAxis(axis) {\r\n    const { pswp } = this;\r\n    const { currSlide } = pswp;\r\n    const { velocity } = this.gestures;\r\n    const { pan, bounds } = currSlide;\r\n    const panPos = pan[axis];\r\n    const restoreBgOpacity = (pswp.bgOpacity < 1 && axis === 'y');\r\n\r\n    // 0.995 means - scroll view loses 0.5% of its velocity per millisecond\r\n    // Inceasing this number will reduce travel distance\r\n    const decelerationRate = 0.995; // 0.99\r\n\r\n    // Pan position if there is no bounds\r\n    const projectedPosition = panPos + project(velocity[axis], decelerationRate);\r\n\r\n    if (restoreBgOpacity) {\r\n      const vDragRatio = this._getVerticalDragRatio(panPos);\r\n      const projectedVDragRatio = this._getVerticalDragRatio(projectedPosition);\r\n\r\n      // If we are above and moving upwards,\r\n      // or if we are below and moving downwards\r\n      if ((vDragRatio < 0 && projectedVDragRatio < -MIN_RATIO_TO_CLOSE)\r\n          || (vDragRatio > 0 && projectedVDragRatio > MIN_RATIO_TO_CLOSE)) {\r\n        pswp.close();\r\n        return;\r\n      }\r\n    }\r\n\r\n    // Pan position with corrected bounds\r\n    const correctedPanPosition = bounds.correctPan(axis, projectedPosition);\r\n\r\n    // Exit if pan position should not be changed\r\n    // or if speed it too low\r\n    if (panPos === correctedPanPosition) {\r\n      return;\r\n    }\r\n\r\n    // Overshoot if the final position is out of pan bounds\r\n    const dampingRatio = (correctedPanPosition === projectedPosition) ? 1 : 0.82;\r\n\r\n    const initialBgOpacity = pswp.bgOpacity;\r\n    const totalPanDist = correctedPanPosition - panPos;\r\n\r\n    pswp.animations.startSpring({\r\n      name: 'panGesture' + axis,\r\n      isPan: true,\r\n      start: panPos,\r\n      end: correctedPanPosition,\r\n      velocity: velocity[axis],\r\n      dampingRatio,\r\n      onUpdate: (pos) => {\r\n        // Animate opacity of background relative to Y pan position of an image\r\n        if (restoreBgOpacity && pswp.bgOpacity < 1) {\r\n          // 0 - start of animation, 1 - end of animation\r\n          const animationProgressRatio = 1 - (correctedPanPosition - pos) / totalPanDist;\r\n\r\n          // We clamp opacity to keep it between 0 and 1.\r\n          // As progress ratio can be larger than 1 due to overshoot,\r\n          // and we do not want to bounce opacity.\r\n          pswp.applyBgOpacity(clamp(\r\n            initialBgOpacity + (1 - initialBgOpacity) * animationProgressRatio,\r\n            0,\r\n            1\r\n          ));\r\n        }\r\n\r\n        pan[axis] = Math.floor(pos);\r\n        currSlide.applyCurrentZoomPan();\r\n      },\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Update position of the main scroll,\r\n   * or/and update pan position of the current slide.\r\n   *\r\n   * Should return true if it changes (or can change) main scroll.\r\n   *\r\n   * @private\r\n   * @param {'x' | 'y'} axis\r\n   */\r\n  _panOrMoveMainScroll(axis) {\r\n    const { p1, pswp, dragAxis, prevP1, isMultitouch } = this.gestures;\r\n    const { currSlide, mainScroll } = pswp;\r\n    const delta = (p1[axis] - prevP1[axis]);\r\n    const newMainScrollX = mainScroll.x + delta;\r\n\r\n    if (!delta) {\r\n      return;\r\n    }\r\n\r\n    // Always move main scroll if image can not be panned\r\n    if (axis === 'x' && !currSlide.isPannable() && !isMultitouch) {\r\n      mainScroll.moveTo(newMainScrollX, true);\r\n      return true; // changed main scroll\r\n    }\r\n\r\n    const { bounds } = currSlide;\r\n    const newPan = currSlide.pan[axis] + delta;\r\n\r\n    if (pswp.options.allowPanToNext\r\n        && dragAxis === 'x'\r\n        && axis === 'x'\r\n        && !isMultitouch) {\r\n      const currSlideMainScrollX = mainScroll.getCurrSlideX();\r\n\r\n      // Position of the main scroll relative to the viewport\r\n      const mainScrollShiftDiff = mainScroll.x - currSlideMainScrollX;\r\n\r\n      const isLeftToRight = delta > 0;\r\n      const isRightToLeft = !isLeftToRight;\r\n\r\n      if (newPan > bounds.min[axis] && isLeftToRight) {\r\n        // Panning from left to right, beyond the left edge\r\n\r\n        // Wether the image was at minimum pan position (or less)\r\n        // when this drag gesture started.\r\n        // Minimum pan position refers to the left edge of the image.\r\n        const wasAtMinPanPosition = (bounds.min[axis] <= this.startPan[axis]);\r\n\r\n        if (wasAtMinPanPosition) {\r\n          mainScroll.moveTo(newMainScrollX, true);\r\n          return true;\r\n        } else {\r\n          this._setPanWithFriction(axis, newPan);\r\n          //currSlide.pan[axis] = newPan;\r\n        }\r\n      } else if (newPan < bounds.max[axis] && isRightToLeft) {\r\n        // Paning from right to left, beyond the right edge\r\n\r\n        // Maximum pan position refers to the right edge of the image.\r\n        const wasAtMaxPanPosition = (this.startPan[axis] <= bounds.max[axis]);\r\n\r\n        if (wasAtMaxPanPosition) {\r\n          mainScroll.moveTo(newMainScrollX, true);\r\n          return true;\r\n        } else {\r\n          this._setPanWithFriction(axis, newPan);\r\n          //currSlide.pan[axis] = newPan;\r\n        }\r\n      } else {\r\n        // If main scroll is shifted\r\n        if (mainScrollShiftDiff !== 0) {\r\n          // If main scroll is shifted right\r\n          if (mainScrollShiftDiff > 0 /*&& isRightToLeft*/) {\r\n            mainScroll.moveTo(Math.max(newMainScrollX, currSlideMainScrollX), true);\r\n            return true;\r\n          } else if (mainScrollShiftDiff < 0 /*&& isLeftToRight*/) {\r\n            // Main scroll is shifted left (Position is less than 0 comparing to the viewport 0)\r\n            mainScroll.moveTo(Math.min(newMainScrollX, currSlideMainScrollX), true);\r\n            return true;\r\n          }\r\n        } else {\r\n          // We are within pan bounds, so just pan\r\n          this._setPanWithFriction(axis, newPan);\r\n        }\r\n      }\r\n    } else {\r\n      if (axis === 'y') {\r\n        // Do not pan vertically if main scroll is shifted o\r\n        if (!mainScroll.isShifted() && bounds.min.y !== bounds.max.y) {\r\n          this._setPanWithFriction(axis, newPan);\r\n        }\r\n      } else {\r\n        this._setPanWithFriction(axis, newPan);\r\n      }\r\n    }\r\n  }\r\n  //\r\n  // If we move above - the ratio is negative\r\n  // If we move below the ratio is positive\r\n\r\n  /**\r\n   * Relation between pan Y position and third of viewport height.\r\n   *\r\n   * When we are at initial position (center bounds) - the ratio is 0,\r\n   * if position is shifted upwards - the ratio is negative,\r\n   * if position is shifted downwards - the ratio is positive.\r\n   *\r\n   * @private\r\n   * @param {number} panY The current pan Y position.\r\n   */\r\n  _getVerticalDragRatio(panY) {\r\n    return (panY - this.pswp.currSlide.bounds.center.y)\r\n            / (this.pswp.viewportSize.y / 3);\r\n  }\r\n\r\n  /**\r\n   * Set pan position of the current slide.\r\n   * Apply friction if the position is beyond the pan bounds,\r\n   * or if custom friction is defined.\r\n   *\r\n   * @private\r\n   * @param {'x' | 'y'} axis\r\n   * @param {number} potentialPan\r\n   * @param {number=} customFriction (0.1 - 1)\r\n   */\r\n  _setPanWithFriction(axis, potentialPan, customFriction) {\r\n    const { pan, bounds } = this.pswp.currSlide;\r\n    const correctedPan = bounds.correctPan(axis, potentialPan);\r\n    // If we are out of pan bounds\r\n    if (correctedPan !== potentialPan || customFriction) {\r\n      const delta = Math.round(potentialPan - pan[axis]);\r\n      pan[axis] += delta * (customFriction || PAN_END_FRICTION);\r\n    } else {\r\n      pan[axis] = potentialPan;\r\n    }\r\n  }\r\n}\n\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n/** @typedef {import('./gestures.js').default} Gestures */\r\n\r\nconst UPPER_ZOOM_FRICTION = 0.05;\r\nconst LOWER_ZOOM_FRICTION = 0.15;\r\n\r\n\r\n/**\r\n * Get center point between two points\r\n *\r\n * @param {Point} p\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nfunction getZoomPointsCenter(p, p1, p2) {\r\n  p.x = (p1.x + p2.x) / 2;\r\n  p.y = (p1.y + p2.y) / 2;\r\n  return p;\r\n}\r\n\r\nclass ZoomHandler {\r\n  /**\r\n   * @param {Gestures} gestures\r\n   */\r\n  constructor(gestures) {\r\n    this.gestures = gestures;\r\n    this.pswp = this.gestures.pswp;\r\n    /** @type {Point} */\r\n    this._startPan = {};\r\n\r\n    /** @type {Point} */\r\n    this._startZoomPoint = {};\r\n    /** @type {Point} */\r\n    this._zoomPoint = {};\r\n  }\r\n\r\n  start() {\r\n    this._startZoomLevel = this.pswp.currSlide.currZoomLevel;\r\n    equalizePoints(this._startPan, this.pswp.currSlide.pan);\r\n    this.pswp.animations.stopAllPan();\r\n    this._wasOverFitZoomLevel = false;\r\n  }\r\n\r\n  change() {\r\n    const { p1, startP1, p2, startP2, pswp } = this.gestures;\r\n    const { currSlide } = pswp;\r\n    const minZoomLevel = currSlide.zoomLevels.min;\r\n    const maxZoomLevel = currSlide.zoomLevels.max;\r\n\r\n    if (!currSlide.isZoomable() || pswp.mainScroll.isShifted()) {\r\n      return;\r\n    }\r\n\r\n    getZoomPointsCenter(this._startZoomPoint, startP1, startP2);\r\n    getZoomPointsCenter(this._zoomPoint, p1, p2);\r\n\r\n    let currZoomLevel = (1 / getDistanceBetween(startP1, startP2))\r\n                      * getDistanceBetween(p1, p2)\r\n                      * this._startZoomLevel;\r\n\r\n    // slightly over the zoom.fit\r\n    if (currZoomLevel > currSlide.zoomLevels.initial + (currSlide.zoomLevels.initial / 15)) {\r\n      this._wasOverFitZoomLevel = true;\r\n    }\r\n\r\n    if (currZoomLevel < minZoomLevel) {\r\n      if (pswp.options.pinchToClose\r\n          && !this._wasOverFitZoomLevel\r\n          && this._startZoomLevel <= currSlide.zoomLevels.initial) {\r\n        // fade out background if zooming out\r\n        const bgOpacity = 1 - ((minZoomLevel - currZoomLevel) / (minZoomLevel / 1.2));\r\n        if (!pswp.dispatch('pinchClose', { bgOpacity }).defaultPrevented) {\r\n          pswp.applyBgOpacity(bgOpacity);\r\n        }\r\n      } else {\r\n        // Apply the friction if zoom level is below the min\r\n        currZoomLevel = minZoomLevel - (minZoomLevel - currZoomLevel) * LOWER_ZOOM_FRICTION;\r\n      }\r\n    } else if (currZoomLevel > maxZoomLevel) {\r\n      // Apply the friction if zoom level is above the max\r\n      currZoomLevel = maxZoomLevel + (currZoomLevel - maxZoomLevel) * UPPER_ZOOM_FRICTION;\r\n    }\r\n\r\n    currSlide.pan.x = this._calculatePanForZoomLevel('x', currZoomLevel);\r\n    currSlide.pan.y = this._calculatePanForZoomLevel('y', currZoomLevel);\r\n\r\n    currSlide.setZoomLevel(currZoomLevel);\r\n    currSlide.applyCurrentZoomPan();\r\n  }\r\n\r\n  end() {\r\n    const { pswp } = this;\r\n    const { currSlide } = pswp;\r\n    if (currSlide.currZoomLevel < currSlide.zoomLevels.initial\r\n        && !this._wasOverFitZoomLevel\r\n        && pswp.options.pinchToClose) {\r\n      pswp.close();\r\n    } else {\r\n      this.correctZoomPan();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {'x' | 'y'} axis\r\n   * @param {number} currZoomLevel\r\n   */\r\n  _calculatePanForZoomLevel(axis, currZoomLevel) {\r\n    const zoomFactor = currZoomLevel / this._startZoomLevel;\r\n    return this._zoomPoint[axis]\r\n            - ((this._startZoomPoint[axis] - this._startPan[axis]) * zoomFactor);\r\n  }\r\n\r\n  /**\r\n   * Correct currZoomLevel and pan if they are\r\n   * beyond minimum or maximum values.\r\n   * With animation.\r\n   *\r\n   * @param {boolean=} ignoreGesture\r\n   * Wether gesture coordinates should be ignored when calculating destination pan position.\r\n   */\r\n  correctZoomPan(ignoreGesture) {\r\n    const { pswp } = this;\r\n    const { currSlide } = pswp;\r\n\r\n    if (!currSlide.isZoomable()) {\r\n      return;\r\n    }\r\n\r\n    if (this._zoomPoint.x === undefined) {\r\n      ignoreGesture = true;\r\n    }\r\n\r\n    const prevZoomLevel = currSlide.currZoomLevel;\r\n\r\n    /** @type {number} */\r\n    let destinationZoomLevel;\r\n    let currZoomLevelNeedsChange = true;\r\n\r\n    if (prevZoomLevel < currSlide.zoomLevels.initial) {\r\n      destinationZoomLevel = currSlide.zoomLevels.initial;\r\n      // zoom to min\r\n    } else if (prevZoomLevel > currSlide.zoomLevels.max) {\r\n      destinationZoomLevel = currSlide.zoomLevels.max;\r\n      // zoom to max\r\n    } else {\r\n      currZoomLevelNeedsChange = false;\r\n      destinationZoomLevel = prevZoomLevel;\r\n    }\r\n\r\n    const initialBgOpacity = pswp.bgOpacity;\r\n    const restoreBgOpacity = pswp.bgOpacity < 1;\r\n\r\n    const initialPan = equalizePoints({}, currSlide.pan);\r\n    let destinationPan = equalizePoints({}, initialPan);\r\n\r\n    if (ignoreGesture) {\r\n      this._zoomPoint.x = 0;\r\n      this._zoomPoint.y = 0;\r\n      this._startZoomPoint.x = 0;\r\n      this._startZoomPoint.y = 0;\r\n      this._startZoomLevel = prevZoomLevel;\r\n      equalizePoints(this._startPan, initialPan);\r\n    }\r\n\r\n    if (currZoomLevelNeedsChange) {\r\n      destinationPan = {\r\n        x: this._calculatePanForZoomLevel('x', destinationZoomLevel),\r\n        y: this._calculatePanForZoomLevel('y', destinationZoomLevel)\r\n      };\r\n    }\r\n\r\n    // set zoom level, so pan bounds are updated according to it\r\n    currSlide.setZoomLevel(destinationZoomLevel);\r\n\r\n    destinationPan = {\r\n      x: currSlide.bounds.correctPan('x', destinationPan.x),\r\n      y: currSlide.bounds.correctPan('y', destinationPan.y)\r\n    };\r\n\r\n    // return zoom level and its bounds to initial\r\n    currSlide.setZoomLevel(prevZoomLevel);\r\n\r\n    let panNeedsChange = true;\r\n    if (pointsEqual(destinationPan, initialPan)) {\r\n      panNeedsChange = false;\r\n    }\r\n\r\n    if (!panNeedsChange && !currZoomLevelNeedsChange && !restoreBgOpacity) {\r\n      // update resolution after gesture\r\n      currSlide._setResolution(destinationZoomLevel);\r\n      currSlide.applyCurrentZoomPan();\r\n\r\n      // nothing to animate\r\n      return;\r\n    }\r\n\r\n    pswp.animations.stopAllPan();\r\n\r\n    pswp.animations.startSpring({\r\n      isPan: true,\r\n      start: 0,\r\n      end: 1000,\r\n      velocity: 0,\r\n      dampingRatio: 1,\r\n      naturalFrequency: 40,\r\n      onUpdate: (now) => {\r\n        now /= 1000; // 0 - start, 1 - end\r\n\r\n        if (panNeedsChange || currZoomLevelNeedsChange) {\r\n          if (panNeedsChange) {\r\n            currSlide.pan.x = initialPan.x + (destinationPan.x - initialPan.x) * now;\r\n            currSlide.pan.y = initialPan.y + (destinationPan.y - initialPan.y) * now;\r\n          }\r\n\r\n          if (currZoomLevelNeedsChange) {\r\n            const newZoomLevel = prevZoomLevel\r\n                        + (destinationZoomLevel - prevZoomLevel) * now;\r\n            currSlide.setZoomLevel(newZoomLevel);\r\n          }\r\n\r\n          currSlide.applyCurrentZoomPan();\r\n        }\r\n\r\n        // Restore background opacity\r\n        if (restoreBgOpacity && pswp.bgOpacity < 1) {\r\n          // We clamp opacity to keep it between 0 and 1.\r\n          // As progress ratio can be larger than 1 due to overshoot,\r\n          // and we do not want to bounce opacity.\r\n          pswp.applyBgOpacity(clamp(\r\n            initialBgOpacity + (1 - initialBgOpacity) * now, 0, 1\r\n          ));\r\n        }\r\n      },\r\n      onComplete: () => {\r\n        // update resolution after transition ends\r\n        currSlide._setResolution(destinationZoomLevel);\r\n        currSlide.applyCurrentZoomPan();\r\n      }\r\n    });\r\n  }\r\n}\n\n/**\r\n * @template T\r\n * @template P\r\n * @typedef {import('../types.js').AddPostfix<T, P>} AddPostfix<T, P>\r\n */\r\n\r\n/** @typedef {import('./gestures.js').default} Gestures */\r\n\r\n/** @typedef {'imageClick' | 'bgClick' | 'tap' | 'doubleTap'} Actions */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n\r\n/**\r\n * Whether the tap was performed on the main slide\r\n * (rather than controls or caption).\r\n *\r\n * @param {PointerEvent} event\r\n */\r\nfunction didTapOnMainContent(event) {\r\n  return !!(/** @type {HTMLElement} */ (event.target).closest('.pswp__container'));\r\n}\r\n\r\n/**\r\n * Tap, double-tap handler.\r\n */\r\nclass TapHandler {\r\n  /**\r\n   * @param {Gestures} gestures\r\n   */\r\n  constructor(gestures) {\r\n    this.gestures = gestures;\r\n  }\r\n\r\n  /**\r\n   * @param {Point} point\r\n   * @param {PointerEvent} originalEvent\r\n   */\r\n  click(point, originalEvent) {\r\n    const targetClassList = /** @type {HTMLElement} */ (originalEvent.target).classList;\r\n    const isImageClick = targetClassList.contains('pswp__img');\r\n    const isBackgroundClick = targetClassList.contains('pswp__item')\r\n                              || targetClassList.contains('pswp__zoom-wrap');\r\n\r\n    if (isImageClick) {\r\n      this._doClickOrTapAction('imageClick', point, originalEvent);\r\n    } else if (isBackgroundClick) {\r\n      this._doClickOrTapAction('bgClick', point, originalEvent);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {Point} point\r\n   * @param {PointerEvent} originalEvent\r\n   */\r\n  tap(point, originalEvent) {\r\n    if (didTapOnMainContent(originalEvent)) {\r\n      this._doClickOrTapAction('tap', point, originalEvent);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {Point} point\r\n   * @param {PointerEvent} originalEvent\r\n   */\r\n  doubleTap(point, originalEvent) {\r\n    if (didTapOnMainContent(originalEvent)) {\r\n      this._doClickOrTapAction('doubleTap', point, originalEvent);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {Actions} actionName\r\n   * @param {Point} point\r\n   * @param {PointerEvent} originalEvent\r\n   */\r\n  _doClickOrTapAction(actionName, point, originalEvent) {\r\n    const { pswp } = this.gestures;\r\n    const { currSlide } = pswp;\r\n    const actionFullName = /** @type {AddPostfix<Actions, 'Action'>} */ (actionName + 'Action');\r\n    const optionValue = pswp.options[actionFullName];\r\n\r\n    if (pswp.dispatch(actionFullName, { point, originalEvent }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (typeof optionValue === 'function') {\r\n      optionValue.call(pswp, point, originalEvent);\r\n      return;\r\n    }\r\n\r\n    switch (optionValue) {\r\n      case 'close':\r\n      case 'next':\r\n        pswp[optionValue]();\r\n        break;\r\n      case 'zoom':\r\n        currSlide.toggleZoom(point);\r\n        break;\r\n      case 'zoom-or-close':\r\n        // by default click zooms current image,\r\n        // if it can not be zoomed - gallery will be closed\r\n        if (currSlide.isZoomable()\r\n            && currSlide.zoomLevels.secondary !== currSlide.zoomLevels.initial) {\r\n          currSlide.toggleZoom(point);\r\n        } else if (pswp.options.clickToCloseNonZoomable) {\r\n          pswp.close();\r\n        }\r\n        break;\r\n      case 'toggle-controls':\r\n        this.gestures.pswp.element.classList.toggle('pswp--ui-visible');\r\n        // if (_controlsVisible) {\r\n        //   _ui.hideControls();\r\n        // } else {\r\n        //   _ui.showControls();\r\n        // }\r\n        break;\r\n    }\r\n  }\r\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n\r\n// How far should user should drag\r\n// until we can determine that the gesture is swipe and its direction\r\nconst AXIS_SWIPE_HYSTERISIS = 10;\r\n//const PAN_END_FRICTION = 0.35;\r\n\r\nconst DOUBLE_TAP_DELAY = 300; // ms\r\nconst MIN_TAP_DISTANCE = 25; // px\r\n\r\n/**\r\n * Gestures class bind touch, pointer or mouse events\r\n * and emits drag to drag-handler and zoom events zoom-handler.\r\n *\r\n * Drag and zoom events are emited in requestAnimationFrame,\r\n * and only when one of pointers was actually changed.\r\n */\r\nclass Gestures {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n\r\n    /** @type {'x' | 'y'} */\r\n    this.dragAxis = undefined;\r\n\r\n    // point objects are defined once and reused\r\n    // PhotoSwipe keeps track only of two pointers, others are ignored\r\n    /** @type {Point} */\r\n    this.p1 = {}; // the first pressed pointer\r\n    /** @type {Point} */\r\n    this.p2 = {}; // the second pressed pointer\r\n    /** @type {Point} */\r\n    this.prevP1 = {};\r\n    /** @type {Point} */\r\n    this.prevP2 = {};\r\n    /** @type {Point} */\r\n    this.startP1 = {};\r\n    /** @type {Point} */\r\n    this.startP2 = {};\r\n    /** @type {Point} */\r\n    this.velocity = {};\r\n\r\n    /** @type {Point} */\r\n    this._lastStartP1 = {};\r\n    /** @type {Point} */\r\n    this._intervalP1 = {};\r\n    this._numActivePoints = 0;\r\n    /** @type {Point[]} */\r\n    this._ongoingPointers = [];\r\n\r\n    this._touchEventEnabled = 'ontouchstart' in window;\r\n    this._pointerEventEnabled = !!(window.PointerEvent);\r\n    this.supportsTouch = this._touchEventEnabled\r\n                          || (this._pointerEventEnabled && navigator.maxTouchPoints > 1);\r\n\r\n    if (!this.supportsTouch) {\r\n      // disable pan to next slide for non-touch devices\r\n      pswp.options.allowPanToNext = false;\r\n    }\r\n\r\n    this.drag = new DragHandler(this);\r\n    this.zoomLevels = new ZoomHandler(this);\r\n    this.tapHandler = new TapHandler(this);\r\n\r\n    pswp.on('bindEvents', () => {\r\n      pswp.events.add(pswp.scrollWrap, 'click', e => this._onClick(e));\r\n\r\n      if (this._pointerEventEnabled) {\r\n        this._bindEvents('pointer', 'down', 'up', 'cancel');\r\n      } else if (this._touchEventEnabled) {\r\n        this._bindEvents('touch', 'start', 'end', 'cancel');\r\n\r\n        // In previous versions we also bound mouse event here,\r\n        // in case device supports both touch and mouse events,\r\n        // but newer versions of browsers now support PointerEvent.\r\n\r\n        // on iOS10 if you bind touchmove/end after touchstart,\r\n        // and you don't preventDefault touchstart (which PhotoSwipe does),\r\n        // preventDefault will have no effect on touchmove and touchend.\r\n        // Unless you bind it previously.\r\n        pswp.scrollWrap.ontouchmove = () => {}; // eslint-disable-line\r\n        pswp.scrollWrap.ontouchend = () => {}; // eslint-disable-line\r\n      } else {\r\n        this._bindEvents('mouse', 'down', 'up');\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   *\r\n   * @param {'mouse' | 'touch' | 'pointer'} pref\r\n   * @param {'down' | 'start'} down\r\n   * @param {'up' | 'end'} up\r\n   * @param {'cancel'} [cancel]\r\n   */\r\n  _bindEvents(pref, down, up, cancel) {\r\n    const { pswp } = this;\r\n    const { events } = pswp;\r\n\r\n    const cancelEvent = cancel ? pref + cancel : '';\r\n\r\n    events.add(pswp.scrollWrap, pref + down, this.onPointerDown.bind(this));\r\n    events.add(window, pref + 'move', this.onPointerMove.bind(this));\r\n    events.add(window, pref + up, this.onPointerUp.bind(this));\r\n    if (cancelEvent) {\r\n      events.add(pswp.scrollWrap, cancelEvent, this.onPointerUp.bind(this));\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {PointerEvent} e\r\n   */\r\n  onPointerDown(e) {\r\n    // We do not call preventDefault for touch events\r\n    // to allow browser to show native dialog on longpress\r\n    // (the one that allows to save image or open it in new tab).\r\n    //\r\n    // Desktop Safari allows to drag images when preventDefault isn't called on mousedown,\r\n    // even though preventDefault IS called on mousemove. That's why we preventDefault mousedown.\r\n    let isMousePointer;\r\n    if (e.type === 'mousedown' || e.pointerType === 'mouse') {\r\n      isMousePointer = true;\r\n    }\r\n\r\n    // Allow dragging only via left mouse button.\r\n    // http://www.quirksmode.org/js/events_properties.html\r\n    // https://developer.mozilla.org/en-US/docs/Web/API/event.button\r\n    if (isMousePointer && e.button > 0) {\r\n      return;\r\n    }\r\n\r\n    const { pswp } = this;\r\n\r\n    // if PhotoSwipe is opening or closing\r\n    if (!pswp.opener.isOpen) {\r\n      e.preventDefault();\r\n      return;\r\n    }\r\n\r\n    if (pswp.dispatch('pointerDown', { originalEvent: e }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (isMousePointer) {\r\n      pswp.mouseDetected();\r\n\r\n      // preventDefault mouse event to prevent\r\n      // browser image drag feature\r\n      this._preventPointerEventBehaviour(e);\r\n    }\r\n\r\n    pswp.animations.stopAll();\r\n\r\n    this._updatePoints(e, 'down');\r\n\r\n    this.pointerDown = true;\r\n\r\n    if (this._numActivePoints === 1) {\r\n      this.dragAxis = null;\r\n      // we need to store initial point to determine the main axis,\r\n      // drag is activated only after the axis is determined\r\n      equalizePoints(this.startP1, this.p1);\r\n    }\r\n\r\n    if (this._numActivePoints > 1) {\r\n      // Tap or double tap should not trigger if more than one pointer\r\n      this._clearTapTimer();\r\n      this.isMultitouch = true;\r\n    } else {\r\n      this.isMultitouch = false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {PointerEvent} e\r\n   */\r\n  onPointerMove(e) {\r\n    e.preventDefault(); // always preventDefault move event\r\n\r\n    if (!this._numActivePoints) {\r\n      return;\r\n    }\r\n\r\n    this._updatePoints(e, 'move');\r\n\r\n    if (this.pswp.dispatch('pointerMove', { originalEvent: e }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this._numActivePoints === 1 && !this.isDragging) {\r\n      if (!this.dragAxis) {\r\n        this._calculateDragDirection();\r\n      }\r\n\r\n      // Drag axis was detected, emit drag.start\r\n      if (this.dragAxis && !this.isDragging) {\r\n        if (this.isZooming) {\r\n          this.isZooming = false;\r\n          this.zoomLevels.end();\r\n        }\r\n\r\n        this.isDragging = true;\r\n        this._clearTapTimer(); // Tap can not trigger after drag\r\n\r\n        // Adjust starting point\r\n        this._updateStartPoints();\r\n        this._intervalTime = Date.now();\r\n        //this._startTime = this._intervalTime;\r\n        this._velocityCalculated = false;\r\n        equalizePoints(this._intervalP1, this.p1);\r\n        this.velocity.x = 0;\r\n        this.velocity.y = 0;\r\n        this.drag.start();\r\n\r\n        this._rafStopLoop();\r\n        this._rafRenderLoop();\r\n      }\r\n    } else if (this._numActivePoints > 1 && !this.isZooming) {\r\n      this._finishDrag();\r\n\r\n      this.isZooming = true;\r\n\r\n      // Adjust starting points\r\n      this._updateStartPoints();\r\n\r\n      this.zoomLevels.start();\r\n\r\n      this._rafStopLoop();\r\n      this._rafRenderLoop();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   */\r\n  _finishDrag() {\r\n    if (this.isDragging) {\r\n      this.isDragging = false;\r\n\r\n      // Try to calculate velocity,\r\n      // if it wasn't calculated yet in drag.change\r\n      if (!this._velocityCalculated) {\r\n        this._updateVelocity(true);\r\n      }\r\n\r\n      this.drag.end();\r\n      this.dragAxis = null;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {PointerEvent} e\r\n   */\r\n  onPointerUp(e) {\r\n    if (!this._numActivePoints) {\r\n      return;\r\n    }\r\n\r\n    this._updatePoints(e, 'up');\r\n\r\n    if (this.pswp.dispatch('pointerUp', { originalEvent: e }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this._numActivePoints === 0) {\r\n      this.pointerDown = false;\r\n      this._rafStopLoop();\r\n\r\n      if (this.isDragging) {\r\n        this._finishDrag();\r\n      } else if (!this.isZooming && !this.isMultitouch) {\r\n        //this.zoomLevels.correctZoomPan();\r\n        this._finishTap(e);\r\n      }\r\n    }\r\n\r\n    if (this._numActivePoints < 2 && this.isZooming) {\r\n      this.isZooming = false;\r\n      this.zoomLevels.end();\r\n\r\n      if (this._numActivePoints === 1) {\r\n        // Since we have 1 point left, we need to reinitiate drag\r\n        this.dragAxis = null;\r\n        this._updateStartPoints();\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   */\r\n  _rafRenderLoop() {\r\n    if (this.isDragging || this.isZooming) {\r\n      this._updateVelocity();\r\n\r\n      if (this.isDragging) {\r\n        // make sure that pointer moved since the last update\r\n        if (!pointsEqual(this.p1, this.prevP1)) {\r\n          this.drag.change();\r\n        }\r\n      } else /* if (this.isZooming) */ {\r\n        if (!pointsEqual(this.p1, this.prevP1)\r\n            || !pointsEqual(this.p2, this.prevP2)) {\r\n          this.zoomLevels.change();\r\n        }\r\n      }\r\n\r\n      this._updatePrevPoints();\r\n      this.raf = requestAnimationFrame(this._rafRenderLoop.bind(this));\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update velocity at 50ms interval\r\n   *\r\n   * @param {boolean=} force\r\n   */\r\n  _updateVelocity(force) {\r\n    const time = Date.now();\r\n    const duration = time - this._intervalTime;\r\n\r\n    if (duration < 50 && !force) {\r\n      return;\r\n    }\r\n\r\n\r\n    this.velocity.x = this._getVelocity('x', duration);\r\n    this.velocity.y = this._getVelocity('y', duration);\r\n\r\n    this._intervalTime = time;\r\n    equalizePoints(this._intervalP1, this.p1);\r\n    this._velocityCalculated = true;\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {PointerEvent} e\r\n   */\r\n  _finishTap(e) {\r\n    const { mainScroll } = this.pswp;\r\n\r\n    // Do not trigger tap events if main scroll is shifted\r\n    if (mainScroll.isShifted()) {\r\n      // restore main scroll position\r\n      // (usually happens if stopped in the middle of animation)\r\n      mainScroll.moveIndexBy(0, true);\r\n      return;\r\n    }\r\n\r\n    // Do not trigger tap for touchcancel or pointercancel\r\n    if (e.type.indexOf('cancel') > 0) {\r\n      return;\r\n    }\r\n\r\n    // Trigger click instead of tap for mouse events\r\n    if (e.type === 'mouseup' || e.pointerType === 'mouse') {\r\n      this.tapHandler.click(this.startP1, e);\r\n      return;\r\n    }\r\n\r\n    // Disable delay if there is no doubleTapAction\r\n    const tapDelay = this.pswp.options.doubleTapAction ? DOUBLE_TAP_DELAY : 0;\r\n\r\n    // If tapTimer is defined - we tapped recently,\r\n    // check if the current tap is close to the previous one,\r\n    // if yes - trigger double tap\r\n    if (this._tapTimer) {\r\n      this._clearTapTimer();\r\n      // Check if two taps were more or less on the same place\r\n      if (getDistanceBetween(this._lastStartP1, this.startP1) < MIN_TAP_DISTANCE) {\r\n        this.tapHandler.doubleTap(this.startP1, e);\r\n      }\r\n    } else {\r\n      equalizePoints(this._lastStartP1, this.startP1);\r\n      this._tapTimer = setTimeout(() => {\r\n        this.tapHandler.tap(this.startP1, e);\r\n        this._clearTapTimer();\r\n      }, tapDelay);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   */\r\n  _clearTapTimer() {\r\n    if (this._tapTimer) {\r\n      clearTimeout(this._tapTimer);\r\n      this._tapTimer = null;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get velocity for axis\r\n   *\r\n   * @private\r\n   * @param {'x' | 'y'} axis\r\n   * @param {number} duration\r\n   */\r\n  _getVelocity(axis, duration) {\r\n    // displacement is like distance, but can be negative.\r\n    const displacement = this.p1[axis] - this._intervalP1[axis];\r\n\r\n    if (Math.abs(displacement) > 1 && duration > 5) {\r\n      return displacement / duration;\r\n    }\r\n\r\n    return 0;\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   */\r\n  _rafStopLoop() {\r\n    if (this.raf) {\r\n      cancelAnimationFrame(this.raf);\r\n      this.raf = null;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {PointerEvent} e\r\n   */\r\n  _preventPointerEventBehaviour(e) {\r\n    // TODO find a way to disable e.preventDefault on some elements\r\n    //      via event or some class or something\r\n    e.preventDefault();\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Parses and normalizes points from the touch, mouse or pointer event.\r\n   * Updates p1 and p2.\r\n   *\r\n   * @private\r\n   * @param {PointerEvent | TouchEvent} e\r\n   * @param {'up' | 'down' | 'move'} pointerType Normalized pointer type\r\n   */\r\n  _updatePoints(e, pointerType) {\r\n    if (this._pointerEventEnabled) {\r\n      const pointerEvent = /** @type {PointerEvent} */ (e);\r\n      // Try to find the current pointer in ongoing pointers by its ID\r\n      const pointerIndex = this._ongoingPointers.findIndex((ongoingPoiner) => {\r\n        return ongoingPoiner.id === pointerEvent.pointerId;\r\n      });\r\n\r\n      if (pointerType === 'up' && pointerIndex > -1) {\r\n        // release the pointer - remove it from ongoing\r\n        this._ongoingPointers.splice(pointerIndex, 1);\r\n      } else if (pointerType === 'down' && pointerIndex === -1) {\r\n        // add new pointer\r\n        this._ongoingPointers.push(this._convertEventPosToPoint(pointerEvent, {}));\r\n      } else if (pointerIndex > -1) {\r\n        // update existing pointer\r\n        this._convertEventPosToPoint(pointerEvent, this._ongoingPointers[pointerIndex]);\r\n      }\r\n\r\n      this._numActivePoints = this._ongoingPointers.length;\r\n\r\n      // update points that PhotoSwipe uses\r\n      // to calculate position and scale\r\n      if (this._numActivePoints > 0) {\r\n        equalizePoints(this.p1, this._ongoingPointers[0]);\r\n      }\r\n\r\n      if (this._numActivePoints > 1) {\r\n        equalizePoints(this.p2, this._ongoingPointers[1]);\r\n      }\r\n    } else {\r\n      const touchEvent = /** @type {TouchEvent} */ (e);\r\n\r\n      this._numActivePoints = 0;\r\n      if (touchEvent.type.indexOf('touch') > -1) {\r\n        // Touch Event\r\n        // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\r\n        if (touchEvent.touches && touchEvent.touches.length > 0) {\r\n          this._convertEventPosToPoint(touchEvent.touches[0], this.p1);\r\n          this._numActivePoints++;\r\n          if (touchEvent.touches.length > 1) {\r\n            this._convertEventPosToPoint(touchEvent.touches[1], this.p2);\r\n            this._numActivePoints++;\r\n          }\r\n        }\r\n      } else {\r\n        // Mouse Event\r\n        this._convertEventPosToPoint(/** @type {PointerEvent} */ (e), this.p1);\r\n        if (pointerType === 'up') {\r\n          // clear all points on mouseup\r\n          this._numActivePoints = 0;\r\n        } else {\r\n          this._numActivePoints++;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  // update points that were used during previous rAF tick\r\n  _updatePrevPoints() {\r\n    equalizePoints(this.prevP1, this.p1);\r\n    equalizePoints(this.prevP2, this.p2);\r\n  }\r\n\r\n  // update points at the start of gesture\r\n  _updateStartPoints() {\r\n    equalizePoints(this.startP1, this.p1);\r\n    equalizePoints(this.startP2, this.p2);\r\n    this._updatePrevPoints();\r\n  }\r\n\r\n  _calculateDragDirection() {\r\n    if (this.pswp.mainScroll.isShifted()) {\r\n      // if main scroll position is shifted – direction is always horizontal\r\n      this.dragAxis = 'x';\r\n    } else {\r\n      // calculate delta of the last touchmove tick\r\n      const diff = Math.abs(this.p1.x - this.startP1.x) - Math.abs(this.p1.y - this.startP1.y);\r\n\r\n      if (diff !== 0) {\r\n        // check if pointer was shifted horizontally or vertically\r\n        const axisToCheck = diff > 0 ? 'x' : 'y';\r\n\r\n        if (Math.abs(this.p1[axisToCheck] - this.startP1[axisToCheck]) >= AXIS_SWIPE_HYSTERISIS) {\r\n          this.dragAxis = axisToCheck;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Converts touch, pointer or mouse event\r\n   * to PhotoSwipe point.\r\n   *\r\n   * @private\r\n   * @param {Touch | PointerEvent} e\r\n   * @param {Point} p\r\n   */\r\n  _convertEventPosToPoint(e, p) {\r\n    p.x = e.pageX - this.pswp.offset.x;\r\n    p.y = e.pageY - this.pswp.offset.y;\r\n\r\n    if ('pointerId' in e) {\r\n      p.id = e.pointerId;\r\n    } else if (e.identifier !== undefined) {\r\n      p.id = e.identifier;\r\n    }\r\n\r\n    return p;\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {PointerEvent} e\r\n   */\r\n  _onClick(e) {\r\n    // Do not allow click event to pass through after drag\r\n    if (this.pswp.mainScroll.isShifted()) {\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n    }\r\n  }\r\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('./slide/slide.js').default} Slide */\r\n\r\n/** @typedef {{ el: HTMLDivElement; slide?: Slide }} ItemHolder */\r\n\r\nconst MAIN_SCROLL_END_FRICTION = 0.35;\r\n\r\n\r\n// const MIN_SWIPE_TRANSITION_DURATION = 250;\r\n// const MAX_SWIPE_TRABSITION_DURATION = 500;\r\n// const DEFAULT_SWIPE_TRANSITION_DURATION = 333;\r\n\r\n/**\r\n * Handles movement of the main scrolling container\r\n * (for example, it repositions when user swipes left or right).\r\n *\r\n * Also stores its state.\r\n */\r\nclass MainScroll {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n    this.x = 0;\r\n\r\n    /** @type {number} */\r\n    this.slideWidth = undefined;\r\n\r\n    /** @type {ItemHolder[]} */\r\n    this.itemHolders = undefined;\r\n\r\n    this.resetPosition();\r\n  }\r\n\r\n  /**\r\n   * Position the scroller and slide containers\r\n   * according to viewport size.\r\n   *\r\n   * @param {boolean=} resizeSlides Whether slides content should resized\r\n   */\r\n  resize(resizeSlides) {\r\n    const { pswp } = this;\r\n    const newSlideWidth = Math.round(\r\n      pswp.viewportSize.x + pswp.viewportSize.x * pswp.options.spacing\r\n    );\r\n    // Mobile browsers might trigger a resize event during a gesture.\r\n    // (due to toolbar appearing or hiding).\r\n    // Avoid re-adjusting main scroll position if width wasn't changed\r\n    const slideWidthChanged = (newSlideWidth !== this.slideWidth);\r\n\r\n    if (slideWidthChanged) {\r\n      this.slideWidth = newSlideWidth;\r\n      this.moveTo(this.getCurrSlideX());\r\n    }\r\n\r\n    this.itemHolders.forEach((itemHolder, index) => {\r\n      if (slideWidthChanged) {\r\n        setTransform(itemHolder.el, (index + this._containerShiftIndex)\r\n                                    * this.slideWidth);\r\n      }\r\n\r\n      if (resizeSlides && itemHolder.slide) {\r\n        itemHolder.slide.resize();\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Reset X position of the main scroller to zero\r\n   */\r\n  resetPosition() {\r\n    // Position on the main scroller (offset)\r\n    // it is independent from slide index\r\n    this._currPositionIndex = 0;\r\n    this._prevPositionIndex = 0;\r\n\r\n    // This will force recalculation of size on next resize()\r\n    this.slideWidth = 0;\r\n\r\n    // _containerShiftIndex*viewportSize will give you amount of transform of the current slide\r\n    this._containerShiftIndex = -1;\r\n  }\r\n\r\n  /**\r\n   * Create and append array of three items\r\n   * that hold data about slides in DOM\r\n   */\r\n  appendHolders() {\r\n    this.itemHolders = [];\r\n\r\n    // append our three slide holders -\r\n    // previous, current, and next\r\n    for (let i = 0; i < 3; i++) {\r\n      const el = createElement('pswp__item', false, this.pswp.container);\r\n      el.setAttribute('role', 'group');\r\n      el.setAttribute('aria-roledescription', 'slide');\r\n      el.setAttribute('aria-hidden', 'true');\r\n\r\n      // hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\r\n      el.style.display = (i === 1) ? 'block' : 'none';\r\n\r\n      this.itemHolders.push({\r\n        el,\r\n        //index: -1\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Whether the main scroll can be horizontally swiped to the next or previous slide.\r\n   */\r\n  canBeSwiped() {\r\n    return this.pswp.getNumItems() > 1;\r\n  }\r\n\r\n  /**\r\n   * Move main scroll by X amount of slides.\r\n   * For example:\r\n   *   `-1` will move to the previous slide,\r\n   *    `0` will reset the scroll position of the current slide,\r\n   *    `3` will move three slides forward\r\n   *\r\n   * If loop option is enabled - index will be automatically looped too,\r\n   * (for example `-1` will move to the last slide of the gallery).\r\n   *\r\n   * @param {number} diff\r\n   * @param {boolean=} animate\r\n   * @param {number=} velocityX\r\n   * @returns {boolean} whether index was changed or not\r\n   */\r\n  moveIndexBy(diff, animate, velocityX) {\r\n    const { pswp } = this;\r\n    let newIndex = pswp.potentialIndex + diff;\r\n    const numSlides = pswp.getNumItems();\r\n\r\n    if (pswp.canLoop()) {\r\n      newIndex = pswp.getLoopedIndex(newIndex);\r\n      const distance = (diff + numSlides) % numSlides;\r\n      if (distance <= numSlides / 2) {\r\n        // go forward\r\n        diff = distance;\r\n      } else {\r\n        // go backwards\r\n        diff = distance - numSlides;\r\n      }\r\n    } else {\r\n      if (newIndex < 0) {\r\n        newIndex = 0;\r\n      } else if (newIndex >= numSlides) {\r\n        newIndex = numSlides - 1;\r\n      }\r\n      diff = newIndex - pswp.potentialIndex;\r\n    }\r\n\r\n    pswp.potentialIndex = newIndex;\r\n    this._currPositionIndex -= diff;\r\n\r\n    pswp.animations.stopMainScroll();\r\n\r\n    const destinationX = this.getCurrSlideX();\r\n    if (!animate) {\r\n      this.moveTo(destinationX);\r\n      this.updateCurrItem();\r\n    } else {\r\n      pswp.animations.startSpring({\r\n        isMainScroll: true,\r\n        start: this.x,\r\n        end: destinationX,\r\n        velocity: velocityX || 0,\r\n        naturalFrequency: 30,\r\n        dampingRatio: 1, //0.7,\r\n        onUpdate: (x) => {\r\n          this.moveTo(x);\r\n        },\r\n        onComplete: () => {\r\n          this.updateCurrItem();\r\n          pswp.appendHeavy();\r\n        }\r\n      });\r\n\r\n      let currDiff = pswp.potentialIndex - pswp.currIndex;\r\n      if (pswp.canLoop()) {\r\n        const currDistance = (currDiff + numSlides) % numSlides;\r\n        if (currDistance <= numSlides / 2) {\r\n          // go forward\r\n          currDiff = currDistance;\r\n        } else {\r\n          // go backwards\r\n          currDiff = currDistance - numSlides;\r\n        }\r\n      }\r\n\r\n      // Force-append new slides during transition\r\n      // if difference between slides is more than 1\r\n      if (Math.abs(currDiff) > 1) {\r\n        this.updateCurrItem();\r\n      }\r\n    }\r\n\r\n    if (diff) {\r\n      return true;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * X position of the main scroll for the current slide\r\n   * (ignores position during dragging)\r\n   */\r\n  getCurrSlideX() {\r\n    return this.slideWidth * this._currPositionIndex;\r\n  }\r\n\r\n  /**\r\n   * Whether scroll position is shifted.\r\n   * For example, it will return true if the scroll is being dragged or animated.\r\n   */\r\n  isShifted() {\r\n    return this.x !== this.getCurrSlideX();\r\n  }\r\n\r\n  /**\r\n   * Update slides X positions and set their content\r\n   */\r\n  updateCurrItem() {\r\n    const { pswp } = this;\r\n    const positionDifference = this._prevPositionIndex - this._currPositionIndex;\r\n\r\n    if (!positionDifference) {\r\n      return;\r\n    }\r\n\r\n    this._prevPositionIndex = this._currPositionIndex;\r\n\r\n    pswp.currIndex = pswp.potentialIndex;\r\n\r\n    let diffAbs = Math.abs(positionDifference);\r\n    let tempHolder;\r\n\r\n    if (diffAbs >= 3) {\r\n      this._containerShiftIndex += positionDifference + (positionDifference > 0 ? -3 : 3);\r\n      diffAbs = 3;\r\n    }\r\n\r\n    for (let i = 0; i < diffAbs; i++) {\r\n      if (positionDifference > 0) {\r\n        tempHolder = this.itemHolders.shift();\r\n        this.itemHolders[2] = tempHolder; // move first to last\r\n\r\n        this._containerShiftIndex++;\r\n\r\n        setTransform(tempHolder.el, (this._containerShiftIndex + 2) * this.slideWidth);\r\n\r\n        pswp.setContent(tempHolder, (pswp.currIndex - diffAbs) + i + 2);\r\n      } else {\r\n        tempHolder = this.itemHolders.pop();\r\n        this.itemHolders.unshift(tempHolder); // move last to first\r\n\r\n        this._containerShiftIndex--;\r\n\r\n        setTransform(tempHolder.el, this._containerShiftIndex * this.slideWidth);\r\n\r\n        pswp.setContent(tempHolder, (pswp.currIndex + diffAbs) - i - 2);\r\n      }\r\n    }\r\n\r\n    // Reset transfrom every 50ish navigations in one direction.\r\n    //\r\n    // Otherwise transform will keep growing indefinitely,\r\n    // which might cause issues as browsers have a maximum transform limit.\r\n    // I wasn't able to reach it, but just to be safe.\r\n    // This should not cause noticable lag.\r\n    if (Math.abs(this._containerShiftIndex) > 50 && !this.isShifted()) {\r\n      this.resetPosition();\r\n      this.resize();\r\n    }\r\n\r\n    // Pan transition might be running (and consntantly updating pan position)\r\n    pswp.animations.stopAllPan();\r\n\r\n    this.itemHolders.forEach((itemHolder, i) => {\r\n      if (itemHolder.slide) {\r\n        // Slide in the 2nd holder is always active\r\n        itemHolder.slide.setIsActive(i === 1);\r\n      }\r\n    });\r\n\r\n    pswp.currSlide = this.itemHolders[1].slide;\r\n    pswp.contentLoader.updateLazy(positionDifference);\r\n\r\n    if (pswp.currSlide) {\r\n      pswp.currSlide.applyCurrentZoomPan();\r\n    }\r\n\r\n    pswp.dispatch('change');\r\n  }\r\n\r\n  /**\r\n   * Move the X position of the main scroll container\r\n   *\r\n   * @param {number} x\r\n   * @param {boolean=} dragging\r\n   */\r\n  moveTo(x, dragging) {\r\n    /** @type {number} */\r\n    let newSlideIndexOffset;\r\n    /** @type {number} */\r\n    let delta;\r\n\r\n    if (!this.pswp.canLoop() && dragging) {\r\n      // Apply friction\r\n      newSlideIndexOffset = ((this.slideWidth * this._currPositionIndex) - x) / this.slideWidth;\r\n      newSlideIndexOffset += this.pswp.currIndex;\r\n      delta = Math.round(x - this.x);\r\n\r\n      if ((newSlideIndexOffset < 0 && delta > 0)\r\n          || (newSlideIndexOffset >= this.pswp.getNumItems() - 1 && delta < 0)) {\r\n        x = this.x + (delta * MAIN_SCROLL_END_FRICTION);\r\n      }\r\n    }\r\n\r\n    this.x = x;\r\n    setTransform(this.pswp.container, x);\r\n\r\n    this.pswp.dispatch('moveMainScroll', { x, dragging });\r\n  }\r\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('./types.js').Methods<T>} Methods<T>\r\n */\r\n\r\n/**\r\n * - Manages keyboard shortcuts.\r\n * - Heps trap focus within photoswipe.\r\n */\r\nclass Keyboard {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n\r\n    pswp.on('bindEvents', () => {\r\n      // Dialog was likely opened by keyboard if initial point is not defined\r\n      if (!pswp.options.initialPointerPos) {\r\n        // focus causes layout,\r\n        // which causes lag during the animation,\r\n        // that's why we delay it until the opener transition ends\r\n        this._focusRoot();\r\n      }\r\n\r\n      pswp.events.add(document, 'focusin', this._onFocusIn.bind(this));\r\n      pswp.events.add(document, 'keydown', this._onKeyDown.bind(this));\r\n    });\r\n\r\n    const lastActiveElement = /** @type {HTMLElement} */ (document.activeElement);\r\n    pswp.on('destroy', () => {\r\n      if (pswp.options.returnFocus\r\n          && lastActiveElement\r\n          && this._wasFocused) {\r\n        lastActiveElement.focus();\r\n      }\r\n    });\r\n  }\r\n\r\n  _focusRoot() {\r\n    if (!this._wasFocused) {\r\n      this.pswp.element.focus();\r\n      this._wasFocused = true;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} e\r\n   */\r\n  _onKeyDown(e) {\r\n    const { pswp } = this;\r\n\r\n    if (pswp.dispatch('keydown', { originalEvent: e }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (specialKeyUsed(e)) {\r\n      // don't do anything if special key pressed\r\n      // to prevent from overriding default browser actions\r\n      // for example, in Chrome on Mac cmd+arrow-left returns to previous page\r\n      return;\r\n    }\r\n\r\n    /** @type {Methods<PhotoSwipe>} */\r\n    let keydownAction;\r\n    /** @type {'x' | 'y'} */\r\n    let axis;\r\n    let isForward;\r\n\r\n    switch (e.keyCode) {\r\n      case 27: // esc\r\n        if (pswp.options.escKey) {\r\n          keydownAction = 'close';\r\n        }\r\n        break;\r\n      case 90: // z key\r\n        keydownAction = 'toggleZoom';\r\n        break;\r\n      case 37: // left\r\n        axis = 'x';\r\n        break;\r\n      case 38: // top\r\n        axis = 'y';\r\n        break;\r\n      case 39: // right\r\n        axis = 'x';\r\n        isForward = true;\r\n        break;\r\n      case 40: // bottom\r\n        isForward = true;\r\n        axis = 'y';\r\n        break;\r\n      case 9: // tab\r\n        this._focusRoot();\r\n        break;\r\n    }\r\n\r\n    // if left/right/top/bottom key\r\n    if (axis) {\r\n      // prevent page scroll\r\n      e.preventDefault();\r\n\r\n      const { currSlide } = pswp;\r\n\r\n      if (pswp.options.arrowKeys\r\n          && axis === 'x'\r\n          && pswp.getNumItems() > 1) {\r\n        keydownAction = isForward ? 'next' : 'prev';\r\n      } else if (currSlide && currSlide.currZoomLevel > currSlide.zoomLevels.fit) {\r\n        // up/down arrow keys pan the image vertically\r\n        // left/right arrow keys pan horizontally.\r\n        // Unless there is only one image,\r\n        // or arrowKeys option is disabled\r\n        currSlide.pan[axis] += isForward ? -80 : 80;\r\n        currSlide.panTo(currSlide.pan.x, currSlide.pan.y);\r\n      }\r\n    }\r\n\r\n    if (keydownAction) {\r\n      e.preventDefault();\r\n      pswp[keydownAction]();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Trap focus inside photoswipe\r\n   *\r\n   * @param {FocusEvent} e\r\n   */\r\n  _onFocusIn(e) {\r\n    const { template } = this.pswp;\r\n    if (document !== e.target\r\n        && template !== e.target\r\n        && !template.contains(/** @type {Node} */ (e.target))) {\r\n      // focus root element\r\n      template.focus();\r\n    }\r\n  }\r\n}\n\nconst DEFAULT_EASING = 'cubic-bezier(.4,0,.22,1)';\r\n\r\n/** @typedef {import('./animations.js').AnimationProps} AnimationProps */\r\n\r\n/**\r\n * Runs CSS transition.\r\n */\r\nclass CSSAnimation {\r\n  /**\r\n   * onComplete can be unpredictable, be careful about current state\r\n   *\r\n   * @param {AnimationProps} props\r\n   */\r\n  constructor(props) {\r\n    this.props = props;\r\n    const {\r\n      target,\r\n      onComplete,\r\n      transform,\r\n      onFinish\r\n      // opacity\r\n    } = props;\r\n\r\n    let {\r\n      duration,\r\n      easing,\r\n    } = props;\r\n\r\n    /** @type {() => void} */\r\n    this.onFinish = onFinish;\r\n\r\n    // support only transform and opacity\r\n    const prop = transform ? 'transform' : 'opacity';\r\n    const propValue = props[prop];\r\n\r\n    /** @private */\r\n    this._target = target;\r\n    /** @private */\r\n    this._onComplete = onComplete;\r\n\r\n    duration = duration || 333;\r\n    easing = easing || DEFAULT_EASING;\r\n\r\n    /** @private */\r\n    this._onTransitionEnd = this._onTransitionEnd.bind(this);\r\n\r\n    // Using timeout hack to make sure that animation\r\n    // starts even if the animated property was changed recently,\r\n    // otherwise transitionend might not fire or transiton won't start.\r\n    // https://drafts.csswg.org/css-transitions/#starting\r\n    //\r\n    // ¯\\_(ツ)_/¯\r\n    /** @private */\r\n    this._helperTimeout = setTimeout(() => {\r\n      setTransitionStyle(target, prop, duration, easing);\r\n      this._helperTimeout = setTimeout(() => {\r\n        target.addEventListener('transitionend', this._onTransitionEnd, false);\r\n        target.addEventListener('transitioncancel', this._onTransitionEnd, false);\r\n\r\n        // Safari occasionally does not emit transitionend event\r\n        // if element propery was modified during the transition,\r\n        // which may be caused by resize or third party component,\r\n        // using timeout as a safety fallback\r\n        this._helperTimeout = setTimeout(() => {\r\n          this._finalizeAnimation();\r\n        }, duration + 500);\r\n        target.style[prop] = propValue;\r\n      }, 30); // Do not reduce this number\r\n    }, 0);\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {TransitionEvent} e\r\n   */\r\n  _onTransitionEnd(e) {\r\n    if (e.target === this._target) {\r\n      this._finalizeAnimation();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   */\r\n  _finalizeAnimation() {\r\n    if (!this._finished) {\r\n      this._finished = true;\r\n      this.onFinish();\r\n      if (this._onComplete) {\r\n        this._onComplete();\r\n      }\r\n    }\r\n  }\r\n\r\n  // Destroy is called automatically onFinish\r\n  destroy() {\r\n    if (this._helperTimeout) {\r\n      clearTimeout(this._helperTimeout);\r\n    }\r\n    removeTransitionStyle(this._target);\r\n    this._target.removeEventListener('transitionend', this._onTransitionEnd, false);\r\n    this._target.removeEventListener('transitioncancel', this._onTransitionEnd, false);\r\n    if (!this._finished) {\r\n      this._finalizeAnimation();\r\n    }\r\n  }\r\n}\n\nconst DEFAULT_NATURAL_FREQUENCY = 12;\r\nconst DEFAULT_DAMPING_RATIO = 0.75;\r\n\r\n/**\r\n * Spring easing helper\r\n */\r\nclass SpringEaser {\r\n  /**\r\n   * @param {number} initialVelocity Initial velocity, px per ms.\r\n   *\r\n   * @param {number} dampingRatio\r\n   * Determines how bouncy animation will be.\r\n   * From 0 to 1, 0 - always overshoot, 1 - do not overshoot.\r\n   * \"overshoot\" refers to part of animation that\r\n   * goes beyond the final value.\r\n   *\r\n   * @param {number} naturalFrequency\r\n   * Determines how fast animation will slow down.\r\n   * The higher value - the stiffer the transition will be,\r\n   * and the faster it will slow down.\r\n   * Recommended value from 10 to 50\r\n   */\r\n  constructor(initialVelocity, dampingRatio, naturalFrequency) {\r\n    this.velocity = initialVelocity * 1000; // convert to \"pixels per second\"\r\n\r\n    // https://en.wikipedia.org/wiki/Damping_ratio\r\n    this._dampingRatio = dampingRatio || DEFAULT_DAMPING_RATIO;\r\n\r\n    // https://en.wikipedia.org/wiki/Natural_frequency\r\n    this._naturalFrequency = naturalFrequency || DEFAULT_NATURAL_FREQUENCY;\r\n\r\n    if (this._dampingRatio < 1) {\r\n      this._dampedFrequency = this._naturalFrequency\r\n                         * Math.sqrt(1 - this._dampingRatio * this._dampingRatio);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {number} deltaPosition Difference between current and end position of the animation\r\n   * @param {number} deltaTime Frame duration in milliseconds\r\n   *\r\n   * @returns {number} Displacement, relative to the end position.\r\n   */\r\n  easeFrame(deltaPosition, deltaTime) {\r\n    // Inspired by Apple Webkit and Android spring function implementation\r\n    // https://en.wikipedia.org/wiki/Oscillation\r\n    // https://en.wikipedia.org/wiki/Damping_ratio\r\n    // we ignore mass (assume that it's 1kg)\r\n\r\n    let displacement = 0;\r\n    let coeff;\r\n\r\n    deltaTime /= 1000;\r\n\r\n    const naturalDumpingPow = Math.E ** (-this._dampingRatio * this._naturalFrequency * deltaTime);\r\n\r\n    if (this._dampingRatio === 1) {\r\n      coeff = this.velocity + this._naturalFrequency * deltaPosition;\r\n\r\n      displacement = (deltaPosition + coeff * deltaTime) * naturalDumpingPow;\r\n\r\n      this.velocity = displacement\r\n                        * (-this._naturalFrequency) + coeff\r\n                        * naturalDumpingPow;\r\n    } else if (this._dampingRatio < 1) {\r\n      coeff = (1 / this._dampedFrequency)\r\n                * (this._dampingRatio * this._naturalFrequency * deltaPosition + this.velocity);\r\n\r\n      const dumpedFCos = Math.cos(this._dampedFrequency * deltaTime);\r\n      const dumpedFSin = Math.sin(this._dampedFrequency * deltaTime);\r\n\r\n      displacement = naturalDumpingPow\r\n                       * (deltaPosition * dumpedFCos + coeff * dumpedFSin);\r\n\r\n      this.velocity = displacement\r\n                        * (-this._naturalFrequency)\r\n                        * this._dampingRatio\r\n                        + naturalDumpingPow\r\n                        * (-this._dampedFrequency * deltaPosition * dumpedFSin\r\n                        + this._dampedFrequency * coeff * dumpedFCos);\r\n    }\r\n\r\n    // Overdamped (>1) damping ratio is not supported\r\n\r\n    return displacement;\r\n  }\r\n}\n\n/** @typedef {import('./animations.js').AnimationProps} AnimationProps */\r\n\r\nclass SpringAnimation {\r\n  /**\r\n   * @param {AnimationProps} props\r\n   */\r\n  constructor(props) {\r\n    this.props = props;\r\n\r\n    const {\r\n      start,\r\n      end,\r\n      velocity,\r\n      onUpdate,\r\n      onComplete,\r\n      onFinish,\r\n      dampingRatio,\r\n      naturalFrequency\r\n    } = props;\r\n\r\n    /** @type {() => void} */\r\n    this.onFinish = onFinish;\r\n\r\n    const easer = new SpringEaser(velocity, dampingRatio, naturalFrequency);\r\n    let prevTime = Date.now();\r\n    let deltaPosition = start - end;\r\n\r\n    const animationLoop = () => {\r\n      if (this._raf) {\r\n        deltaPosition = easer.easeFrame(deltaPosition, Date.now() - prevTime);\r\n\r\n        // Stop the animation if velocity is low and position is close to end\r\n        if (Math.abs(deltaPosition) < 1 && Math.abs(easer.velocity) < 50) {\r\n          // Finalize the animation\r\n          onUpdate(end);\r\n          if (onComplete) {\r\n            onComplete();\r\n          }\r\n          this.onFinish();\r\n        } else {\r\n          prevTime = Date.now();\r\n          onUpdate(deltaPosition + end);\r\n          this._raf = requestAnimationFrame(animationLoop);\r\n        }\r\n      }\r\n    };\r\n\r\n    this._raf = requestAnimationFrame(animationLoop);\r\n  }\r\n\r\n  // Destroy is called automatically onFinish\r\n  destroy() {\r\n    if (this._raf >= 0) {\r\n      cancelAnimationFrame(this._raf);\r\n    }\r\n    this._raf = null;\r\n  }\r\n}\n\n/** @typedef {SpringAnimation | CSSAnimation} Animation */\r\n\r\n/**\r\n * @typedef {Object} AnimationProps\r\n *\r\n * @prop {HTMLElement=} target\r\n *\r\n * @prop {string=} name\r\n *\r\n * @prop {number=} start\r\n * @prop {number=} end\r\n * @prop {number=} duration\r\n * @prop {number=} velocity\r\n * @prop {number=} dampingRatio\r\n * @prop {number=} naturalFrequency\r\n *\r\n * @prop {(end: number) => void} [onUpdate]\r\n * @prop {() => void} [onComplete]\r\n * @prop {() => void} [onFinish]\r\n *\r\n * @prop {string=} transform\r\n * @prop {string=} opacity\r\n * @prop {string=} easing\r\n *\r\n * @prop {boolean=} isPan\r\n * @prop {boolean=} isMainScroll\r\n */\r\n\r\n/**\r\n * Manages animations\r\n */\r\nclass Animations {\r\n  constructor() {\r\n    /** @type {Animation[]} */\r\n    this.activeAnimations = [];\r\n  }\r\n\r\n  /**\r\n   * @param {AnimationProps} props\r\n   */\r\n  startSpring(props) {\r\n    this._start(props, true);\r\n  }\r\n\r\n  /**\r\n   * @param {AnimationProps} props\r\n   */\r\n  startTransition(props) {\r\n    this._start(props);\r\n  }\r\n\r\n  /**\r\n   * @param {AnimationProps} props\r\n   * @param {boolean=} isSpring\r\n   */\r\n  _start(props, isSpring) {\r\n    /** @type {Animation} */\r\n    let animation;\r\n    if (isSpring) {\r\n      animation = new SpringAnimation(props);\r\n    } else {\r\n      animation = new CSSAnimation(props);\r\n    }\r\n\r\n    this.activeAnimations.push(animation);\r\n    animation.onFinish = () => this.stop(animation);\r\n\r\n    return animation;\r\n  }\r\n\r\n  /**\r\n   * @param {Animation} animation\r\n   */\r\n  stop(animation) {\r\n    animation.destroy();\r\n    const index = this.activeAnimations.indexOf(animation);\r\n    if (index > -1) {\r\n      this.activeAnimations.splice(index, 1);\r\n    }\r\n  }\r\n\r\n  stopAll() { // _stopAllAnimations\r\n    this.activeAnimations.forEach((animation) => {\r\n      animation.destroy();\r\n    });\r\n    this.activeAnimations = [];\r\n  }\r\n\r\n  /**\r\n   * Stop all pan or zoom transitions\r\n   */\r\n  stopAllPan() {\r\n    this.activeAnimations = this.activeAnimations.filter((animation) => {\r\n      if (animation.props.isPan) {\r\n        animation.destroy();\r\n        return false;\r\n      }\r\n\r\n      return true;\r\n    });\r\n  }\r\n\r\n  stopMainScroll() {\r\n    this.activeAnimations = this.activeAnimations.filter((animation) => {\r\n      if (animation.props.isMainScroll) {\r\n        animation.destroy();\r\n        return false;\r\n      }\r\n\r\n      return true;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Returns true if main scroll transition is running\r\n   */\r\n  // isMainScrollRunning() {\r\n  //   return this.activeAnimations.some((animation) => {\r\n  //     return animation.props.isMainScroll;\r\n  //   });\r\n  // }\r\n\r\n  /**\r\n   * Returns true if any pan or zoom transition is running\r\n   */\r\n  isPanRunning() {\r\n    return this.activeAnimations.some((animation) => {\r\n      return animation.props.isPan;\r\n    });\r\n  }\r\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n * Handles scroll wheel.\r\n * Can pan and zoom current slide image.\r\n */\r\nclass ScrollWheel {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n    pswp.events.add(pswp.element, 'wheel', this._onWheel.bind(this));\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {WheelEvent} e\r\n   */\r\n  _onWheel(e) {\r\n    e.preventDefault();\r\n    const { currSlide } = this.pswp;\r\n    let { deltaX, deltaY } = e;\r\n\r\n    if (!currSlide) {\r\n      return;\r\n    }\r\n\r\n    if (this.pswp.dispatch('wheel', { originalEvent: e }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (e.ctrlKey || this.pswp.options.wheelToZoom) {\r\n      // zoom\r\n      if (currSlide.isZoomable()) {\r\n        let zoomFactor = -deltaY;\r\n        if (e.deltaMode === 1 /* DOM_DELTA_LINE */) {\r\n          zoomFactor *= 0.05;\r\n        } else {\r\n          zoomFactor *= e.deltaMode ? 1 : 0.002;\r\n        }\r\n        zoomFactor = 2 ** zoomFactor;\r\n\r\n        const destZoomLevel = currSlide.currZoomLevel * zoomFactor;\r\n        currSlide.zoomTo(destZoomLevel, {\r\n          x: e.clientX,\r\n          y: e.clientY\r\n        });\r\n      }\r\n    } else {\r\n      // pan\r\n      if (currSlide.isPannable()) {\r\n        if (e.deltaMode === 1 /* DOM_DELTA_LINE */) {\r\n          // 18 - average line height\r\n          deltaX *= 18;\r\n          deltaY *= 18;\r\n        }\r\n\r\n        currSlide.panTo(\r\n          currSlide.pan.x - deltaX,\r\n          currSlide.pan.y - deltaY\r\n        );\r\n      }\r\n    }\r\n  }\r\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('../types.js').Methods<T>} Methods<T>\r\n */\r\n\r\n/**\r\n * @typedef {Object} UIElementMarkupProps\r\n * @prop {boolean=} isCustomSVG\r\n * @prop {string} inner\r\n * @prop {string=} outlineID\r\n * @prop {number | string} [size]\r\n */\r\n\r\n/**\r\n * @typedef {Object} UIElementData\r\n * @prop {DefaultUIElements | string} [name]\r\n * @prop {string=} className\r\n * @prop {UIElementMarkup=} html\r\n * @prop {boolean=} isButton\r\n * @prop {keyof HTMLElementTagNameMap} [tagName]\r\n * @prop {string=} title\r\n * @prop {string=} ariaLabel\r\n * @prop {(element: HTMLElement, pswp: PhotoSwipe) => void} [onInit]\r\n * @prop {Methods<PhotoSwipe> | ((e: MouseEvent, element: HTMLElement, pswp: PhotoSwipe) => void)} [onClick]\r\n * @prop {'bar' | 'wrapper' | 'root'} [appendTo]\r\n * @prop {number=} order\r\n */\r\n\r\n/** @typedef {'arrowPrev' | 'arrowNext' | 'close' | 'zoom' | 'counter'} DefaultUIElements */\r\n\r\n/** @typedef {string | UIElementMarkupProps} UIElementMarkup */\r\n\r\n/**\r\n * @param {UIElementMarkup} [htmlData]\r\n */\r\nfunction addElementHTML(htmlData) {\r\n  if (typeof htmlData === 'string') {\r\n    // Allow developers to provide full svg,\r\n    // For example:\r\n    // <svg viewBox=\"0 0 32 32\" width=\"32\" height=\"32\" aria-hidden=\"true\" class=\"pswp__icn\">\r\n    //   <path d=\"...\" />\r\n    //   <circle ... />\r\n    // </svg>\r\n    // Can also be any HTML string.\r\n    return htmlData;\r\n  }\r\n\r\n  if (!htmlData || !htmlData.isCustomSVG) {\r\n    return '';\r\n  }\r\n\r\n  const svgData = htmlData;\r\n  let out = '<svg aria-hidden=\"true\" class=\"pswp__icn\" viewBox=\"0 0 %d %d\" width=\"%d\" height=\"%d\">';\r\n  // replace all %d with size\r\n  out = out.split('%d').join(/** @type {string} */ (svgData.size || 32));\r\n\r\n  // Icons may contain outline/shadow,\r\n  // to make it we \"clone\" base icon shape and add border to it.\r\n  // Icon itself and border are styled via CSS.\r\n  //\r\n  // Property shadowID defines ID of element that should be cloned.\r\n  if (svgData.outlineID) {\r\n    out += '<use class=\"pswp__icn-shadow\" xlink:href=\"#' + svgData.outlineID + '\"/>';\r\n  }\r\n\r\n  out += svgData.inner;\r\n\r\n  out += '</svg>';\r\n\r\n  return out;\r\n}\r\n\r\nclass UIElement {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   * @param {UIElementData} data\r\n   */\r\n  constructor(pswp, data) {\r\n    const name = data.name || data.className;\r\n    let elementHTML = data.html;\r\n\r\n    // @ts-expect-error lookup only by `data.name` maybe?\r\n    if (pswp.options[name] === false) {\r\n      // exit if element is disabled from options\r\n      return;\r\n    }\r\n\r\n    // Allow to override SVG icons from options\r\n    // @ts-expect-error lookup only by `data.name` maybe?\r\n    if (typeof pswp.options[name + 'SVG'] === 'string') {\r\n      // arrowPrevSVG\r\n      // arrowNextSVG\r\n      // closeSVG\r\n      // zoomSVG\r\n      // @ts-expect-error lookup only by `data.name` maybe?\r\n      elementHTML = pswp.options[name + 'SVG'];\r\n    }\r\n\r\n    pswp.dispatch('uiElementCreate', { data });\r\n\r\n    let className = '';\r\n    if (data.isButton) {\r\n      className += 'pswp__button ';\r\n      className += (data.className || `pswp__button--${data.name}`);\r\n    } else {\r\n      className += (data.className || `pswp__${data.name}`);\r\n    }\r\n\r\n    /** @type {HTMLElement} */\r\n    let element;\r\n    let tagName = data.isButton ? (data.tagName || 'button') : (data.tagName || 'div');\r\n    tagName = /** @type {keyof HTMLElementTagNameMap} */ (tagName.toLowerCase());\r\n    element = createElement(className, tagName);\r\n\r\n    if (data.isButton) {\r\n      // create button element\r\n      element = createElement(className, tagName);\r\n      if (tagName === 'button') {\r\n        /** @type {HTMLButtonElement} */ (element).type = 'button';\r\n      }\r\n\r\n      let { title } = data;\r\n      const { ariaLabel } = data;\r\n\r\n      // @ts-expect-error lookup only by `data.name` maybe?\r\n      if (typeof pswp.options[name + 'Title'] === 'string') {\r\n        // @ts-expect-error lookup only by `data.name` maybe?\r\n        title = pswp.options[name + 'Title'];\r\n      }\r\n\r\n      if (title) {\r\n        element.title = title;\r\n      }\r\n\r\n      if (ariaLabel || title) {\r\n        /** @type {HTMLElement} */ (element).setAttribute('aria-label', ariaLabel || title);\r\n      }\r\n    }\r\n\r\n    element.innerHTML = addElementHTML(elementHTML);\r\n\r\n    if (data.onInit) {\r\n      data.onInit(element, pswp);\r\n    }\r\n\r\n    if (data.onClick) {\r\n      element.onclick = (e) => {\r\n        if (typeof data.onClick === 'string') {\r\n          pswp[data.onClick]();\r\n        } else {\r\n          data.onClick(e, element, pswp);\r\n        }\r\n      };\r\n    }\r\n\r\n    // Top bar is default position\r\n    const appendTo = data.appendTo || 'bar';\r\n    let container;\r\n    if (appendTo === 'bar') {\r\n      if (!pswp.topBar) {\r\n        pswp.topBar = createElement('pswp__top-bar pswp__hide-on-close', 'div', pswp.scrollWrap);\r\n      }\r\n      container = pswp.topBar;\r\n    } else {\r\n      // element outside of top bar gets a secondary class\r\n      // that makes element fade out on close\r\n      element.classList.add('pswp__hide-on-close');\r\n\r\n      if (appendTo === 'wrapper') {\r\n        container = pswp.scrollWrap;\r\n      } else {\r\n        // root element\r\n        container = pswp.element;\r\n      }\r\n    }\r\n\r\n    container.appendChild(pswp.applyFilters('uiElement', element, data));\r\n  }\r\n}\n\n/*\r\n  Backward and forward arrow buttons\r\n */\r\n\r\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n *\r\n * @param {HTMLElement} element\r\n * @param {PhotoSwipe} pswp\r\n * @param {boolean=} isNextButton\r\n */\r\nfunction initArrowButton(element, pswp, isNextButton) {\r\n  element.classList.add('pswp__button--arrow');\r\n  // TODO: this should point to a unique id for this instance\r\n  element.setAttribute('aria-controls', 'pswp__items');\r\n  pswp.on('change', () => {\r\n    if (!pswp.options.loop) {\r\n      if (isNextButton) {\r\n        /** @type {HTMLButtonElement} */\r\n        (element).disabled = !(pswp.currIndex < pswp.getNumItems() - 1);\r\n      } else {\r\n        /** @type {HTMLButtonElement} */\r\n        (element).disabled = !(pswp.currIndex > 0);\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/** @type {UIElementData} */\r\nconst arrowPrev = {\r\n  name: 'arrowPrev',\r\n  className: 'pswp__button--arrow--prev',\r\n  title: 'Previous',\r\n  order: 10,\r\n  isButton: true,\r\n  appendTo: 'wrapper',\r\n  html: {\r\n    isCustomSVG: true,\r\n    size: 60,\r\n    inner: '<path d=\"M29 43l-3 3-16-16 16-16 3 3-13 13 13 13z\" id=\"pswp__icn-arrow\"/>',\r\n    outlineID: 'pswp__icn-arrow'\r\n  },\r\n  onClick: 'prev',\r\n  onInit: initArrowButton\r\n};\r\n\r\n/** @type {UIElementData} */\r\nconst arrowNext = {\r\n  name: 'arrowNext',\r\n  className: 'pswp__button--arrow--next',\r\n  title: 'Next',\r\n  order: 11,\r\n  isButton: true,\r\n  appendTo: 'wrapper',\r\n  html: {\r\n    isCustomSVG: true,\r\n    size: 60,\r\n    inner: '<use xlink:href=\"#pswp__icn-arrow\"/>',\r\n    outlineID: 'pswp__icn-arrow'\r\n  },\r\n  onClick: 'next',\r\n  onInit: (el, pswp) => {\r\n    initArrowButton(el, pswp, true);\r\n  }\r\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nconst closeButton = {\r\n  name: 'close',\r\n  title: 'Close',\r\n  order: 20,\r\n  isButton: true,\r\n  html: {\r\n    isCustomSVG: true,\r\n    inner: '<path d=\"M24 10l-2-2-6 6-6-6-2 2 6 6-6 6 2 2 6-6 6 6 2-2-6-6z\" id=\"pswp__icn-close\"/>',\r\n    outlineID: 'pswp__icn-close'\r\n  },\r\n  onClick: 'close'\r\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nconst zoomButton = {\r\n  name: 'zoom',\r\n  title: 'Zoom',\r\n  order: 10,\r\n  isButton: true,\r\n  html: {\r\n    isCustomSVG: true,\r\n    // eslint-disable-next-line max-len\r\n    inner: '<path d=\"M17.426 19.926a6 6 0 1 1 1.5-1.5L23 22.5 21.5 24l-4.074-4.074z\" id=\"pswp__icn-zoom\"/>'\r\n          + '<path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-h\" d=\"M11 16v-2h6v2z\"/>'\r\n          + '<path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-v\" d=\"M13 12h2v6h-2z\"/>',\r\n    outlineID: 'pswp__icn-zoom'\r\n  },\r\n  onClick: 'toggleZoom'\r\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nconst loadingIndicator = {\r\n  name: 'preloader',\r\n  appendTo: 'bar',\r\n  order: 7,\r\n  html: {\r\n    isCustomSVG: true,\r\n    // eslint-disable-next-line max-len\r\n    inner: '<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M21.2 16a5.2 5.2 0 1 1-5.2-5.2V8a8 8 0 1 0 8 8h-2.8Z\" id=\"pswp__icn-loading\"/>',\r\n    outlineID: 'pswp__icn-loading'\r\n  },\r\n  onInit: (indicatorElement, pswp) => {\r\n    /** @type {boolean} */\r\n    let isVisible;\r\n    /** @type {NodeJS.Timeout} */\r\n    let delayTimeout;\r\n\r\n    /**\r\n     * @param {string} className\r\n     * @param {boolean} add\r\n     */\r\n    const toggleIndicatorClass = (className, add) => {\r\n      indicatorElement.classList[add ? 'add' : 'remove']('pswp__preloader--' + className);\r\n    };\r\n\r\n    /**\r\n     * @param {boolean} visible\r\n     */\r\n    const setIndicatorVisibility = (visible) => {\r\n      if (isVisible !== visible) {\r\n        isVisible = visible;\r\n        toggleIndicatorClass('active', visible);\r\n      }\r\n    };\r\n\r\n    const updatePreloaderVisibility = () => {\r\n      if (!pswp.currSlide.content.isLoading()) {\r\n        setIndicatorVisibility(false);\r\n        if (delayTimeout) {\r\n          clearTimeout(delayTimeout);\r\n          delayTimeout = null;\r\n        }\r\n        return;\r\n      }\r\n\r\n      if (!delayTimeout) {\r\n        // display loading indicator with delay\r\n        delayTimeout = setTimeout(() => {\r\n          setIndicatorVisibility(pswp.currSlide.content.isLoading());\r\n          delayTimeout = null;\r\n        }, pswp.options.preloaderDelay);\r\n      }\r\n    };\r\n\r\n    pswp.on('change', updatePreloaderVisibility);\r\n\r\n    pswp.on('loadComplete', (e) => {\r\n      if (pswp.currSlide === e.slide) {\r\n        updatePreloaderVisibility();\r\n      }\r\n    });\r\n\r\n    // expose the method\r\n    pswp.ui.updatePreloaderVisibility = updatePreloaderVisibility;\r\n  }\r\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nconst counterIndicator = {\r\n  name: 'counter',\r\n  order: 5,\r\n  onInit: (counterElement, pswp) => {\r\n    pswp.on('change', () => {\r\n      counterElement.innerText = (pswp.currIndex + 1)\r\n                                  + pswp.options.indexIndicatorSep\r\n                                  + pswp.getNumItems();\r\n    });\r\n  }\r\n};\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\r\n\r\n/**\r\n * Set special class on element when image is zoomed.\r\n *\r\n * By default it is used to adjust\r\n * zoom icon and zoom cursor via CSS.\r\n *\r\n * @param {HTMLElement} el\r\n * @param {boolean} isZoomedIn\r\n */\r\nfunction setZoomedIn(el, isZoomedIn) {\r\n  el.classList[isZoomedIn ? 'add' : 'remove']('pswp--zoomed-in');\r\n}\r\n\r\nclass UI {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n\r\n    /** @type {() => void} */\r\n    this.updatePreloaderVisibility = undefined;\r\n\r\n    /** @type {number} */\r\n    this._lastUpdatedZoomLevel = undefined;\r\n  }\r\n\r\n  init() {\r\n    const { pswp } = this;\r\n    this.isRegistered = false;\r\n    /** @type {UIElementData[]} */\r\n    this.uiElementsData = [\r\n      closeButton,\r\n      arrowPrev,\r\n      arrowNext,\r\n      zoomButton,\r\n      loadingIndicator,\r\n      counterIndicator\r\n    ];\r\n\r\n    pswp.dispatch('uiRegister');\r\n\r\n    // sort by order\r\n    this.uiElementsData.sort((a, b) => {\r\n      // default order is 0\r\n      return (a.order || 0) - (b.order || 0);\r\n    });\r\n\r\n    /** @type {(UIElement | UIElementData)[]} */\r\n    this.items = [];\r\n\r\n    this.isRegistered = true;\r\n    this.uiElementsData.forEach((uiElementData) => {\r\n      this.registerElement(uiElementData);\r\n    });\r\n\r\n    pswp.on('change', () => {\r\n      pswp.element.classList[pswp.getNumItems() === 1 ? 'add' : 'remove']('pswp--one-slide');\r\n    });\r\n\r\n    pswp.on('zoomPanUpdate', () => this._onZoomPanUpdate());\r\n  }\r\n\r\n  /**\r\n   * @param {UIElementData} elementData\r\n   */\r\n  registerElement(elementData) {\r\n    if (this.isRegistered) {\r\n      this.items.push(\r\n        new UIElement(this.pswp, elementData)\r\n      );\r\n    } else {\r\n      this.uiElementsData.push(elementData);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Fired each time zoom or pan position is changed.\r\n   * Update classes that control visibility of zoom button and cursor icon.\r\n   */\r\n  _onZoomPanUpdate() {\r\n    const { template, currSlide, options } = this.pswp;\r\n    let { currZoomLevel } = currSlide;\r\n\r\n    if (this.pswp.opener.isClosing) {\r\n      return;\r\n    }\r\n\r\n    // if not open yet - check against initial zoom level\r\n    if (!this.pswp.opener.isOpen) {\r\n      currZoomLevel = currSlide.zoomLevels.initial;\r\n    }\r\n\r\n    if (currZoomLevel === this._lastUpdatedZoomLevel) {\r\n      return;\r\n    }\r\n    this._lastUpdatedZoomLevel = currZoomLevel;\r\n\r\n    const currZoomLevelDiff = currSlide.zoomLevels.initial - currSlide.zoomLevels.secondary;\r\n\r\n    // Initial and secondary zoom levels are almost equal\r\n    if (Math.abs(currZoomLevelDiff) < 0.01 || !currSlide.isZoomable()) {\r\n      // disable zoom\r\n      setZoomedIn(template, false);\r\n      template.classList.remove('pswp--zoom-allowed');\r\n      return;\r\n    }\r\n\r\n    template.classList.add('pswp--zoom-allowed');\r\n\r\n    const potentialZoomLevel = currZoomLevel === currSlide.zoomLevels.initial\r\n      ? currSlide.zoomLevels.secondary : currSlide.zoomLevels.initial;\r\n\r\n    setZoomedIn(template, potentialZoomLevel <= currZoomLevel);\r\n\r\n    if (options.imageClickAction === 'zoom'\r\n        || options.imageClickAction === 'zoom-or-close') {\r\n      template.classList.add('pswp--click-to-zoom');\r\n    }\r\n  }\r\n}\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n\r\n/** @typedef {{ x: number; y: number; w: number; innerRect?: { w: number; h: number; x: number; y: number } }} Bounds */\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n */\r\nfunction getBoundsByElement(el) {\r\n  const thumbAreaRect = el.getBoundingClientRect();\r\n  return {\r\n    x: thumbAreaRect.left,\r\n    y: thumbAreaRect.top,\r\n    w: thumbAreaRect.width\r\n  };\r\n}\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n * @param {number} imageWidth\r\n * @param {number} imageHeight\r\n */\r\nfunction getCroppedBoundsByElement(el, imageWidth, imageHeight) {\r\n  const thumbAreaRect = el.getBoundingClientRect();\r\n\r\n  // fill image into the area\r\n  // (do they same as object-fit:cover does to retrieve coordinates)\r\n  const hRatio = thumbAreaRect.width / imageWidth;\r\n  const vRatio = thumbAreaRect.height / imageHeight;\r\n  const fillZoomLevel = hRatio > vRatio ? hRatio : vRatio;\r\n\r\n  const offsetX = (thumbAreaRect.width - imageWidth * fillZoomLevel) / 2;\r\n  const offsetY = (thumbAreaRect.height - imageHeight * fillZoomLevel) / 2;\r\n\r\n  /**\r\n   * Coordinates of the image,\r\n   * as if it was not cropped,\r\n   * height is calculated automatically\r\n   *\r\n   * @type {Bounds}\r\n   */\r\n  const bounds = {\r\n    x: thumbAreaRect.left + offsetX,\r\n    y: thumbAreaRect.top + offsetY,\r\n    w: imageWidth * fillZoomLevel\r\n  };\r\n\r\n  // Coordinates of inner crop area\r\n  // relative to the image\r\n  bounds.innerRect = {\r\n    w: thumbAreaRect.width,\r\n    h: thumbAreaRect.height,\r\n    x: offsetX,\r\n    y: offsetY\r\n  };\r\n\r\n  return bounds;\r\n}\r\n\r\n/**\r\n * Get dimensions of thumbnail image\r\n * (click on which opens photoswipe or closes photoswipe to)\r\n *\r\n * @param {number} index\r\n * @param {SlideData} itemData\r\n * @param {PhotoSwipe} instance PhotoSwipe instance\r\n * @returns {Bounds | undefined}\r\n */\r\nfunction getThumbBounds(index, itemData, instance) {\r\n  // legacy event, before filters were introduced\r\n  const event = instance.dispatch('thumbBounds', {\r\n    index,\r\n    itemData,\r\n    instance\r\n  });\r\n  // @ts-expect-error\r\n  if (event.thumbBounds) {\r\n    // @ts-expect-error\r\n    return event.thumbBounds;\r\n  }\r\n\r\n  const { element } = itemData;\r\n  let thumbBounds;\r\n  /** @type {HTMLElement} */\r\n  let thumbnail;\r\n\r\n  if (element && instance.options.thumbSelector !== false) {\r\n    const thumbSelector = instance.options.thumbSelector || 'img';\r\n    thumbnail = element.matches(thumbSelector)\r\n      ? element : element.querySelector(thumbSelector);\r\n  }\r\n\r\n  thumbnail = instance.applyFilters('thumbEl', thumbnail, itemData, index);\r\n\r\n  if (thumbnail) {\r\n    if (!itemData.thumbCropped) {\r\n      thumbBounds = getBoundsByElement(thumbnail);\r\n    } else {\r\n      thumbBounds = getCroppedBoundsByElement(\r\n        thumbnail,\r\n        itemData.width || itemData.w,\r\n        itemData.height || itemData.h\r\n      );\r\n    }\r\n  }\r\n\r\n  return instance.applyFilters('thumbBounds', thumbBounds, itemData, index);\r\n}\n\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\r\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('../slide/content.js').default} ContentDefault */\r\n/** @typedef {import('../slide/slide.js').default} Slide */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\r\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\r\n\r\n/**\r\n * Allow adding an arbitrary props to the Content\r\n * https://photoswipe.com/custom-content/#using-webp-image-format\r\n * @typedef {ContentDefault & Record<string, any>} Content\r\n */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\r\n *\r\n *\r\n * https://photoswipe.com/adding-ui-elements/\r\n *\r\n * @prop {undefined} uiRegister\r\n * @prop {{ data: UIElementData }} uiElementCreate\r\n *\r\n *\r\n * https://photoswipe.com/events/#initialization-events\r\n *\r\n * @prop {undefined} beforeOpen\r\n * @prop {undefined} firstUpdate\r\n * @prop {undefined} initialLayout\r\n * @prop {undefined} change\r\n * @prop {undefined} afterInit\r\n * @prop {undefined} bindEvents\r\n *\r\n *\r\n * https://photoswipe.com/events/#opening-or-closing-transition-events\r\n *\r\n * @prop {undefined} openingAnimationStart\r\n * @prop {undefined} openingAnimationEnd\r\n * @prop {undefined} closingAnimationStart\r\n * @prop {undefined} closingAnimationEnd\r\n *\r\n *\r\n * https://photoswipe.com/events/#closing-events\r\n *\r\n * @prop {undefined} close\r\n * @prop {undefined} destroy\r\n *\r\n *\r\n * https://photoswipe.com/events/#pointer-and-gesture-events\r\n *\r\n * @prop {{ originalEvent: PointerEvent }} pointerDown\r\n * @prop {{ originalEvent: PointerEvent }} pointerMove\r\n * @prop {{ originalEvent: PointerEvent }} pointerUp\r\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\r\n * @prop {{ panY: number }} verticalDrag can be default prevented\r\n *\r\n *\r\n * https://photoswipe.com/events/#slide-content-events\r\n *\r\n * @prop {{ content: Content }} contentInit\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\r\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\r\n * @prop {{ content: Content; slide: Slide }} loadError\r\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\r\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\r\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\r\n * @prop {{ content: Content }} contentAppend can be default prevented\r\n * @prop {{ content: Content }} contentActivate can be default prevented\r\n * @prop {{ content: Content }} contentDeactivate can be default prevented\r\n * @prop {{ content: Content }} contentRemove can be default prevented\r\n * @prop {{ content: Content }} contentDestroy can be default prevented\r\n *\r\n *\r\n * undocumented\r\n *\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\r\n *\r\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\r\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\r\n * @prop {{ slide: Slide }} firstZoomPan\r\n * @prop {{ slide: Slide, data: SlideData, index: number }} gettingData\r\n * @prop {undefined} beforeResize\r\n * @prop {undefined} resize\r\n * @prop {undefined} viewportSize\r\n * @prop {undefined} updateScrollOffset\r\n * @prop {{ slide: Slide }} slideInit\r\n * @prop {{ slide: Slide }} afterSetContent\r\n * @prop {{ slide: Slide }} slideLoad\r\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\r\n * @prop {{ slide: Slide }} appendHeavyContent\r\n * @prop {{ slide: Slide }} slideActivate\r\n * @prop {{ slide: Slide }} slideDeactivate\r\n * @prop {{ slide: Slide }} slideDestroy\r\n * @prop {{ destZoomLevel: number, centerPoint: Point, transitionDuration: number | false }} beforeZoomTo\r\n * @prop {{ slide: Slide }} zoomPanUpdate\r\n * @prop {{ slide: Slide }} initialZoomPan\r\n * @prop {{ slide: Slide }} calcSlideSize\r\n * @prop {undefined} resolutionChanged\r\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\r\n * @prop {{ content: Content }} contentAppendImage can be default prevented\r\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\r\n * @prop {undefined} lazyLoad\r\n * @prop {{ slide: Slide }} calcBounds\r\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\r\n *\r\n *\r\n * legacy\r\n *\r\n * @prop {undefined} init\r\n * @prop {undefined} initialZoomIn\r\n * @prop {undefined} initialZoomOut\r\n * @prop {undefined} initialZoomInEnd\r\n * @prop {undefined} initialZoomOutEnd\r\n * @prop {{ dataSource: DataSource, numItems: number }} numItems\r\n * @prop {{ itemData: SlideData; index: number }} itemData\r\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\r\n */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\r\n *\r\n * @prop {(numItems: number, dataSource: DataSource) => number} numItems\r\n * Modify the total amount of slides. Example on Data sources page.\r\n * https://photoswipe.com/filters/#numitems\r\n *\r\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\r\n * Modify slide item data. Example on Data sources page.\r\n * https://photoswipe.com/filters/#itemdata\r\n *\r\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\r\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\r\n * https://photoswipe.com/filters/#domitemdata\r\n *\r\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\r\n * Modify clicked gallery item index.\r\n * https://photoswipe.com/filters/#clickedindex\r\n *\r\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\r\n * Modify placeholder image source.\r\n * https://photoswipe.com/filters/#placeholdersrc\r\n *\r\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\r\n * Modify if the content is currently loading.\r\n * https://photoswipe.com/filters/#iscontentloading\r\n *\r\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\r\n * Modify if the content can be zoomed.\r\n * https://photoswipe.com/filters/#iscontentzoomable\r\n *\r\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\r\n * Modify if the placeholder should be used for the content.\r\n * https://photoswipe.com/filters/#usecontentplaceholder\r\n *\r\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\r\n * Modify if the placeholder should be kept after the content is loaded.\r\n * https://photoswipe.com/filters/#iskeepingplaceholder\r\n *\r\n *\r\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\r\n * Modify an element when the content has error state (for example, if image cannot be loaded).\r\n * https://photoswipe.com/filters/#contenterrorelement\r\n *\r\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\r\n * Modify a UI element that's being created.\r\n * https://photoswipe.com/filters/#uielement\r\n *\r\n * @prop {(thumbnail: HTMLElement, itemData: SlideData, index: number) => HTMLElement} thumbEl\r\n * Modify the thubmnail element from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbel\r\n *\r\n * @prop {(thumbBounds: Bounds, itemData: SlideData, index: number) => Bounds} thumbBounds\r\n * Modify the thubmnail bounds from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbbounds\r\n *\r\n * @prop {(srcsetSizesWidth: number, content: Content) => number} srcsetSizesWidth\r\n *\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter<T>\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent<T> : PhotoSwipeEvent<T> & PhotoSwipeEventsMap[T]} AugmentedEvent\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {(event: AugmentedEvent<T>) => void} EventCallback<T>\r\n */\r\n\r\n/**\r\n * Base PhotoSwipe event object\r\n *\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n */\r\nclass PhotoSwipeEvent {\r\n  /**\r\n   * @param {T} type\r\n   * @param {PhotoSwipeEventsMap[T]} [details]\r\n   */\r\n  constructor(type, details) {\r\n    this.type = type;\r\n    if (details) {\r\n      Object.assign(this, details);\r\n    }\r\n  }\r\n\r\n  preventDefault() {\r\n    this.defaultPrevented = true;\r\n  }\r\n}\r\n\r\n/**\r\n * PhotoSwipe base class that can listen and dispatch for events.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox, extended by base.js\r\n */\r\nclass Eventable {\r\n  constructor() {\r\n    /**\r\n     * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent<T>) => void)[] }}\r\n     */\r\n    this._listeners = {};\r\n\r\n    /**\r\n     * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter<T>[] }}\r\n     */\r\n    this._filters = {};\r\n\r\n    /** @type {PhotoSwipe=} */\r\n    this.pswp = undefined;\r\n\r\n    /** @type {PhotoSwipeOptions} */\r\n    this.options = undefined;\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeFiltersMap} T\r\n   * @param {T} name\r\n   * @param {PhotoSwipeFiltersMap[T]} fn\r\n   * @param {number} priority\r\n   */\r\n  addFilter(name, fn, priority = 100) {\r\n    if (!this._filters[name]) {\r\n      this._filters[name] = [];\r\n    }\r\n\r\n    this._filters[name].push({ fn, priority });\r\n    this._filters[name].sort((f1, f2) => f1.priority - f2.priority);\r\n\r\n    if (this.pswp) {\r\n      this.pswp.addFilter(name, fn, priority);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeFiltersMap} T\r\n   * @param {T} name\r\n   * @param {PhotoSwipeFiltersMap[T]} fn\r\n   */\r\n  removeFilter(name, fn) {\r\n    if (this._filters[name]) {\r\n      // @ts-expect-error\r\n      this._filters[name] = this._filters[name].filter(filter => (filter.fn !== fn));\r\n    }\r\n\r\n    if (this.pswp) {\r\n      this.pswp.removeFilter(name, fn);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeFiltersMap} T\r\n   * @param {T} name\r\n   * @param {Parameters<PhotoSwipeFiltersMap[T]>} args\r\n   * @returns {Parameters<PhotoSwipeFiltersMap[T]>[0]}\r\n   */\r\n  applyFilters(name, ...args) {\r\n    if (this._filters[name]) {\r\n      this._filters[name].forEach((filter) => {\r\n        // @ts-expect-error\r\n        args[0] = filter.fn.apply(this, args);\r\n      });\r\n    }\r\n    return args[0];\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeEventsMap} T\r\n   * @param {T} name\r\n   * @param {EventCallback<T>} fn\r\n   */\r\n  on(name, fn) {\r\n    if (!this._listeners[name]) {\r\n      this._listeners[name] = [];\r\n    }\r\n    this._listeners[name].push(fn);\r\n\r\n    // When binding events to lightbox,\r\n    // also bind events to PhotoSwipe Core,\r\n    // if it's open.\r\n    if (this.pswp) {\r\n      this.pswp.on(name, fn);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeEventsMap} T\r\n   * @param {T} name\r\n   * @param {EventCallback<T>} fn\r\n   */\r\n  off(name, fn) {\r\n    if (this._listeners[name]) {\r\n      // @ts-expect-error\r\n      this._listeners[name] = this._listeners[name].filter(listener => (fn !== listener));\r\n    }\r\n\r\n    if (this.pswp) {\r\n      this.pswp.off(name, fn);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeEventsMap} T\r\n   * @param {T} name\r\n   * @param {PhotoSwipeEventsMap[T]} [details]\r\n   * @returns {AugmentedEvent<T>}\r\n   */\r\n  dispatch(name, details) {\r\n    if (this.pswp) {\r\n      return this.pswp.dispatch(name, details);\r\n    }\r\n\r\n    const event = /** @type {AugmentedEvent<T>} */ (new PhotoSwipeEvent(name, details));\r\n\r\n    if (!this._listeners) {\r\n      return event;\r\n    }\r\n\r\n    if (this._listeners[name]) {\r\n      this._listeners[name].forEach((listener) => {\r\n        listener.call(this, event);\r\n      });\r\n    }\r\n\r\n    return event;\r\n  }\r\n}\n\nclass Placeholder {\r\n  /**\r\n   * @param {string | false} imageSrc\r\n   * @param {HTMLElement} container\r\n   */\r\n  constructor(imageSrc, container) {\r\n    // Create placeholder\r\n    // (stretched thumbnail or simple div behind the main image)\r\n    this.element = createElement(\r\n      'pswp__img pswp__img--placeholder',\r\n      imageSrc ? 'img' : '',\r\n      container\r\n    );\r\n\r\n    if (imageSrc) {\r\n      /** @type {HTMLImageElement} */\r\n      (this.element).decoding = 'async';\r\n      /** @type {HTMLImageElement} */\r\n      (this.element).alt = '';\r\n      /** @type {HTMLImageElement} */\r\n      (this.element).src = imageSrc;\r\n      this.element.setAttribute('role', 'presentation');\r\n    }\r\n\r\n    this.element.setAttribute('aria-hidden', 'true');\r\n  }\r\n\r\n  /**\r\n   * @param {number} width\r\n   * @param {number} height\r\n   */\r\n  setDisplayedSize(width, height) {\r\n    if (!this.element) {\r\n      return;\r\n    }\r\n\r\n    if (this.element.tagName === 'IMG') {\r\n      // Use transform scale() to modify img placeholder size\r\n      // (instead of changing width/height directly).\r\n      // This helps with performance, specifically in iOS15 Safari.\r\n      setWidthHeight(this.element, 250, 'auto');\r\n      this.element.style.transformOrigin = '0 0';\r\n      this.element.style.transform = toTransformString(0, 0, width / 250);\r\n    } else {\r\n      setWidthHeight(this.element, width, height);\r\n    }\r\n  }\r\n\r\n  destroy() {\r\n    if (this.element.parentNode) {\r\n      this.element.remove();\r\n    }\r\n    this.element = null;\r\n  }\r\n}\n\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../util/util.js').LoadState} LoadState */\r\n\r\nclass Content {\r\n  /**\r\n   * @param {SlideData} itemData Slide data\r\n   * @param {PhotoSwipe} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n   * @param {number} index\r\n   */\r\n  constructor(itemData, instance, index) {\r\n    this.instance = instance;\r\n    this.data = itemData;\r\n    this.index = index;\r\n\r\n    /** @type {HTMLImageElement | HTMLDivElement} */\r\n    this.element = undefined;\r\n\r\n    this.displayedImageWidth = 0;\r\n    this.displayedImageHeight = 0;\r\n\r\n    this.width = Number(this.data.w) || Number(this.data.width) || 0;\r\n    this.height = Number(this.data.h) || Number(this.data.height) || 0;\r\n\r\n    this.isAttached = false;\r\n    this.hasSlide = false;\r\n    /** @type {LoadState} */\r\n    this.state = LOAD_STATE.IDLE;\r\n\r\n    if (this.data.type) {\r\n      this.type = this.data.type;\r\n    } else if (this.data.src) {\r\n      this.type = 'image';\r\n    } else {\r\n      this.type = 'html';\r\n    }\r\n\r\n    this.instance.dispatch('contentInit', { content: this });\r\n  }\r\n\r\n  removePlaceholder() {\r\n    if (this.placeholder && !this.keepPlaceholder()) {\r\n      // With delay, as image might be loaded, but not rendered\r\n      setTimeout(() => {\r\n        if (this.placeholder) {\r\n          this.placeholder.destroy();\r\n          this.placeholder = null;\r\n        }\r\n      }, 1000);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Preload content\r\n   *\r\n   * @param {boolean=} isLazy\r\n   * @param {boolean=} reload\r\n   */\r\n  load(isLazy, reload) {\r\n    if (this.slide && this.usePlaceholder()) {\r\n      if (!this.placeholder) {\r\n        const placeholderSrc = this.instance.applyFilters(\r\n          'placeholderSrc',\r\n          // use  image-based placeholder only for the first slide,\r\n          // as rendering (even small stretched thumbnail) is an expensive operation\r\n          (this.data.msrc && this.slide.isFirstSlide) ? this.data.msrc : false,\r\n          this\r\n        );\r\n        this.placeholder = new Placeholder(\r\n          placeholderSrc,\r\n          this.slide.container\r\n        );\r\n      } else {\r\n        const placeholderEl = this.placeholder.element;\r\n        // Add placeholder to DOM if it was already created\r\n        if (placeholderEl && !placeholderEl.parentElement) {\r\n          this.slide.container.prepend(placeholderEl);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (this.element && !reload) {\r\n      return;\r\n    }\r\n\r\n    if (this.instance.dispatch('contentLoad', { content: this, isLazy }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this.isImageContent()) {\r\n      this.element = createElement('pswp__img', 'img');\r\n      // Start loading only after width is defined, as sizes might depend on it.\r\n      // Due to Safari feature, we must define sizes before srcset.\r\n      if (this.displayedImageWidth) {\r\n        this.loadImage(isLazy);\r\n      }\r\n    } else {\r\n      this.element = createElement('pswp__content');\r\n      this.element.innerHTML = this.data.html || '';\r\n    }\r\n\r\n    if (reload && this.slide) {\r\n      this.slide.updateContentSize(true);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Preload image\r\n   *\r\n   * @param {boolean} isLazy\r\n   */\r\n  loadImage(isLazy) {\r\n    const imageElement = /** @type HTMLImageElement */ (this.element);\r\n\r\n    if (this.instance.dispatch('contentLoadImage', { content: this, isLazy }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    this.updateSrcsetSizes();\r\n\r\n    if (this.data.srcset) {\r\n      imageElement.srcset = this.data.srcset;\r\n    }\r\n\r\n    imageElement.src = this.data.src;\r\n\r\n    imageElement.alt = this.data.alt || '';\r\n\r\n    this.state = LOAD_STATE.LOADING;\r\n\r\n    if (imageElement.complete) {\r\n      this.onLoaded();\r\n    } else {\r\n      imageElement.onload = () => {\r\n        this.onLoaded();\r\n      };\r\n\r\n      imageElement.onerror = () => {\r\n        this.onError();\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Assign slide to content\r\n   *\r\n   * @param {Slide} slide\r\n   */\r\n  setSlide(slide) {\r\n    this.slide = slide;\r\n    this.hasSlide = true;\r\n    this.instance = slide.pswp;\r\n\r\n    // todo: do we need to unset slide?\r\n  }\r\n\r\n  /**\r\n   * Content load success handler\r\n   */\r\n  onLoaded() {\r\n    this.state = LOAD_STATE.LOADED;\r\n\r\n    if (this.slide) {\r\n      this.instance.dispatch('loadComplete', { slide: this.slide, content: this });\r\n\r\n      // if content is reloaded\r\n      if (this.slide.isActive\r\n          && this.slide.heavyAppended\r\n          && !this.element.parentNode) {\r\n        this.append();\r\n        this.slide.updateContentSize(true);\r\n      }\r\n\r\n      if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\r\n        this.removePlaceholder();\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Content load error handler\r\n   */\r\n  onError() {\r\n    this.state = LOAD_STATE.ERROR;\r\n\r\n    if (this.slide) {\r\n      this.displayError();\r\n      this.instance.dispatch('loadComplete', { slide: this.slide, isError: true, content: this });\r\n      this.instance.dispatch('loadError', { slide: this.slide, content: this });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @returns {Boolean} If the content is currently loading\r\n   */\r\n  isLoading() {\r\n    return this.instance.applyFilters(\r\n      'isContentLoading',\r\n      this.state === LOAD_STATE.LOADING,\r\n      this\r\n    );\r\n  }\r\n\r\n  isError() {\r\n    return this.state === LOAD_STATE.ERROR;\r\n  }\r\n\r\n  /**\r\n   * @returns {boolean} If the content is image\r\n   */\r\n  isImageContent() {\r\n    return this.type === 'image';\r\n  }\r\n\r\n  /**\r\n   * Update content size\r\n   *\r\n   * @param {Number} width\r\n   * @param {Number} height\r\n   */\r\n  setDisplayedSize(width, height) {\r\n    if (!this.element) {\r\n      return;\r\n    }\r\n\r\n    if (this.placeholder) {\r\n      this.placeholder.setDisplayedSize(width, height);\r\n    }\r\n\r\n    // eslint-disable-next-line max-len\r\n    if (this.instance.dispatch('contentResize', { content: this, width, height }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    setWidthHeight(this.element, width, height);\r\n\r\n    if (this.isImageContent() && !this.isError()) {\r\n      const isInitialSizeUpdate = (!this.displayedImageWidth && width);\r\n\r\n      this.displayedImageWidth = width;\r\n      this.displayedImageHeight = height;\r\n\r\n      if (isInitialSizeUpdate) {\r\n        this.loadImage(false);\r\n      } else {\r\n        this.updateSrcsetSizes();\r\n      }\r\n\r\n      if (this.slide) {\r\n        // eslint-disable-next-line max-len\r\n        this.instance.dispatch('imageSizeChange', { slide: this.slide, width, height, content: this });\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @returns {boolean} If the content can be zoomed\r\n   */\r\n  isZoomable() {\r\n    return this.instance.applyFilters(\r\n      'isContentZoomable',\r\n      this.isImageContent() && (this.state !== LOAD_STATE.ERROR),\r\n      this\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Update image srcset sizes attribute based on width and height\r\n   */\r\n  updateSrcsetSizes() {\r\n    // Handle srcset sizes attribute.\r\n    //\r\n    // Never lower quality, if it was increased previously.\r\n    // Chrome does this automatically, Firefox and Safari do not,\r\n    // so we store largest used size in dataset.\r\n    // Handle srcset sizes attribute.\r\n    //\r\n    // Never lower quality, if it was increased previously.\r\n    // Chrome does this automatically, Firefox and Safari do not,\r\n    // so we store largest used size in dataset.\r\n    if (this.data.srcset) {\r\n      const image = /** @type HTMLImageElement */ (this.element);\r\n      const sizesWidth = this.instance.applyFilters(\r\n        'srcsetSizesWidth',\r\n        this.displayedImageWidth,\r\n        this\r\n      );\r\n\r\n      if (!image.dataset.largestUsedSize\r\n          || sizesWidth > parseInt(image.dataset.largestUsedSize, 10)) {\r\n        image.sizes = sizesWidth + 'px';\r\n        image.dataset.largestUsedSize = String(sizesWidth);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @returns {boolean} If content should use a placeholder (from msrc by default)\r\n   */\r\n  usePlaceholder() {\r\n    return this.instance.applyFilters(\r\n      'useContentPlaceholder',\r\n      this.isImageContent(),\r\n      this\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Preload content with lazy-loading param\r\n   */\r\n  lazyLoad() {\r\n    if (this.instance.dispatch('contentLazyLoad', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    this.load(true);\r\n  }\r\n\r\n  /**\r\n   * @returns {boolean} If placeholder should be kept after content is loaded\r\n   */\r\n  keepPlaceholder() {\r\n    return this.instance.applyFilters(\r\n      'isKeepingPlaceholder',\r\n      this.isLoading(),\r\n      this\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Destroy the content\r\n   */\r\n  destroy() {\r\n    this.hasSlide = false;\r\n    this.slide = null;\r\n\r\n    if (this.instance.dispatch('contentDestroy', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    this.remove();\r\n\r\n    if (this.placeholder) {\r\n      this.placeholder.destroy();\r\n      this.placeholder = null;\r\n    }\r\n\r\n    if (this.isImageContent() && this.element) {\r\n      this.element.onload = null;\r\n      this.element.onerror = null;\r\n      this.element = null;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Display error message\r\n   */\r\n  displayError() {\r\n    if (this.slide) {\r\n      /** @type {HTMLElement} */\r\n      let errorMsgEl = createElement('pswp__error-msg');\r\n      errorMsgEl.innerText = this.instance.options.errorMsg;\r\n      errorMsgEl = this.instance.applyFilters(\r\n        'contentErrorElement',\r\n        errorMsgEl,\r\n        this\r\n      );\r\n      this.element = createElement('pswp__content pswp__error-msg-container');\r\n      this.element.appendChild(errorMsgEl);\r\n      this.slide.container.innerText = '';\r\n      this.slide.container.appendChild(this.element);\r\n      this.slide.updateContentSize(true);\r\n      this.removePlaceholder();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Append the content\r\n   */\r\n  append() {\r\n    if (this.isAttached) {\r\n      return;\r\n    }\r\n\r\n    this.isAttached = true;\r\n\r\n    if (this.state === LOAD_STATE.ERROR) {\r\n      this.displayError();\r\n      return;\r\n    }\r\n\r\n    if (this.instance.dispatch('contentAppend', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    const supportsDecode = ('decode' in this.element);\r\n\r\n    if (this.isImageContent()) {\r\n      // Use decode() on nearby slides\r\n      //\r\n      // Nearby slide images are in DOM and not hidden via display:none.\r\n      // However, they are placed offscreen (to the left and right side).\r\n      //\r\n      // Some browsers do not composite the image until it's actually visible,\r\n      // using decode() helps.\r\n      //\r\n      // You might ask \"why dont you just decode() and then append all images\",\r\n      // that's because I want to show image before it's fully loaded,\r\n      // as browser can render parts of image while it is loading.\r\n      // We do not do this in Safari due to partial loading bug.\r\n      if (supportsDecode && this.slide && (!this.slide.isActive || isSafari())) {\r\n        this.isDecoding = true;\r\n        // purposefully using finally instead of then,\r\n        // as if srcset sizes changes dynamically - it may cause decode error\r\n        /** @type {HTMLImageElement} */\r\n        (this.element).decode().catch(() => {}).finally(() => {\r\n          this.isDecoding = false;\r\n          this.appendImage();\r\n        });\r\n      } else {\r\n        this.appendImage();\r\n      }\r\n    } else if (this.element && !this.element.parentNode) {\r\n      this.slide.container.appendChild(this.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Activate the slide,\r\n   * active slide is generally the current one,\r\n   * meaning the user can see it.\r\n   */\r\n  activate() {\r\n    if (this.instance.dispatch('contentActivate', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this.slide) {\r\n      if (this.isImageContent() && this.isDecoding && !isSafari()) {\r\n        // add image to slide when it becomes active,\r\n        // even if it's not finished decoding\r\n        this.appendImage();\r\n      } else if (this.isError()) {\r\n        this.load(false, true); // try to reload\r\n      }\r\n\r\n      if (this.slide.holderElement) {\r\n        this.slide.holderElement.setAttribute('aria-hidden', 'false');\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Deactivate the content\r\n   */\r\n  deactivate() {\r\n    this.instance.dispatch('contentDeactivate', { content: this });\r\n    if (this.slide && this.slide.holderElement) {\r\n      this.slide.holderElement.setAttribute('aria-hidden', 'true');\r\n    }\r\n  }\r\n\r\n\r\n  /**\r\n   * Remove the content from DOM\r\n   */\r\n  remove() {\r\n    this.isAttached = false;\r\n\r\n    if (this.instance.dispatch('contentRemove', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this.element && this.element.parentNode) {\r\n      this.element.remove();\r\n    }\r\n\r\n    if (this.placeholder && this.placeholder.element) {\r\n      this.placeholder.element.remove();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Append the image content to slide container\r\n   */\r\n  appendImage() {\r\n    if (!this.isAttached) {\r\n      return;\r\n    }\r\n\r\n    if (this.instance.dispatch('contentAppendImage', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    // ensure that element exists and is not already appended\r\n    if (this.slide && this.element && !this.element.parentNode) {\r\n      this.slide.container.appendChild(this.element);\r\n    }\r\n\r\n    if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\r\n      this.removePlaceholder();\r\n    }\r\n  }\r\n}\n\n/** @typedef {import('./content.js').default} Content */\r\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\r\n\r\nconst MIN_SLIDES_TO_CACHE = 5;\r\n\r\n/**\r\n * Lazy-load an image\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {PhotoSwipe | PhotoSwipeLightbox | PhotoSwipeBase} instance PhotoSwipe instance\r\n * @param {number} index\r\n * @returns Image that is being decoded or false.\r\n */\r\nfunction lazyLoadData(itemData, instance, index) {\r\n  // src/slide/content/content.js\r\n  const content = instance.createContentFromData(itemData, index);\r\n\r\n  if (!content || !content.lazyLoad) {\r\n    return;\r\n  }\r\n\r\n  const { options } = instance;\r\n\r\n  // We need to know dimensions of the image to preload it,\r\n  // as it might use srcset and we need to define sizes\r\n  // @ts-expect-error should provide pswp instance?\r\n  const viewportSize = instance.viewportSize || getViewportSize(options, instance);\r\n  const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\r\n\r\n  const zoomLevel = new ZoomLevel(options, itemData, -1);\r\n  zoomLevel.update(content.width, content.height, panAreaSize);\r\n\r\n  content.lazyLoad();\r\n  content.setDisplayedSize(\r\n    Math.ceil(content.width * zoomLevel.initial),\r\n    Math.ceil(content.height * zoomLevel.initial)\r\n  );\r\n\r\n  return content;\r\n}\r\n\r\n\r\n/**\r\n * Lazy-loads specific slide.\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * By default it loads image based on viewport size and initial zoom level.\r\n *\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipe | PhotoSwipeLightbox} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\r\n */\r\nfunction lazyLoadSlide(index, instance) {\r\n  const itemData = instance.getItemData(index);\r\n\r\n  if (instance.dispatch('lazyLoadSlide', { index, itemData }).defaultPrevented) {\r\n    return;\r\n  }\r\n\r\n  return lazyLoadData(itemData, instance, index);\r\n}\r\n\r\n\r\nclass ContentLoader {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n    // Total amount of cached images\r\n    this.limit = Math.max(\r\n      pswp.options.preload[0] + pswp.options.preload[1] + 1,\r\n      MIN_SLIDES_TO_CACHE\r\n    );\r\n    /** @type {Content[]} */\r\n    this._cachedItems = [];\r\n  }\r\n\r\n  /**\r\n   * Lazy load nearby slides based on `preload` option.\r\n   *\r\n   * @param {number=} diff Difference between slide indexes that was changed recently, or 0.\r\n   */\r\n  updateLazy(diff) {\r\n    const { pswp } = this;\r\n\r\n    if (pswp.dispatch('lazyLoad').defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    const { preload } = pswp.options;\r\n    const isForward = diff === undefined ? true : (diff >= 0);\r\n    let i;\r\n\r\n    // preload[1] - num items to preload in forward direction\r\n    for (i = 0; i <= preload[1]; i++) {\r\n      this.loadSlideByIndex(pswp.currIndex + (isForward ? i : (-i)));\r\n    }\r\n\r\n    // preload[0] - num items to preload in backward direction\r\n    for (i = 1; i <= preload[0]; i++) {\r\n      this.loadSlideByIndex(pswp.currIndex + (isForward ? (-i) : i));\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {number} index\r\n   */\r\n  loadSlideByIndex(index) {\r\n    index = this.pswp.getLoopedIndex(index);\r\n    // try to get cached content\r\n    let content = this.getContentByIndex(index);\r\n    if (!content) {\r\n      // no cached content, so try to load from scratch:\r\n      content = lazyLoadSlide(index, this.pswp);\r\n      // if content can be loaded, add it to cache:\r\n      if (content) {\r\n        this.addToCache(content);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {Slide} slide\r\n   */\r\n  getContentBySlide(slide) {\r\n    let content = this.getContentByIndex(slide.index);\r\n    if (!content) {\r\n      // create content if not found in cache\r\n      content = this.pswp.createContentFromData(slide.data, slide.index);\r\n      if (content) {\r\n        this.addToCache(content);\r\n      }\r\n    }\r\n\r\n    if (content) {\r\n      // assign slide to content\r\n      content.setSlide(slide);\r\n    }\r\n    return content;\r\n  }\r\n\r\n  /**\r\n   * @param {Content} content\r\n   */\r\n  addToCache(content) {\r\n    // move to the end of array\r\n    this.removeByIndex(content.index);\r\n    this._cachedItems.push(content);\r\n\r\n    if (this._cachedItems.length > this.limit) {\r\n      // Destroy the first content that's not attached\r\n      const indexToRemove = this._cachedItems.findIndex((item) => {\r\n        return !item.isAttached && !item.hasSlide;\r\n      });\r\n      if (indexToRemove !== -1) {\r\n        const removedItem = this._cachedItems.splice(indexToRemove, 1)[0];\r\n        removedItem.destroy();\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes an image from cache, does not destroy() it, just removes.\r\n   *\r\n   * @param {number} index\r\n   */\r\n  removeByIndex(index) {\r\n    const indexToRemove = this._cachedItems.findIndex(item => item.index === index);\r\n    if (indexToRemove !== -1) {\r\n      this._cachedItems.splice(indexToRemove, 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {number} index\r\n   */\r\n  getContentByIndex(index) {\r\n    return this._cachedItems.find(content => content.index === index);\r\n  }\r\n\r\n  destroy() {\r\n    this._cachedItems.forEach(content => content.destroy());\r\n    this._cachedItems = null;\r\n  }\r\n}\n\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\r\n/** @typedef {import(\"../photoswipe.js\").PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\r\n\r\n/**\r\n * PhotoSwipe base class that can retrieve data about every slide.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\r\n */\r\nclass PhotoSwipeBase extends Eventable {\r\n  /**\r\n   * Get total number of slides\r\n   *\r\n   * @returns {number}\r\n   */\r\n  getNumItems() {\r\n    let numItems;\r\n    const { dataSource } = this.options;\r\n    if (!dataSource) {\r\n      numItems = 0;\r\n    } else if ('length' in dataSource) {\r\n      // may be an array or just object with length property\r\n      numItems = dataSource.length;\r\n    } else if ('gallery' in dataSource) {\r\n      // query DOM elements\r\n      if (!dataSource.items) {\r\n        dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\r\n      }\r\n\r\n      if (dataSource.items) {\r\n        numItems = dataSource.items.length;\r\n      }\r\n    }\r\n\r\n    // legacy event, before filters were introduced\r\n    const event = this.dispatch('numItems', {\r\n      dataSource,\r\n      numItems\r\n    });\r\n    return this.applyFilters('numItems', event.numItems, dataSource);\r\n  }\r\n\r\n  /**\r\n   * @param {SlideData} slideData\r\n   * @param {number} index\r\n   */\r\n  createContentFromData(slideData, index) {\r\n    // @ts-expect-error\r\n    return new Content(slideData, this, index);\r\n  }\r\n\r\n  /**\r\n   * Get item data by index.\r\n   *\r\n   * \"item data\" should contain normalized information that PhotoSwipe needs to generate a slide.\r\n   * For example, it may contain properties like\r\n   * `src`, `srcset`, `w`, `h`, which will be used to generate a slide with image.\r\n   *\r\n   * @param {number} index\r\n   */\r\n  getItemData(index) {\r\n    const { dataSource } = this.options;\r\n    let dataSourceItem;\r\n    if (Array.isArray(dataSource)) {\r\n      // Datasource is an array of elements\r\n      dataSourceItem = dataSource[index];\r\n    } else if (dataSource && dataSource.gallery) {\r\n      // dataSource has gallery property,\r\n      // thus it was created by Lightbox, based on\r\n      // gallery and children options\r\n\r\n      // query DOM elements\r\n      if (!dataSource.items) {\r\n        dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\r\n      }\r\n\r\n      dataSourceItem = dataSource.items[index];\r\n    }\r\n\r\n    let itemData = dataSourceItem;\r\n\r\n    if (itemData instanceof Element) {\r\n      itemData = this._domElementToItemData(itemData);\r\n    }\r\n\r\n    // Dispatching the itemData event,\r\n    // it's a legacy verion before filters were introduced\r\n    const event = this.dispatch('itemData', {\r\n      itemData: itemData || {},\r\n      index\r\n    });\r\n\r\n    return this.applyFilters('itemData', event.itemData, index);\r\n  }\r\n\r\n  /**\r\n   * Get array of gallery DOM elements,\r\n   * based on childSelector and gallery element.\r\n   *\r\n   * @param {HTMLElement} galleryElement\r\n   */\r\n  _getGalleryDOMElements(galleryElement) {\r\n    if (this.options.children || this.options.childSelector) {\r\n      return getElementsFromOption(\r\n        this.options.children,\r\n        this.options.childSelector,\r\n        galleryElement\r\n      ) || [];\r\n    }\r\n\r\n    return [galleryElement];\r\n  }\r\n\r\n  /**\r\n   * Converts DOM element to item data object.\r\n   *\r\n   * @param {HTMLElement} element DOM element\r\n   */\r\n  // eslint-disable-next-line class-methods-use-this\r\n  _domElementToItemData(element) {\r\n    /** @type {SlideData} */\r\n    const itemData = {\r\n      element\r\n    };\r\n\r\n    // eslint-disable-next-line max-len\r\n    const linkEl = /** @type {HTMLAnchorElement} */ (element.tagName === 'A' ? element : element.querySelector('a'));\r\n\r\n    if (linkEl) {\r\n      // src comes from data-pswp-src attribute,\r\n      // if it's empty link href is used\r\n      itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\r\n\r\n      if (linkEl.dataset.pswpSrcset) {\r\n        itemData.srcset = linkEl.dataset.pswpSrcset;\r\n      }\r\n\r\n      itemData.width = parseInt(linkEl.dataset.pswpWidth, 10);\r\n      itemData.height = parseInt(linkEl.dataset.pswpHeight, 10);\r\n\r\n      // support legacy w & h properties\r\n      itemData.w = itemData.width;\r\n      itemData.h = itemData.height;\r\n\r\n      if (linkEl.dataset.pswpType) {\r\n        itemData.type = linkEl.dataset.pswpType;\r\n      }\r\n\r\n      const thumbnailEl = element.querySelector('img');\r\n\r\n      if (thumbnailEl) {\r\n        // msrc is URL to placeholder image that's displayed before large image is loaded\r\n        // by default it's displayed only for the first slide\r\n        itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\r\n        itemData.alt = thumbnailEl.getAttribute('alt');\r\n      }\r\n\r\n      if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\r\n        itemData.thumbCropped = true;\r\n      }\r\n    }\r\n\r\n    return this.applyFilters('domItemData', itemData, element, linkEl);\r\n  }\r\n\r\n  /**\r\n   * Lazy-load by slide data\r\n   *\r\n   * @param {SlideData} itemData Data about the slide\r\n   * @param {number} index\r\n   * @returns Image that is being decoded or false.\r\n   */\r\n  lazyLoadData(itemData, index) {\r\n    return lazyLoadData(itemData, this, index);\r\n  }\r\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('./slide/get-thumb-bounds.js').Bounds} Bounds */\r\n/** @typedef {import('./util/animations.js').AnimationProps} AnimationProps */\r\n\r\n// some browsers do not paint\r\n// elements which opacity is set to 0,\r\n// since we need to pre-render elements for the animation -\r\n// we set it to the minimum amount\r\nconst MIN_OPACITY = 0.003;\r\n\r\n/**\r\n * Manages opening and closing transitions of the PhotoSwipe.\r\n *\r\n * It can perform zoom, fade or no transition.\r\n */\r\nclass Opener {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n    this.isClosed = true;\r\n    this._prepareOpen = this._prepareOpen.bind(this);\r\n\r\n    /** @type {false | Bounds} */\r\n    this._thumbBounds = undefined;\r\n\r\n    // Override initial zoom and pan position\r\n    pswp.on('firstZoomPan', this._prepareOpen);\r\n  }\r\n\r\n  open() {\r\n    this._prepareOpen();\r\n    this._start();\r\n  }\r\n\r\n  close() {\r\n    if (this.isClosed || this.isClosing || this.isOpening) {\r\n      // if we close during opening animation\r\n      // for now do nothing,\r\n      // browsers aren't good at changing the direction of the CSS transition\r\n      return false;\r\n    }\r\n\r\n    const slide = this.pswp.currSlide;\r\n\r\n    this.isOpen = false;\r\n    this.isOpening = false;\r\n    this.isClosing = true;\r\n    this._duration = this.pswp.options.hideAnimationDuration;\r\n\r\n    if (slide && slide.currZoomLevel * slide.width >= this.pswp.options.maxWidthToAnimate) {\r\n      this._duration = 0;\r\n    }\r\n\r\n    this._applyStartProps();\r\n    setTimeout(() => {\r\n      this._start();\r\n    }, this._croppedZoom ? 30 : 0);\r\n\r\n    return true;\r\n  }\r\n\r\n  _prepareOpen() {\r\n    this.pswp.off('firstZoomPan', this._prepareOpen);\r\n    if (!this.isOpening) {\r\n      const slide = this.pswp.currSlide;\r\n      this.isOpening = true;\r\n      this.isClosing = false;\r\n      this._duration = this.pswp.options.showAnimationDuration;\r\n      if (slide && slide.zoomLevels.initial * slide.width >= this.pswp.options.maxWidthToAnimate) {\r\n        this._duration = 0;\r\n      }\r\n      this._applyStartProps();\r\n    }\r\n  }\r\n\r\n  _applyStartProps() {\r\n    const { pswp } = this;\r\n    const slide = this.pswp.currSlide;\r\n    const { options } = pswp;\r\n\r\n    if (options.showHideAnimationType === 'fade') {\r\n      options.showHideOpacity = true;\r\n      this._thumbBounds = false;\r\n    } else if (options.showHideAnimationType === 'none') {\r\n      options.showHideOpacity = false;\r\n      this._duration = 0;\r\n      this._thumbBounds = false;\r\n    } else if (this.isOpening && pswp._initialThumbBounds) {\r\n      // Use initial bounds if defined\r\n      this._thumbBounds = pswp._initialThumbBounds;\r\n    } else {\r\n      this._thumbBounds = this.pswp.getThumbBounds();\r\n    }\r\n\r\n    this._placeholder = slide.getPlaceholderElement();\r\n\r\n    pswp.animations.stopAll();\r\n\r\n    // Discard animations when duration is less than 50ms\r\n    this._useAnimation = (this._duration > 50);\r\n    this._animateZoom = Boolean(this._thumbBounds)\r\n                        && (slide.content && slide.content.usePlaceholder())\r\n                        && (!this.isClosing || !pswp.mainScroll.isShifted());\r\n    if (!this._animateZoom) {\r\n      this._animateRootOpacity = true;\r\n\r\n      if (this.isOpening) {\r\n        slide.zoomAndPanToInitial();\r\n        slide.applyCurrentZoomPan();\r\n      }\r\n    } else {\r\n      this._animateRootOpacity = options.showHideOpacity;\r\n    }\r\n    this._animateBgOpacity = !this._animateRootOpacity && this.pswp.options.bgOpacity > MIN_OPACITY;\r\n    this._opacityElement = this._animateRootOpacity ? pswp.element : pswp.bg;\r\n\r\n    if (!this._useAnimation) {\r\n      this._duration = 0;\r\n      this._animateZoom = false;\r\n      this._animateBgOpacity = false;\r\n      this._animateRootOpacity = true;\r\n      if (this.isOpening) {\r\n        pswp.element.style.opacity = String(MIN_OPACITY);\r\n        pswp.applyBgOpacity(1);\r\n      }\r\n      return;\r\n    }\r\n\r\n    if (this._animateZoom && this._thumbBounds && this._thumbBounds.innerRect) {\r\n      // Properties are used when animation from cropped thumbnail\r\n      this._croppedZoom = true;\r\n      this._cropContainer1 = this.pswp.container;\r\n      this._cropContainer2 = this.pswp.currSlide.holderElement;\r\n\r\n      pswp.container.style.overflow = 'hidden';\r\n      pswp.container.style.width = pswp.viewportSize.x + 'px';\r\n    } else {\r\n      this._croppedZoom = false;\r\n    }\r\n\r\n    if (this.isOpening) {\r\n      // Apply styles before opening transition\r\n      if (this._animateRootOpacity) {\r\n        pswp.element.style.opacity = String(MIN_OPACITY);\r\n        pswp.applyBgOpacity(1);\r\n      } else {\r\n        if (this._animateBgOpacity) {\r\n          pswp.bg.style.opacity = String(MIN_OPACITY);\r\n        }\r\n        pswp.element.style.opacity = '1';\r\n      }\r\n\r\n      if (this._animateZoom) {\r\n        this._setClosedStateZoomPan();\r\n        if (this._placeholder) {\r\n          // tell browser that we plan to animate the placeholder\r\n          this._placeholder.style.willChange = 'transform';\r\n\r\n          // hide placeholder to allow hiding of\r\n          // elements that overlap it (such as icons over the thumbnail)\r\n          this._placeholder.style.opacity = String(MIN_OPACITY);\r\n        }\r\n      }\r\n    } else if (this.isClosing) {\r\n      // hide nearby slides to make sure that\r\n      // they are not painted during the transition\r\n      pswp.mainScroll.itemHolders[0].el.style.display = 'none';\r\n      pswp.mainScroll.itemHolders[2].el.style.display = 'none';\r\n\r\n      if (this._croppedZoom) {\r\n        if (pswp.mainScroll.x !== 0) {\r\n          // shift the main scroller to zero position\r\n          pswp.mainScroll.resetPosition();\r\n          pswp.mainScroll.resize();\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  _start() {\r\n    if (this.isOpening\r\n        && this._useAnimation\r\n        && this._placeholder\r\n        && this._placeholder.tagName === 'IMG') {\r\n      // To ensure smooth animation\r\n      // we wait till the current slide image placeholder is decoded,\r\n      // but no longer than 250ms,\r\n      // and no shorter than 50ms\r\n      // (just using requestanimationframe is not enough in Firefox,\r\n      // for some reason)\r\n      new Promise((resolve) => {\r\n        let decoded = false;\r\n        let isDelaying = true;\r\n        decodeImage(/** @type {HTMLImageElement} */ (this._placeholder)).finally(() => {\r\n          decoded = true;\r\n          if (!isDelaying) {\r\n            resolve();\r\n          }\r\n        });\r\n        setTimeout(() => {\r\n          isDelaying = false;\r\n          if (decoded) {\r\n            resolve();\r\n          }\r\n        }, 50);\r\n        setTimeout(resolve, 250);\r\n      }).finally(() => this._initiate());\r\n    } else {\r\n      this._initiate();\r\n    }\r\n  }\r\n\r\n  _initiate() {\r\n    this.pswp.element.style.setProperty('--pswp-transition-duration', this._duration + 'ms');\r\n\r\n    this.pswp.dispatch(\r\n      this.isOpening ? 'openingAnimationStart' : 'closingAnimationStart'\r\n    );\r\n\r\n    // legacy event\r\n    this.pswp.dispatch(\r\n      /** @type {'initialZoomIn' | 'initialZoomOut'} */\r\n      ('initialZoom' + (this.isOpening ? 'In' : 'Out'))\r\n    );\r\n\r\n    this.pswp.element.classList[this.isOpening ? 'add' : 'remove']('pswp--ui-visible');\r\n\r\n    if (this.isOpening) {\r\n      if (this._placeholder) {\r\n        // unhide the placeholder\r\n        this._placeholder.style.opacity = '1';\r\n      }\r\n      this._animateToOpenState();\r\n    } else if (this.isClosing) {\r\n      this._animateToClosedState();\r\n    }\r\n\r\n    if (!this._useAnimation) {\r\n      this._onAnimationComplete();\r\n    }\r\n  }\r\n\r\n  _onAnimationComplete() {\r\n    const { pswp } = this;\r\n    this.isOpen = this.isOpening;\r\n    this.isClosed = this.isClosing;\r\n    this.isOpening = false;\r\n    this.isClosing = false;\r\n\r\n    pswp.dispatch(\r\n      this.isOpen ? 'openingAnimationEnd' : 'closingAnimationEnd'\r\n    );\r\n\r\n    // legacy event\r\n    pswp.dispatch(\r\n      /** @type {'initialZoomInEnd' | 'initialZoomOutEnd'} */\r\n      ('initialZoom' + (this.isOpen ? 'InEnd' : 'OutEnd'))\r\n    );\r\n\r\n    if (this.isClosed) {\r\n      pswp.destroy();\r\n    } else if (this.isOpen) {\r\n      if (this._animateZoom) {\r\n        pswp.container.style.overflow = 'visible';\r\n        pswp.container.style.width = '100%';\r\n      }\r\n      pswp.currSlide.applyCurrentZoomPan();\r\n    }\r\n  }\r\n\r\n  _animateToOpenState() {\r\n    const { pswp } = this;\r\n    if (this._animateZoom) {\r\n      if (this._croppedZoom) {\r\n        this._animateTo(this._cropContainer1, 'transform', 'translate3d(0,0,0)');\r\n        this._animateTo(this._cropContainer2, 'transform', 'none');\r\n      }\r\n\r\n      pswp.currSlide.zoomAndPanToInitial();\r\n      this._animateTo(\r\n        pswp.currSlide.container,\r\n        'transform',\r\n        pswp.currSlide.getCurrentTransform()\r\n      );\r\n    }\r\n\r\n    if (this._animateBgOpacity) {\r\n      this._animateTo(pswp.bg, 'opacity', String(pswp.options.bgOpacity));\r\n    }\r\n\r\n    if (this._animateRootOpacity) {\r\n      this._animateTo(pswp.element, 'opacity', '1');\r\n    }\r\n  }\r\n\r\n  _animateToClosedState() {\r\n    const { pswp } = this;\r\n\r\n    if (this._animateZoom) {\r\n      this._setClosedStateZoomPan(true);\r\n    }\r\n\r\n    if (this._animateBgOpacity\r\n        && pswp.bgOpacity > 0.01) { // do not animate opacity if it's already at 0\r\n      this._animateTo(pswp.bg, 'opacity', '0');\r\n    }\r\n\r\n    if (this._animateRootOpacity) {\r\n      this._animateTo(pswp.element, 'opacity', '0');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {boolean=} animate\r\n   */\r\n  _setClosedStateZoomPan(animate) {\r\n    if (!this._thumbBounds) return;\r\n\r\n    const { pswp } = this;\r\n    const { innerRect } = this._thumbBounds;\r\n    const { currSlide, viewportSize } = pswp;\r\n\r\n    if (this._croppedZoom) {\r\n      const containerOnePanX = -viewportSize.x + (this._thumbBounds.x - innerRect.x) + innerRect.w;\r\n      const containerOnePanY = -viewportSize.y + (this._thumbBounds.y - innerRect.y) + innerRect.h;\r\n      const containerTwoPanX = viewportSize.x - innerRect.w;\r\n      const containerTwoPanY = viewportSize.y - innerRect.h;\r\n\r\n\r\n      if (animate) {\r\n        this._animateTo(\r\n          this._cropContainer1,\r\n          'transform',\r\n          toTransformString(containerOnePanX, containerOnePanY)\r\n        );\r\n\r\n        this._animateTo(\r\n          this._cropContainer2,\r\n          'transform',\r\n          toTransformString(containerTwoPanX, containerTwoPanY)\r\n        );\r\n      } else {\r\n        setTransform(this._cropContainer1, containerOnePanX, containerOnePanY);\r\n        setTransform(this._cropContainer2, containerTwoPanX, containerTwoPanY);\r\n      }\r\n    }\r\n\r\n    equalizePoints(currSlide.pan, innerRect || this._thumbBounds);\r\n    currSlide.currZoomLevel = this._thumbBounds.w / currSlide.width;\r\n\r\n    if (animate) {\r\n      this._animateTo(currSlide.container, 'transform', currSlide.getCurrentTransform());\r\n    } else {\r\n      currSlide.applyCurrentZoomPan();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {HTMLElement} target\r\n   * @param {'transform' | 'opacity'} prop\r\n   * @param {string} propValue\r\n   */\r\n  _animateTo(target, prop, propValue) {\r\n    if (!this._duration) {\r\n      target.style[prop] = propValue;\r\n      return;\r\n    }\r\n\r\n    const { animations } = this.pswp;\r\n    /** @type {AnimationProps} */\r\n    const animProps = {\r\n      duration: this._duration,\r\n      easing: this.pswp.options.easing,\r\n      onComplete: () => {\r\n        if (!animations.activeAnimations.length) {\r\n          this._onAnimationComplete();\r\n        }\r\n      },\r\n      target,\r\n    };\r\n    animProps[prop] = propValue;\r\n    animations.startTransition(animProps);\r\n  }\r\n}\n\n/**\r\n * @template T\r\n * @typedef {import('./types.js').Type<T>} Type<T>\r\n */\r\n\r\n/** @typedef {import('./slide/slide.js').SlideData} SlideData */\r\n/** @typedef {import('./slide/zoom-level.js').ZoomLevelOption} ZoomLevelOption */\r\n/** @typedef {import('./ui/ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('./main-scroll.js').ItemHolder} ItemHolder */\r\n/** @typedef {import('./core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\r\n/** @typedef {import('./core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\r\n/**\r\n * @template T\r\n * @typedef {import('./core/eventable.js').EventCallback<T>} EventCallback<T>\r\n */\r\n/**\r\n * @template T\r\n * @typedef {import('./core/eventable.js').AugmentedEvent<T>} AugmentedEvent<T>\r\n */\r\n\r\n/** @typedef {{ x?: number; y?: number; id?: string | number }} Point */\r\n/** @typedef {{ x?: number; y?: number }} Size */\r\n/** @typedef {{ top: number; bottom: number; left: number; right: number }} Padding */\r\n/** @typedef {SlideData[]} DataSourceArray */\r\n/** @typedef {{ gallery: HTMLElement; items?: HTMLElement[] }} DataSourceObject */\r\n/** @typedef {DataSourceArray | DataSourceObject} DataSource */\r\n/** @typedef {(point: Point, originalEvent: PointerEvent) => void} ActionFn */\r\n/** @typedef {'close' | 'next' | 'zoom' | 'zoom-or-close' | 'toggle-controls'} ActionType */\r\n/** @typedef {Type<PhotoSwipe> | { default: Type<PhotoSwipe> }} PhotoSwipeModule */\r\n/** @typedef {PhotoSwipeModule | Promise<PhotoSwipeModule> | (() => Promise<PhotoSwipeModule>)} PhotoSwipeModuleOption */\r\n\r\n/**\r\n * @typedef {string | NodeListOf<HTMLElement> | HTMLElement[] | HTMLElement} ElementProvider\r\n */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeOptions https://photoswipe.com/options/\r\n *\r\n * @prop {DataSource=} dataSource\r\n * Pass an array of any items via dataSource option. Its length will determine amount of slides\r\n * (which may be modified further from numItems event).\r\n *\r\n * Each item should contain data that you need to generate slide\r\n * (for image slide it would be src (image URL), width (image width), height, srcset, alt).\r\n *\r\n * If these properties are not present in your initial array, you may \"pre-parse\" each item from itemData filter.\r\n *\r\n * @prop {number=} bgOpacity\r\n * Background backdrop opacity, always define it via this option and not via CSS rgba color.\r\n *\r\n * @prop {number=} spacing\r\n * Spacing between slides. Defined as ratio relative to the viewport width (0.1 = 10% of viewport).\r\n *\r\n * @prop {boolean=} allowPanToNext\r\n * Allow swipe navigation to the next slide when the current slide is zoomed. Does not apply to mouse events.\r\n *\r\n * @prop {boolean=} loop\r\n * If set to true you'll be able to swipe from the last to the first image.\r\n * Option is always false when there are less than 3 slides.\r\n *\r\n * @prop {boolean=} wheelToZoom\r\n * By default PhotoSwipe zooms image with ctrl-wheel, if you enable this option - image will zoom just via wheel.\r\n *\r\n * @prop {boolean=} pinchToClose\r\n * Pinch touch gesture to close the gallery.\r\n *\r\n * @prop {boolean=} closeOnVerticalDrag\r\n * Vertical drag gesture to close the PhotoSwipe.\r\n *\r\n * @prop {Padding=} padding\r\n * Slide area padding (in pixels).\r\n *\r\n * @prop {(viewportSize: Size, itemData: SlideData, index: number) => Padding} [paddingFn]\r\n * The option is checked frequently, so make sure it's performant. Overrides padding option if defined. For example:\r\n *\r\n * @prop {number | false} [hideAnimationDuration]\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {number | false} [showAnimationDuration]\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {number | false} [zoomAnimationDuration]\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {string=} easing\r\n * String, 'cubic-bezier(.4,0,.22,1)'. CSS easing function for open/close/zoom transitions.\r\n *\r\n * @prop {boolean=} escKey\r\n * Esc key to close.\r\n *\r\n * @prop {boolean=} arrowKeys\r\n * Left/right arrow keys for navigation.\r\n *\r\n * @prop {boolean=} returnFocus\r\n * Restore focus the last active element after PhotoSwipe is closed.\r\n *\r\n * @prop {boolean=} clickToCloseNonZoomable\r\n * If image is not zoomable (for example, smaller than viewport) it can be closed by clicking on it.\r\n *\r\n * @prop {ActionType | ActionFn | false} [imageClickAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} [bgClickAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} [tapAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} [doubleTapAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {number=} preloaderDelay\r\n * Delay before the loading indicator will be displayed,\r\n * if image is loaded during it - the indicator will not be displayed at all. Can be zero.\r\n *\r\n * @prop {string=} indexIndicatorSep\r\n * Used for slide count indicator (\"1 of 10 \").\r\n *\r\n * @prop {(options: PhotoSwipeOptions, pswp: PhotoSwipe) => { x: number; y: number }} [getViewportSizeFn]\r\n * A function that should return slide viewport width and height, in format {x: 100, y: 100}.\r\n *\r\n * @prop {string=} errorMsg\r\n * Message to display when the image wasn't able to load. If you need to display HTML - use contentErrorElement filter.\r\n *\r\n * @prop {[number, number]=} preload\r\n * Lazy loading of nearby slides based on direction of movement. Should be an array with two integers,\r\n * first one - number of items to preload before the current image, second one - after the current image.\r\n * Two nearby images are always loaded.\r\n *\r\n * @prop {string=} mainClass\r\n * Class that will be added to the root element of PhotoSwipe, may contain multiple separated by space.\r\n * Example on Styling page.\r\n *\r\n * @prop {HTMLElement=} appendToEl\r\n * Element to which PhotoSwipe dialog will be appended when it opens.\r\n *\r\n * @prop {number=} maxWidthToAnimate\r\n * Maximum width of image to animate, if initial rendered image width\r\n * is larger than this value - the opening/closing transition will be automatically disabled.\r\n *\r\n * @prop {string=} closeTitle\r\n * Translating\r\n *\r\n * @prop {string=} zoomTitle\r\n * Translating\r\n *\r\n * @prop {string=} arrowPrevTitle\r\n * Translating\r\n *\r\n * @prop {string=} arrowNextTitle\r\n * Translating\r\n *\r\n * @prop {'zoom' | 'fade' | 'none'} [showHideAnimationType]\r\n * To adjust opening or closing transition type use lightbox option `showHideAnimationType` (`String`).\r\n * It supports three values - `zoom` (default), `fade` (default if there is no thumbnail) and `none`.\r\n *\r\n * Animations are automatically disabled if user `(prefers-reduced-motion: reduce)`.\r\n *\r\n * @prop {number=} index\r\n * Defines start slide index.\r\n *\r\n * @prop {(e: MouseEvent) => number} [getClickedIndexFn]\r\n *\r\n * @prop {boolean=} arrowPrev\r\n * @prop {boolean=} arrowNext\r\n * @prop {boolean=} zoom\r\n * @prop {boolean=} close\r\n * @prop {boolean=} counter\r\n *\r\n * @prop {string=} arrowPrevSVG\r\n * @prop {string=} arrowNextSVG\r\n * @prop {string=} zoomSVG\r\n * @prop {string=} closeSVG\r\n * @prop {string=} counterSVG\r\n *\r\n * @prop {string=} arrowPrevTitle\r\n * @prop {string=} arrowNextTitle\r\n * @prop {string=} zoomTitle\r\n * @prop {string=} closeTitle\r\n * @prop {string=} counterTitle\r\n *\r\n * @prop {ZoomLevelOption=} initialZoomLevel\r\n * @prop {ZoomLevelOption=} secondaryZoomLevel\r\n * @prop {ZoomLevelOption=} maxZoomLevel\r\n *\r\n * @prop {boolean=} mouseMovePan\r\n * @prop {Point | null} [initialPointerPos]\r\n * @prop {boolean=} showHideOpacity\r\n *\r\n * @prop {PhotoSwipeModuleOption} [pswpModule]\r\n * @prop {() => Promise<any>} [openPromise]\r\n * @prop {boolean=} preloadFirstSlide\r\n * @prop {ElementProvider=} gallery\r\n * @prop {string=} gallerySelector\r\n * @prop {ElementProvider=} children\r\n * @prop {string=} childSelector\r\n * @prop {string | false} [thumbSelector]\r\n */\r\n\r\n/** @type {PhotoSwipeOptions} */\r\nconst defaultOptions = {\r\n  allowPanToNext: true,\r\n  spacing: 0.1,\r\n  loop: true,\r\n  pinchToClose: true,\r\n  closeOnVerticalDrag: true,\r\n  hideAnimationDuration: 333,\r\n  showAnimationDuration: 333,\r\n  zoomAnimationDuration: 333,\r\n  escKey: true,\r\n  arrowKeys: true,\r\n  returnFocus: true,\r\n  maxWidthToAnimate: 4000,\r\n  clickToCloseNonZoomable: true,\r\n  imageClickAction: 'zoom-or-close',\r\n  bgClickAction: 'close',\r\n  tapAction: 'toggle-controls',\r\n  doubleTapAction: 'zoom',\r\n  indexIndicatorSep: ' / ',\r\n  preloaderDelay: 2000,\r\n  bgOpacity: 0.8,\r\n\r\n  index: 0,\r\n  errorMsg: 'The image cannot be loaded',\r\n  preload: [1, 2],\r\n  easing: 'cubic-bezier(.4,0,.22,1)'\r\n};\r\n\r\n/**\r\n * PhotoSwipe Core\r\n */\r\nclass PhotoSwipe extends PhotoSwipeBase {\r\n  /**\r\n   * @param {PhotoSwipeOptions} options\r\n   */\r\n  constructor(options) {\r\n    super();\r\n\r\n    this._prepareOptions(options);\r\n\r\n    /**\r\n     * offset of viewport relative to document\r\n     *\r\n     * @type {{ x?: number; y?: number }}\r\n     */\r\n    this.offset = {};\r\n\r\n    /**\r\n     * @type {{ x?: number; y?: number }}\r\n     * @private\r\n     */\r\n    this._prevViewportSize = {};\r\n\r\n    /**\r\n     * Size of scrollable PhotoSwipe viewport\r\n     *\r\n     * @type {{ x?: number; y?: number }}\r\n     */\r\n    this.viewportSize = {};\r\n\r\n    /**\r\n     * background (backdrop) opacity\r\n     *\r\n     * @type {number}\r\n     */\r\n    this.bgOpacity = 1;\r\n\r\n    /** @type {HTMLDivElement} */\r\n    this.topBar = undefined;\r\n\r\n    this.events = new DOMEvents();\r\n\r\n    /** @type {Animations} */\r\n    this.animations = new Animations();\r\n\r\n    this.mainScroll = new MainScroll(this);\r\n    this.gestures = new Gestures(this);\r\n    this.opener = new Opener(this);\r\n    this.keyboard = new Keyboard(this);\r\n    this.contentLoader = new ContentLoader(this);\r\n  }\r\n\r\n  init() {\r\n    if (this.isOpen || this.isDestroying) {\r\n      return;\r\n    }\r\n\r\n    this.isOpen = true;\r\n    this.dispatch('init'); // legacy\r\n    this.dispatch('beforeOpen');\r\n\r\n    this._createMainStructure();\r\n\r\n    // add classes to the root element of PhotoSwipe\r\n    let rootClasses = 'pswp--open';\r\n    if (this.gestures.supportsTouch) {\r\n      rootClasses += ' pswp--touch';\r\n    }\r\n    if (this.options.mainClass) {\r\n      rootClasses += ' ' + this.options.mainClass;\r\n    }\r\n    this.element.className += ' ' + rootClasses;\r\n\r\n    this.currIndex = this.options.index || 0;\r\n    this.potentialIndex = this.currIndex;\r\n    this.dispatch('firstUpdate'); // starting index can be modified here\r\n\r\n    // initialize scroll wheel handler to block the scroll\r\n    this.scrollWheel = new ScrollWheel(this);\r\n\r\n    // sanitize index\r\n    if (Number.isNaN(this.currIndex)\r\n        || this.currIndex < 0\r\n        || this.currIndex >= this.getNumItems()) {\r\n      this.currIndex = 0;\r\n    }\r\n\r\n    if (!this.gestures.supportsTouch) {\r\n      // enable mouse features if no touch support detected\r\n      this.mouseDetected();\r\n    }\r\n\r\n    // causes forced synchronous layout\r\n    this.updateSize();\r\n\r\n    this.offset.y = window.pageYOffset;\r\n\r\n    this._initialItemData = this.getItemData(this.currIndex);\r\n    this.dispatch('gettingData', {\r\n      index: this.currIndex,\r\n      data: this._initialItemData,\r\n      slide: undefined\r\n    });\r\n\r\n    // *Layout* - calculate size and position of elements here\r\n    this._initialThumbBounds = this.getThumbBounds();\r\n    this.dispatch('initialLayout');\r\n\r\n    this.on('openingAnimationEnd', () => {\r\n      this.mainScroll.itemHolders[0].el.style.display = 'block';\r\n      this.mainScroll.itemHolders[2].el.style.display = 'block';\r\n\r\n      // Add content to the previous and next slide\r\n      this.setContent(this.mainScroll.itemHolders[0], this.currIndex - 1);\r\n      this.setContent(this.mainScroll.itemHolders[2], this.currIndex + 1);\r\n\r\n      this.appendHeavy();\r\n\r\n      this.contentLoader.updateLazy();\r\n\r\n      this.events.add(window, 'resize', this._handlePageResize.bind(this));\r\n      this.events.add(window, 'scroll', this._updatePageScrollOffset.bind(this));\r\n      this.dispatch('bindEvents');\r\n    });\r\n\r\n    // set content for center slide (first time)\r\n    this.setContent(this.mainScroll.itemHolders[1], this.currIndex);\r\n    this.dispatch('change');\r\n\r\n    this.opener.open();\r\n\r\n    this.dispatch('afterInit');\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Get looped slide index\r\n   * (for example, -1 will return the last slide)\r\n   *\r\n   * @param {number} index\r\n   */\r\n  getLoopedIndex(index) {\r\n    const numSlides = this.getNumItems();\r\n\r\n    if (this.options.loop) {\r\n      if (index > numSlides - 1) {\r\n        index -= numSlides;\r\n      }\r\n\r\n      if (index < 0) {\r\n        index += numSlides;\r\n      }\r\n    }\r\n\r\n    index = clamp(index, 0, numSlides - 1);\r\n\r\n    return index;\r\n  }\r\n\r\n  appendHeavy() {\r\n    this.mainScroll.itemHolders.forEach((itemHolder) => {\r\n      if (itemHolder.slide) {\r\n        itemHolder.slide.appendHeavy();\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Change the slide\r\n   * @param {number} index New index\r\n   */\r\n  goTo(index) {\r\n    this.mainScroll.moveIndexBy(\r\n      this.getLoopedIndex(index) - this.potentialIndex\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Go to the next slide.\r\n   */\r\n  next() {\r\n    this.goTo(this.potentialIndex + 1);\r\n  }\r\n\r\n  /**\r\n   * Go to the previous slide.\r\n   */\r\n  prev() {\r\n    this.goTo(this.potentialIndex - 1);\r\n  }\r\n\r\n  /**\r\n   * @see slide/slide.js zoomTo\r\n   *\r\n   * @param {Parameters<Slide['zoomTo']>} args\r\n   */\r\n  zoomTo(...args) {\r\n    this.currSlide.zoomTo(...args);\r\n  }\r\n\r\n  /**\r\n   * @see slide/slide.js toggleZoom\r\n   */\r\n  toggleZoom() {\r\n    this.currSlide.toggleZoom();\r\n  }\r\n\r\n  /**\r\n   * Close the gallery.\r\n   * After closing transition ends - destroy it\r\n   */\r\n  close() {\r\n    if (!this.opener.isOpen || this.isDestroying) {\r\n      return;\r\n    }\r\n\r\n    this.isDestroying = true;\r\n\r\n    this.dispatch('close');\r\n\r\n    this.events.removeAll();\r\n    this.opener.close();\r\n  }\r\n\r\n  /**\r\n   * Destroys the gallery:\r\n   * - instantly closes the gallery\r\n   * - unbinds events,\r\n   * - cleans intervals and timeouts\r\n   * - removes elements from DOM\r\n   */\r\n  destroy() {\r\n    if (!this.isDestroying) {\r\n      this.options.showHideAnimationType = 'none';\r\n      this.close();\r\n      return;\r\n    }\r\n\r\n    this.dispatch('destroy');\r\n\r\n    this.listeners = null;\r\n\r\n    this.scrollWrap.ontouchmove = null;\r\n    this.scrollWrap.ontouchend = null;\r\n\r\n    this.element.remove();\r\n\r\n    this.mainScroll.itemHolders.forEach((itemHolder) => {\r\n      if (itemHolder.slide) {\r\n        itemHolder.slide.destroy();\r\n      }\r\n    });\r\n\r\n    this.contentLoader.destroy();\r\n    this.events.removeAll();\r\n  }\r\n\r\n  /**\r\n   * Refresh/reload content of a slide by its index\r\n   *\r\n   * @param {number} slideIndex\r\n   */\r\n  refreshSlideContent(slideIndex) {\r\n    this.contentLoader.removeByIndex(slideIndex);\r\n    this.mainScroll.itemHolders.forEach((itemHolder, i) => {\r\n      let potentialHolderIndex = this.currSlide.index - 1 + i;\r\n      if (this.canLoop()) {\r\n        potentialHolderIndex = this.getLoopedIndex(potentialHolderIndex);\r\n      }\r\n      if (potentialHolderIndex === slideIndex) {\r\n        // set the new slide content\r\n        this.setContent(itemHolder, slideIndex, true);\r\n\r\n        // activate the new slide if it's current\r\n        if (i === 1) {\r\n          /** @type {Slide} */\r\n          this.currSlide = itemHolder.slide;\r\n          itemHolder.slide.setIsActive(true);\r\n        }\r\n      }\r\n    });\r\n\r\n    this.dispatch('change');\r\n  }\r\n\r\n\r\n  /**\r\n   * Set slide content\r\n   *\r\n   * @param {ItemHolder} holder mainScroll.itemHolders array item\r\n   * @param {number} index Slide index\r\n   * @param {boolean=} force If content should be set even if index wasn't changed\r\n   */\r\n  setContent(holder, index, force) {\r\n    if (this.canLoop()) {\r\n      index = this.getLoopedIndex(index);\r\n    }\r\n\r\n    if (holder.slide) {\r\n      if (holder.slide.index === index && !force) {\r\n        // exit if holder already contains this slide\r\n        // this could be common when just three slides are used\r\n        return;\r\n      }\r\n\r\n      // destroy previous slide\r\n      holder.slide.destroy();\r\n      holder.slide = null;\r\n    }\r\n\r\n    // exit if no loop and index is out of bounds\r\n    if (!this.canLoop() && (index < 0 || index >= this.getNumItems())) {\r\n      return;\r\n    }\r\n\r\n    const itemData = this.getItemData(index);\r\n    holder.slide = new Slide(itemData, index, this);\r\n\r\n    // set current slide\r\n    if (index === this.currIndex) {\r\n      this.currSlide = holder.slide;\r\n    }\r\n\r\n    holder.slide.append(holder.el);\r\n  }\r\n\r\n  getViewportCenterPoint() {\r\n    return {\r\n      x: this.viewportSize.x / 2,\r\n      y: this.viewportSize.y / 2\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Update size of all elements.\r\n   * Executed on init and on page resize.\r\n   *\r\n   * @param {boolean=} force Update size even if size of viewport was not changed.\r\n   */\r\n  updateSize(force) {\r\n    // let item;\r\n    // let itemIndex;\r\n\r\n    if (this.isDestroying) {\r\n      // exit if PhotoSwipe is closed or closing\r\n      // (to avoid errors, as resize event might be delayed)\r\n      return;\r\n    }\r\n\r\n    //const newWidth = this.scrollWrap.clientWidth;\r\n    //const newHeight = this.scrollWrap.clientHeight;\r\n\r\n    const newViewportSize = getViewportSize(this.options, this);\r\n\r\n    if (!force && pointsEqual(newViewportSize, this._prevViewportSize)) {\r\n      // Exit if dimensions were not changed\r\n      return;\r\n    }\r\n\r\n    //this._prevViewportSize.x = newWidth;\r\n    //this._prevViewportSize.y = newHeight;\r\n    equalizePoints(this._prevViewportSize, newViewportSize);\r\n\r\n    this.dispatch('beforeResize');\r\n\r\n    equalizePoints(this.viewportSize, this._prevViewportSize);\r\n\r\n    this._updatePageScrollOffset();\r\n\r\n    this.dispatch('viewportSize');\r\n\r\n    // Resize slides only after opener animation is finished\r\n    // and don't re-calculate size on inital size update\r\n    this.mainScroll.resize(this.opener.isOpen);\r\n\r\n    if (!this.hasMouse && window.matchMedia('(any-hover: hover)').matches) {\r\n      this.mouseDetected();\r\n    }\r\n\r\n    this.dispatch('resize');\r\n  }\r\n\r\n  /**\r\n   * @param {number} opacity\r\n   */\r\n  applyBgOpacity(opacity) {\r\n    this.bgOpacity = Math.max(opacity, 0);\r\n    this.bg.style.opacity = String(this.bgOpacity * this.options.bgOpacity);\r\n  }\r\n\r\n  /**\r\n   * Whether mouse is detected\r\n   */\r\n  mouseDetected() {\r\n    if (!this.hasMouse) {\r\n      this.hasMouse = true;\r\n      this.element.classList.add('pswp--has_mouse');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Page resize event handler\r\n   *\r\n   * @private\r\n   */\r\n  _handlePageResize() {\r\n    this.updateSize();\r\n\r\n    // In iOS webview, if element size depends on document size,\r\n    // it'll be measured incorrectly in resize event\r\n    //\r\n    // https://bugs.webkit.org/show_bug.cgi?id=170595\r\n    // https://hackernoon.com/onresize-event-broken-in-mobile-safari-d8469027bf4d\r\n    if (/iPhone|iPad|iPod/i.test(window.navigator.userAgent)) {\r\n      setTimeout(() => {\r\n        this.updateSize();\r\n      }, 500);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Page scroll offset is used\r\n   * to get correct coordinates\r\n   * relative to PhotoSwipe viewport.\r\n   *\r\n   * @private\r\n   */\r\n  _updatePageScrollOffset() {\r\n    this.setScrollOffset(0, window.pageYOffset);\r\n  }\r\n\r\n  /**\r\n   * @param {number} x\r\n   * @param {number} y\r\n   */\r\n  setScrollOffset(x, y) {\r\n    this.offset.x = x;\r\n    this.offset.y = y;\r\n    this.dispatch('updateScrollOffset');\r\n  }\r\n\r\n  /**\r\n   * Create main HTML structure of PhotoSwipe,\r\n   * and add it to DOM\r\n   *\r\n   * @private\r\n   */\r\n  _createMainStructure() {\r\n    // root DOM element of PhotoSwipe (.pswp)\r\n    this.element = createElement('pswp');\r\n    this.element.setAttribute('tabindex', '-1');\r\n    this.element.setAttribute('role', 'dialog');\r\n\r\n    // template is legacy prop\r\n    this.template = this.element;\r\n\r\n    // Background is added as a separate element,\r\n    // as animating opacity is faster than animating rgba()\r\n    this.bg = createElement('pswp__bg', false, this.element);\r\n    this.scrollWrap = createElement('pswp__scroll-wrap', 'section', this.element);\r\n    this.container = createElement('pswp__container', false, this.scrollWrap);\r\n\r\n    // aria pattern: carousel\r\n    this.scrollWrap.setAttribute('aria-roledescription', 'carousel');\r\n    this.container.setAttribute('aria-live', 'off');\r\n    this.container.setAttribute('id', 'pswp__items');\r\n\r\n    this.mainScroll.appendHolders();\r\n\r\n    this.ui = new UI(this);\r\n    this.ui.init();\r\n\r\n    // append to DOM\r\n    (this.options.appendToEl || document.body).appendChild(this.element);\r\n  }\r\n\r\n\r\n  /**\r\n   * Get position and dimensions of small thumbnail\r\n   *   {x:,y:,w:}\r\n   *\r\n   * Height is optional (calculated based on the large image)\r\n   */\r\n  getThumbBounds() {\r\n    return getThumbBounds(\r\n      this.currIndex,\r\n      this.currSlide ? this.currSlide.data : this._initialItemData,\r\n      this\r\n    );\r\n  }\r\n\r\n  /**\r\n   * If the PhotoSwipe can have continious loop\r\n   * @returns Boolean\r\n   */\r\n  canLoop() {\r\n    return (this.options.loop && this.getNumItems() > 2);\r\n  }\r\n\r\n  /**\r\n   * @param {PhotoSwipeOptions} options\r\n   * @private\r\n   */\r\n  _prepareOptions(options) {\r\n    if (window.matchMedia('(prefers-reduced-motion), (update: slow)').matches) {\r\n      options.showHideAnimationType = 'none';\r\n      options.zoomAnimationDuration = 0;\r\n    }\r\n\r\n    /** @type {PhotoSwipeOptions}*/\r\n    this.options = {\r\n      ...defaultOptions,\r\n      ...options\r\n    };\r\n  }\r\n}\n\nexport { PhotoSwipe as default };\n//# sourceMappingURL=photoswipe.esm.js.map\n","import PhotoSwipeGallery from \"./photoswipe/PhotoSwipeGallery\";\r\n\r\n/**\r\n * Builds a slide show on top of PhotoSwipe.\r\n */\r\nexport default class SlideShow {\r\n\r\n    /**\r\n     *\r\n     * @param photoSwipeGallery PhotoSwipe\r\n     */\r\n    constructor(photoSwipe) {\r\n        if (!window.EventGalleryLightboxConfiguration) {\r\n            return;\r\n        }\r\n\r\n        if (!window.EventGalleryLightboxConfiguration.doUseSlideshow) {\r\n            return;\r\n        }\r\n\r\n        this._photoSwipe = photoSwipe;\r\n        this._SlideShow_Running = false;\r\n        this._currentTimer = null;\r\n        this._SlideShow_Delay = window?.EventGalleryLightboxConfiguration?.slideshowSpeed || 2000 /*ms*/;\r\n        this._SlideShow_Button = null;\r\n        this._photoSwipe.ui.registerElement({\r\n            name: 'playpause-button',\r\n            order: 9,\r\n            isButton: true,\r\n            html: '',\r\n            onInit: (el) => {\r\n                this._SlideShow_Button = el;\r\n                this._adjustNavigation();\r\n            },\r\n            onClick: (event, el) => {\r\n                //console.log('slideshow click')\r\n                return this.toggleSlideShowState();\r\n            }\r\n        });\r\n\r\n        this._photoSwipe.on('change', () => {\r\n            this._planNextSwitch(false);\r\n        });\r\n\r\n        this._photoSwipe.on('destroy', () => this._photoSwipeGallery=null);\r\n        this._photoSwipe.on('keydown',     (e) => {if (e.originalEvent.target !== this._SlideShow_Button) this._stopSlideshow()} )\r\n        this._photoSwipe.on('pointerDown', (e) => {if (e.originalEvent.target !== this._SlideShow_Button) this._stopSlideshow()} )\r\n\r\n        if (window.EventGalleryLightboxConfiguration.doUseAutoplay) {\r\n            this.toggleSlideShowState();\r\n        }\r\n    }\r\n\r\n    /**\r\n     *\r\n     * @param delay int\r\n     */\r\n    setDelay(delay) {\r\n        this._SlideShow_Delay = delay;\r\n    }\r\n\r\n    /**\r\n     * switches the slide show on/off depending on the current state\r\n     */\r\n    toggleSlideShowState() {\r\n\r\n        if (this._SlideShow_Running) {\r\n            this._stopSlideshow();\r\n        } else {\r\n            this._startSlideshow();\r\n        }\r\n    }\r\n\r\n    _stopSlideshow() {\r\n        this._SlideShow_Running = false;\r\n        this._adjustNavigation();\r\n    }\r\n\r\n    _startSlideshow() {\r\n        this._SlideShow_Running = true;\r\n        this._planNextSwitch(true);\r\n        this._adjustNavigation();\r\n    }\r\n\r\n    /**\r\n     * make sure the navigation displays the current slide show state.\r\n     */\r\n    _adjustNavigation() {\r\n        if (this._SlideShow_Button) {\r\n            this._SlideShow_Button.classList.remove(this._SlideShow_Running ? \"play\" : \"pause\");\r\n            this._SlideShow_Button.classList.add(this._SlideShow_Running ? \"pause\" : \"play\");\r\n            //this._SlideShow_Button.setAttribute('title', this._SlideShow_Running ? this._SlideShow_Button.getAttribute('data-title-pause') : this._SlideShow_Button.getAttribute('data-title-play'));\r\n        }\r\n    }\r\n\r\n    /**\r\n     * create the timeout for the next switch.\r\n     *\r\n     * @param isForTheFirstSwitch Boolean changes the switch time so the first switch can be faster\r\n     */\r\n    _planNextSwitch(isForTheFirstSwitch)  {\r\n        clearTimeout(this._currentTimer);\r\n        this._currentTimer = setTimeout(() => this._nextSlide(), isForTheFirstSwitch ? this._SlideShow_Delay / 2.0 :this._SlideShow_Delay);\r\n    }\r\n\r\n    /**\r\n     * change to the next slide\r\n     */\r\n    _nextSlide() {\r\n        if (this._photoSwipe === null) {\r\n            return;\r\n        }\r\n\r\n        if (!this._SlideShow_Running) {\r\n            return;\r\n        }\r\n\r\n        this._photoSwipe.next();\r\n    }\r\n}\r\n","/**\r\n * Finds all thumbnail containers on the page\r\n * @returns {NodeListOf<Element>}\r\n */\r\nimport {getParents} from \"../../../common/js/Helpers\";\r\nimport PhotoSwipeGallerySlide from \"./PhotoSwipeGallerySlide\";\r\n\r\n/**\r\n *\r\n * @returns {Element[]}\r\n */\r\nexport function getThumbnailContainers() {\r\n    let thumbEl = document.querySelectorAll( 'a[data-eg-lightbox]' );\r\n\r\n    // don't add images from the clone slides. They are not clickable but will add duplicates to the lightbox => #818\r\n    return Array.from(thumbEl).filter((tc => {\r\n        let parents = getParents(tc);\r\n        let thumbElIsAllowed = true;\r\n        parents.forEach(parent => {\r\n            if (thumbElIsAllowed && parent.classList.contains('glide__slide--clone')) {\r\n                thumbElIsAllowed = false;\r\n            }\r\n        });\r\n        return thumbElIsAllowed;\r\n    }))\r\n}\r\n\r\n/**\r\n *\r\n * @param el\r\n * @param fn\r\n * @returns {Element}\r\n */\r\nexport function  closest(el, fn) {\r\n    return el && ( fn(el) ? el : closest(el.parentNode, fn) );\r\n}\r\n\r\n/**\r\n *\r\n * @param thumbEl Node\r\n * @returns PhotoSwipeGallerySlide\r\n */\r\nexport function  parseThumbnailElement(thumbEl) {\r\n    let item,\r\n        imgEl,\r\n        height,\r\n        width,\r\n        pid,\r\n        gid;\r\n\r\n    // include only element nodes\r\n    if(thumbEl.nodeType !== 1) {\r\n        return null;\r\n    }\r\n\r\n    imgEl = thumbEl.getElementsByTagName('IMG')[0];\r\n\r\n    if (imgEl === undefined) {\r\n        return null;\r\n    }\r\n\r\n    height = thumbEl.getAttribute('data-height');\r\n    width = thumbEl.getAttribute('data-width');\r\n    pid = thumbEl.getAttribute('data-pid');\r\n    gid = thumbEl.getAttribute('data-gid');\r\n\r\n    if (height === null || width === null || pid === null) {\r\n        return null;\r\n    }\r\n\r\n    // create slide object\r\n    item = new PhotoSwipeGallerySlide();\r\n    item.src = thumbEl.getAttribute('href');\r\n    item.width = parseInt(width, 10);\r\n    item.height = parseInt(height, 10);\r\n\r\n    // prevent null entry\r\n    item.title = decodeURIComponent(thumbEl.getAttribute('data-title')?thumbEl.getAttribute('data-title'):'');\r\n\r\n    item.pid = parseInt(pid, 10);\r\n\r\n    item.gid = gid;\r\n\r\n    item.thumbEl  = thumbEl; // save link to element for getThumbBoundsFn\r\n\r\n\r\n    let shareButton = thumbEl.querySelector('.social-share-button');\r\n    if (shareButton) {\r\n        item.shareUrl = shareButton.getAttribute('data-href');\r\n    }\r\n\r\n    item.directDownloadButton = thumbEl.querySelector('.eg-download');\r\n\r\n    let add2cartButton = thumbEl.querySelector('.eventgallery-add2cart');\r\n    if (add2cartButton) {\r\n        item.add2cartUrl = window.EventGalleryCartConfiguration?.add2cartdialogurl + '&' + add2cartButton.getAttribute('data-id');\r\n    }\r\n\r\n    return item;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import {addUrlHashParameter, mergeObjects, removeUrlHashParameter} from \"../../../common/js/Helpers\";\r\n\r\nexport default class HistoryHandler {\r\n\r\n    constructor(newOptions) {\r\n        this.options = {\r\n            onClose: () => {},\r\n            window: window,\r\n            history: history\r\n        }\r\n        this.options = mergeObjects(this.options, newOptions);\r\n    }\r\n\r\n    browserBackHappened = false;\r\n\r\n    _close = () => {\r\n        this.browserBackHappened = true;\r\n        this.options.onClose();\r\n    }\r\n\r\n    /**\r\n     * Add a cleaned history item on the stack,\r\n     * watch for browser back\r\n     */\r\n    startUrlHistory() {\r\n        if (!this.options.history) return;\r\n\r\n        this.options.window.addEventListener('popstate', this._close)\r\n        this.browserBackHappened = false;\r\n        let url = this.options.window.location.href;\r\n\r\n        url = removeUrlHashParameter(url, 'gid');\r\n        url = removeUrlHashParameter(url, 'pid')\r\n\r\n        this.options.history.replaceState(null, '', url);\r\n        this.options.history.pushState(null,'', null);\r\n    }\r\n\r\n    /**\r\n     * remove the listener\r\n     * go one step back in the history if NO browser-back detected\r\n     */\r\n    endUrlHistory() {\r\n        if (!this.options.history) return;\r\n        this.options.window.removeEventListener('popstate', this._close)\r\n        if (!this.browserBackHappened) this.options.history.go(-1);\r\n    }\r\n\r\n    /**\r\n     * set the URL for the current slide\r\n     * @param slide PhotoSwipeGallerySlide\r\n     */\r\n    adjustUrlHistory(slide) {\r\n        if (!this.options.history) return;\r\n        let url = this.options.window.location.href;\r\n\r\n        url = addUrlHashParameter(url, 'gid', slide.gid);\r\n        url = addUrlHashParameter(url, 'pid', slide.pid)\r\n\r\n        this.options.history.replaceState(null, '', url);\r\n    }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import PhotoSwipe from 'photoswipe';\r\nimport 'photoswipe/style.css'\r\nimport {getElementHeight, mergeObjects, removeElement} from \"../../../common/js/Helpers\";\r\nimport Polyfill from \"../Polyfill\";\r\nimport Overlay from \"../Overlay\";\r\nimport SlideShow from \"../SlideShow\";\r\nimport {parseHash} from \"./UrlHandling\";\r\nimport {closest, getThumbnailContainers, parseThumbnailElement} from \"./SlideGenerator\";\r\nimport {Events} from \"../minicart/CartEvents\";\r\nimport HistoryHandler from \"./HistoryHandler\";\r\n\r\n\r\n\r\nexport default class PhotoSwipeGallery {\r\n\r\n    constructor(options) {\r\n        this._isOpen = false;\r\n        this._gallery = null;\r\n        this.options = mergeObjects({\r\n            doOverlapToolbar: false,\r\n            imagePadding: 0,\r\n            doOverlapImageWithCaption: false,\r\n            showHideAnimationType: 'zoom',\r\n        }, options);\r\n    }\r\n\r\n    initPhotoSwipe() {\r\n        this.translations = this._translate();\r\n        this._registerClickEvents();\r\n\r\n        // Parse URL and open gallery if it contains #&pid=3&gid=1\r\n        let hashData = parseHash();\r\n        if(hashData.pid && hashData.gid) {\r\n            this.openPhotoSwipe( hashData.pid ,  this.getGalleries().get(hashData.gid), true, true );\r\n        }\r\n    };\r\n\r\n    _translate() {\r\n        if (!window.EventGalleryLightboxConfiguration) {\r\n            return {};\r\n        }\r\n\r\n        return {\r\n            closeTitle: EventGalleryLightboxConfiguration.KEY_CLOSE,\r\n            zoomTitle: EventGalleryLightboxConfiguration.KEY_ZOOM,\r\n            arrowPrevTitle: EventGalleryLightboxConfiguration.KEY_PREVIOUS,\r\n            arrowNextTitle: EventGalleryLightboxConfiguration.KEY_NEXT,\r\n            errorMsg: 'The image cannot be loaded',\r\n            indexIndicatorSep: ' / ',\r\n            share: EventGalleryLightboxConfiguration.KEY_SHARE,\r\n            download: EventGalleryLightboxConfiguration.KEY_DOWNLOAD,\r\n            buy: EventGalleryLightboxConfiguration.KEY_BUY,\r\n            'playpause-buttonTitle': EventGalleryLightboxConfiguration.KEY_PLAYSLIDESHOW,\r\n            pause: EventGalleryLightboxConfiguration.KEY_PAUSESLIDESHOW,\r\n        }\r\n    }\r\n\r\n    onThumbnailsClick(e) {\r\n        e = e || window.event;\r\n        e.preventDefault ? e.preventDefault() : e.returnValue = false;\r\n\r\n        let eTarget = e.target || e.srcElement;\r\n\r\n        // leave the icons for cart&sharing alone\r\n        let iconContainer = closest(eTarget, function(el) {\r\n            return (el.classList && el.classList.contains('eventgallery-icon-container'));\r\n        });\r\n        if (iconContainer !== null) {\r\n            return;\r\n        }\r\n\r\n        // find root element of slide\r\n        let clickedListItem = closest(eTarget, function(el) {\r\n            return (el.tagName && el.tagName.toUpperCase() === 'A');\r\n        });\r\n\r\n        if(!clickedListItem) {\r\n            return;\r\n        }\r\n\r\n        let slide = this.getSlideBy(clickedListItem);\r\n        let index = this.getIndexOfSlide(slide);\r\n        let slides = this.getGalleries().get(slide.gid);\r\n\r\n        if(index >= 0) {\r\n            // open PhotoSwipe if valid index found\r\n            this.openPhotoSwipe( index, slides );\r\n        }\r\n        return false;\r\n    };\r\n\r\n    /**\r\n     *\r\n     * @param index\r\n     * @param slides\r\n     * @param disableAnimation\r\n     * @param fromURL\r\n     */\r\n    openPhotoSwipe(index, slides, disableAnimation, fromURL, useHistory = true) {\r\n        if (slides === undefined || slides.length === 0 ) {\r\n            return;\r\n        }\r\n\r\n        // define options (if needed)\r\n        let options = mergeObjects({\r\n            pswpModule: PhotoSwipe,\r\n\r\n            galleryPIDs:true,\r\n            bgOpacity: 1,\r\n            showHideAnimationType: this.options.showHideAnimationType,\r\n\r\n            // define gallery index (for URL)\r\n            galleryUID: slides[0].gid,\r\n\r\n            'tapAction': () => {\r\n                this._gallery.element.classList.toggle('pswp--ui-visible');\r\n                if (this._gallery.element.classList.contains('pswp--ui-visible')) {\r\n                    this._gallery.element.classList.remove('pswp--ui-invisible');\r\n                } else {\r\n                    this._gallery.element.classList.add('pswp--ui-invisible');\r\n                }\r\n\r\n                this._gallery.updateSize(true);\r\n            },\r\n\r\n\r\n            paddingFn: (viewportSize, itemData, index) => {\r\n\r\n                let top = 0;\r\n                let bottom = 0;\r\n                let captionHeight = 0;\r\n\r\n                if (!this._gallery.element.classList.contains('pswp--ui-invisible')) {\r\n\r\n                    if (this.options.doOverlapToolbar === false) {\r\n                        top = getElementHeight(document.querySelector('.pswp__top-bar'))\r\n                    }\r\n\r\n                    top += this.options.imagePadding;\r\n\r\n                    if (!this.options.doOverlapImageWithCaption) {\r\n                        if (itemData.title) {\r\n                            const el = document.createElement('div');\r\n                            el.className = 'pswp__custom-caption';\r\n                            el.innerHTML = itemData.title;\r\n                            this._gallery.element.appendChild(el);\r\n                            captionHeight = getElementHeight(el);\r\n                            let cSSStyleDeclaration = getComputedStyle(el);\r\n\r\n                            if (cSSStyleDeclaration['bottom']) {\r\n                                let captionBottom = parseInt(cSSStyleDeclaration['bottom'], 10)\r\n                                captionHeight += captionBottom;\r\n                                captionHeight += Math.max(0, 4 - this.options.imagePadding);\r\n                            }\r\n\r\n                            Polyfill.removeHtmlElementNode(el);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return {\r\n                    top,\r\n                    bottom: bottom +  captionHeight,\r\n                    left: 0,\r\n                    right: 0\r\n                };\r\n            },\r\n        }, this.translations);\r\n\r\n        // disable close gestures to avoid trouble with the add2cart dialog.\r\n        options.pinchToClose = !options.add2cartEl;\r\n        options.closeOnVerticalDrag = !options.add2cartEl;\r\n        options.closeOnScroll = !options.add2cartEl;\r\n\r\n        if (window.EventGalleryLightboxConfiguration) {\r\n            if (parseInt(window.EventGalleryLightboxConfiguration.navigationFadeDelay) > 0) {\r\n                options.timeToIdle = parseInt(window.EventGalleryLightboxConfiguration.navigationFadeDelay);\r\n                options.timeToIdleOutside = parseInt(window.EventGalleryLightboxConfiguration.navigationFadeDelay);\r\n            }\r\n        }\r\n\r\n        // PhotoSwipe opened from URL\r\n        if(fromURL) {\r\n            if(options.galleryPIDs) {\r\n                index = parseInt(index, 10);\r\n                // parse real index when custom PIDs are used\r\n                // http://photoswipe.com/documentation/faq.html#custom-pid-in-url\r\n                for(let j = 0; j < slides.length; j++) {\r\n                    if(slides[j].pid === index) {\r\n                        options.index = j;\r\n                        break;\r\n                    }\r\n                }\r\n            } else {\r\n                // in URL indexes start from 1\r\n                options.index = parseInt(index, 10) - 1;\r\n            }\r\n        } else {\r\n            options.index = parseInt(index, 10);\r\n        }\r\n\r\n        // exit if index not found\r\n        if( isNaN(options.index) ) {\r\n            return;\r\n        }\r\n\r\n        if(disableAnimation) {\r\n            options.showAnimationDuration = 0;\r\n        }\r\n\r\n        // Pass data to PhotoSwipe and initialize it\r\n\r\n        options.dataSource = slides;\r\n\r\n\r\n        this._gallery = new PhotoSwipe(options);\r\n\r\n\r\n        /** allows the zoom closing */\r\n        this._gallery.addFilter('thumbEl', (thumbEl, data, index) => {\r\n            if (data.thumbEl) {\r\n                const el = data.thumbEl.querySelector('img');\r\n                if (el) {\r\n                    return el;\r\n                }\r\n            }\r\n            return thumbEl;\r\n        });\r\n\r\n        /** get a placeholder */\r\n        /*this._gallery.addFilter('placeholderSrc', (placeholderSrc, slide) => {\r\n            const el = slide.data.thumbEl.querySelector('img');\r\n            if (el) {\r\n                return el.src;\r\n            }\r\n            return placeholderSrc;\r\n        });*/\r\n\r\n        this._gallery.on('close', () => {\r\n            return this._isOpen = false;\r\n        });\r\n\r\n        this._gallery.on('change', () => {\r\n            this.overlay?.closeOverlay();\r\n        })\r\n\r\n        // HISTORY\r\n\r\n        let historyHandler = new HistoryHandler({\r\n            onClose: () => this._gallery.close(),\r\n            history: useHistory ? history : null\r\n        })\r\n\r\n        this._gallery.on('afterInit', () => {\r\n            historyHandler.startUrlHistory();\r\n            historyHandler.adjustUrlHistory(this.getCurrentSlide());\r\n        });\r\n\r\n        this._gallery.on('change', () => {\r\n            historyHandler.adjustUrlHistory(this.getCurrentSlide());\r\n        })\r\n\r\n        this._gallery.on('close', () => {\r\n            historyHandler.endUrlHistory();\r\n        })\r\n        // END HISTORY\r\n\r\n        this._gallery.on('keydown', (e) => {\r\n            // prevent photoswipe to react on keypresses\r\n            if (this.overlay?.isOpen) {\r\n                e.defaultPrevented = true;\r\n            }\r\n        })\r\n\r\n        this._gallery.on('close', () => {\r\n            this.overlay?.closeOverlay();\r\n        })\r\n\r\n        this._gallery.on('change', () => {\r\n            document.dispatchEvent(Polyfill.createNewEvent('eventgallery-lightbox-changed'));\r\n        });\r\n\r\n        this._registerUIElements();\r\n        this._gallery.init();\r\n\r\n        this._isOpen = true;\r\n\r\n        document.dispatchEvent(Polyfill.createNewEvent('eventgallery-lightbox-opened'));\r\n    };\r\n\r\n    _registerUIElements() {\r\n        this._gallery.on('uiRegister', () => {\r\n\r\n            this._gallery.ui.registerElement({\r\n                name: 'custom-caption',\r\n                order: 9,\r\n                isButton: false,\r\n                appendTo: 'root',\r\n                html: 'Caption text',\r\n                onInit: (el, pswp) => {\r\n                    pswp.on('change', () => {\r\n                        const currSlideElement = this.getCurrentSlide();\r\n                        let captionHTML = '';\r\n                        if (currSlideElement) {\r\n                            captionHTML = currSlideElement.title;\r\n                        }\r\n\r\n                        el.innerHTML = captionHTML || '';\r\n                        if (captionHTML.length > 0 ) {\r\n                            el.style.display = 'block';\r\n                        } else {\r\n                            el.style.display = 'none';\r\n                        }\r\n\r\n                    });\r\n                }\r\n            });\r\n\r\n            this._gallery.ui.registerElement({\r\n                name: 'share-button',\r\n                ariaLabel: this.translations.share,\r\n                title: this.translations.share,\r\n                order: 10,\r\n                isButton: true,\r\n                html: '',\r\n                onInit: (el, pswp) => {\r\n                    pswp.on('change', (a,) => {\r\n                        if (this.getCurrentSlide().shareUrl) {\r\n                            el.style.display = 'block';\r\n                        } else {\r\n                            el.style.display = 'none';\r\n                        }\r\n                    });\r\n                },\r\n                onClick: (event, el, pswp) => {\r\n                    this.overlay = new Overlay();\r\n                    let url = this.getCurrentSlide().shareUrl\r\n                    this.overlay.openOverlay(url);\r\n                    return false;\r\n                }\r\n            });\r\n\r\n            this._gallery.ui.registerElement({\r\n                name: 'add2cart-button',\r\n                ariaLabel: this.translations.buy,\r\n                title: this.translations.buy,\r\n                order: 11,\r\n                isButton: true,\r\n                html: '',\r\n                onInit: (el, pswp) => {\r\n                    pswp.on('change', (a,) => {\r\n                        if (this.getCurrentSlide().add2cartUrl) {\r\n                            el.style.display = 'block';\r\n                        } else {\r\n                            el.style.display = 'none';\r\n                        }\r\n\r\n                    });\r\n                },\r\n                onClick: (event, el) => {\r\n                    this.overlay = new Overlay();\r\n\r\n                    this.overlay.onLoad = () => {\r\n                        document.dispatchEvent(Polyfill.createNewEvent(Events.prepareAdd2cartDialogContent, null));\r\n                    };\r\n\r\n                    let url = this.getCurrentSlide().add2cartUrl;\r\n                    this.overlay.openOverlay(url);\r\n\r\n                    return false;\r\n                }\r\n\r\n            });\r\n\r\n            this._gallery.ui.registerElement({\r\n                name: 'download-button',\r\n                ariaLabel: this.translations.download,\r\n                title: this.translations.download,\r\n                order: 12,\r\n                isButton: true,\r\n                html: '',\r\n                onInit: (el, pswp) => {\r\n                    pswp.on('change', (a,) => {\r\n                        if (this.getCurrentSlide().directDownloadButton) {\r\n                            el.style.display = 'block';\r\n                        } else {\r\n                            el.style.display = 'none';\r\n                        }\r\n\r\n                    });\r\n                },\r\n                onClick: (event, el) => {\r\n                    this.getCurrentSlide().directDownloadButton?.click();\r\n                    return false;\r\n                }\r\n            });\r\n\r\n            new SlideShow(this._gallery);\r\n        })\r\n\r\n\r\n    }\r\n\r\n    _registerClickEvents() {\r\n        // loop through all gallery elements and bind events\r\n        let galleries = this.getGalleries();\r\n\r\n        for(let gallery of galleries.values()) {\r\n            for (let i = 0, l = gallery.length; i < l; i++) {\r\n                gallery[i].thumbEl.onclick = (e) => {this.onThumbnailsClick(e)};\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * searches the galleries for a thumbnail container and returns the\r\n     * Slide object\r\n     *\r\n     * @param thumbEl\r\n     * @returns PhotoSwipeGallerySlide\r\n     */\r\n    getSlideBy(thumbEl) {\r\n        let galleries = this.getGalleries();\r\n\r\n        for(let gallery of galleries.values()) {\r\n            for (let i = 0, l = gallery.length; i < l; i++) {\r\n                if (gallery[i].thumbEl === thumbEl) {\r\n                    return gallery[i];\r\n                }\r\n            }\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n\r\n    /**\r\n     *\r\n     * @param slide PhotoSwipeGallerySlide\r\n     * @returns {*|number}\r\n     */\r\n    getIndexOfSlide(slide) {\r\n        let slides = this.getGalleries().get(slide.gid);\r\n        return slides.map(function(e) { return e.hash(); }).indexOf(slide.hash());\r\n    }\r\n\r\n    /**\r\n     * Parses all elements on the page so we know which triggers for a lightbox exist.\r\n     * Returns a mal containing the gallery and all elements\r\n     * @returns {Map<String, Array>}\r\n     */\r\n    getGalleries() {\r\n        let galleries = new Map(),\r\n            thumbnails = getThumbnailContainers();\r\n\r\n        for(let i=0; i<thumbnails.length; i++) {\r\n            let thumbEl = thumbnails[i];\r\n            let gallery;\r\n\r\n            let item = parseThumbnailElement(thumbEl);\r\n            if (item !== null) {\r\n                if (galleries.get(item.gid) === undefined) {\r\n                    galleries.set(item.gid, []);\r\n                }\r\n                gallery = galleries.get(item.gid);\r\n                gallery.push(item);\r\n                galleries.set(item.gid, gallery);\r\n            }\r\n        }\r\n\r\n        return galleries;\r\n    }\r\n\r\n    /**\r\n     * grabs the current slide from the lightbox\r\n     * @returns PhotoSwipeGallerySlide\r\n     */\r\n    getCurrentSlide() {\r\n        return this._gallery.currSlide.data;\r\n    }\r\n\r\n    /**\r\n     * Returns the index if the current item in the lightbox\r\n     *\r\n     * @returns integer\r\n     */\r\n    getCurrentIndex() {\r\n        return this._gallery.currIndex;\r\n    }\r\n\r\n    /**\r\n     * reinitiate the lightbox. Register the click events for existing and new elements.\r\n     */\r\n    reload() {\r\n        this._registerClickEvents();\r\n    }\r\n\r\n    /**\r\n     * reports back if the lightbox is currently open\r\n     * @returns {boolean}\r\n     */\r\n    isOpen() {\r\n        return this._isOpen;\r\n    }\r\n\r\n    /**\r\n     *\r\n     * @param afterChangeFunction\r\n     */\r\n    setAfterChangeEventListener(afterChangeFunction) {\r\n        this._gallery.on('change', afterChangeFunction);\r\n    }\r\n\r\n    /**\r\n     * jump to a specific slide.\r\n     * @param index\r\n     */\r\n    gotoSlide(index) {\r\n        this._gallery.goTo(index);\r\n    }\r\n\r\n}\r\n\r\n","/**\r\n * splits a hash value into its elements. returns an empty object if there is nothing in\r\n */\r\nexport function _parseHashString(hash) {\r\n    let params = {};\r\n\r\n    if(hash.length < 5) {\r\n        return params;\r\n    }\r\n\r\n    let vars = hash.split('&');\r\n    for (let i = 0; i < vars.length; i++) {\r\n        if(!vars[i]) {\r\n            continue;\r\n        }\r\n        let pair = vars[i].split('=');\r\n        if(pair.length < 2) {\r\n            continue;\r\n        }\r\n        params[pair[0]] = pair[1];\r\n    }\r\n\r\n    return params;\r\n}\r\n\r\nexport function parseHash() {\r\n    return _parseHashString(window.location.hash.substring(1));\r\n}\r\n\r\n\r\n","\r\nexport default class PhotoSwipeGallerySlide {\r\n    constructor() {\r\n        this.width = 0;\r\n        this.height = 0;\r\n        this.src = '';\r\n        this.alt = '';\r\n        this.title = '';\r\n        this.pid = '';\r\n        this.gid = '';\r\n        this.thumbEl = null;\r\n        this.msrc= '';\r\n        this.shareUrl = '';\r\n        this.add2cartUrl = '';\r\n        this.directDownloadButton = '';\r\n    }\r\n\r\n    hash() {\r\n        return this.gid + this.src;\r\n    }\r\n}\r\n","\r\n/**\r\n * Indicates whether the specified value is a string.\r\n *\r\n * @param  {*}   value\r\n * @return {Boolean}\r\n */\r\nexport function isString (value: any) {\r\n    return typeof value === 'string'\r\n}\r\n\r\nexport function isArray(value: any) {\r\n    return Array.isArray(value);\r\n}\r\n\r\nexport function isNodeList(value: any) {\r\n    return NodeList.prototype.isPrototypeOf(value);\r\n}\r\n","import {isString, isArray, isNodeList} from \"./units\";\r\n\r\nexport default class EventsHandler {\r\n    /**\r\n     * Construct a EventsHandler instance.\r\n     */\r\n    constructor (listeners = {}) {\r\n        this.listeners = listeners;\r\n    }\r\n\r\n    /**\r\n     * Adds events listeners to arrows HTML elements.\r\n     *\r\n     * @param  {String|Array} events\r\n     * @param  {NodeList|Element|Window|Document} el\r\n     * @param  {Function} closure\r\n     * @param  {boolean} capture\r\n     */\r\n    on (events, el, closure, capture = false, passive = false) {\r\n        if (isString(events)) {\r\n            events = [events]\r\n        }\r\n\r\n        if (!isNodeList(el) && !isArray(el)) {\r\n            el = [el];\r\n        }\r\n\r\n        events.forEach((event)=> {\r\n            this.listeners[event] = {'closure': closure, 'options': {'capture': capture, 'passive': passive}};\r\n\r\n            for (let i=0; i<el.length;i++) {\r\n                el[i].addEventListener(event, this.listeners[event].closure, this.listeners[event].options)\r\n            }\r\n\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Removes event listeners from arrows HTML elements.\r\n     *\r\n     * @param  {String|Array} events\r\n     * @param  {NodeList|Element|Window|Document} el\r\n     */\r\n    off (events, el) {\r\n        if (isString(events)) {\r\n            events = [events]\r\n        }\r\n\r\n        if (!isNodeList(el) && !isArray(el)) {\r\n            el = [el];\r\n        }\r\n\r\n        events.forEach((event) => {\r\n            for (let i=0; i<el.length;i++) {\r\n                let listener = this.listeners[event];\r\n                if (listener === undefined) {\r\n                    continue;\r\n                }\r\n                el[i].removeEventListener(event, listener.closure, listener.options)\r\n            }\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Destroy collected listeners.\r\n     *\r\n     */\r\n    destroy () {\r\n        delete this.listeners\r\n    }\r\n}\r\n","export default class Polyfill {\r\n    static removeHtmlElementNode(element:any) {\r\n            if (element.parentNode !== null)\r\n                element.parentNode.removeChild(element);\r\n    }\r\n\r\n    static createNewEvent(eventName:string, data:any) {\r\n        let event = null;\r\n\r\n        if(typeof(CustomEvent) === 'function') {\r\n            event = new CustomEvent(eventName, {detail: data});\r\n        }else{\r\n            event = document.createEvent('Event');\r\n            event.initEvent(eventName, true, true);\r\n            // @ts-ignore\r\n            event.detail = data;\r\n        }\r\n        return event;\r\n    }\r\n}\r\n","export enum Events {\r\n    reload = 'eventgallery-minicart-reload',\r\n    prepareAdd2cartDialogContent = 'eventgallery-prepare-add2cartdialogcontent',\r\n    rebindAdd2CartButtons = 'eventgallery-rebind-add2cart-buttons'\r\n}","import {getOuterHeight, mergeObjects} from \"../../../common/js/Helpers\";\r\nimport Polyfill from \"../Polyfill\";\r\nimport {CartProcessor} from \"./CartProcessor\";\r\nimport {Events} from \"./CartEvents\";\r\n\r\nenum MiniCartMode {\r\n    short,\r\n    long\r\n}\r\n\r\nclass MiniCartOptions {\r\n    buttonShowType:string =  'inline';\r\n    emptyCartSelector:string = '.eventgallery-empty-minicart';\r\n    cartSelector:string = '.eventgallery-minicart';\r\n    cartItemContainerSelector:string = '.cart-items-container';\r\n    cartItemsSelector:string = '.cart-items';\r\n    cartItemSelector:string = '.cart-items .cart-item';\r\n    cartCountSelector:string = '.itemscount';\r\n    buttonDownSelector:string = '.toggle-down';\r\n    buttonUpSelector:string = '.toggle-up';\r\n    cartItemsMinHeight:number = null;\r\n    removeLinkTitle:string = \"Remove\";\r\n}\r\n\r\nexport class MiniCart {\r\n    containerElement: HTMLElement;\r\n    cartElement: HTMLElement;\r\n    cartItemsElement: HTMLElement;\r\n    emptyCartElement: HTMLElement;\r\n    buttonToShort: HTMLElement;\r\n    buttonToLong: HTMLElement;\r\n    options: MiniCartOptions;\r\n    lineItems: any;\r\n    cartProcessor: CartProcessor;\r\n    minicartMode: MiniCartMode = MiniCartMode.short;\r\n\r\n    constructor(cartProcessor: CartProcessor, containerElement: HTMLElement, options:MiniCartOptions) {\r\n        this.containerElement = containerElement;\r\n        this.cartProcessor = cartProcessor;\r\n        this.lineItems = [];\r\n\r\n        this.options = mergeObjects(new MiniCartOptions(), options);\r\n        // @ts-ignore\r\n        let globalConfigStore = window.EventGalleryCartConfiguration;\r\n        this.options = mergeObjects(this.options, globalConfigStore);\r\n\r\n        this.initUI();\r\n\r\n        document.addEventListener(Events.reload, (e: CustomEvent)=>this.updateCartData(e.detail));\r\n        document.addEventListener(Events.rebindAdd2CartButtons, () => {this.updateAdd2CartIcons()})\r\n    }\r\n\r\n    initUI() {\r\n        this.cartElement = this.containerElement?.querySelector(this.options.cartSelector);\r\n        this.cartItemsElement = this.cartElement?.querySelector(this.options.cartItemsSelector);\r\n        this.emptyCartElement = this.containerElement?.querySelector(this.options.emptyCartSelector);\r\n        this.buttonToShort = this.cartElement?.querySelector(this.options.buttonUpSelector);\r\n        this.buttonToLong = this.cartElement?.querySelector(this.options.buttonDownSelector);\r\n\r\n        this.buttonToLong.addEventListener('click', () => {this.resizeCartArea(MiniCartMode.long)});\r\n        this.buttonToShort.addEventListener('click', () => {this.resizeCartArea(MiniCartMode.short)});\r\n    }\r\n\r\n    _generateId(lineItem: any) {\r\n        return 'folder=' + encodeURIComponent(lineItem.folder) + '&file=' + encodeURIComponent(lineItem.file);\r\n    }\r\n\r\n    updateAdd2CartIcons() {\r\n\r\n        let elements = document.querySelectorAll('.eventgallery-add2cart i.egfa');\r\n        for(let i=0; i<elements.length; i++) {\r\n            elements[i].classList.remove('egfa-shopping-cart');\r\n            elements[i].classList.add('egfa-cart-plus');\r\n        }\r\n\r\n        // mark the add2cart link to show the item is already in the cart\r\n        for (let i = 0; i<this.lineItems.length; i++) {\r\n            let id = this._generateId(this.lineItems[i])\r\n\r\n            let elements = document.querySelectorAll(`.eventgallery-add2cart[data-id*='${id}'] i.egfa`);\r\n            for (let i = 0; i < elements.length; i++) {\r\n                elements[i].classList.add('egfa-shopping-cart');\r\n                elements[i].classList.remove('egfa-cart-plus');\r\n            }\r\n        }\r\n    }\r\n\r\n    resizeCartArea(miniCartMode: MiniCartMode) {\r\n        this.minicartMode = miniCartMode;\r\n\r\n        let amountOfLines:number = 1;\r\n        let lineHeight = -1;\r\n\r\n        let lastY:number = -1;\r\n        let cartElements = this.cartItemsElement.querySelectorAll(this.options.cartItemSelector);\r\n        for(let i = 0; i<cartElements.length; i++) {\r\n            let cartElement: HTMLElement = cartElements[i] as HTMLElement;\r\n            if (lineHeight<0) {\r\n                lineHeight = getOuterHeight(cartElement);\r\n            }\r\n            if (lastY>-1 && lastY != cartElement.offsetTop) {\r\n                amountOfLines++\r\n            }\r\n            lastY = cartElement.offsetTop;\r\n        }\r\n\r\n        let visibleAmountOfLines = 1;\r\n\r\n        if (amountOfLines === 1) {\r\n            this.buttonToShort.style.display = 'none';\r\n            this.buttonToLong.style.display = 'none';\r\n        } else {\r\n            if (this.minicartMode == MiniCartMode.short) {\r\n                this.buttonToShort.style.display = 'none';\r\n                this.buttonToLong.style.display = 'inline';\r\n            } else {\r\n                this.buttonToShort.style.display = 'inline';\r\n                this.buttonToLong.style.display = 'none';\r\n                visibleAmountOfLines = amountOfLines;\r\n            }\r\n        }\r\n\r\n        this.cartItemsElement.style.height = (visibleAmountOfLines*lineHeight) + 'px';\r\n    }\r\n\r\n    updateCartData(data:any) {\r\n\r\n        this.lineItems = data.cart;\r\n\r\n        if (this.lineItems.length>0) {\r\n            this.cartElement.style.display = 'block';\r\n            if (this.emptyCartElement) this.emptyCartElement.style.display = 'none';\r\n        } else {\r\n            this.cartElement.style.display = 'none';\r\n            if (this.emptyCartElement) this.emptyCartElement.style.display = 'block';\r\n        }\r\n\r\n        let cartItemsHTML = '';\r\n        for (let i = this.lineItems.length - 1; i >= 0; i--) {\r\n            cartItemsHTML = cartItemsHTML +\r\n                `<div>\r\n                    <div class=\"cart-item\">\r\n                        <span class=\"badge badge-pill badge-info\">${this.lineItems[i].count}</span>\r\n                        ${this.lineItems[i].imagetag}\r\n                        <a href=\"#\" title=\"${this.options.removeLinkTitle}\" \r\n                            class=\"button-removeFromCart eventgallery-removeFromCart\" \r\n                            data-id=\"lineitemid=${this.lineItems[i].lineitemid}\">\r\n                            <i class=\"egfa egfa-2x egfa-remove\"></i>\r\n                        </a>\r\n                    </div>\r\n                </div>`;\r\n        }\r\n\r\n        this.cartItemsElement.innerHTML = cartItemsHTML;\r\n\r\n        let newLineItemElements = this.cartItemsElement.querySelectorAll('.eventgallery-removeFromCart');\r\n        for(let i = 0; i<newLineItemElements.length; i++) {\r\n            newLineItemElements[i].addEventListener('click', (e: Event) => this.remove(e));\r\n        }\r\n\r\n        this.updateAdd2CartIcons();\r\n        this.resizeCartArea(this.minicartMode);\r\n\r\n        this.cartElement.querySelector('.itemscount').innerHTML =  this.lineItems.length;\r\n\r\n        // force the lightbox to rescan the page so we can open cart items in a lightbox.\r\n        // @ts-ignore\r\n        if (Eventgallery !== undefined && Eventgallery.lightbox !== undefined) {\r\n            // @ts-ignore\r\n            Eventgallery.lightbox.reload();\r\n        }\r\n        // tigger the loading of Google Photos images for example.\r\n        document.dispatchEvent(Polyfill.createNewEvent('eventgallery-images-added', {isOverlay: true}));\r\n    }\r\n\r\n    remove(e:Event) {\r\n        e.preventDefault();\r\n\r\n        let button: HTMLElement = e.target as HTMLElement;\r\n        let reference:string;\r\n        if (button.getAttribute('data-id')) {\r\n            reference = button.getAttribute('data-id');\r\n        } else {\r\n            reference = button.parentElement.getAttribute('data-id');\r\n        }\r\n\r\n\r\n        this.cartProcessor.remove(reference);\r\n    }\r\n}\r\n","import {CartProcessor} from \"./CartProcessor\";\r\n\r\n/**\r\n * Helps to bring the content of the add2cart dialog to life. e.g. makes the plus/minus-buttons work.\r\n */\r\nexport class Add2CartDialogContent {\r\n    cartProcessor: CartProcessor;\r\n\r\n    constructor(cartProcessor: CartProcessor) {\r\n        this.cartProcessor = cartProcessor;\r\n        this.initialize();\r\n    }\r\n\r\n    initialize() {\r\n\r\n        let q = document.getElementsByClassName('eventgallery-cartquantity');\r\n        for(let i=0; i<q.length; i++) {\r\n            q[i].addEventListener('change', (e)=>this.updateQuantity(e));\r\n        }\r\n\r\n        let p = document.getElementsByClassName('eventgallery-qtyplus');\r\n        for(let i=0; i<p.length; i++) {\r\n            p[i].addEventListener('click', (e) => this.quantityPlus(e), {capture: true});\r\n        }\r\n\r\n        let m = document.getElementsByClassName('eventgallery-qtyminus');\r\n        for(let i=0; i<m.length; i++) {\r\n            m[i].addEventListener('click', (e) => this.quantityMinus(e), {capture: true});\r\n        }\r\n\r\n        if (document.querySelector('#eg-single-image-type-action-needed')) {\r\n            this.cartProcessor.loadCart();\r\n        }\r\n\r\n    }\r\n\r\n    updateQuantity(e:Event) {\r\n        e.preventDefault();\r\n\r\n        let inputFild: HTMLInputElement = e.target as HTMLInputElement;\r\n        let quantity: number = parseInt(inputFild.value);\r\n        if (isNaN(quantity)) {\r\n            quantity = 1;\r\n        }\r\n        let reference = inputFild.getAttribute('data-id');\r\n\r\n        this.cartProcessor.add(reference, quantity);\r\n    };\r\n\r\n    quantityPlus(e:Event) {\r\n        e.preventDefault();\r\n\r\n        let target = e.target as HTMLElement;\r\n        let fieldName: string = target.getAttribute('field');\r\n        let inputField: HTMLInputElement = document.getElementsByName(fieldName)[0] as HTMLInputElement;\r\n        let currentVal: number = parseInt(inputField.value);\r\n\r\n        if (!isNaN(currentVal)) {\r\n            let maxOrderQuantity:number = parseInt(inputField.getAttribute('data-maxorderquantity'));\r\n            if (maxOrderQuantity === 0 || currentVal<maxOrderQuantity) {\r\n                inputField.value = String(currentVal + 1);\r\n            }\r\n            let changeEvent = new Event('change');\r\n            inputField.dispatchEvent(changeEvent);\r\n        } else {\r\n            inputField.value = \"0\";\r\n        }\r\n    };\r\n\r\n    quantityMinus(e:Event) {\r\n        e.preventDefault();\r\n\r\n        let target = e.target as HTMLElement;\r\n        let fieldName: string = target.getAttribute('field');\r\n        let inputField: HTMLInputElement = document.getElementsByName(fieldName)[0] as HTMLInputElement;\r\n        let currentVal: number = parseInt(inputField.value);\r\n\r\n        if (!isNaN(currentVal) && currentVal > 0) {\r\n            inputField.value = String(currentVal - 1);\r\n            let changeEvent = new Event('change');\r\n            inputField.dispatchEvent(changeEvent);\r\n        } else {\r\n            inputField.value = \"0\";\r\n        }\r\n    };\r\n}","import {Add2CartDialogContent} from \"./Add2CartDialogContent\";\r\nimport Overlay from \"../Overlay\";\r\nimport {CartProcessor} from \"./CartProcessor\";\r\nimport EventsHandler from \"../utils/eventshandler\";\r\nimport {Events} from \"./CartEvents\";\r\n\r\n/**\r\n * takes care about the add2cart buttons on the images:\r\n * - update the click events\r\n */\r\n\r\nexport class Add2CartButtonHandler {\r\n    cartProcessor: CartProcessor;\r\n    eventHandler:EventsHandler = new EventsHandler();\r\n    add2cartdialogurl: string;\r\n\r\n    constructor(cartProcessor: CartProcessor, add2cartdialogurl: string) {\r\n        this.cartProcessor = cartProcessor;\r\n        this.add2cartdialogurl = add2cartdialogurl;\r\n        this.initializeCartButtons();\r\n        document.addEventListener(Events.rebindAdd2CartButtons, () => {this.initializeCartButtons()})\r\n    }\r\n\r\n    initializeCartButtons() {\r\n        let add2cartButtons = document.getElementsByClassName('eventgallery-openAdd2cart');\r\n        Array.prototype.forEach.call(add2cartButtons, (btn: HTMLBaseElement)=> {\r\n            this.eventHandler.off('click', btn);\r\n            this.eventHandler.on('click', btn, (e:Event) => {this.openAdd2CartDialog(e)});\r\n        });\r\n    }\r\n\r\n    openAdd2CartDialog(e: Event) {\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n\r\n        let link: HTMLElement = e.target as HTMLElement;\r\n\r\n        if (!link.getAttribute('data-id')) {\r\n            link = link.parentElement;\r\n        }\r\n\r\n        let overlay = new Overlay();\r\n        overlay.onLoad = () => {\r\n            new Add2CartDialogContent(this.cartProcessor);\r\n        };\r\n\r\n        overlay.openOverlay(this.add2cartdialogurl + '&' + link.getAttribute('data-id'));\r\n\r\n        return false;\r\n    };\r\n}\r\n","import EventsHandler from \"../utils/eventshandler\";\r\nimport {Events} from \"./CartEvents\";\r\nimport {getParent} from \"../../../common/js/Helpers\";\r\n\r\n/**\r\n * takes care about the external cart connector buttons on the images:\r\n * - update the click events\r\n */\r\n\r\nexport class CartConnectorButtonHandler {\r\n    eventHandler:EventsHandler = new EventsHandler();\r\n\r\n\r\n    constructor() {\r\n        this.initializeCartConnectorButtons();\r\n        document.addEventListener(Events.rebindAdd2CartButtons, () => {this.initializeCartConnectorButtons()})\r\n    }\r\n\r\n    initializeCartConnectorButtons() {\r\n        let cartConnectorButtons = document.getElementsByClassName('eventgallery-cart-connector');\r\n        Array.prototype.forEach.call(cartConnectorButtons, (btn: HTMLBaseElement)=> {\r\n            this.eventHandler.off('click', btn);\r\n            this.eventHandler.on('click', btn, (e:Event) => {this.openLink(e)});\r\n        });\r\n    }\r\n\r\n    openLink(e: Event) {\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n        let link: HTMLElement = e.target as HTMLElement;\r\n\r\n        if (!link.getAttribute('data-href')) {\r\n            link = getParent(link, 'SPAN');\r\n        }\r\n\r\n        window.location.href = link.getAttribute('data-href');\r\n    };\r\n}\r\n","import Polyfill from \"../Polyfill\";\r\nimport {Add2CartButtonHandler} from \"./Add2CartButtonHandler\";\r\nimport {Events} from \"./CartEvents\";\r\nimport {CartConnectorButtonHandler} from \"./CartConnectorButtonHandler\";\r\n\r\nclass CartUrls {\r\n    removeUrl:string = \"\";\r\n    add2cartUrl:string = \"\";\r\n    getCartUrl:string = \"\";\r\n    add2cartdialogurl:string = \"\";\r\n}\r\n\r\nexport class CartProcessor {\r\n\r\n    urls: CartUrls;\r\n    add2CartButtonHandler: Add2CartButtonHandler;\r\n    cartConnectorButtonHandler: CartConnectorButtonHandler;\r\n\r\n    constructor() {\r\n        // @ts-ignore\r\n        this.urls = window.EventGalleryCartConfiguration as CartUrls || CartUrls;\r\n        this.add2CartButtonHandler = new Add2CartButtonHandler(this, this.urls?.add2cartdialogurl);\r\n        this.cartConnectorButtonHandler = new CartConnectorButtonHandler();\r\n    }\r\n\r\n    add(reference: string, quantity:number) {\r\n        fetch(this.urls.add2cartUrl + '&' + reference + '&quantity=' + quantity)\r\n            .then(response => response.json())\r\n            .then(data => this.dispatchCartData(data));\r\n    }\r\n\r\n    remove(reference: string) {\r\n        fetch(this.urls.removeUrl + '&' + reference)\r\n            .then(response => response.json())\r\n            .then(data => this.dispatchCartData(data));\r\n    }\r\n\r\n    loadCart() {\r\n        fetch(this.urls.getCartUrl)\r\n            .then(response => response.json())\r\n            .then(data => this.dispatchCartData(data));\r\n    }\r\n\r\n    dispatchCartData(data: any) {\r\n        document.dispatchEvent(Polyfill.createNewEvent(Events.reload, {cart: data}));\r\n    }\r\n}\r\n","import {MiniCart} from \"./MiniCart\";\r\nimport {Add2CartDialogContent} from \"./Add2CartDialogContent\";\r\nimport {CartProcessor} from \"./CartProcessor\";\r\nimport {Events} from \"./CartEvents\";\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n    try {\r\n        let cartProcessor = new CartProcessor();\r\n\r\n        let carts = document.getElementsByClassName('eventgallery-minicart-container');\r\n        if (carts.length == 0) return\r\n\r\n        for (let i = 0; i < carts.length; i++) {\r\n            new MiniCart(cartProcessor, carts[i] as HTMLElement, null);\r\n        }\r\n\r\n        cartProcessor.loadCart();\r\n\r\n        document.addEventListener(Events.prepareAdd2cartDialogContent, () => {\r\n            new Add2CartDialogContent(cartProcessor)\r\n        });\r\n    } catch (e) {\r\n        console.log(e);\r\n    }\r\n\r\n})\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n    let container = document.querySelector('.orderimages-container');\r\n    if (!container) {\r\n        return;\r\n    }\r\n    let doUseStickyImagetypeSelection = container.getAttribute(\"data-sticky-image-type-selection\") === \"true\";\r\n\r\n    let orderimagesHideButton: HTMLElement = container.querySelector('.orderimages-hide'),\r\n        orderimagesShowButton: HTMLElement = container.querySelector('.orderimages-show'),\r\n        orderimagesHelp: HTMLElement = container.querySelector('.orderimages-help');\r\n\r\n    function closeImageTypeSelection(e:Event) {\r\n        if (e) {\r\n            e.preventDefault();\r\n        }\r\n        orderimagesHideButton.style.display= 'none';\r\n        orderimagesHelp.style.display= 'none';\r\n        orderimagesShowButton.style.display= 'block';\r\n        makeCartButtonsVisible(false);\r\n    }\r\n\r\n    function openImageTypeSelection(e:Event) {\r\n        if (e) {\r\n            e.preventDefault();\r\n        }\r\n        orderimagesHideButton.style.display= 'block';\r\n        orderimagesHelp.style.display= 'block';\r\n        orderimagesShowButton.style.display= 'none';\r\n\r\n        makeCartButtonsVisible(true);\r\n    }\r\n\r\n    function makeCartButtonsVisible(doShow:boolean) {\r\n        let cartButtons = document.querySelectorAll<HTMLElement>('.eventgallery-add2cart');\r\n        for(let i=0; i<cartButtons.length; i++) {\r\n            cartButtons[i].style.display = doShow ? 'inline-block':'none';\r\n        }\r\n    }\r\n\r\n\r\n    orderimagesShowButton.addEventListener('click', openImageTypeSelection);\r\n    orderimagesHideButton.addEventListener('click', closeImageTypeSelection);\r\n\r\n    if (doUseStickyImagetypeSelection) {\r\n        orderimagesShowButton.style.display= 'none';\r\n        orderimagesHideButton.style.display= 'none';\r\n        makeCartButtonsVisible(true);\r\n    }\r\n    else\r\n    {\r\n        closeImageTypeSelection(null);\r\n    }\r\n\r\n});\r\n","import {getParent, insertAndExecute} from \"../../../common/js/Helpers\";\r\n\r\nexport class DownloadButton {\r\n    static download(e:Event, href:string, download:string) {\r\n        e.preventDefault();\r\n        let a = document.createElement('a');\r\n        a.href = href;\r\n        a.setAttribute(\"target\", \"_blank\");\r\n        a.download = download;\r\n        document.body.appendChild(a);\r\n        a.click();\r\n        document.body.removeChild(a)\r\n    }\r\n}\r\n\r\nexport class ClickableButton {\r\n    static click(e:Event, href:string) {\r\n        e.preventDefault();\r\n        document.location.href = href;\r\n    }\r\n}\r\n","import {ClickableButton, DownloadButton} from \"./socialbutton\";\r\nimport Overlay from \"../Overlay\";\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n\r\n    let elements = document.querySelectorAll('.social-share-button-open');\r\n    for (let i=0; i<elements.length;i++) {\r\n        let href = elements[i].getAttribute('data-href');\r\n        elements[i].addEventListener(\"click\", (e) => {\r\n            e.preventDefault();\r\n            let overlay = new Overlay();\r\n            overlay.openOverlay(href);\r\n        }, true);\r\n    }\r\n\r\n    elements = document.querySelectorAll('.eg-download');\r\n    for (let i=0; i<elements.length;i++) {\r\n        let element = elements[i];\r\n        let href = element.getAttribute('data-href');\r\n        let download = element.getAttribute('data-download');\r\n\r\n        if (download != null) {\r\n            element.addEventListener(\"click\", (e) => {\r\n                DownloadButton.download(e, href, download);\r\n            }, true);\r\n        } else {\r\n            element.addEventListener(\"click\", (e) => {\r\n                ClickableButton.click(e, href);\r\n            }, true);\r\n        }\r\n    }\r\n\r\n});\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","window.Eventgallery = window.Eventgallery || {};\r\n\r\nrequire('./frontend/js/EventgalleryBehavior.js');\r\n\r\nrequire('./frontend/js/photoswipe/PhotoSwipeGallery.js');\r\nrequire('./frontend/js/photoswipe/PhotoSwipeGallerySlide.js');\r\n\r\nrequire('./frontend/less/eventgallery.less');\r\nrequire('./frontend/less/font-awesome/font-awesome.less');\r\n\r\nrequire('./frontend/js/minicart/index');\r\nrequire('./frontend/js/socialbutton/index');\r\nrequire('./frontend/js/jsgallery/index');\r\n\r\n// Required Core Stylesheet\r\nimport \"@glidejs/glide/src/assets/sass/glide.core.scss\";\r\nimport \"./frontend/sass/glide/glide.theme.scss\";\r\n\r\n"],"names":["removeElement","array","elm","index","indexOf","splice","mergeObjects","defaults","options","key","getElementWidth","el","parseFloat","getComputedStyle","width","replace","getElementHeight","height","calcBorderWidth","elements","properties","sum","i","length","cSSStyleDeclaration","j","value","isNaN","addUrlHashParameter","initialUrl","fragments","removeUrlHashParameter","split","urlpart","hashparts","push","encodeURIComponent","join","getUrlHashParameterValue","url","result","prefix","newHashParts","addUrlParameter","removeUrlParameter","urlparts","pars","setCSSStyle","nodes","style","getOuterHeight","offsetHeight","parseInt","marginTop","marginBottom","getParents","node","parents","parentElement","parent","getParent","query","matches","insertAndExecute","htmlElement","newContent","innerHTML","scripts","Array","prototype","slice","call","getElementsByTagName","src","tag","document","createElement","appendChild","eval","err","console","error","forEach","callback","serializeForm","form","serialized","inputElements","querySelectorAll","field","name","disabled","type","n","selected","checked","Glide","Components","Events","Binder","EventsHandler","prevented","Anchors","mount","this","_a","Html","wrapper","bind","on","click","unbind","off","event","stopPropagation","preventDefault","detach","attach","Object","defineProperty","get","Transition","after","destroy","_typeof","obj","Symbol","iterator","constructor","_classCallCheck","instance","Constructor","TypeError","_defineProperties","target","props","descriptor","enumerable","configurable","writable","_createClass","protoProps","staticProps","_getPrototypeOf","o","setPrototypeOf","getPrototypeOf","__proto__","_setPrototypeOf","p","_possibleConstructorReturn","self","ReferenceError","_assertThisInitialized","_superPropBase","object","property","hasOwnProperty","_get","Reflect","receiver","base","desc","getOwnPropertyDescriptor","arguments","apply","startAt","perView","focusAt","gap","autoplay","hoverpause","keyboard","bound","swipeThreshold","dragThreshold","perSwipe","touchRatio","touchAngle","animationDuration","rewind","rewindDuration","animationTimingFunc","waitForTransition","throttle","direction","peek","cloningRatio","breakpoints","classes","swipeable","dragging","ltr","rtl","slider","carousel","slide","clone","active","arrow","nav","warn","msg","concat","toInt","isString","isObject","isFunction","isUndefined","isArray","glide","extensions","events","components","_name","prop","definition","mergeOptions","settings","assign","EventsBus","undefined","hop","handler","remove","context","emit","item","Glide$1","selector","_c","_t","_e","transformers","pattern","Run","make","distance","disable","Move","interval","_o","set","_i","_d","status","now","Date","getTime","func","wait","timeout","args","previous","later","leading","throttled","at","remaining","clearTimeout","trailing","setTimeout","cancel","MARGIN_TYPE","siblings","parentNode","firstChild","matched","nextSibling","nodeType","exist","window","HTMLElement","toArray","nodeList","TRACK_SELECTOR","EventsBinder","listeners","closure","capture","addEventListener","removeEventListener","VALID_DIRECTIONS","FLIPED_MOVEMENTS","Rtl","modify","translate","Direction","is","Gap","multiplier","Math","floor","Sizes","slideWidth","Gaps","Grow","Clones","grow","Peeking","Peek","before","Focusing","supportsPassive","opts","e","supportsPassive$1","START_EVENTS","MOVE_EVENTS","END_EVENTS","MOUSE_EVENTS","swipe","swipeSin","swipeStartX","swipeStartY","passive","Swipe","bindSwipeStart","start","touches","pageX","pageY","bindSwipeMove","bindSwipeEnd","move","_Glide$settings","subExSx","subEySy","powEX","abs","powEY","swipeHypotenuse","sqrt","swipeCathetus","asin","PI","root","classList","add","end","_Glide$settings2","threshold","swipeDistance","swipeDeg","enable","resolve","unbindSwipeMove","unbindSwipeEnd","_this","_Glide$settings3","unbindSwipeStart","_this2","_this3","changedTouches","Images","dragstart","CONTROLS_SELECTOR","PREVIOUS_CONTROLS_SELECTOR","NEXT_CONTROLS_SELECTOR","controls","Controls","_n","_arrowControls","next","addBindings","setActive","addClass","children","removeActive","removeClass","sibling","setArrowState","resetArrowState","disableArrow","_len","lists","_key","list","element","_len2","_key2","removeBindings","currentTarget","getAttribute","Autoplay","setInterval","stop","time","clearInterval","slides","sortBreakpoints","points","keys","sort","reduce","r","k","Breakpoints","match","matchMedia","point","COMPONENTS","track","querySelector","collectSlides","filter","contains","_r","t","Translate","transform","TRANSFORMERS","mutate","transformer","mutator","translate3d","mozTransform","webkitTransform","getStartIndex","isOffset","getTravelDistance","travelDistance","isType","movement","startWidth","compose","duration","transition","offset","token","_v","setupSlides","setupWrapper","wrapperSize","offsetWidth","reductor","len","marginLeft","marginRight","items","collect","peekIncrementer","cloneCount","round","append","reverse","prepend","max","cloneNode","_clone","unshift","_Components$Html","half","_i2","insertBefore","_i3","removeChild","Resize","Build","typeClass","activeClass","removeClasses","_Glide$settings$class","calculate","isStart","isEnd","steps","viewSize","calculateForwardIndex","isBound","normalizeForwardIndex","_index","ceil","calculateBackwardIndex","normalizeBackwardIndex","_m","step","substr","_Core","subClass","superClass","create","_inherits","Derived","hasNativeReflectConstruct","_super","construct","sham","Proxy","Boolean","valueOf","_isNativeReflectConstruct","Super","NewTarget","sliderRootSelector","SliderTransformator","sourceGroupElement","sourceElementSelector","doShowNav","elementSelector","sourceElements","getSourceElements","numberOfItemsPerSlide","sliderRoot","sliderMarkup","createRange","createContextualFragment","controlElement","Polyfill","sliderGroupElement","currentSliderElement","className","CamelCaseConverter","str","m","w","toUpperCase","SliderOptions","slidesElementsSelector","numberOfRowsPerSlide","showNav","_parseOptions","attributes","toCamelCase","ElementSize","domRect","getBoundingClientRect","computedStyle","containerElement","numberOfRows","getOuterWidth","EventgalleryLazyload","classForLoaded","classForLoading","IntersectionObserverEntry","intersectionRatio","imageObserver","IntersectionObserver","entries","imgObserver","entry","isIntersecting","lazyImage","dataset","setAttribute","knownImageUrls","includes","img","onload","lazyImages","observe","SliderStarter","sliderTransformator","sliderOptions","_loadOptions","getSlidesElementsSelector","getAutoPlay","calclateNumberOfFittingItemsPerSlide","getNumberOfRowsPerSlide","rootElement","watchImages","Anchor","Image","image","newOptions","imageTagContainer","calculatedWidth","calcSize","glueLeft","glueRight","glueTop","glueBottom","newWidth","newHeight","ratio","sizeCalculator","SizeCalculator","dataSrc","secret","secret_o","secret_h","secret_k","farm","server","id","getFlickrURL","googleWidth","getSize","adjustImageURL","display","margin","Row","maxWidth","maxHeight","heightJitter","adjustHeight","doFillLastRow","isLastRow","images","random","eventgalleryImage","imageWidth","addThisImage","rowHeight","gapToClose","setSize","Imagelist","rowHeightPercentage","rowHeightJitter","minImageWidth","imagesetContainer","imageset","firstImageRowHeight","initComplete","resizeStart","resizeComplete","eventgalleryPageWidth","initialize","eventgalleryTimer","new_width","minHeight","processList","rowWidth","getRowWidth","imagesToProcess","shift","hide","show","imageHeight","rowHeightForRightSideImages","getImageTagHeight","generateRows","numberOfRowsToCreate","finalRows","currentRow","processRow","EventsList","EventsTiles","adjustMode","SquareList","TilesCollection","tiles","tilesContainer","tilesPerRow","tile","visibility","position","float","firstExampleTile","columnWidth","y","offsetTop","columnHeight","smallestColumn","getSmallestColumn","left","top","getHighestColumn","smallestColumnValue","smallestColumnNumber","columnValue","columnNumber","URLHelper","urlParameterString","pairs","parameters","Map","pair","splittedPair","urlSring","parts","queryParts","parseURLParameter","urlString","LOADING_MATCHER","MARKER_IMAGE_IS_IN_PROGRESS_ATTRIBUTE","GooglePhotosProcessor","albumUrl","albumsUrl","EventGalleryGooglePhotosConfiguration","imageAddedCallback","processImages","doReloadLightbox","detail","isOverlay","albums","_groupByAlbum","_collectHTMLElements","_markImagesAsInProgress","_getMainImageDataFromServer","htmlCollection","imageSrcSet","foundLinkHTMLElements","a","rel","href","parsedHTMLElement","getHTMLElement","htmlElements","imageHTMLElement","_parseHTMLElement","updateParameters","folder","tagName","ParsedImageHTMLElement","ParsedLinkHTMLElement","foldername","album","_doAlbumRequest","fetch","then","response","json","data","_processAlbumResult","_replaceImages","albumsWithMainImagesOnly","_filterForAlbumsWithMainImageOnly","size","_doAlbumsRequest","delete","_getAlbumDataFromServer","_processAlbumsResult","newAlbums","mainImages","isMainImage","serverResult","parsedImageHTMLElement","imageUrl","getFile","replaceElementLinks","Eventgallery","lightbox","isOpen","link","getCurrentSlide","thumbEl","_gallery","close","ParsedHTMLElement","attributeNames","Set","parameterString","substring","updateParametersWithUrl","getImageUrl","getWidth","triggerLazyLoading","container","thumbnails","dispatchEvent","eventgalleryTilesCollection","tilesOptions","PhotoSwipeGallery","initPhotoSwipe","getElementById","contentId","Overlay","openOverlay","sliderElements","sliderStarter","timer","availableSizes","flickrSizes","originalwidth","originalheight","longSideSize","originalLongSideSize","sizeCode","secretString","minSizes","getMinSizes","heightOkay","lastItem","boxWidth","boxHeight","originalWidth","originalHeight","myDiv","background","body","onClosed","onLoad","repositionTimer","windowWidth","onResizeOverlay","_setRositionTimer","text","dataUrl","opacity","closeOverlay","reposition","startsWith","_getRemoteData","_addContent","force","content","getElementsByClassName","clientWidth","innerHeight","scrollTop","pageYOffset","eventsHandler","JSGallery2","galleryElement","thumbs","bigImageContainer","pageContainer","pages","running","currentPageNumber","blockKeys","imagesPerFirstPage","imagesPerPage","bigImage","convertThumbs","lastPage","location","initialIndex","createControls","createGallerySlides","adjustWidth","adjustPageHeight","adjustImageSize","gotoPage","unBlockKeys","selectByIndex","resizePage","thumbnail","eventgalleryAjaxResizeTimer","resetThumbs","thumbContainer","lightboxLinkElement","title","decodeURIComponent","h","leftAction","rightAction","tabAction","hDistance","vDistance","startCoords","endCoords","vSwipe","hSwipe","prevLink","prevImage","mouseLeaveHandler","focusControl","zoomLink","bigImageClickHandler","nextLink","nextImage","showBigImage","showCartButton","add2cartLink","showCartConnector","cartConnectorLink","cartConnectorLinkRel","showSocialMediaButton","div","socialmediabutton","keyboardHandler","touchContainerSelector","targetTouches","control","keyCode","page","select","selectedContainer","count","convertThumb","forceReload","deselect","history","pushState","targetPage","source","setImage","currentIndex","openPhotoSwipe","setAfterChangeEventListener","gid","getCurrentIndex","newSrc","gotoSlide","titleTarget","pageNumber","selectImage","updateHandles","prevHandle","nextHandle","countHandle","updatePagingBar","currentPage","pageCount","createCountLink","pageSpeed","inline","skipFromRight","skipFromLeft","spaceToRight","child","myAnchor","innerText","myListItem","require","galleryElements","appendToEl","equalizePoints","p1","p2","x","roundPoint","getDistanceBetween","pointsEqual","clamp","val","min","toTransformString","scale","propValue","setTransform","setTransitionStyle","ease","setWidthHeight","LOAD_STATE","isSafari","navigator","vendor","DOMEvents","_pool","listener","_toggleListener","removeAll","poolItem","skipPool","methodName","eType","eventOptions","getViewportSize","pswp","getViewportSizeFn","newViewportSize","documentElement","parsePaddingOption","viewportSize","itemData","paddingValue","paddingFn","padding","legacyPropName","getPanAreaSize","PanBounds","currZoomLevel","center","reset","update","_updateAxis","dispatch","axis","elSize","panAreaSize","correctPan","panOffset","ZoomLevel","elementSize","hRatio","vRatio","fit","fill","vFill","initial","_getInitial","secondary","_getSecondary","_getMax","zoomLevels","slideData","_parseZoomLevelOption","optionPrefix","optionName","optionValue","Number","Slide","isActive","currIndex","currentResolution","isFirstSlide","opener","pan","contentLoader","getContentBySlide","bounds","prevDisplayedWidth","prevDisplayedHeight","setIsActive","activate","deactivate","holderElement","transformOrigin","calculateSize","load","updateContentSize","appendHeavy","zoomAndPanToInitial","applyCurrentZoomPan","heavyAppended","mainScroll","isShifted","defaultPrevented","hasSlide","resize","panTo","scaleMultiplier","sizeChanged","setDisplayedSize","getPlaceholderElement","placeholder","zoomTo","destZoomLevel","centerPoint","transitionDuration","ignoreBounds","isZoomable","animations","stopAllPan","prevZoomLevel","setZoomLevel","calculateZoomToPanOffset","finishTransition","_setResolution","startTransition","isPan","getCurrentTransform","onComplete","easing","toggleZoom","zoomAnimationDuration","getViewportCenterPoint","zoomFactor","panX","panY","isPannable","_applyZoomTransform","currSlide","zoom","newResolution","DragHandler","gestures","startPan","stopAll","change","prevP1","dragAxis","closeOnVerticalDrag","isMultitouch","_setPanWithFriction","bgOpacity","_getVerticalDragRatio","applyBgOpacity","_panOrMoveMainScroll","velocity","indexDiff","currentSlideVisibilityRatio","getCurrSlideX","moveIndexBy","correctZoomPan","_finishPanGestureForAxis","panPos","restoreBgOpacity","projectedPosition","vDragRatio","projectedVDragRatio","correctedPanPosition","dampingRatio","initialBgOpacity","totalPanDist","startSpring","onUpdate","pos","animationProgressRatio","delta","newMainScrollX","moveTo","newPan","allowPanToNext","currSlideMainScrollX","mainScrollShiftDiff","isLeftToRight","isRightToLeft","potentialPan","customFriction","getZoomPointsCenter","ZoomHandler","_startPan","_startZoomPoint","_zoomPoint","_startZoomLevel","_wasOverFitZoomLevel","startP1","startP2","minZoomLevel","maxZoomLevel","pinchToClose","_calculatePanForZoomLevel","ignoreGesture","destinationZoomLevel","currZoomLevelNeedsChange","initialPan","destinationPan","panNeedsChange","naturalFrequency","newZoomLevel","didTapOnMainContent","closest","TapHandler","originalEvent","targetClassList","isImageClick","isBackgroundClick","_doClickOrTapAction","tap","doubleTap","actionName","actionFullName","clickToCloseNonZoomable","toggle","Gestures","prevP2","_lastStartP1","_intervalP1","_numActivePoints","_ongoingPointers","_touchEventEnabled","_pointerEventEnabled","supportsTouch","maxTouchPoints","drag","tapHandler","scrollWrap","_onClick","_bindEvents","ontouchmove","ontouchend","pref","down","up","cancelEvent","onPointerDown","onPointerMove","onPointerUp","isMousePointer","pointerType","button","mouseDetected","_preventPointerEventBehaviour","_updatePoints","pointerDown","_clearTapTimer","isDragging","isZooming","_finishDrag","_updateStartPoints","_rafStopLoop","_rafRenderLoop","_calculateDragDirection","_intervalTime","_velocityCalculated","_updateVelocity","_finishTap","_updatePrevPoints","raf","requestAnimationFrame","_getVelocity","tapDelay","doubleTapAction","_tapTimer","displacement","cancelAnimationFrame","pointerEvent","pointerIndex","findIndex","ongoingPoiner","pointerId","_convertEventPosToPoint","touchEvent","diff","axisToCheck","identifier","MainScroll","itemHolders","resetPosition","resizeSlides","newSlideWidth","spacing","slideWidthChanged","itemHolder","_containerShiftIndex","_currPositionIndex","_prevPositionIndex","appendHolders","canBeSwiped","getNumItems","animate","velocityX","newIndex","potentialIndex","numSlides","canLoop","getLoopedIndex","stopMainScroll","destinationX","isMainScroll","updateCurrItem","currDiff","currDistance","positionDifference","tempHolder","diffAbs","setContent","pop","updateLazy","newSlideIndexOffset","Keyboard","initialPointerPos","_focusRoot","_onFocusIn","_onKeyDown","lastActiveElement","returnFocus","_wasFocused","focus","which","ctrlKey","metaKey","altKey","shiftKey","specialKeyUsed","keydownAction","isForward","escKey","arrowKeys","template","CSSAnimation","onFinish","_target","_onComplete","_onTransitionEnd","_helperTimeout","_finalizeAnimation","_finished","SpringEaser","initialVelocity","_dampingRatio","_naturalFrequency","_dampedFrequency","easeFrame","deltaPosition","deltaTime","coeff","naturalDumpingPow","E","dumpedFCos","cos","dumpedFSin","sin","SpringAnimation","easer","prevTime","animationLoop","_raf","Animations","activeAnimations","_start","isSpring","animation","isPanRunning","some","ScrollWheel","_onWheel","deltaX","deltaY","wheelToZoom","deltaMode","clientX","clientY","UIElement","elementHTML","html","isButton","toLowerCase","ariaLabel","htmlData","isCustomSVG","svgData","out","outlineID","inner","addElementHTML","onInit","onClick","onclick","appendTo","topBar","applyFilters","initArrowButton","isNextButton","loop","arrowPrev","order","arrowNext","closeButton","zoomButton","loadingIndicator","indicatorElement","isVisible","delayTimeout","setIndicatorVisibility","visible","updatePreloaderVisibility","isLoading","preloaderDelay","ui","counterIndicator","counterElement","indexIndicatorSep","setZoomedIn","isZoomedIn","UI","_lastUpdatedZoomLevel","init","isRegistered","uiElementsData","b","uiElementData","registerElement","_onZoomPanUpdate","elementData","isClosing","currZoomLevelDiff","imageClickAction","PhotoSwipeEvent","details","Eventable","_listeners","_filters","addFilter","fn","priority","f1","f2","removeFilter","Placeholder","imageSrc","decoding","alt","Content","displayedImageWidth","displayedImageHeight","isAttached","state","removePlaceholder","keepPlaceholder","isLazy","reload","usePlaceholder","placeholderEl","placeholderSrc","msrc","isImageContent","loadImage","imageElement","updateSrcsetSizes","srcset","complete","onLoaded","onerror","onError","setSlide","displayError","isError","isInitialSizeUpdate","sizesWidth","largestUsedSize","sizes","String","lazyLoad","errorMsgEl","errorMsg","supportsDecode","isDecoding","decode","catch","finally","appendImage","lazyLoadData","createContentFromData","zoomLevel","ContentLoader","limit","preload","_cachedItems","loadSlideByIndex","getContentByIndex","getItemData","lazyLoadSlide","addToCache","removeByIndex","indexToRemove","find","PhotoSwipeBase","numItems","dataSource","_getGalleryDOMElements","gallery","dataSourceItem","Element","_domElementToItemData","childSelector","option","legacySelector","NodeList","from","getElementsFromOption","linkEl","pswpSrc","pswpSrcset","pswpWidth","pswpHeight","pswpType","thumbnailEl","currentSrc","pswpCropped","cropped","thumbCropped","MIN_OPACITY","Opener","isClosed","_prepareOpen","_thumbBounds","open","isOpening","_duration","hideAnimationDuration","maxWidthToAnimate","_applyStartProps","_croppedZoom","showAnimationDuration","showHideAnimationType","showHideOpacity","_initialThumbBounds","getThumbBounds","_placeholder","_useAnimation","_animateZoom","_animateRootOpacity","_animateBgOpacity","_opacityElement","bg","innerRect","_cropContainer1","_cropContainer2","overflow","_setClosedStateZoomPan","willChange","Promise","decoded","isDelaying","reject","_initiate","setProperty","_animateToOpenState","_animateToClosedState","_onAnimationComplete","_animateTo","containerOnePanX","containerOnePanY","containerTwoPanX","containerTwoPanY","animProps","defaultOptions","bgClickAction","tapAction","PhotoSwipe","super","_prepareOptions","_prevViewportSize","isDestroying","_createMainStructure","rootClasses","mainClass","scrollWheel","updateSize","_initialItemData","_handlePageResize","_updatePageScrollOffset","goTo","prev","refreshSlideContent","slideIndex","potentialHolderIndex","holder","hasMouse","test","userAgent","setScrollOffset","thumbBounds","thumbSelector","thumbAreaRect","fillZoomLevel","offsetX","offsetY","getCroppedBoundsByElement","getBoundsByElement","SlideShow","photoSwipe","EventGalleryLightboxConfiguration","doUseSlideshow","_photoSwipe","_SlideShow_Running","_currentTimer","_SlideShow_Delay","slideshowSpeed","_SlideShow_Button","_adjustNavigation","toggleSlideShowState","_planNextSwitch","_photoSwipeGallery","_stopSlideshow","doUseAutoplay","delay","_startSlideshow","isForTheFirstSwitch","_nextSlide","parseThumbnailElement","pid","PhotoSwipeGallerySlide","shareButton","shareUrl","directDownloadButton","add2cartButton","add2cartUrl","EventGalleryCartConfiguration","add2cartdialogurl","HistoryHandler","browserBackHappened","onClose","_close","replaceState","go","_isOpen","doOverlapToolbar","imagePadding","doOverlapImageWithCaption","translations","_translate","_registerClickEvents","hashData","hash","params","vars","_parseHashString","getGalleries","closeTitle","KEY_CLOSE","zoomTitle","KEY_ZOOM","arrowPrevTitle","KEY_PREVIOUS","arrowNextTitle","KEY_NEXT","share","KEY_SHARE","download","KEY_DOWNLOAD","buy","KEY_BUY","KEY_PLAYSLIDESHOW","pause","KEY_PAUSESLIDESHOW","returnValue","eTarget","srcElement","clickedListItem","getSlideBy","getIndexOfSlide","disableAnimation","fromURL","useHistory","pswpModule","galleryPIDs","galleryUID","captionHeight","bottom","right","add2cartEl","closeOnScroll","navigationFadeDelay","timeToIdle","timeToIdleOutside","overlay","historyHandler","startUrlHistory","adjustUrlHistory","endUrlHistory","_registerUIElements","currSlideElement","captionHTML","values","l","onThumbnailsClick","map","galleries","tc","thumbElIsAllowed","afterChangeFunction","isNodeList","isPrototypeOf","removeHtmlElementNode","createNewEvent","eventName","CustomEvent","createEvent","initEvent","MiniCartMode","buttonShowType","emptyCartSelector","cartSelector","cartItemContainerSelector","cartItemsSelector","cartItemSelector","cartCountSelector","buttonDownSelector","buttonUpSelector","cartItemsMinHeight","removeLinkTitle","cartProcessor","minicartMode","short","lineItems","MiniCartOptions","globalConfigStore","initUI","updateCartData","updateAdd2CartIcons","cartElement","cartItemsElement","emptyCartElement","buttonToShort","buttonToLong","resizeCartArea","long","_generateId","lineItem","file","miniCartMode","amountOfLines","lineHeight","lastY","cartElements","visibleAmountOfLines","cart","cartItemsHTML","imagetag","lineitemid","newLineItemElements","reference","q","updateQuantity","quantityPlus","quantityMinus","loadCart","inputFild","quantity","fieldName","inputField","getElementsByName","currentVal","maxOrderQuantity","changeEvent","Event","eventHandler","initializeCartButtons","add2cartButtons","btn","openAdd2CartDialog","Add2CartDialogContent","initializeCartConnectorButtons","cartConnectorButtons","openLink","removeUrl","getCartUrl","urls","CartUrls","add2CartButtonHandler","Add2CartButtonHandler","cartConnectorButtonHandler","CartConnectorButtonHandler","dispatchCartData","CartProcessor","carts","MiniCart","log","doUseStickyImagetypeSelection","orderimagesHideButton","orderimagesShowButton","orderimagesHelp","makeCartButtonsVisible","closeImageTypeSelection","doShow","cartButtons","DownloadButton","ClickableButton","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","d","toStringTag"],"sourceRoot":""}