balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

swiper.js (303703B)


      1 /**
      2  * Swiper 5.3.6
      3  * Most modern mobile touch slider and framework with hardware accelerated transitions
      4  * http://swiperjs.com
      5  *
      6  * Copyright 2014-2020 Vladimir Kharlampidi
      7  *
      8  * Released under the MIT License
      9  *
     10  * Released on: February 29, 2020
     11  */
     12 
     13 (function (global, factory) {
     14   typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
     15   typeof define === 'function' && define.amd ? define(factory) :
     16   (global = global || self, global.Swiper = factory());
     17 }(this, function () { 'use strict';
     18 
     19   /**
     20    * SSR Window 1.0.1
     21    * Better handling for window object in SSR environment
     22    * https://github.com/nolimits4web/ssr-window
     23    *
     24    * Copyright 2018, Vladimir Kharlampidi
     25    *
     26    * Licensed under MIT
     27    *
     28    * Released on: July 18, 2018
     29    */
     30   var doc = (typeof document === 'undefined') ? {
     31     body: {},
     32     addEventListener: function addEventListener() {},
     33     removeEventListener: function removeEventListener() {},
     34     activeElement: {
     35       blur: function blur() {},
     36       nodeName: '',
     37     },
     38     querySelector: function querySelector() {
     39       return null;
     40     },
     41     querySelectorAll: function querySelectorAll() {
     42       return [];
     43     },
     44     getElementById: function getElementById() {
     45       return null;
     46     },
     47     createEvent: function createEvent() {
     48       return {
     49         initEvent: function initEvent() {},
     50       };
     51     },
     52     createElement: function createElement() {
     53       return {
     54         children: [],
     55         childNodes: [],
     56         style: {},
     57         setAttribute: function setAttribute() {},
     58         getElementsByTagName: function getElementsByTagName() {
     59           return [];
     60         },
     61       };
     62     },
     63     location: { hash: '' },
     64   } : document; // eslint-disable-line
     65 
     66   var win = (typeof window === 'undefined') ? {
     67     document: doc,
     68     navigator: {
     69       userAgent: '',
     70     },
     71     location: {},
     72     history: {},
     73     CustomEvent: function CustomEvent() {
     74       return this;
     75     },
     76     addEventListener: function addEventListener() {},
     77     removeEventListener: function removeEventListener() {},
     78     getComputedStyle: function getComputedStyle() {
     79       return {
     80         getPropertyValue: function getPropertyValue() {
     81           return '';
     82         },
     83       };
     84     },
     85     Image: function Image() {},
     86     Date: function Date() {},
     87     screen: {},
     88     setTimeout: function setTimeout() {},
     89     clearTimeout: function clearTimeout() {},
     90   } : window; // eslint-disable-line
     91 
     92   /**
     93    * Dom7 2.1.3
     94    * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API
     95    * http://framework7.io/docs/dom.html
     96    *
     97    * Copyright 2019, Vladimir Kharlampidi
     98    * The iDangero.us
     99    * http://www.idangero.us/
    100    *
    101    * Licensed under MIT
    102    *
    103    * Released on: February 11, 2019
    104    */
    105 
    106   var Dom7 = function Dom7(arr) {
    107     var self = this;
    108     // Create array-like object
    109     for (var i = 0; i < arr.length; i += 1) {
    110       self[i] = arr[i];
    111     }
    112     self.length = arr.length;
    113     // Return collection with methods
    114     return this;
    115   };
    116 
    117   function $(selector, context) {
    118     var arr = [];
    119     var i = 0;
    120     if (selector && !context) {
    121       if (selector instanceof Dom7) {
    122         return selector;
    123       }
    124     }
    125     if (selector) {
    126         // String
    127       if (typeof selector === 'string') {
    128         var els;
    129         var tempParent;
    130         var html = selector.trim();
    131         if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {
    132           var toCreate = 'div';
    133           if (html.indexOf('<li') === 0) { toCreate = 'ul'; }
    134           if (html.indexOf('<tr') === 0) { toCreate = 'tbody'; }
    135           if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) { toCreate = 'tr'; }
    136           if (html.indexOf('<tbody') === 0) { toCreate = 'table'; }
    137           if (html.indexOf('<option') === 0) { toCreate = 'select'; }
    138           tempParent = doc.createElement(toCreate);
    139           tempParent.innerHTML = html;
    140           for (i = 0; i < tempParent.childNodes.length; i += 1) {
    141             arr.push(tempParent.childNodes[i]);
    142           }
    143         } else {
    144           if (!context && selector[0] === '#' && !selector.match(/[ .<>:~]/)) {
    145             // Pure ID selector
    146             els = [doc.getElementById(selector.trim().split('#')[1])];
    147           } else {
    148             // Other selectors
    149             els = (context || doc).querySelectorAll(selector.trim());
    150           }
    151           for (i = 0; i < els.length; i += 1) {
    152             if (els[i]) { arr.push(els[i]); }
    153           }
    154         }
    155       } else if (selector.nodeType || selector === win || selector === doc) {
    156         // Node/element
    157         arr.push(selector);
    158       } else if (selector.length > 0 && selector[0].nodeType) {
    159         // Array of elements or instance of Dom
    160         for (i = 0; i < selector.length; i += 1) {
    161           arr.push(selector[i]);
    162         }
    163       }
    164     }
    165     return new Dom7(arr);
    166   }
    167 
    168   $.fn = Dom7.prototype;
    169   $.Class = Dom7;
    170   $.Dom7 = Dom7;
    171 
    172   function unique(arr) {
    173     var uniqueArray = [];
    174     for (var i = 0; i < arr.length; i += 1) {
    175       if (uniqueArray.indexOf(arr[i]) === -1) { uniqueArray.push(arr[i]); }
    176     }
    177     return uniqueArray;
    178   }
    179 
    180   // Classes and attributes
    181   function addClass(className) {
    182     if (typeof className === 'undefined') {
    183       return this;
    184     }
    185     var classes = className.split(' ');
    186     for (var i = 0; i < classes.length; i += 1) {
    187       for (var j = 0; j < this.length; j += 1) {
    188         if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.add(classes[i]); }
    189       }
    190     }
    191     return this;
    192   }
    193   function removeClass(className) {
    194     var classes = className.split(' ');
    195     for (var i = 0; i < classes.length; i += 1) {
    196       for (var j = 0; j < this.length; j += 1) {
    197         if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.remove(classes[i]); }
    198       }
    199     }
    200     return this;
    201   }
    202   function hasClass(className) {
    203     if (!this[0]) { return false; }
    204     return this[0].classList.contains(className);
    205   }
    206   function toggleClass(className) {
    207     var classes = className.split(' ');
    208     for (var i = 0; i < classes.length; i += 1) {
    209       for (var j = 0; j < this.length; j += 1) {
    210         if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.toggle(classes[i]); }
    211       }
    212     }
    213     return this;
    214   }
    215   function attr(attrs, value) {
    216     var arguments$1 = arguments;
    217 
    218     if (arguments.length === 1 && typeof attrs === 'string') {
    219       // Get attr
    220       if (this[0]) { return this[0].getAttribute(attrs); }
    221       return undefined;
    222     }
    223 
    224     // Set attrs
    225     for (var i = 0; i < this.length; i += 1) {
    226       if (arguments$1.length === 2) {
    227         // String
    228         this[i].setAttribute(attrs, value);
    229       } else {
    230         // Object
    231         // eslint-disable-next-line
    232         for (var attrName in attrs) {
    233           this[i][attrName] = attrs[attrName];
    234           this[i].setAttribute(attrName, attrs[attrName]);
    235         }
    236       }
    237     }
    238     return this;
    239   }
    240   // eslint-disable-next-line
    241   function removeAttr(attr) {
    242     for (var i = 0; i < this.length; i += 1) {
    243       this[i].removeAttribute(attr);
    244     }
    245     return this;
    246   }
    247   function data(key, value) {
    248     var el;
    249     if (typeof value === 'undefined') {
    250       el = this[0];
    251       // Get value
    252       if (el) {
    253         if (el.dom7ElementDataStorage && (key in el.dom7ElementDataStorage)) {
    254           return el.dom7ElementDataStorage[key];
    255         }
    256 
    257         var dataKey = el.getAttribute(("data-" + key));
    258         if (dataKey) {
    259           return dataKey;
    260         }
    261         return undefined;
    262       }
    263       return undefined;
    264     }
    265 
    266     // Set value
    267     for (var i = 0; i < this.length; i += 1) {
    268       el = this[i];
    269       if (!el.dom7ElementDataStorage) { el.dom7ElementDataStorage = {}; }
    270       el.dom7ElementDataStorage[key] = value;
    271     }
    272     return this;
    273   }
    274   // Transforms
    275   // eslint-disable-next-line
    276   function transform(transform) {
    277     for (var i = 0; i < this.length; i += 1) {
    278       var elStyle = this[i].style;
    279       elStyle.webkitTransform = transform;
    280       elStyle.transform = transform;
    281     }
    282     return this;
    283   }
    284   function transition(duration) {
    285     if (typeof duration !== 'string') {
    286       duration = duration + "ms"; // eslint-disable-line
    287     }
    288     for (var i = 0; i < this.length; i += 1) {
    289       var elStyle = this[i].style;
    290       elStyle.webkitTransitionDuration = duration;
    291       elStyle.transitionDuration = duration;
    292     }
    293     return this;
    294   }
    295   // Events
    296   function on() {
    297     var assign;
    298 
    299     var args = [], len = arguments.length;
    300     while ( len-- ) args[ len ] = arguments[ len ];
    301     var eventType = args[0];
    302     var targetSelector = args[1];
    303     var listener = args[2];
    304     var capture = args[3];
    305     if (typeof args[1] === 'function') {
    306       (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);
    307       targetSelector = undefined;
    308     }
    309     if (!capture) { capture = false; }
    310 
    311     function handleLiveEvent(e) {
    312       var target = e.target;
    313       if (!target) { return; }
    314       var eventData = e.target.dom7EventData || [];
    315       if (eventData.indexOf(e) < 0) {
    316         eventData.unshift(e);
    317       }
    318       if ($(target).is(targetSelector)) { listener.apply(target, eventData); }
    319       else {
    320         var parents = $(target).parents(); // eslint-disable-line
    321         for (var k = 0; k < parents.length; k += 1) {
    322           if ($(parents[k]).is(targetSelector)) { listener.apply(parents[k], eventData); }
    323         }
    324       }
    325     }
    326     function handleEvent(e) {
    327       var eventData = e && e.target ? e.target.dom7EventData || [] : [];
    328       if (eventData.indexOf(e) < 0) {
    329         eventData.unshift(e);
    330       }
    331       listener.apply(this, eventData);
    332     }
    333     var events = eventType.split(' ');
    334     var j;
    335     for (var i = 0; i < this.length; i += 1) {
    336       var el = this[i];
    337       if (!targetSelector) {
    338         for (j = 0; j < events.length; j += 1) {
    339           var event = events[j];
    340           if (!el.dom7Listeners) { el.dom7Listeners = {}; }
    341           if (!el.dom7Listeners[event]) { el.dom7Listeners[event] = []; }
    342           el.dom7Listeners[event].push({
    343             listener: listener,
    344             proxyListener: handleEvent,
    345           });
    346           el.addEventListener(event, handleEvent, capture);
    347         }
    348       } else {
    349         // Live events
    350         for (j = 0; j < events.length; j += 1) {
    351           var event$1 = events[j];
    352           if (!el.dom7LiveListeners) { el.dom7LiveListeners = {}; }
    353           if (!el.dom7LiveListeners[event$1]) { el.dom7LiveListeners[event$1] = []; }
    354           el.dom7LiveListeners[event$1].push({
    355             listener: listener,
    356             proxyListener: handleLiveEvent,
    357           });
    358           el.addEventListener(event$1, handleLiveEvent, capture);
    359         }
    360       }
    361     }
    362     return this;
    363   }
    364   function off() {
    365     var assign;
    366 
    367     var args = [], len = arguments.length;
    368     while ( len-- ) args[ len ] = arguments[ len ];
    369     var eventType = args[0];
    370     var targetSelector = args[1];
    371     var listener = args[2];
    372     var capture = args[3];
    373     if (typeof args[1] === 'function') {
    374       (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);
    375       targetSelector = undefined;
    376     }
    377     if (!capture) { capture = false; }
    378 
    379     var events = eventType.split(' ');
    380     for (var i = 0; i < events.length; i += 1) {
    381       var event = events[i];
    382       for (var j = 0; j < this.length; j += 1) {
    383         var el = this[j];
    384         var handlers = (void 0);
    385         if (!targetSelector && el.dom7Listeners) {
    386           handlers = el.dom7Listeners[event];
    387         } else if (targetSelector && el.dom7LiveListeners) {
    388           handlers = el.dom7LiveListeners[event];
    389         }
    390         if (handlers && handlers.length) {
    391           for (var k = handlers.length - 1; k >= 0; k -= 1) {
    392             var handler = handlers[k];
    393             if (listener && handler.listener === listener) {
    394               el.removeEventListener(event, handler.proxyListener, capture);
    395               handlers.splice(k, 1);
    396             } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {
    397               el.removeEventListener(event, handler.proxyListener, capture);
    398               handlers.splice(k, 1);
    399             } else if (!listener) {
    400               el.removeEventListener(event, handler.proxyListener, capture);
    401               handlers.splice(k, 1);
    402             }
    403           }
    404         }
    405       }
    406     }
    407     return this;
    408   }
    409   function trigger() {
    410     var args = [], len = arguments.length;
    411     while ( len-- ) args[ len ] = arguments[ len ];
    412 
    413     var events = args[0].split(' ');
    414     var eventData = args[1];
    415     for (var i = 0; i < events.length; i += 1) {
    416       var event = events[i];
    417       for (var j = 0; j < this.length; j += 1) {
    418         var el = this[j];
    419         var evt = (void 0);
    420         try {
    421           evt = new win.CustomEvent(event, {
    422             detail: eventData,
    423             bubbles: true,
    424             cancelable: true,
    425           });
    426         } catch (e) {
    427           evt = doc.createEvent('Event');
    428           evt.initEvent(event, true, true);
    429           evt.detail = eventData;
    430         }
    431         // eslint-disable-next-line
    432         el.dom7EventData = args.filter(function (data, dataIndex) { return dataIndex > 0; });
    433         el.dispatchEvent(evt);
    434         el.dom7EventData = [];
    435         delete el.dom7EventData;
    436       }
    437     }
    438     return this;
    439   }
    440   function transitionEnd(callback) {
    441     var events = ['webkitTransitionEnd', 'transitionend'];
    442     var dom = this;
    443     var i;
    444     function fireCallBack(e) {
    445       /* jshint validthis:true */
    446       if (e.target !== this) { return; }
    447       callback.call(this, e);
    448       for (i = 0; i < events.length; i += 1) {
    449         dom.off(events[i], fireCallBack);
    450       }
    451     }
    452     if (callback) {
    453       for (i = 0; i < events.length; i += 1) {
    454         dom.on(events[i], fireCallBack);
    455       }
    456     }
    457     return this;
    458   }
    459   function outerWidth(includeMargins) {
    460     if (this.length > 0) {
    461       if (includeMargins) {
    462         // eslint-disable-next-line
    463         var styles = this.styles();
    464         return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));
    465       }
    466       return this[0].offsetWidth;
    467     }
    468     return null;
    469   }
    470   function outerHeight(includeMargins) {
    471     if (this.length > 0) {
    472       if (includeMargins) {
    473         // eslint-disable-next-line
    474         var styles = this.styles();
    475         return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));
    476       }
    477       return this[0].offsetHeight;
    478     }
    479     return null;
    480   }
    481   function offset() {
    482     if (this.length > 0) {
    483       var el = this[0];
    484       var box = el.getBoundingClientRect();
    485       var body = doc.body;
    486       var clientTop = el.clientTop || body.clientTop || 0;
    487       var clientLeft = el.clientLeft || body.clientLeft || 0;
    488       var scrollTop = el === win ? win.scrollY : el.scrollTop;
    489       var scrollLeft = el === win ? win.scrollX : el.scrollLeft;
    490       return {
    491         top: (box.top + scrollTop) - clientTop,
    492         left: (box.left + scrollLeft) - clientLeft,
    493       };
    494     }
    495 
    496     return null;
    497   }
    498   function styles() {
    499     if (this[0]) { return win.getComputedStyle(this[0], null); }
    500     return {};
    501   }
    502   function css(props, value) {
    503     var i;
    504     if (arguments.length === 1) {
    505       if (typeof props === 'string') {
    506         if (this[0]) { return win.getComputedStyle(this[0], null).getPropertyValue(props); }
    507       } else {
    508         for (i = 0; i < this.length; i += 1) {
    509           // eslint-disable-next-line
    510           for (var prop in props) {
    511             this[i].style[prop] = props[prop];
    512           }
    513         }
    514         return this;
    515       }
    516     }
    517     if (arguments.length === 2 && typeof props === 'string') {
    518       for (i = 0; i < this.length; i += 1) {
    519         this[i].style[props] = value;
    520       }
    521       return this;
    522     }
    523     return this;
    524   }
    525   // Iterate over the collection passing elements to `callback`
    526   function each(callback) {
    527     // Don't bother continuing without a callback
    528     if (!callback) { return this; }
    529     // Iterate over the current collection
    530     for (var i = 0; i < this.length; i += 1) {
    531       // If the callback returns false
    532       if (callback.call(this[i], i, this[i]) === false) {
    533         // End the loop early
    534         return this;
    535       }
    536     }
    537     // Return `this` to allow chained DOM operations
    538     return this;
    539   }
    540   function filter(callback) {
    541     var matchedItems = [];
    542     var dom = this;
    543     for (var i = 0; i < dom.length; i += 1) {
    544       if (callback.call(dom[i], i, dom[i])) { matchedItems.push(dom[i]); }
    545     }
    546     return new Dom7(matchedItems);
    547   }
    548   // eslint-disable-next-line
    549   function html(html) {
    550     if (typeof html === 'undefined') {
    551       return this[0] ? this[0].innerHTML : undefined;
    552     }
    553 
    554     for (var i = 0; i < this.length; i += 1) {
    555       this[i].innerHTML = html;
    556     }
    557     return this;
    558   }
    559   // eslint-disable-next-line
    560   function text(text) {
    561     if (typeof text === 'undefined') {
    562       if (this[0]) {
    563         return this[0].textContent.trim();
    564       }
    565       return null;
    566     }
    567 
    568     for (var i = 0; i < this.length; i += 1) {
    569       this[i].textContent = text;
    570     }
    571     return this;
    572   }
    573   function is(selector) {
    574     var el = this[0];
    575     var compareWith;
    576     var i;
    577     if (!el || typeof selector === 'undefined') { return false; }
    578     if (typeof selector === 'string') {
    579       if (el.matches) { return el.matches(selector); }
    580       else if (el.webkitMatchesSelector) { return el.webkitMatchesSelector(selector); }
    581       else if (el.msMatchesSelector) { return el.msMatchesSelector(selector); }
    582 
    583       compareWith = $(selector);
    584       for (i = 0; i < compareWith.length; i += 1) {
    585         if (compareWith[i] === el) { return true; }
    586       }
    587       return false;
    588     } else if (selector === doc) { return el === doc; }
    589     else if (selector === win) { return el === win; }
    590 
    591     if (selector.nodeType || selector instanceof Dom7) {
    592       compareWith = selector.nodeType ? [selector] : selector;
    593       for (i = 0; i < compareWith.length; i += 1) {
    594         if (compareWith[i] === el) { return true; }
    595       }
    596       return false;
    597     }
    598     return false;
    599   }
    600   function index() {
    601     var child = this[0];
    602     var i;
    603     if (child) {
    604       i = 0;
    605       // eslint-disable-next-line
    606       while ((child = child.previousSibling) !== null) {
    607         if (child.nodeType === 1) { i += 1; }
    608       }
    609       return i;
    610     }
    611     return undefined;
    612   }
    613   // eslint-disable-next-line
    614   function eq(index) {
    615     if (typeof index === 'undefined') { return this; }
    616     var length = this.length;
    617     var returnIndex;
    618     if (index > length - 1) {
    619       return new Dom7([]);
    620     }
    621     if (index < 0) {
    622       returnIndex = length + index;
    623       if (returnIndex < 0) { return new Dom7([]); }
    624       return new Dom7([this[returnIndex]]);
    625     }
    626     return new Dom7([this[index]]);
    627   }
    628   function append() {
    629     var args = [], len = arguments.length;
    630     while ( len-- ) args[ len ] = arguments[ len ];
    631 
    632     var newChild;
    633 
    634     for (var k = 0; k < args.length; k += 1) {
    635       newChild = args[k];
    636       for (var i = 0; i < this.length; i += 1) {
    637         if (typeof newChild === 'string') {
    638           var tempDiv = doc.createElement('div');
    639           tempDiv.innerHTML = newChild;
    640           while (tempDiv.firstChild) {
    641             this[i].appendChild(tempDiv.firstChild);
    642           }
    643         } else if (newChild instanceof Dom7) {
    644           for (var j = 0; j < newChild.length; j += 1) {
    645             this[i].appendChild(newChild[j]);
    646           }
    647         } else {
    648           this[i].appendChild(newChild);
    649         }
    650       }
    651     }
    652 
    653     return this;
    654   }
    655   function prepend(newChild) {
    656     var i;
    657     var j;
    658     for (i = 0; i < this.length; i += 1) {
    659       if (typeof newChild === 'string') {
    660         var tempDiv = doc.createElement('div');
    661         tempDiv.innerHTML = newChild;
    662         for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {
    663           this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);
    664         }
    665       } else if (newChild instanceof Dom7) {
    666         for (j = 0; j < newChild.length; j += 1) {
    667           this[i].insertBefore(newChild[j], this[i].childNodes[0]);
    668         }
    669       } else {
    670         this[i].insertBefore(newChild, this[i].childNodes[0]);
    671       }
    672     }
    673     return this;
    674   }
    675   function next(selector) {
    676     if (this.length > 0) {
    677       if (selector) {
    678         if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {
    679           return new Dom7([this[0].nextElementSibling]);
    680         }
    681         return new Dom7([]);
    682       }
    683 
    684       if (this[0].nextElementSibling) { return new Dom7([this[0].nextElementSibling]); }
    685       return new Dom7([]);
    686     }
    687     return new Dom7([]);
    688   }
    689   function nextAll(selector) {
    690     var nextEls = [];
    691     var el = this[0];
    692     if (!el) { return new Dom7([]); }
    693     while (el.nextElementSibling) {
    694       var next = el.nextElementSibling; // eslint-disable-line
    695       if (selector) {
    696         if ($(next).is(selector)) { nextEls.push(next); }
    697       } else { nextEls.push(next); }
    698       el = next;
    699     }
    700     return new Dom7(nextEls);
    701   }
    702   function prev(selector) {
    703     if (this.length > 0) {
    704       var el = this[0];
    705       if (selector) {
    706         if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {
    707           return new Dom7([el.previousElementSibling]);
    708         }
    709         return new Dom7([]);
    710       }
    711 
    712       if (el.previousElementSibling) { return new Dom7([el.previousElementSibling]); }
    713       return new Dom7([]);
    714     }
    715     return new Dom7([]);
    716   }
    717   function prevAll(selector) {
    718     var prevEls = [];
    719     var el = this[0];
    720     if (!el) { return new Dom7([]); }
    721     while (el.previousElementSibling) {
    722       var prev = el.previousElementSibling; // eslint-disable-line
    723       if (selector) {
    724         if ($(prev).is(selector)) { prevEls.push(prev); }
    725       } else { prevEls.push(prev); }
    726       el = prev;
    727     }
    728     return new Dom7(prevEls);
    729   }
    730   function parent(selector) {
    731     var parents = []; // eslint-disable-line
    732     for (var i = 0; i < this.length; i += 1) {
    733       if (this[i].parentNode !== null) {
    734         if (selector) {
    735           if ($(this[i].parentNode).is(selector)) { parents.push(this[i].parentNode); }
    736         } else {
    737           parents.push(this[i].parentNode);
    738         }
    739       }
    740     }
    741     return $(unique(parents));
    742   }
    743   function parents(selector) {
    744     var parents = []; // eslint-disable-line
    745     for (var i = 0; i < this.length; i += 1) {
    746       var parent = this[i].parentNode; // eslint-disable-line
    747       while (parent) {
    748         if (selector) {
    749           if ($(parent).is(selector)) { parents.push(parent); }
    750         } else {
    751           parents.push(parent);
    752         }
    753         parent = parent.parentNode;
    754       }
    755     }
    756     return $(unique(parents));
    757   }
    758   function closest(selector) {
    759     var closest = this; // eslint-disable-line
    760     if (typeof selector === 'undefined') {
    761       return new Dom7([]);
    762     }
    763     if (!closest.is(selector)) {
    764       closest = closest.parents(selector).eq(0);
    765     }
    766     return closest;
    767   }
    768   function find(selector) {
    769     var foundElements = [];
    770     for (var i = 0; i < this.length; i += 1) {
    771       var found = this[i].querySelectorAll(selector);
    772       for (var j = 0; j < found.length; j += 1) {
    773         foundElements.push(found[j]);
    774       }
    775     }
    776     return new Dom7(foundElements);
    777   }
    778   function children(selector) {
    779     var children = []; // eslint-disable-line
    780     for (var i = 0; i < this.length; i += 1) {
    781       var childNodes = this[i].childNodes;
    782 
    783       for (var j = 0; j < childNodes.length; j += 1) {
    784         if (!selector) {
    785           if (childNodes[j].nodeType === 1) { children.push(childNodes[j]); }
    786         } else if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) {
    787           children.push(childNodes[j]);
    788         }
    789       }
    790     }
    791     return new Dom7(unique(children));
    792   }
    793   function remove() {
    794     for (var i = 0; i < this.length; i += 1) {
    795       if (this[i].parentNode) { this[i].parentNode.removeChild(this[i]); }
    796     }
    797     return this;
    798   }
    799   function add() {
    800     var args = [], len = arguments.length;
    801     while ( len-- ) args[ len ] = arguments[ len ];
    802 
    803     var dom = this;
    804     var i;
    805     var j;
    806     for (i = 0; i < args.length; i += 1) {
    807       var toAdd = $(args[i]);
    808       for (j = 0; j < toAdd.length; j += 1) {
    809         dom[dom.length] = toAdd[j];
    810         dom.length += 1;
    811       }
    812     }
    813     return dom;
    814   }
    815 
    816   var Methods = {
    817     addClass: addClass,
    818     removeClass: removeClass,
    819     hasClass: hasClass,
    820     toggleClass: toggleClass,
    821     attr: attr,
    822     removeAttr: removeAttr,
    823     data: data,
    824     transform: transform,
    825     transition: transition,
    826     on: on,
    827     off: off,
    828     trigger: trigger,
    829     transitionEnd: transitionEnd,
    830     outerWidth: outerWidth,
    831     outerHeight: outerHeight,
    832     offset: offset,
    833     css: css,
    834     each: each,
    835     html: html,
    836     text: text,
    837     is: is,
    838     index: index,
    839     eq: eq,
    840     append: append,
    841     prepend: prepend,
    842     next: next,
    843     nextAll: nextAll,
    844     prev: prev,
    845     prevAll: prevAll,
    846     parent: parent,
    847     parents: parents,
    848     closest: closest,
    849     find: find,
    850     children: children,
    851     filter: filter,
    852     remove: remove,
    853     add: add,
    854     styles: styles,
    855   };
    856 
    857   Object.keys(Methods).forEach(function (methodName) {
    858     $.fn[methodName] = $.fn[methodName] || Methods[methodName];
    859   });
    860 
    861   var Utils = {
    862     deleteProps: function deleteProps(obj) {
    863       var object = obj;
    864       Object.keys(object).forEach(function (key) {
    865         try {
    866           object[key] = null;
    867         } catch (e) {
    868           // no getter for object
    869         }
    870         try {
    871           delete object[key];
    872         } catch (e) {
    873           // something got wrong
    874         }
    875       });
    876     },
    877     nextTick: function nextTick(callback, delay) {
    878       if ( delay === void 0 ) delay = 0;
    879 
    880       return setTimeout(callback, delay);
    881     },
    882     now: function now() {
    883       return Date.now();
    884     },
    885     getTranslate: function getTranslate(el, axis) {
    886       if ( axis === void 0 ) axis = 'x';
    887 
    888       var matrix;
    889       var curTransform;
    890       var transformMatrix;
    891 
    892       var curStyle = win.getComputedStyle(el, null);
    893 
    894       if (win.WebKitCSSMatrix) {
    895         curTransform = curStyle.transform || curStyle.webkitTransform;
    896         if (curTransform.split(',').length > 6) {
    897           curTransform = curTransform.split(', ').map(function (a) { return a.replace(',', '.'); }).join(', ');
    898         }
    899         // Some old versions of Webkit choke when 'none' is passed; pass
    900         // empty string instead in this case
    901         transformMatrix = new win.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
    902       } else {
    903         transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
    904         matrix = transformMatrix.toString().split(',');
    905       }
    906 
    907       if (axis === 'x') {
    908         // Latest Chrome and webkits Fix
    909         if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m41; }
    910         // Crazy IE10 Matrix
    911         else if (matrix.length === 16) { curTransform = parseFloat(matrix[12]); }
    912         // Normal Browsers
    913         else { curTransform = parseFloat(matrix[4]); }
    914       }
    915       if (axis === 'y') {
    916         // Latest Chrome and webkits Fix
    917         if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m42; }
    918         // Crazy IE10 Matrix
    919         else if (matrix.length === 16) { curTransform = parseFloat(matrix[13]); }
    920         // Normal Browsers
    921         else { curTransform = parseFloat(matrix[5]); }
    922       }
    923       return curTransform || 0;
    924     },
    925     parseUrlQuery: function parseUrlQuery(url) {
    926       var query = {};
    927       var urlToParse = url || win.location.href;
    928       var i;
    929       var params;
    930       var param;
    931       var length;
    932       if (typeof urlToParse === 'string' && urlToParse.length) {
    933         urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\S*\?/, '') : '';
    934         params = urlToParse.split('&').filter(function (paramsPart) { return paramsPart !== ''; });
    935         length = params.length;
    936 
    937         for (i = 0; i < length; i += 1) {
    938           param = params[i].replace(/#\S+/g, '').split('=');
    939           query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param[1]) || '';
    940         }
    941       }
    942       return query;
    943     },
    944     isObject: function isObject(o) {
    945       return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object;
    946     },
    947     extend: function extend() {
    948       var args = [], len$1 = arguments.length;
    949       while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];
    950 
    951       var to = Object(args[0]);
    952       for (var i = 1; i < args.length; i += 1) {
    953         var nextSource = args[i];
    954         if (nextSource !== undefined && nextSource !== null) {
    955           var keysArray = Object.keys(Object(nextSource));
    956           for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
    957             var nextKey = keysArray[nextIndex];
    958             var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
    959             if (desc !== undefined && desc.enumerable) {
    960               if (Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
    961                 Utils.extend(to[nextKey], nextSource[nextKey]);
    962               } else if (!Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
    963                 to[nextKey] = {};
    964                 Utils.extend(to[nextKey], nextSource[nextKey]);
    965               } else {
    966                 to[nextKey] = nextSource[nextKey];
    967               }
    968             }
    969           }
    970         }
    971       }
    972       return to;
    973     },
    974   };
    975 
    976   var Support = (function Support() {
    977     return {
    978       touch: (win.Modernizr && win.Modernizr.touch === true) || (function checkTouch() {
    979         return !!((win.navigator.maxTouchPoints > 0) || ('ontouchstart' in win) || (win.DocumentTouch && doc instanceof win.DocumentTouch));
    980       }()),
    981 
    982       pointerEvents: !!win.PointerEvent && ('maxTouchPoints' in win.navigator) && win.navigator.maxTouchPoints > 0,
    983 
    984       observer: (function checkObserver() {
    985         return ('MutationObserver' in win || 'WebkitMutationObserver' in win);
    986       }()),
    987 
    988       passiveListener: (function checkPassiveListener() {
    989         var supportsPassive = false;
    990         try {
    991           var opts = Object.defineProperty({}, 'passive', {
    992             // eslint-disable-next-line
    993             get: function get() {
    994               supportsPassive = true;
    995             },
    996           });
    997           win.addEventListener('testPassiveListener', null, opts);
    998         } catch (e) {
    999           // No support
   1000         }
   1001         return supportsPassive;
   1002       }()),
   1003 
   1004       gestures: (function checkGestures() {
   1005         return 'ongesturestart' in win;
   1006       }()),
   1007     };
   1008   }());
   1009 
   1010   var SwiperClass = function SwiperClass(params) {
   1011     if ( params === void 0 ) params = {};
   1012 
   1013     var self = this;
   1014     self.params = params;
   1015 
   1016     // Events
   1017     self.eventsListeners = {};
   1018 
   1019     if (self.params && self.params.on) {
   1020       Object.keys(self.params.on).forEach(function (eventName) {
   1021         self.on(eventName, self.params.on[eventName]);
   1022       });
   1023     }
   1024   };
   1025 
   1026   var staticAccessors = { components: { configurable: true } };
   1027 
   1028   SwiperClass.prototype.on = function on (events, handler, priority) {
   1029     var self = this;
   1030     if (typeof handler !== 'function') { return self; }
   1031     var method = priority ? 'unshift' : 'push';
   1032     events.split(' ').forEach(function (event) {
   1033       if (!self.eventsListeners[event]) { self.eventsListeners[event] = []; }
   1034       self.eventsListeners[event][method](handler);
   1035     });
   1036     return self;
   1037   };
   1038 
   1039   SwiperClass.prototype.once = function once (events, handler, priority) {
   1040     var self = this;
   1041     if (typeof handler !== 'function') { return self; }
   1042     function onceHandler() {
   1043         var args = [], len = arguments.length;
   1044         while ( len-- ) args[ len ] = arguments[ len ];
   1045 
   1046       self.off(events, onceHandler);
   1047       if (onceHandler.f7proxy) {
   1048         delete onceHandler.f7proxy;
   1049       }
   1050       handler.apply(self, args);
   1051     }
   1052     onceHandler.f7proxy = handler;
   1053     return self.on(events, onceHandler, priority);
   1054   };
   1055 
   1056   SwiperClass.prototype.off = function off (events, handler) {
   1057     var self = this;
   1058     if (!self.eventsListeners) { return self; }
   1059     events.split(' ').forEach(function (event) {
   1060       if (typeof handler === 'undefined') {
   1061         self.eventsListeners[event] = [];
   1062       } else if (self.eventsListeners[event] && self.eventsListeners[event].length) {
   1063         self.eventsListeners[event].forEach(function (eventHandler, index) {
   1064           if (eventHandler === handler || (eventHandler.f7proxy && eventHandler.f7proxy === handler)) {
   1065             self.eventsListeners[event].splice(index, 1);
   1066           }
   1067         });
   1068       }
   1069     });
   1070     return self;
   1071   };
   1072 
   1073   SwiperClass.prototype.emit = function emit () {
   1074       var args = [], len = arguments.length;
   1075       while ( len-- ) args[ len ] = arguments[ len ];
   1076 
   1077     var self = this;
   1078     if (!self.eventsListeners) { return self; }
   1079     var events;
   1080     var data;
   1081     var context;
   1082     if (typeof args[0] === 'string' || Array.isArray(args[0])) {
   1083       events = args[0];
   1084       data = args.slice(1, args.length);
   1085       context = self;
   1086     } else {
   1087       events = args[0].events;
   1088       data = args[0].data;
   1089       context = args[0].context || self;
   1090     }
   1091     var eventsArray = Array.isArray(events) ? events : events.split(' ');
   1092     eventsArray.forEach(function (event) {
   1093       if (self.eventsListeners && self.eventsListeners[event]) {
   1094         var handlers = [];
   1095         self.eventsListeners[event].forEach(function (eventHandler) {
   1096           handlers.push(eventHandler);
   1097         });
   1098         handlers.forEach(function (eventHandler) {
   1099           eventHandler.apply(context, data);
   1100         });
   1101       }
   1102     });
   1103     return self;
   1104   };
   1105 
   1106   SwiperClass.prototype.useModulesParams = function useModulesParams (instanceParams) {
   1107     var instance = this;
   1108     if (!instance.modules) { return; }
   1109     Object.keys(instance.modules).forEach(function (moduleName) {
   1110       var module = instance.modules[moduleName];
   1111       // Extend params
   1112       if (module.params) {
   1113         Utils.extend(instanceParams, module.params);
   1114       }
   1115     });
   1116   };
   1117 
   1118   SwiperClass.prototype.useModules = function useModules (modulesParams) {
   1119       if ( modulesParams === void 0 ) modulesParams = {};
   1120 
   1121     var instance = this;
   1122     if (!instance.modules) { return; }
   1123     Object.keys(instance.modules).forEach(function (moduleName) {
   1124       var module = instance.modules[moduleName];
   1125       var moduleParams = modulesParams[moduleName] || {};
   1126       // Extend instance methods and props
   1127       if (module.instance) {
   1128         Object.keys(module.instance).forEach(function (modulePropName) {
   1129           var moduleProp = module.instance[modulePropName];
   1130           if (typeof moduleProp === 'function') {
   1131             instance[modulePropName] = moduleProp.bind(instance);
   1132           } else {
   1133             instance[modulePropName] = moduleProp;
   1134           }
   1135         });
   1136       }
   1137       // Add event listeners
   1138       if (module.on && instance.on) {
   1139         Object.keys(module.on).forEach(function (moduleEventName) {
   1140           instance.on(moduleEventName, module.on[moduleEventName]);
   1141         });
   1142       }
   1143 
   1144       // Module create callback
   1145       if (module.create) {
   1146         module.create.bind(instance)(moduleParams);
   1147       }
   1148     });
   1149   };
   1150 
   1151   staticAccessors.components.set = function (components) {
   1152     var Class = this;
   1153     if (!Class.use) { return; }
   1154     Class.use(components);
   1155   };
   1156 
   1157   SwiperClass.installModule = function installModule (module) {
   1158       var params = [], len = arguments.length - 1;
   1159       while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];
   1160 
   1161     var Class = this;
   1162     if (!Class.prototype.modules) { Class.prototype.modules = {}; }
   1163     var name = module.name || (((Object.keys(Class.prototype.modules).length) + "_" + (Utils.now())));
   1164     Class.prototype.modules[name] = module;
   1165     // Prototype
   1166     if (module.proto) {
   1167       Object.keys(module.proto).forEach(function (key) {
   1168         Class.prototype[key] = module.proto[key];
   1169       });
   1170     }
   1171     // Class
   1172     if (module.static) {
   1173       Object.keys(module.static).forEach(function (key) {
   1174         Class[key] = module.static[key];
   1175       });
   1176     }
   1177     // Callback
   1178     if (module.install) {
   1179       module.install.apply(Class, params);
   1180     }
   1181     return Class;
   1182   };
   1183 
   1184   SwiperClass.use = function use (module) {
   1185       var params = [], len = arguments.length - 1;
   1186       while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];
   1187 
   1188     var Class = this;
   1189     if (Array.isArray(module)) {
   1190       module.forEach(function (m) { return Class.installModule(m); });
   1191       return Class;
   1192     }
   1193     return Class.installModule.apply(Class, [ module ].concat( params ));
   1194   };
   1195 
   1196   Object.defineProperties( SwiperClass, staticAccessors );
   1197 
   1198   function updateSize () {
   1199     var swiper = this;
   1200     var width;
   1201     var height;
   1202     var $el = swiper.$el;
   1203     if (typeof swiper.params.width !== 'undefined') {
   1204       width = swiper.params.width;
   1205     } else {
   1206       width = $el[0].clientWidth;
   1207     }
   1208     if (typeof swiper.params.height !== 'undefined') {
   1209       height = swiper.params.height;
   1210     } else {
   1211       height = $el[0].clientHeight;
   1212     }
   1213     if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {
   1214       return;
   1215     }
   1216 
   1217     // Subtract paddings
   1218     width = width - parseInt($el.css('padding-left'), 10) - parseInt($el.css('padding-right'), 10);
   1219     height = height - parseInt($el.css('padding-top'), 10) - parseInt($el.css('padding-bottom'), 10);
   1220 
   1221     Utils.extend(swiper, {
   1222       width: width,
   1223       height: height,
   1224       size: swiper.isHorizontal() ? width : height,
   1225     });
   1226   }
   1227 
   1228   function updateSlides () {
   1229     var swiper = this;
   1230     var params = swiper.params;
   1231 
   1232     var $wrapperEl = swiper.$wrapperEl;
   1233     var swiperSize = swiper.size;
   1234     var rtl = swiper.rtlTranslate;
   1235     var wrongRTL = swiper.wrongRTL;
   1236     var isVirtual = swiper.virtual && params.virtual.enabled;
   1237     var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
   1238     var slides = $wrapperEl.children(("." + (swiper.params.slideClass)));
   1239     var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
   1240     var snapGrid = [];
   1241     var slidesGrid = [];
   1242     var slidesSizesGrid = [];
   1243 
   1244     function slidesForMargin(slideIndex) {
   1245       if (!params.cssMode) { return true; }
   1246       if (slideIndex === slides.length - 1) {
   1247         return false;
   1248       }
   1249       return true;
   1250     }
   1251 
   1252     var offsetBefore = params.slidesOffsetBefore;
   1253     if (typeof offsetBefore === 'function') {
   1254       offsetBefore = params.slidesOffsetBefore.call(swiper);
   1255     }
   1256 
   1257     var offsetAfter = params.slidesOffsetAfter;
   1258     if (typeof offsetAfter === 'function') {
   1259       offsetAfter = params.slidesOffsetAfter.call(swiper);
   1260     }
   1261 
   1262     var previousSnapGridLength = swiper.snapGrid.length;
   1263     var previousSlidesGridLength = swiper.snapGrid.length;
   1264 
   1265     var spaceBetween = params.spaceBetween;
   1266     var slidePosition = -offsetBefore;
   1267     var prevSlideSize = 0;
   1268     var index = 0;
   1269     if (typeof swiperSize === 'undefined') {
   1270       return;
   1271     }
   1272     if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
   1273       spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;
   1274     }
   1275 
   1276     swiper.virtualSize = -spaceBetween;
   1277 
   1278     // reset margins
   1279     if (rtl) { slides.css({ marginLeft: '', marginTop: '' }); }
   1280     else { slides.css({ marginRight: '', marginBottom: '' }); }
   1281 
   1282     var slidesNumberEvenToRows;
   1283     if (params.slidesPerColumn > 1) {
   1284       if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) {
   1285         slidesNumberEvenToRows = slidesLength;
   1286       } else {
   1287         slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn;
   1288       }
   1289       if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') {
   1290         slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn);
   1291       }
   1292     }
   1293 
   1294     // Calc slides
   1295     var slideSize;
   1296     var slidesPerColumn = params.slidesPerColumn;
   1297     var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;
   1298     var numFullColumns = Math.floor(slidesLength / params.slidesPerColumn);
   1299     for (var i = 0; i < slidesLength; i += 1) {
   1300       slideSize = 0;
   1301       var slide = slides.eq(i);
   1302       if (params.slidesPerColumn > 1) {
   1303         // Set slides order
   1304         var newSlideOrderIndex = (void 0);
   1305         var column = (void 0);
   1306         var row = (void 0);
   1307         if (params.slidesPerColumnFill === 'row' && params.slidesPerGroup > 1) {
   1308           var groupIndex = Math.floor(i / (params.slidesPerGroup * params.slidesPerColumn));
   1309           var slideIndexInGroup = i - params.slidesPerColumn * params.slidesPerGroup * groupIndex;
   1310           var columnsInGroup = groupIndex === 0
   1311             ? params.slidesPerGroup
   1312             : Math.min(Math.ceil((slidesLength - groupIndex * slidesPerColumn * params.slidesPerGroup) / slidesPerColumn), params.slidesPerGroup);
   1313           row = Math.floor(slideIndexInGroup / columnsInGroup);
   1314           column = (slideIndexInGroup - row * columnsInGroup) + groupIndex * params.slidesPerGroup;
   1315 
   1316           newSlideOrderIndex = column + ((row * slidesNumberEvenToRows) / slidesPerColumn);
   1317           slide
   1318             .css({
   1319               '-webkit-box-ordinal-group': newSlideOrderIndex,
   1320               '-moz-box-ordinal-group': newSlideOrderIndex,
   1321               '-ms-flex-order': newSlideOrderIndex,
   1322               '-webkit-order': newSlideOrderIndex,
   1323               order: newSlideOrderIndex,
   1324             });
   1325         } else if (params.slidesPerColumnFill === 'column') {
   1326           column = Math.floor(i / slidesPerColumn);
   1327           row = i - (column * slidesPerColumn);
   1328           if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn - 1)) {
   1329             row += 1;
   1330             if (row >= slidesPerColumn) {
   1331               row = 0;
   1332               column += 1;
   1333             }
   1334           }
   1335         } else {
   1336           row = Math.floor(i / slidesPerRow);
   1337           column = i - (row * slidesPerRow);
   1338         }
   1339         slide.css(
   1340           ("margin-" + (swiper.isHorizontal() ? 'top' : 'left')),
   1341           (row !== 0 && params.spaceBetween) && (((params.spaceBetween) + "px"))
   1342         );
   1343       }
   1344       if (slide.css('display') === 'none') { continue; } // eslint-disable-line
   1345 
   1346       if (params.slidesPerView === 'auto') {
   1347         var slideStyles = win.getComputedStyle(slide[0], null);
   1348         var currentTransform = slide[0].style.transform;
   1349         var currentWebKitTransform = slide[0].style.webkitTransform;
   1350         if (currentTransform) {
   1351           slide[0].style.transform = 'none';
   1352         }
   1353         if (currentWebKitTransform) {
   1354           slide[0].style.webkitTransform = 'none';
   1355         }
   1356         if (params.roundLengths) {
   1357           slideSize = swiper.isHorizontal()
   1358             ? slide.outerWidth(true)
   1359             : slide.outerHeight(true);
   1360         } else {
   1361           // eslint-disable-next-line
   1362           if (swiper.isHorizontal()) {
   1363             var width = parseFloat(slideStyles.getPropertyValue('width'));
   1364             var paddingLeft = parseFloat(slideStyles.getPropertyValue('padding-left'));
   1365             var paddingRight = parseFloat(slideStyles.getPropertyValue('padding-right'));
   1366             var marginLeft = parseFloat(slideStyles.getPropertyValue('margin-left'));
   1367             var marginRight = parseFloat(slideStyles.getPropertyValue('margin-right'));
   1368             var boxSizing = slideStyles.getPropertyValue('box-sizing');
   1369             if (boxSizing && boxSizing === 'border-box') {
   1370               slideSize = width + marginLeft + marginRight;
   1371             } else {
   1372               slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight;
   1373             }
   1374           } else {
   1375             var height = parseFloat(slideStyles.getPropertyValue('height'));
   1376             var paddingTop = parseFloat(slideStyles.getPropertyValue('padding-top'));
   1377             var paddingBottom = parseFloat(slideStyles.getPropertyValue('padding-bottom'));
   1378             var marginTop = parseFloat(slideStyles.getPropertyValue('margin-top'));
   1379             var marginBottom = parseFloat(slideStyles.getPropertyValue('margin-bottom'));
   1380             var boxSizing$1 = slideStyles.getPropertyValue('box-sizing');
   1381             if (boxSizing$1 && boxSizing$1 === 'border-box') {
   1382               slideSize = height + marginTop + marginBottom;
   1383             } else {
   1384               slideSize = height + paddingTop + paddingBottom + marginTop + marginBottom;
   1385             }
   1386           }
   1387         }
   1388         if (currentTransform) {
   1389           slide[0].style.transform = currentTransform;
   1390         }
   1391         if (currentWebKitTransform) {
   1392           slide[0].style.webkitTransform = currentWebKitTransform;
   1393         }
   1394         if (params.roundLengths) { slideSize = Math.floor(slideSize); }
   1395       } else {
   1396         slideSize = (swiperSize - ((params.slidesPerView - 1) * spaceBetween)) / params.slidesPerView;
   1397         if (params.roundLengths) { slideSize = Math.floor(slideSize); }
   1398 
   1399         if (slides[i]) {
   1400           if (swiper.isHorizontal()) {
   1401             slides[i].style.width = slideSize + "px";
   1402           } else {
   1403             slides[i].style.height = slideSize + "px";
   1404           }
   1405         }
   1406       }
   1407       if (slides[i]) {
   1408         slides[i].swiperSlideSize = slideSize;
   1409       }
   1410       slidesSizesGrid.push(slideSize);
   1411 
   1412 
   1413       if (params.centeredSlides) {
   1414         slidePosition = slidePosition + (slideSize / 2) + (prevSlideSize / 2) + spaceBetween;
   1415         if (prevSlideSize === 0 && i !== 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
   1416         if (i === 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
   1417         if (Math.abs(slidePosition) < 1 / 1000) { slidePosition = 0; }
   1418         if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
   1419         if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
   1420         slidesGrid.push(slidePosition);
   1421       } else {
   1422         if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
   1423         if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
   1424         slidesGrid.push(slidePosition);
   1425         slidePosition = slidePosition + slideSize + spaceBetween;
   1426       }
   1427 
   1428       swiper.virtualSize += slideSize + spaceBetween;
   1429 
   1430       prevSlideSize = slideSize;
   1431 
   1432       index += 1;
   1433     }
   1434     swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
   1435     var newSlidesGrid;
   1436 
   1437     if (
   1438       rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
   1439       $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") });
   1440     }
   1441     if (params.setWrapperSize) {
   1442       if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
   1443       else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
   1444     }
   1445 
   1446     if (params.slidesPerColumn > 1) {
   1447       swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows;
   1448       swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween;
   1449       if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
   1450       else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
   1451       if (params.centeredSlides) {
   1452         newSlidesGrid = [];
   1453         for (var i$1 = 0; i$1 < snapGrid.length; i$1 += 1) {
   1454           var slidesGridItem = snapGrid[i$1];
   1455           if (params.roundLengths) { slidesGridItem = Math.floor(slidesGridItem); }
   1456           if (snapGrid[i$1] < swiper.virtualSize + snapGrid[0]) { newSlidesGrid.push(slidesGridItem); }
   1457         }
   1458         snapGrid = newSlidesGrid;
   1459       }
   1460     }
   1461 
   1462     // Remove last grid elements depending on width
   1463     if (!params.centeredSlides) {
   1464       newSlidesGrid = [];
   1465       for (var i$2 = 0; i$2 < snapGrid.length; i$2 += 1) {
   1466         var slidesGridItem$1 = snapGrid[i$2];
   1467         if (params.roundLengths) { slidesGridItem$1 = Math.floor(slidesGridItem$1); }
   1468         if (snapGrid[i$2] <= swiper.virtualSize - swiperSize) {
   1469           newSlidesGrid.push(slidesGridItem$1);
   1470         }
   1471       }
   1472       snapGrid = newSlidesGrid;
   1473       if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
   1474         snapGrid.push(swiper.virtualSize - swiperSize);
   1475       }
   1476     }
   1477     if (snapGrid.length === 0) { snapGrid = [0]; }
   1478 
   1479     if (params.spaceBetween !== 0) {
   1480       if (swiper.isHorizontal()) {
   1481         if (rtl) { slides.filter(slidesForMargin).css({ marginLeft: (spaceBetween + "px") }); }
   1482         else { slides.filter(slidesForMargin).css({ marginRight: (spaceBetween + "px") }); }
   1483       } else { slides.filter(slidesForMargin).css({ marginBottom: (spaceBetween + "px") }); }
   1484     }
   1485 
   1486     if (params.centeredSlides && params.centeredSlidesBounds) {
   1487       var allSlidesSize = 0;
   1488       slidesSizesGrid.forEach(function (slideSizeValue) {
   1489         allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
   1490       });
   1491       allSlidesSize -= params.spaceBetween;
   1492       var maxSnap = allSlidesSize - swiperSize;
   1493       snapGrid = snapGrid.map(function (snap) {
   1494         if (snap < 0) { return -offsetBefore; }
   1495         if (snap > maxSnap) { return maxSnap + offsetAfter; }
   1496         return snap;
   1497       });
   1498     }
   1499 
   1500     if (params.centerInsufficientSlides) {
   1501       var allSlidesSize$1 = 0;
   1502       slidesSizesGrid.forEach(function (slideSizeValue) {
   1503         allSlidesSize$1 += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
   1504       });
   1505       allSlidesSize$1 -= params.spaceBetween;
   1506       if (allSlidesSize$1 < swiperSize) {
   1507         var allSlidesOffset = (swiperSize - allSlidesSize$1) / 2;
   1508         snapGrid.forEach(function (snap, snapIndex) {
   1509           snapGrid[snapIndex] = snap - allSlidesOffset;
   1510         });
   1511         slidesGrid.forEach(function (snap, snapIndex) {
   1512           slidesGrid[snapIndex] = snap + allSlidesOffset;
   1513         });
   1514       }
   1515     }
   1516 
   1517     Utils.extend(swiper, {
   1518       slides: slides,
   1519       snapGrid: snapGrid,
   1520       slidesGrid: slidesGrid,
   1521       slidesSizesGrid: slidesSizesGrid,
   1522     });
   1523 
   1524     if (slidesLength !== previousSlidesLength) {
   1525       swiper.emit('slidesLengthChange');
   1526     }
   1527     if (snapGrid.length !== previousSnapGridLength) {
   1528       if (swiper.params.watchOverflow) { swiper.checkOverflow(); }
   1529       swiper.emit('snapGridLengthChange');
   1530     }
   1531     if (slidesGrid.length !== previousSlidesGridLength) {
   1532       swiper.emit('slidesGridLengthChange');
   1533     }
   1534 
   1535     if (params.watchSlidesProgress || params.watchSlidesVisibility) {
   1536       swiper.updateSlidesOffset();
   1537     }
   1538   }
   1539 
   1540   function updateAutoHeight (speed) {
   1541     var swiper = this;
   1542     var activeSlides = [];
   1543     var newHeight = 0;
   1544     var i;
   1545     if (typeof speed === 'number') {
   1546       swiper.setTransition(speed);
   1547     } else if (speed === true) {
   1548       swiper.setTransition(swiper.params.speed);
   1549     }
   1550     // Find slides currently in view
   1551     if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
   1552       if (swiper.params.centeredSlides) { activeSlides.push.apply(activeSlides, swiper.visibleSlides); }
   1553       else {
   1554         for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
   1555           var index = swiper.activeIndex + i;
   1556           if (index > swiper.slides.length) { break; }
   1557           activeSlides.push(swiper.slides.eq(index)[0]);
   1558         }
   1559       }
   1560     } else {
   1561       activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]);
   1562     }
   1563 
   1564     // Find new height from highest slide in view
   1565     for (i = 0; i < activeSlides.length; i += 1) {
   1566       if (typeof activeSlides[i] !== 'undefined') {
   1567         var height = activeSlides[i].offsetHeight;
   1568         newHeight = height > newHeight ? height : newHeight;
   1569       }
   1570     }
   1571 
   1572     // Update Height
   1573     if (newHeight) { swiper.$wrapperEl.css('height', (newHeight + "px")); }
   1574   }
   1575 
   1576   function updateSlidesOffset () {
   1577     var swiper = this;
   1578     var slides = swiper.slides;
   1579     for (var i = 0; i < slides.length; i += 1) {
   1580       slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;
   1581     }
   1582   }
   1583 
   1584   function updateSlidesProgress (translate) {
   1585     if ( translate === void 0 ) translate = (this && this.translate) || 0;
   1586 
   1587     var swiper = this;
   1588     var params = swiper.params;
   1589 
   1590     var slides = swiper.slides;
   1591     var rtl = swiper.rtlTranslate;
   1592 
   1593     if (slides.length === 0) { return; }
   1594     if (typeof slides[0].swiperSlideOffset === 'undefined') { swiper.updateSlidesOffset(); }
   1595 
   1596     var offsetCenter = -translate;
   1597     if (rtl) { offsetCenter = translate; }
   1598 
   1599     // Visible Slides
   1600     slides.removeClass(params.slideVisibleClass);
   1601 
   1602     swiper.visibleSlidesIndexes = [];
   1603     swiper.visibleSlides = [];
   1604 
   1605     for (var i = 0; i < slides.length; i += 1) {
   1606       var slide = slides[i];
   1607       var slideProgress = (
   1608         (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0)) - slide.swiperSlideOffset
   1609       ) / (slide.swiperSlideSize + params.spaceBetween);
   1610       if (params.watchSlidesVisibility || (params.centeredSlides && params.autoHeight)) {
   1611         var slideBefore = -(offsetCenter - slide.swiperSlideOffset);
   1612         var slideAfter = slideBefore + swiper.slidesSizesGrid[i];
   1613         var isVisible = (slideBefore >= 0 && slideBefore < swiper.size - 1)
   1614                   || (slideAfter > 1 && slideAfter <= swiper.size)
   1615                   || (slideBefore <= 0 && slideAfter >= swiper.size);
   1616         if (isVisible) {
   1617           swiper.visibleSlides.push(slide);
   1618           swiper.visibleSlidesIndexes.push(i);
   1619           slides.eq(i).addClass(params.slideVisibleClass);
   1620         }
   1621       }
   1622       slide.progress = rtl ? -slideProgress : slideProgress;
   1623     }
   1624     swiper.visibleSlides = $(swiper.visibleSlides);
   1625   }
   1626 
   1627   function updateProgress (translate) {
   1628     var swiper = this;
   1629     if (typeof translate === 'undefined') {
   1630       var multiplier = swiper.rtlTranslate ? -1 : 1;
   1631       // eslint-disable-next-line
   1632       translate = (swiper && swiper.translate && (swiper.translate * multiplier)) || 0;
   1633     }
   1634     var params = swiper.params;
   1635     var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
   1636     var progress = swiper.progress;
   1637     var isBeginning = swiper.isBeginning;
   1638     var isEnd = swiper.isEnd;
   1639     var wasBeginning = isBeginning;
   1640     var wasEnd = isEnd;
   1641     if (translatesDiff === 0) {
   1642       progress = 0;
   1643       isBeginning = true;
   1644       isEnd = true;
   1645     } else {
   1646       progress = (translate - swiper.minTranslate()) / (translatesDiff);
   1647       isBeginning = progress <= 0;
   1648       isEnd = progress >= 1;
   1649     }
   1650     Utils.extend(swiper, {
   1651       progress: progress,
   1652       isBeginning: isBeginning,
   1653       isEnd: isEnd,
   1654     });
   1655 
   1656     if (params.watchSlidesProgress || params.watchSlidesVisibility || (params.centeredSlides && params.autoHeight)) { swiper.updateSlidesProgress(translate); }
   1657 
   1658     if (isBeginning && !wasBeginning) {
   1659       swiper.emit('reachBeginning toEdge');
   1660     }
   1661     if (isEnd && !wasEnd) {
   1662       swiper.emit('reachEnd toEdge');
   1663     }
   1664     if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {
   1665       swiper.emit('fromEdge');
   1666     }
   1667 
   1668     swiper.emit('progress', progress);
   1669   }
   1670 
   1671   function updateSlidesClasses () {
   1672     var swiper = this;
   1673 
   1674     var slides = swiper.slides;
   1675     var params = swiper.params;
   1676     var $wrapperEl = swiper.$wrapperEl;
   1677     var activeIndex = swiper.activeIndex;
   1678     var realIndex = swiper.realIndex;
   1679     var isVirtual = swiper.virtual && params.virtual.enabled;
   1680 
   1681     slides.removeClass(((params.slideActiveClass) + " " + (params.slideNextClass) + " " + (params.slidePrevClass) + " " + (params.slideDuplicateActiveClass) + " " + (params.slideDuplicateNextClass) + " " + (params.slideDuplicatePrevClass)));
   1682 
   1683     var activeSlide;
   1684     if (isVirtual) {
   1685       activeSlide = swiper.$wrapperEl.find(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + activeIndex + "\"]"));
   1686     } else {
   1687       activeSlide = slides.eq(activeIndex);
   1688     }
   1689 
   1690     // Active classes
   1691     activeSlide.addClass(params.slideActiveClass);
   1692 
   1693     if (params.loop) {
   1694       // Duplicate to all looped slides
   1695       if (activeSlide.hasClass(params.slideDuplicateClass)) {
   1696         $wrapperEl
   1697           .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + realIndex + "\"]"))
   1698           .addClass(params.slideDuplicateActiveClass);
   1699       } else {
   1700         $wrapperEl
   1701           .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]"))
   1702           .addClass(params.slideDuplicateActiveClass);
   1703       }
   1704     }
   1705     // Next Slide
   1706     var nextSlide = activeSlide.nextAll(("." + (params.slideClass))).eq(0).addClass(params.slideNextClass);
   1707     if (params.loop && nextSlide.length === 0) {
   1708       nextSlide = slides.eq(0);
   1709       nextSlide.addClass(params.slideNextClass);
   1710     }
   1711     // Prev Slide
   1712     var prevSlide = activeSlide.prevAll(("." + (params.slideClass))).eq(0).addClass(params.slidePrevClass);
   1713     if (params.loop && prevSlide.length === 0) {
   1714       prevSlide = slides.eq(-1);
   1715       prevSlide.addClass(params.slidePrevClass);
   1716     }
   1717     if (params.loop) {
   1718       // Duplicate to all looped slides
   1719       if (nextSlide.hasClass(params.slideDuplicateClass)) {
   1720         $wrapperEl
   1721           .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]"))
   1722           .addClass(params.slideDuplicateNextClass);
   1723       } else {
   1724         $wrapperEl
   1725           .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]"))
   1726           .addClass(params.slideDuplicateNextClass);
   1727       }
   1728       if (prevSlide.hasClass(params.slideDuplicateClass)) {
   1729         $wrapperEl
   1730           .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]"))
   1731           .addClass(params.slideDuplicatePrevClass);
   1732       } else {
   1733         $wrapperEl
   1734           .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]"))
   1735           .addClass(params.slideDuplicatePrevClass);
   1736       }
   1737     }
   1738   }
   1739 
   1740   function updateActiveIndex (newActiveIndex) {
   1741     var swiper = this;
   1742     var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
   1743     var slidesGrid = swiper.slidesGrid;
   1744     var snapGrid = swiper.snapGrid;
   1745     var params = swiper.params;
   1746     var previousIndex = swiper.activeIndex;
   1747     var previousRealIndex = swiper.realIndex;
   1748     var previousSnapIndex = swiper.snapIndex;
   1749     var activeIndex = newActiveIndex;
   1750     var snapIndex;
   1751     if (typeof activeIndex === 'undefined') {
   1752       for (var i = 0; i < slidesGrid.length; i += 1) {
   1753         if (typeof slidesGrid[i + 1] !== 'undefined') {
   1754           if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - ((slidesGrid[i + 1] - slidesGrid[i]) / 2)) {
   1755             activeIndex = i;
   1756           } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
   1757             activeIndex = i + 1;
   1758           }
   1759         } else if (translate >= slidesGrid[i]) {
   1760           activeIndex = i;
   1761         }
   1762       }
   1763       // Normalize slideIndex
   1764       if (params.normalizeSlideIndex) {
   1765         if (activeIndex < 0 || typeof activeIndex === 'undefined') { activeIndex = 0; }
   1766       }
   1767     }
   1768     if (snapGrid.indexOf(translate) >= 0) {
   1769       snapIndex = snapGrid.indexOf(translate);
   1770     } else {
   1771       var skip = Math.min(params.slidesPerGroupSkip, activeIndex);
   1772       snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
   1773     }
   1774     if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
   1775     if (activeIndex === previousIndex) {
   1776       if (snapIndex !== previousSnapIndex) {
   1777         swiper.snapIndex = snapIndex;
   1778         swiper.emit('snapIndexChange');
   1779       }
   1780       return;
   1781     }
   1782 
   1783     // Get real index
   1784     var realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);
   1785 
   1786     Utils.extend(swiper, {
   1787       snapIndex: snapIndex,
   1788       realIndex: realIndex,
   1789       previousIndex: previousIndex,
   1790       activeIndex: activeIndex,
   1791     });
   1792     swiper.emit('activeIndexChange');
   1793     swiper.emit('snapIndexChange');
   1794     if (previousRealIndex !== realIndex) {
   1795       swiper.emit('realIndexChange');
   1796     }
   1797     if (swiper.initialized || swiper.runCallbacksOnInit) {
   1798       swiper.emit('slideChange');
   1799     }
   1800   }
   1801 
   1802   function updateClickedSlide (e) {
   1803     var swiper = this;
   1804     var params = swiper.params;
   1805     var slide = $(e.target).closest(("." + (params.slideClass)))[0];
   1806     var slideFound = false;
   1807     if (slide) {
   1808       for (var i = 0; i < swiper.slides.length; i += 1) {
   1809         if (swiper.slides[i] === slide) { slideFound = true; }
   1810       }
   1811     }
   1812 
   1813     if (slide && slideFound) {
   1814       swiper.clickedSlide = slide;
   1815       if (swiper.virtual && swiper.params.virtual.enabled) {
   1816         swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);
   1817       } else {
   1818         swiper.clickedIndex = $(slide).index();
   1819       }
   1820     } else {
   1821       swiper.clickedSlide = undefined;
   1822       swiper.clickedIndex = undefined;
   1823       return;
   1824     }
   1825     if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
   1826       swiper.slideToClickedSlide();
   1827     }
   1828   }
   1829 
   1830   var update = {
   1831     updateSize: updateSize,
   1832     updateSlides: updateSlides,
   1833     updateAutoHeight: updateAutoHeight,
   1834     updateSlidesOffset: updateSlidesOffset,
   1835     updateSlidesProgress: updateSlidesProgress,
   1836     updateProgress: updateProgress,
   1837     updateSlidesClasses: updateSlidesClasses,
   1838     updateActiveIndex: updateActiveIndex,
   1839     updateClickedSlide: updateClickedSlide,
   1840   };
   1841 
   1842   function getTranslate (axis) {
   1843     if ( axis === void 0 ) axis = this.isHorizontal() ? 'x' : 'y';
   1844 
   1845     var swiper = this;
   1846 
   1847     var params = swiper.params;
   1848     var rtl = swiper.rtlTranslate;
   1849     var translate = swiper.translate;
   1850     var $wrapperEl = swiper.$wrapperEl;
   1851 
   1852     if (params.virtualTranslate) {
   1853       return rtl ? -translate : translate;
   1854     }
   1855     if (params.cssMode) {
   1856       return translate;
   1857     }
   1858 
   1859     var currentTranslate = Utils.getTranslate($wrapperEl[0], axis);
   1860     if (rtl) { currentTranslate = -currentTranslate; }
   1861 
   1862     return currentTranslate || 0;
   1863   }
   1864 
   1865   function setTranslate (translate, byController) {
   1866     var swiper = this;
   1867     var rtl = swiper.rtlTranslate;
   1868     var params = swiper.params;
   1869     var $wrapperEl = swiper.$wrapperEl;
   1870     var wrapperEl = swiper.wrapperEl;
   1871     var progress = swiper.progress;
   1872     var x = 0;
   1873     var y = 0;
   1874     var z = 0;
   1875 
   1876     if (swiper.isHorizontal()) {
   1877       x = rtl ? -translate : translate;
   1878     } else {
   1879       y = translate;
   1880     }
   1881 
   1882     if (params.roundLengths) {
   1883       x = Math.floor(x);
   1884       y = Math.floor(y);
   1885     }
   1886 
   1887     if (params.cssMode) {
   1888       wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;
   1889     } else if (!params.virtualTranslate) {
   1890       $wrapperEl.transform(("translate3d(" + x + "px, " + y + "px, " + z + "px)"));
   1891     }
   1892     swiper.previousTranslate = swiper.translate;
   1893     swiper.translate = swiper.isHorizontal() ? x : y;
   1894 
   1895     // Check if we need to update progress
   1896     var newProgress;
   1897     var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
   1898     if (translatesDiff === 0) {
   1899       newProgress = 0;
   1900     } else {
   1901       newProgress = (translate - swiper.minTranslate()) / (translatesDiff);
   1902     }
   1903     if (newProgress !== progress) {
   1904       swiper.updateProgress(translate);
   1905     }
   1906 
   1907     swiper.emit('setTranslate', swiper.translate, byController);
   1908   }
   1909 
   1910   function minTranslate () {
   1911     return (-this.snapGrid[0]);
   1912   }
   1913 
   1914   function maxTranslate () {
   1915     return (-this.snapGrid[this.snapGrid.length - 1]);
   1916   }
   1917 
   1918   function translateTo (translate, speed, runCallbacks, translateBounds, internal) {
   1919     var obj;
   1920 
   1921     if ( translate === void 0 ) translate = 0;
   1922     if ( speed === void 0 ) speed = this.params.speed;
   1923     if ( runCallbacks === void 0 ) runCallbacks = true;
   1924     if ( translateBounds === void 0 ) translateBounds = true;
   1925     var swiper = this;
   1926 
   1927     var params = swiper.params;
   1928     var wrapperEl = swiper.wrapperEl;
   1929 
   1930     if (swiper.animating && params.preventInteractionOnTransition) {
   1931       return false;
   1932     }
   1933 
   1934     var minTranslate = swiper.minTranslate();
   1935     var maxTranslate = swiper.maxTranslate();
   1936     var newTranslate;
   1937     if (translateBounds && translate > minTranslate) { newTranslate = minTranslate; }
   1938     else if (translateBounds && translate < maxTranslate) { newTranslate = maxTranslate; }
   1939     else { newTranslate = translate; }
   1940 
   1941     // Update progress
   1942     swiper.updateProgress(newTranslate);
   1943 
   1944     if (params.cssMode) {
   1945       var isH = swiper.isHorizontal();
   1946       if (speed === 0) {
   1947         wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
   1948       } else {
   1949         // eslint-disable-next-line
   1950         if (wrapperEl.scrollTo) {
   1951           wrapperEl.scrollTo(( obj = {}, obj[isH ? 'left' : 'top'] = -newTranslate, obj.behavior = 'smooth', obj ));
   1952         } else {
   1953           wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
   1954         }
   1955       }
   1956       return true;
   1957     }
   1958 
   1959     if (speed === 0) {
   1960       swiper.setTransition(0);
   1961       swiper.setTranslate(newTranslate);
   1962       if (runCallbacks) {
   1963         swiper.emit('beforeTransitionStart', speed, internal);
   1964         swiper.emit('transitionEnd');
   1965       }
   1966     } else {
   1967       swiper.setTransition(speed);
   1968       swiper.setTranslate(newTranslate);
   1969       if (runCallbacks) {
   1970         swiper.emit('beforeTransitionStart', speed, internal);
   1971         swiper.emit('transitionStart');
   1972       }
   1973       if (!swiper.animating) {
   1974         swiper.animating = true;
   1975         if (!swiper.onTranslateToWrapperTransitionEnd) {
   1976           swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {
   1977             if (!swiper || swiper.destroyed) { return; }
   1978             if (e.target !== this) { return; }
   1979             swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
   1980             swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);
   1981             swiper.onTranslateToWrapperTransitionEnd = null;
   1982             delete swiper.onTranslateToWrapperTransitionEnd;
   1983             if (runCallbacks) {
   1984               swiper.emit('transitionEnd');
   1985             }
   1986           };
   1987         }
   1988         swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
   1989         swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);
   1990       }
   1991     }
   1992 
   1993     return true;
   1994   }
   1995 
   1996   var translate = {
   1997     getTranslate: getTranslate,
   1998     setTranslate: setTranslate,
   1999     minTranslate: minTranslate,
   2000     maxTranslate: maxTranslate,
   2001     translateTo: translateTo,
   2002   };
   2003 
   2004   function setTransition (duration, byController) {
   2005     var swiper = this;
   2006 
   2007     if (!swiper.params.cssMode) {
   2008       swiper.$wrapperEl.transition(duration);
   2009     }
   2010 
   2011     swiper.emit('setTransition', duration, byController);
   2012   }
   2013 
   2014   function transitionStart (runCallbacks, direction) {
   2015     if ( runCallbacks === void 0 ) runCallbacks = true;
   2016 
   2017     var swiper = this;
   2018     var activeIndex = swiper.activeIndex;
   2019     var params = swiper.params;
   2020     var previousIndex = swiper.previousIndex;
   2021     if (params.cssMode) { return; }
   2022     if (params.autoHeight) {
   2023       swiper.updateAutoHeight();
   2024     }
   2025 
   2026     var dir = direction;
   2027     if (!dir) {
   2028       if (activeIndex > previousIndex) { dir = 'next'; }
   2029       else if (activeIndex < previousIndex) { dir = 'prev'; }
   2030       else { dir = 'reset'; }
   2031     }
   2032 
   2033     swiper.emit('transitionStart');
   2034 
   2035     if (runCallbacks && activeIndex !== previousIndex) {
   2036       if (dir === 'reset') {
   2037         swiper.emit('slideResetTransitionStart');
   2038         return;
   2039       }
   2040       swiper.emit('slideChangeTransitionStart');
   2041       if (dir === 'next') {
   2042         swiper.emit('slideNextTransitionStart');
   2043       } else {
   2044         swiper.emit('slidePrevTransitionStart');
   2045       }
   2046     }
   2047   }
   2048 
   2049   function transitionEnd$1 (runCallbacks, direction) {
   2050     if ( runCallbacks === void 0 ) runCallbacks = true;
   2051 
   2052     var swiper = this;
   2053     var activeIndex = swiper.activeIndex;
   2054     var previousIndex = swiper.previousIndex;
   2055     var params = swiper.params;
   2056     swiper.animating = false;
   2057     if (params.cssMode) { return; }
   2058     swiper.setTransition(0);
   2059 
   2060     var dir = direction;
   2061     if (!dir) {
   2062       if (activeIndex > previousIndex) { dir = 'next'; }
   2063       else if (activeIndex < previousIndex) { dir = 'prev'; }
   2064       else { dir = 'reset'; }
   2065     }
   2066 
   2067     swiper.emit('transitionEnd');
   2068 
   2069     if (runCallbacks && activeIndex !== previousIndex) {
   2070       if (dir === 'reset') {
   2071         swiper.emit('slideResetTransitionEnd');
   2072         return;
   2073       }
   2074       swiper.emit('slideChangeTransitionEnd');
   2075       if (dir === 'next') {
   2076         swiper.emit('slideNextTransitionEnd');
   2077       } else {
   2078         swiper.emit('slidePrevTransitionEnd');
   2079       }
   2080     }
   2081   }
   2082 
   2083   var transition$1 = {
   2084     setTransition: setTransition,
   2085     transitionStart: transitionStart,
   2086     transitionEnd: transitionEnd$1,
   2087   };
   2088 
   2089   function slideTo (index, speed, runCallbacks, internal) {
   2090     var obj;
   2091 
   2092     if ( index === void 0 ) index = 0;
   2093     if ( speed === void 0 ) speed = this.params.speed;
   2094     if ( runCallbacks === void 0 ) runCallbacks = true;
   2095     var swiper = this;
   2096     var slideIndex = index;
   2097     if (slideIndex < 0) { slideIndex = 0; }
   2098 
   2099     var params = swiper.params;
   2100     var snapGrid = swiper.snapGrid;
   2101     var slidesGrid = swiper.slidesGrid;
   2102     var previousIndex = swiper.previousIndex;
   2103     var activeIndex = swiper.activeIndex;
   2104     var rtl = swiper.rtlTranslate;
   2105     var wrapperEl = swiper.wrapperEl;
   2106     if (swiper.animating && params.preventInteractionOnTransition) {
   2107       return false;
   2108     }
   2109 
   2110     var skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
   2111     var snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
   2112     if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
   2113 
   2114     if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {
   2115       swiper.emit('beforeSlideChangeStart');
   2116     }
   2117 
   2118     var translate = -snapGrid[snapIndex];
   2119 
   2120     // Update progress
   2121     swiper.updateProgress(translate);
   2122 
   2123     // Normalize slideIndex
   2124     if (params.normalizeSlideIndex) {
   2125       for (var i = 0; i < slidesGrid.length; i += 1) {
   2126         if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) {
   2127           slideIndex = i;
   2128         }
   2129       }
   2130     }
   2131     // Directions locks
   2132     if (swiper.initialized && slideIndex !== activeIndex) {
   2133       if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {
   2134         return false;
   2135       }
   2136       if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
   2137         if ((activeIndex || 0) !== slideIndex) { return false; }
   2138       }
   2139     }
   2140 
   2141     var direction;
   2142     if (slideIndex > activeIndex) { direction = 'next'; }
   2143     else if (slideIndex < activeIndex) { direction = 'prev'; }
   2144     else { direction = 'reset'; }
   2145 
   2146 
   2147     // Update Index
   2148     if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {
   2149       swiper.updateActiveIndex(slideIndex);
   2150       // Update Height
   2151       if (params.autoHeight) {
   2152         swiper.updateAutoHeight();
   2153       }
   2154       swiper.updateSlidesClasses();
   2155       if (params.effect !== 'slide') {
   2156         swiper.setTranslate(translate);
   2157       }
   2158       if (direction !== 'reset') {
   2159         swiper.transitionStart(runCallbacks, direction);
   2160         swiper.transitionEnd(runCallbacks, direction);
   2161       }
   2162       return false;
   2163     }
   2164     if (params.cssMode) {
   2165       var isH = swiper.isHorizontal();
   2166       if (speed === 0) {
   2167         wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -translate;
   2168       } else {
   2169         // eslint-disable-next-line
   2170         if (wrapperEl.scrollTo) {
   2171           wrapperEl.scrollTo(( obj = {}, obj[isH ? 'left' : 'top'] = -translate, obj.behavior = 'smooth', obj ));
   2172         } else {
   2173           wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -translate;
   2174         }
   2175       }
   2176       return true;
   2177     }
   2178 
   2179     if (speed === 0) {
   2180       swiper.setTransition(0);
   2181       swiper.setTranslate(translate);
   2182       swiper.updateActiveIndex(slideIndex);
   2183       swiper.updateSlidesClasses();
   2184       swiper.emit('beforeTransitionStart', speed, internal);
   2185       swiper.transitionStart(runCallbacks, direction);
   2186       swiper.transitionEnd(runCallbacks, direction);
   2187     } else {
   2188       swiper.setTransition(speed);
   2189       swiper.setTranslate(translate);
   2190       swiper.updateActiveIndex(slideIndex);
   2191       swiper.updateSlidesClasses();
   2192       swiper.emit('beforeTransitionStart', speed, internal);
   2193       swiper.transitionStart(runCallbacks, direction);
   2194       if (!swiper.animating) {
   2195         swiper.animating = true;
   2196         if (!swiper.onSlideToWrapperTransitionEnd) {
   2197           swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
   2198             if (!swiper || swiper.destroyed) { return; }
   2199             if (e.target !== this) { return; }
   2200             swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
   2201             swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
   2202             swiper.onSlideToWrapperTransitionEnd = null;
   2203             delete swiper.onSlideToWrapperTransitionEnd;
   2204             swiper.transitionEnd(runCallbacks, direction);
   2205           };
   2206         }
   2207         swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
   2208         swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
   2209       }
   2210     }
   2211 
   2212     return true;
   2213   }
   2214 
   2215   function slideToLoop (index, speed, runCallbacks, internal) {
   2216     if ( index === void 0 ) index = 0;
   2217     if ( speed === void 0 ) speed = this.params.speed;
   2218     if ( runCallbacks === void 0 ) runCallbacks = true;
   2219 
   2220     var swiper = this;
   2221     var newIndex = index;
   2222     if (swiper.params.loop) {
   2223       newIndex += swiper.loopedSlides;
   2224     }
   2225 
   2226     return swiper.slideTo(newIndex, speed, runCallbacks, internal);
   2227   }
   2228 
   2229   /* eslint no-unused-vars: "off" */
   2230   function slideNext (speed, runCallbacks, internal) {
   2231     if ( speed === void 0 ) speed = this.params.speed;
   2232     if ( runCallbacks === void 0 ) runCallbacks = true;
   2233 
   2234     var swiper = this;
   2235     var params = swiper.params;
   2236     var animating = swiper.animating;
   2237     var increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup;
   2238     if (params.loop) {
   2239       if (animating) { return false; }
   2240       swiper.loopFix();
   2241       // eslint-disable-next-line
   2242       swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
   2243     }
   2244     return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
   2245   }
   2246 
   2247   /* eslint no-unused-vars: "off" */
   2248   function slidePrev (speed, runCallbacks, internal) {
   2249     if ( speed === void 0 ) speed = this.params.speed;
   2250     if ( runCallbacks === void 0 ) runCallbacks = true;
   2251 
   2252     var swiper = this;
   2253     var params = swiper.params;
   2254     var animating = swiper.animating;
   2255     var snapGrid = swiper.snapGrid;
   2256     var slidesGrid = swiper.slidesGrid;
   2257     var rtlTranslate = swiper.rtlTranslate;
   2258 
   2259     if (params.loop) {
   2260       if (animating) { return false; }
   2261       swiper.loopFix();
   2262       // eslint-disable-next-line
   2263       swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
   2264     }
   2265     var translate = rtlTranslate ? swiper.translate : -swiper.translate;
   2266     function normalize(val) {
   2267       if (val < 0) { return -Math.floor(Math.abs(val)); }
   2268       return Math.floor(val);
   2269     }
   2270     var normalizedTranslate = normalize(translate);
   2271     var normalizedSnapGrid = snapGrid.map(function (val) { return normalize(val); });
   2272     var normalizedSlidesGrid = slidesGrid.map(function (val) { return normalize(val); });
   2273 
   2274     var currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)];
   2275     var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
   2276     if (typeof prevSnap === 'undefined' && params.cssMode) {
   2277       snapGrid.forEach(function (snap) {
   2278         if (!prevSnap && normalizedTranslate >= snap) { prevSnap = snap; }
   2279       });
   2280     }
   2281     var prevIndex;
   2282     if (typeof prevSnap !== 'undefined') {
   2283       prevIndex = slidesGrid.indexOf(prevSnap);
   2284       if (prevIndex < 0) { prevIndex = swiper.activeIndex - 1; }
   2285     }
   2286     return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
   2287   }
   2288 
   2289   /* eslint no-unused-vars: "off" */
   2290   function slideReset (speed, runCallbacks, internal) {
   2291     if ( speed === void 0 ) speed = this.params.speed;
   2292     if ( runCallbacks === void 0 ) runCallbacks = true;
   2293 
   2294     var swiper = this;
   2295     return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
   2296   }
   2297 
   2298   /* eslint no-unused-vars: "off" */
   2299   function slideToClosest (speed, runCallbacks, internal, threshold) {
   2300     if ( speed === void 0 ) speed = this.params.speed;
   2301     if ( runCallbacks === void 0 ) runCallbacks = true;
   2302     if ( threshold === void 0 ) threshold = 0.5;
   2303 
   2304     var swiper = this;
   2305     var index = swiper.activeIndex;
   2306     var skip = Math.min(swiper.params.slidesPerGroupSkip, index);
   2307     var snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
   2308 
   2309     var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
   2310 
   2311     if (translate >= swiper.snapGrid[snapIndex]) {
   2312       // The current translate is on or after the current snap index, so the choice
   2313       // is between the current index and the one after it.
   2314       var currentSnap = swiper.snapGrid[snapIndex];
   2315       var nextSnap = swiper.snapGrid[snapIndex + 1];
   2316       if ((translate - currentSnap) > (nextSnap - currentSnap) * threshold) {
   2317         index += swiper.params.slidesPerGroup;
   2318       }
   2319     } else {
   2320       // The current translate is before the current snap index, so the choice
   2321       // is between the current index and the one before it.
   2322       var prevSnap = swiper.snapGrid[snapIndex - 1];
   2323       var currentSnap$1 = swiper.snapGrid[snapIndex];
   2324       if ((translate - prevSnap) <= (currentSnap$1 - prevSnap) * threshold) {
   2325         index -= swiper.params.slidesPerGroup;
   2326       }
   2327     }
   2328     index = Math.max(index, 0);
   2329     index = Math.min(index, swiper.slidesGrid.length - 1);
   2330 
   2331     return swiper.slideTo(index, speed, runCallbacks, internal);
   2332   }
   2333 
   2334   function slideToClickedSlide () {
   2335     var swiper = this;
   2336     var params = swiper.params;
   2337     var $wrapperEl = swiper.$wrapperEl;
   2338 
   2339     var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
   2340     var slideToIndex = swiper.clickedIndex;
   2341     var realIndex;
   2342     if (params.loop) {
   2343       if (swiper.animating) { return; }
   2344       realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);
   2345       if (params.centeredSlides) {
   2346         if (
   2347           (slideToIndex < swiper.loopedSlides - (slidesPerView / 2))
   2348           || (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2))
   2349         ) {
   2350           swiper.loopFix();
   2351           slideToIndex = $wrapperEl
   2352             .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
   2353             .eq(0)
   2354             .index();
   2355 
   2356           Utils.nextTick(function () {
   2357             swiper.slideTo(slideToIndex);
   2358           });
   2359         } else {
   2360           swiper.slideTo(slideToIndex);
   2361         }
   2362       } else if (slideToIndex > swiper.slides.length - slidesPerView) {
   2363         swiper.loopFix();
   2364         slideToIndex = $wrapperEl
   2365           .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
   2366           .eq(0)
   2367           .index();
   2368 
   2369         Utils.nextTick(function () {
   2370           swiper.slideTo(slideToIndex);
   2371         });
   2372       } else {
   2373         swiper.slideTo(slideToIndex);
   2374       }
   2375     } else {
   2376       swiper.slideTo(slideToIndex);
   2377     }
   2378   }
   2379 
   2380   var slide = {
   2381     slideTo: slideTo,
   2382     slideToLoop: slideToLoop,
   2383     slideNext: slideNext,
   2384     slidePrev: slidePrev,
   2385     slideReset: slideReset,
   2386     slideToClosest: slideToClosest,
   2387     slideToClickedSlide: slideToClickedSlide,
   2388   };
   2389 
   2390   function loopCreate () {
   2391     var swiper = this;
   2392     var params = swiper.params;
   2393     var $wrapperEl = swiper.$wrapperEl;
   2394     // Remove duplicated slides
   2395     $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass))).remove();
   2396 
   2397     var slides = $wrapperEl.children(("." + (params.slideClass)));
   2398 
   2399     if (params.loopFillGroupWithBlank) {
   2400       var blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);
   2401       if (blankSlidesNum !== params.slidesPerGroup) {
   2402         for (var i = 0; i < blankSlidesNum; i += 1) {
   2403           var blankNode = $(doc.createElement('div')).addClass(((params.slideClass) + " " + (params.slideBlankClass)));
   2404           $wrapperEl.append(blankNode);
   2405         }
   2406         slides = $wrapperEl.children(("." + (params.slideClass)));
   2407       }
   2408     }
   2409 
   2410     if (params.slidesPerView === 'auto' && !params.loopedSlides) { params.loopedSlides = slides.length; }
   2411 
   2412     swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));
   2413     swiper.loopedSlides += params.loopAdditionalSlides;
   2414     if (swiper.loopedSlides > slides.length) {
   2415       swiper.loopedSlides = slides.length;
   2416     }
   2417 
   2418     var prependSlides = [];
   2419     var appendSlides = [];
   2420     slides.each(function (index, el) {
   2421       var slide = $(el);
   2422       if (index < swiper.loopedSlides) { appendSlides.push(el); }
   2423       if (index < slides.length && index >= slides.length - swiper.loopedSlides) { prependSlides.push(el); }
   2424       slide.attr('data-swiper-slide-index', index);
   2425     });
   2426     for (var i$1 = 0; i$1 < appendSlides.length; i$1 += 1) {
   2427       $wrapperEl.append($(appendSlides[i$1].cloneNode(true)).addClass(params.slideDuplicateClass));
   2428     }
   2429     for (var i$2 = prependSlides.length - 1; i$2 >= 0; i$2 -= 1) {
   2430       $wrapperEl.prepend($(prependSlides[i$2].cloneNode(true)).addClass(params.slideDuplicateClass));
   2431     }
   2432   }
   2433 
   2434   function loopFix () {
   2435     var swiper = this;
   2436 
   2437     swiper.emit('beforeLoopFix');
   2438 
   2439     var activeIndex = swiper.activeIndex;
   2440     var slides = swiper.slides;
   2441     var loopedSlides = swiper.loopedSlides;
   2442     var allowSlidePrev = swiper.allowSlidePrev;
   2443     var allowSlideNext = swiper.allowSlideNext;
   2444     var snapGrid = swiper.snapGrid;
   2445     var rtl = swiper.rtlTranslate;
   2446     var newIndex;
   2447     swiper.allowSlidePrev = true;
   2448     swiper.allowSlideNext = true;
   2449 
   2450     var snapTranslate = -snapGrid[activeIndex];
   2451     var diff = snapTranslate - swiper.getTranslate();
   2452 
   2453     // Fix For Negative Oversliding
   2454     if (activeIndex < loopedSlides) {
   2455       newIndex = (slides.length - (loopedSlides * 3)) + activeIndex;
   2456       newIndex += loopedSlides;
   2457       var slideChanged = swiper.slideTo(newIndex, 0, false, true);
   2458       if (slideChanged && diff !== 0) {
   2459         swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
   2460       }
   2461     } else if (activeIndex >= slides.length - loopedSlides) {
   2462       // Fix For Positive Oversliding
   2463       newIndex = -slides.length + activeIndex + loopedSlides;
   2464       newIndex += loopedSlides;
   2465       var slideChanged$1 = swiper.slideTo(newIndex, 0, false, true);
   2466       if (slideChanged$1 && diff !== 0) {
   2467         swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
   2468       }
   2469     }
   2470     swiper.allowSlidePrev = allowSlidePrev;
   2471     swiper.allowSlideNext = allowSlideNext;
   2472 
   2473     swiper.emit('loopFix');
   2474   }
   2475 
   2476   function loopDestroy () {
   2477     var swiper = this;
   2478     var $wrapperEl = swiper.$wrapperEl;
   2479     var params = swiper.params;
   2480     var slides = swiper.slides;
   2481     $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + ",." + (params.slideClass) + "." + (params.slideBlankClass))).remove();
   2482     slides.removeAttr('data-swiper-slide-index');
   2483   }
   2484 
   2485   var loop = {
   2486     loopCreate: loopCreate,
   2487     loopFix: loopFix,
   2488     loopDestroy: loopDestroy,
   2489   };
   2490 
   2491   function setGrabCursor (moving) {
   2492     var swiper = this;
   2493     if (Support.touch || !swiper.params.simulateTouch || (swiper.params.watchOverflow && swiper.isLocked) || swiper.params.cssMode) { return; }
   2494     var el = swiper.el;
   2495     el.style.cursor = 'move';
   2496     el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';
   2497     el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';
   2498     el.style.cursor = moving ? 'grabbing' : 'grab';
   2499   }
   2500 
   2501   function unsetGrabCursor () {
   2502     var swiper = this;
   2503     if (Support.touch || (swiper.params.watchOverflow && swiper.isLocked) || swiper.params.cssMode) { return; }
   2504     swiper.el.style.cursor = '';
   2505   }
   2506 
   2507   var grabCursor = {
   2508     setGrabCursor: setGrabCursor,
   2509     unsetGrabCursor: unsetGrabCursor,
   2510   };
   2511 
   2512   function appendSlide (slides) {
   2513     var swiper = this;
   2514     var $wrapperEl = swiper.$wrapperEl;
   2515     var params = swiper.params;
   2516     if (params.loop) {
   2517       swiper.loopDestroy();
   2518     }
   2519     if (typeof slides === 'object' && 'length' in slides) {
   2520       for (var i = 0; i < slides.length; i += 1) {
   2521         if (slides[i]) { $wrapperEl.append(slides[i]); }
   2522       }
   2523     } else {
   2524       $wrapperEl.append(slides);
   2525     }
   2526     if (params.loop) {
   2527       swiper.loopCreate();
   2528     }
   2529     if (!(params.observer && Support.observer)) {
   2530       swiper.update();
   2531     }
   2532   }
   2533 
   2534   function prependSlide (slides) {
   2535     var swiper = this;
   2536     var params = swiper.params;
   2537     var $wrapperEl = swiper.$wrapperEl;
   2538     var activeIndex = swiper.activeIndex;
   2539 
   2540     if (params.loop) {
   2541       swiper.loopDestroy();
   2542     }
   2543     var newActiveIndex = activeIndex + 1;
   2544     if (typeof slides === 'object' && 'length' in slides) {
   2545       for (var i = 0; i < slides.length; i += 1) {
   2546         if (slides[i]) { $wrapperEl.prepend(slides[i]); }
   2547       }
   2548       newActiveIndex = activeIndex + slides.length;
   2549     } else {
   2550       $wrapperEl.prepend(slides);
   2551     }
   2552     if (params.loop) {
   2553       swiper.loopCreate();
   2554     }
   2555     if (!(params.observer && Support.observer)) {
   2556       swiper.update();
   2557     }
   2558     swiper.slideTo(newActiveIndex, 0, false);
   2559   }
   2560 
   2561   function addSlide (index, slides) {
   2562     var swiper = this;
   2563     var $wrapperEl = swiper.$wrapperEl;
   2564     var params = swiper.params;
   2565     var activeIndex = swiper.activeIndex;
   2566     var activeIndexBuffer = activeIndex;
   2567     if (params.loop) {
   2568       activeIndexBuffer -= swiper.loopedSlides;
   2569       swiper.loopDestroy();
   2570       swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
   2571     }
   2572     var baseLength = swiper.slides.length;
   2573     if (index <= 0) {
   2574       swiper.prependSlide(slides);
   2575       return;
   2576     }
   2577     if (index >= baseLength) {
   2578       swiper.appendSlide(slides);
   2579       return;
   2580     }
   2581     var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;
   2582 
   2583     var slidesBuffer = [];
   2584     for (var i = baseLength - 1; i >= index; i -= 1) {
   2585       var currentSlide = swiper.slides.eq(i);
   2586       currentSlide.remove();
   2587       slidesBuffer.unshift(currentSlide);
   2588     }
   2589 
   2590     if (typeof slides === 'object' && 'length' in slides) {
   2591       for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
   2592         if (slides[i$1]) { $wrapperEl.append(slides[i$1]); }
   2593       }
   2594       newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;
   2595     } else {
   2596       $wrapperEl.append(slides);
   2597     }
   2598 
   2599     for (var i$2 = 0; i$2 < slidesBuffer.length; i$2 += 1) {
   2600       $wrapperEl.append(slidesBuffer[i$2]);
   2601     }
   2602 
   2603     if (params.loop) {
   2604       swiper.loopCreate();
   2605     }
   2606     if (!(params.observer && Support.observer)) {
   2607       swiper.update();
   2608     }
   2609     if (params.loop) {
   2610       swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
   2611     } else {
   2612       swiper.slideTo(newActiveIndex, 0, false);
   2613     }
   2614   }
   2615 
   2616   function removeSlide (slidesIndexes) {
   2617     var swiper = this;
   2618     var params = swiper.params;
   2619     var $wrapperEl = swiper.$wrapperEl;
   2620     var activeIndex = swiper.activeIndex;
   2621 
   2622     var activeIndexBuffer = activeIndex;
   2623     if (params.loop) {
   2624       activeIndexBuffer -= swiper.loopedSlides;
   2625       swiper.loopDestroy();
   2626       swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
   2627     }
   2628     var newActiveIndex = activeIndexBuffer;
   2629     var indexToRemove;
   2630 
   2631     if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {
   2632       for (var i = 0; i < slidesIndexes.length; i += 1) {
   2633         indexToRemove = slidesIndexes[i];
   2634         if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
   2635         if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
   2636       }
   2637       newActiveIndex = Math.max(newActiveIndex, 0);
   2638     } else {
   2639       indexToRemove = slidesIndexes;
   2640       if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
   2641       if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
   2642       newActiveIndex = Math.max(newActiveIndex, 0);
   2643     }
   2644 
   2645     if (params.loop) {
   2646       swiper.loopCreate();
   2647     }
   2648 
   2649     if (!(params.observer && Support.observer)) {
   2650       swiper.update();
   2651     }
   2652     if (params.loop) {
   2653       swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
   2654     } else {
   2655       swiper.slideTo(newActiveIndex, 0, false);
   2656     }
   2657   }
   2658 
   2659   function removeAllSlides () {
   2660     var swiper = this;
   2661 
   2662     var slidesIndexes = [];
   2663     for (var i = 0; i < swiper.slides.length; i += 1) {
   2664       slidesIndexes.push(i);
   2665     }
   2666     swiper.removeSlide(slidesIndexes);
   2667   }
   2668 
   2669   var manipulation = {
   2670     appendSlide: appendSlide,
   2671     prependSlide: prependSlide,
   2672     addSlide: addSlide,
   2673     removeSlide: removeSlide,
   2674     removeAllSlides: removeAllSlides,
   2675   };
   2676 
   2677   var Device = (function Device() {
   2678     var platform = win.navigator.platform;
   2679     var ua = win.navigator.userAgent;
   2680 
   2681     var device = {
   2682       ios: false,
   2683       android: false,
   2684       androidChrome: false,
   2685       desktop: false,
   2686       iphone: false,
   2687       ipod: false,
   2688       ipad: false,
   2689       edge: false,
   2690       ie: false,
   2691       firefox: false,
   2692       macos: false,
   2693       windows: false,
   2694       cordova: !!(win.cordova || win.phonegap),
   2695       phonegap: !!(win.cordova || win.phonegap),
   2696       electron: false,
   2697     };
   2698 
   2699     var screenWidth = win.screen.width;
   2700     var screenHeight = win.screen.height;
   2701 
   2702     var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
   2703     var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
   2704     var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
   2705     var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
   2706     var ie = ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;
   2707     var edge = ua.indexOf('Edge/') >= 0;
   2708     var firefox = ua.indexOf('Gecko/') >= 0 && ua.indexOf('Firefox/') >= 0;
   2709     var windows = platform === 'Win32';
   2710     var electron = ua.toLowerCase().indexOf('electron') >= 0;
   2711     var macos = platform === 'MacIntel';
   2712 
   2713     // iPadOs 13 fix
   2714     if (!ipad
   2715       && macos
   2716       && Support.touch
   2717       && (
   2718         (screenWidth === 1024 && screenHeight === 1366) // Pro 12.9
   2719         || (screenWidth === 834 && screenHeight === 1194) // Pro 11
   2720         || (screenWidth === 834 && screenHeight === 1112) // Pro 10.5
   2721         || (screenWidth === 768 && screenHeight === 1024) // other
   2722       )
   2723     ) {
   2724       ipad = ua.match(/(Version)\/([\d.]+)/);
   2725       macos = false;
   2726     }
   2727 
   2728     device.ie = ie;
   2729     device.edge = edge;
   2730     device.firefox = firefox;
   2731 
   2732     // Android
   2733     if (android && !windows) {
   2734       device.os = 'android';
   2735       device.osVersion = android[2];
   2736       device.android = true;
   2737       device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;
   2738     }
   2739     if (ipad || iphone || ipod) {
   2740       device.os = 'ios';
   2741       device.ios = true;
   2742     }
   2743     // iOS
   2744     if (iphone && !ipod) {
   2745       device.osVersion = iphone[2].replace(/_/g, '.');
   2746       device.iphone = true;
   2747     }
   2748     if (ipad) {
   2749       device.osVersion = ipad[2].replace(/_/g, '.');
   2750       device.ipad = true;
   2751     }
   2752     if (ipod) {
   2753       device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;
   2754       device.ipod = true;
   2755     }
   2756     // iOS 8+ changed UA
   2757     if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {
   2758       if (device.osVersion.split('.')[0] === '10') {
   2759         device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];
   2760       }
   2761     }
   2762 
   2763     // Webview
   2764     device.webView = !!((iphone || ipad || ipod) && (ua.match(/.*AppleWebKit(?!.*Safari)/i) || win.navigator.standalone))
   2765       || (win.matchMedia && win.matchMedia('(display-mode: standalone)').matches);
   2766     device.webview = device.webView;
   2767     device.standalone = device.webView;
   2768 
   2769     // Desktop
   2770     device.desktop = !(device.ios || device.android) || electron;
   2771     if (device.desktop) {
   2772       device.electron = electron;
   2773       device.macos = macos;
   2774       device.windows = windows;
   2775       if (device.macos) {
   2776         device.os = 'macos';
   2777       }
   2778       if (device.windows) {
   2779         device.os = 'windows';
   2780       }
   2781     }
   2782 
   2783     // Pixel Ratio
   2784     device.pixelRatio = win.devicePixelRatio || 1;
   2785 
   2786     // Export object
   2787     return device;
   2788   }());
   2789 
   2790   function onTouchStart (event) {
   2791     var swiper = this;
   2792     var data = swiper.touchEventsData;
   2793     var params = swiper.params;
   2794     var touches = swiper.touches;
   2795 
   2796     if (swiper.animating && params.preventInteractionOnTransition) {
   2797       return;
   2798     }
   2799     var e = event;
   2800     if (e.originalEvent) { e = e.originalEvent; }
   2801     var $targetEl = $(e.target);
   2802 
   2803     if (params.touchEventsTarget === 'wrapper') {
   2804       if (!$targetEl.closest(swiper.wrapperEl).length) { return; }
   2805     }
   2806     data.isTouchEvent = e.type === 'touchstart';
   2807     if (!data.isTouchEvent && 'which' in e && e.which === 3) { return; }
   2808     if (!data.isTouchEvent && 'button' in e && e.button > 0) { return; }
   2809     if (data.isTouched && data.isMoved) { return; }
   2810     if (params.noSwiping && $targetEl.closest(params.noSwipingSelector ? params.noSwipingSelector : ("." + (params.noSwipingClass)))[0]) {
   2811       swiper.allowClick = true;
   2812       return;
   2813     }
   2814     if (params.swipeHandler) {
   2815       if (!$targetEl.closest(params.swipeHandler)[0]) { return; }
   2816     }
   2817 
   2818     touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
   2819     touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
   2820     var startX = touches.currentX;
   2821     var startY = touches.currentY;
   2822 
   2823     // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore
   2824 
   2825     var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;
   2826     var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;
   2827     if (
   2828       edgeSwipeDetection
   2829       && ((startX <= edgeSwipeThreshold)
   2830       || (startX >= win.screen.width - edgeSwipeThreshold))
   2831     ) {
   2832       return;
   2833     }
   2834 
   2835     Utils.extend(data, {
   2836       isTouched: true,
   2837       isMoved: false,
   2838       allowTouchCallbacks: true,
   2839       isScrolling: undefined,
   2840       startMoving: undefined,
   2841     });
   2842 
   2843     touches.startX = startX;
   2844     touches.startY = startY;
   2845     data.touchStartTime = Utils.now();
   2846     swiper.allowClick = true;
   2847     swiper.updateSize();
   2848     swiper.swipeDirection = undefined;
   2849     if (params.threshold > 0) { data.allowThresholdMove = false; }
   2850     if (e.type !== 'touchstart') {
   2851       var preventDefault = true;
   2852       if ($targetEl.is(data.formElements)) { preventDefault = false; }
   2853       if (
   2854         doc.activeElement
   2855         && $(doc.activeElement).is(data.formElements)
   2856         && doc.activeElement !== $targetEl[0]
   2857       ) {
   2858         doc.activeElement.blur();
   2859       }
   2860 
   2861       var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
   2862       if (params.touchStartForcePreventDefault || shouldPreventDefault) {
   2863         e.preventDefault();
   2864       }
   2865     }
   2866     swiper.emit('touchStart', e);
   2867   }
   2868 
   2869   function onTouchMove (event) {
   2870     var swiper = this;
   2871     var data = swiper.touchEventsData;
   2872     var params = swiper.params;
   2873     var touches = swiper.touches;
   2874     var rtl = swiper.rtlTranslate;
   2875     var e = event;
   2876     if (e.originalEvent) { e = e.originalEvent; }
   2877     if (!data.isTouched) {
   2878       if (data.startMoving && data.isScrolling) {
   2879         swiper.emit('touchMoveOpposite', e);
   2880       }
   2881       return;
   2882     }
   2883     if (data.isTouchEvent && e.type === 'mousemove') { return; }
   2884     var targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);
   2885     var pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;
   2886     var pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;
   2887     if (e.preventedByNestedSwiper) {
   2888       touches.startX = pageX;
   2889       touches.startY = pageY;
   2890       return;
   2891     }
   2892     if (!swiper.allowTouchMove) {
   2893       // isMoved = true;
   2894       swiper.allowClick = false;
   2895       if (data.isTouched) {
   2896         Utils.extend(touches, {
   2897           startX: pageX,
   2898           startY: pageY,
   2899           currentX: pageX,
   2900           currentY: pageY,
   2901         });
   2902         data.touchStartTime = Utils.now();
   2903       }
   2904       return;
   2905     }
   2906     if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {
   2907       if (swiper.isVertical()) {
   2908         // Vertical
   2909         if (
   2910           (pageY < touches.startY && swiper.translate <= swiper.maxTranslate())
   2911           || (pageY > touches.startY && swiper.translate >= swiper.minTranslate())
   2912         ) {
   2913           data.isTouched = false;
   2914           data.isMoved = false;
   2915           return;
   2916         }
   2917       } else if (
   2918         (pageX < touches.startX && swiper.translate <= swiper.maxTranslate())
   2919         || (pageX > touches.startX && swiper.translate >= swiper.minTranslate())
   2920       ) {
   2921         return;
   2922       }
   2923     }
   2924     if (data.isTouchEvent && doc.activeElement) {
   2925       if (e.target === doc.activeElement && $(e.target).is(data.formElements)) {
   2926         data.isMoved = true;
   2927         swiper.allowClick = false;
   2928         return;
   2929       }
   2930     }
   2931     if (data.allowTouchCallbacks) {
   2932       swiper.emit('touchMove', e);
   2933     }
   2934     if (e.targetTouches && e.targetTouches.length > 1) { return; }
   2935 
   2936     touches.currentX = pageX;
   2937     touches.currentY = pageY;
   2938 
   2939     var diffX = touches.currentX - touches.startX;
   2940     var diffY = touches.currentY - touches.startY;
   2941     if (swiper.params.threshold && Math.sqrt((Math.pow( diffX, 2 )) + (Math.pow( diffY, 2 ))) < swiper.params.threshold) { return; }
   2942 
   2943     if (typeof data.isScrolling === 'undefined') {
   2944       var touchAngle;
   2945       if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) {
   2946         data.isScrolling = false;
   2947       } else {
   2948         // eslint-disable-next-line
   2949         if ((diffX * diffX) + (diffY * diffY) >= 25) {
   2950           touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;
   2951           data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle);
   2952         }
   2953       }
   2954     }
   2955     if (data.isScrolling) {
   2956       swiper.emit('touchMoveOpposite', e);
   2957     }
   2958     if (typeof data.startMoving === 'undefined') {
   2959       if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
   2960         data.startMoving = true;
   2961       }
   2962     }
   2963     if (data.isScrolling) {
   2964       data.isTouched = false;
   2965       return;
   2966     }
   2967     if (!data.startMoving) {
   2968       return;
   2969     }
   2970     swiper.allowClick = false;
   2971     if (!params.cssMode) {
   2972       e.preventDefault();
   2973     }
   2974     if (params.touchMoveStopPropagation && !params.nested) {
   2975       e.stopPropagation();
   2976     }
   2977 
   2978     if (!data.isMoved) {
   2979       if (params.loop) {
   2980         swiper.loopFix();
   2981       }
   2982       data.startTranslate = swiper.getTranslate();
   2983       swiper.setTransition(0);
   2984       if (swiper.animating) {
   2985         swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');
   2986       }
   2987       data.allowMomentumBounce = false;
   2988       // Grab Cursor
   2989       if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
   2990         swiper.setGrabCursor(true);
   2991       }
   2992       swiper.emit('sliderFirstMove', e);
   2993     }
   2994     swiper.emit('sliderMove', e);
   2995     data.isMoved = true;
   2996 
   2997     var diff = swiper.isHorizontal() ? diffX : diffY;
   2998     touches.diff = diff;
   2999 
   3000     diff *= params.touchRatio;
   3001     if (rtl) { diff = -diff; }
   3002 
   3003     swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
   3004     data.currentTranslate = diff + data.startTranslate;
   3005 
   3006     var disableParentSwiper = true;
   3007     var resistanceRatio = params.resistanceRatio;
   3008     if (params.touchReleaseOnEdges) {
   3009       resistanceRatio = 0;
   3010     }
   3011     if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) {
   3012       disableParentSwiper = false;
   3013       if (params.resistance) { data.currentTranslate = (swiper.minTranslate() - 1) + (Math.pow( (-swiper.minTranslate() + data.startTranslate + diff), resistanceRatio )); }
   3014     } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {
   3015       disableParentSwiper = false;
   3016       if (params.resistance) { data.currentTranslate = (swiper.maxTranslate() + 1) - (Math.pow( (swiper.maxTranslate() - data.startTranslate - diff), resistanceRatio )); }
   3017     }
   3018 
   3019     if (disableParentSwiper) {
   3020       e.preventedByNestedSwiper = true;
   3021     }
   3022 
   3023     // Directions locks
   3024     if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
   3025       data.currentTranslate = data.startTranslate;
   3026     }
   3027     if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
   3028       data.currentTranslate = data.startTranslate;
   3029     }
   3030 
   3031 
   3032     // Threshold
   3033     if (params.threshold > 0) {
   3034       if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
   3035         if (!data.allowThresholdMove) {
   3036           data.allowThresholdMove = true;
   3037           touches.startX = touches.currentX;
   3038           touches.startY = touches.currentY;
   3039           data.currentTranslate = data.startTranslate;
   3040           touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
   3041           return;
   3042         }
   3043       } else {
   3044         data.currentTranslate = data.startTranslate;
   3045         return;
   3046       }
   3047     }
   3048 
   3049     if (!params.followFinger || params.cssMode) { return; }
   3050 
   3051     // Update active index in free mode
   3052     if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) {
   3053       swiper.updateActiveIndex();
   3054       swiper.updateSlidesClasses();
   3055     }
   3056     if (params.freeMode) {
   3057       // Velocity
   3058       if (data.velocities.length === 0) {
   3059         data.velocities.push({
   3060           position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],
   3061           time: data.touchStartTime,
   3062         });
   3063       }
   3064       data.velocities.push({
   3065         position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],
   3066         time: Utils.now(),
   3067       });
   3068     }
   3069     // Update progress
   3070     swiper.updateProgress(data.currentTranslate);
   3071     // Update translate
   3072     swiper.setTranslate(data.currentTranslate);
   3073   }
   3074 
   3075   function onTouchEnd (event) {
   3076     var swiper = this;
   3077     var data = swiper.touchEventsData;
   3078 
   3079     var params = swiper.params;
   3080     var touches = swiper.touches;
   3081     var rtl = swiper.rtlTranslate;
   3082     var $wrapperEl = swiper.$wrapperEl;
   3083     var slidesGrid = swiper.slidesGrid;
   3084     var snapGrid = swiper.snapGrid;
   3085     var e = event;
   3086     if (e.originalEvent) { e = e.originalEvent; }
   3087     if (data.allowTouchCallbacks) {
   3088       swiper.emit('touchEnd', e);
   3089     }
   3090     data.allowTouchCallbacks = false;
   3091     if (!data.isTouched) {
   3092       if (data.isMoved && params.grabCursor) {
   3093         swiper.setGrabCursor(false);
   3094       }
   3095       data.isMoved = false;
   3096       data.startMoving = false;
   3097       return;
   3098     }
   3099     // Return Grab Cursor
   3100     if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
   3101       swiper.setGrabCursor(false);
   3102     }
   3103 
   3104     // Time diff
   3105     var touchEndTime = Utils.now();
   3106     var timeDiff = touchEndTime - data.touchStartTime;
   3107 
   3108     // Tap, doubleTap, Click
   3109     if (swiper.allowClick) {
   3110       swiper.updateClickedSlide(e);
   3111       swiper.emit('tap click', e);
   3112       if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) {
   3113         swiper.emit('doubleTap doubleClick', e);
   3114       }
   3115     }
   3116 
   3117     data.lastClickTime = Utils.now();
   3118     Utils.nextTick(function () {
   3119       if (!swiper.destroyed) { swiper.allowClick = true; }
   3120     });
   3121 
   3122     if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {
   3123       data.isTouched = false;
   3124       data.isMoved = false;
   3125       data.startMoving = false;
   3126       return;
   3127     }
   3128     data.isTouched = false;
   3129     data.isMoved = false;
   3130     data.startMoving = false;
   3131 
   3132     var currentPos;
   3133     if (params.followFinger) {
   3134       currentPos = rtl ? swiper.translate : -swiper.translate;
   3135     } else {
   3136       currentPos = -data.currentTranslate;
   3137     }
   3138 
   3139     if (params.cssMode) {
   3140       return;
   3141     }
   3142 
   3143     if (params.freeMode) {
   3144       if (currentPos < -swiper.minTranslate()) {
   3145         swiper.slideTo(swiper.activeIndex);
   3146         return;
   3147       }
   3148       if (currentPos > -swiper.maxTranslate()) {
   3149         if (swiper.slides.length < snapGrid.length) {
   3150           swiper.slideTo(snapGrid.length - 1);
   3151         } else {
   3152           swiper.slideTo(swiper.slides.length - 1);
   3153         }
   3154         return;
   3155       }
   3156 
   3157       if (params.freeModeMomentum) {
   3158         if (data.velocities.length > 1) {
   3159           var lastMoveEvent = data.velocities.pop();
   3160           var velocityEvent = data.velocities.pop();
   3161 
   3162           var distance = lastMoveEvent.position - velocityEvent.position;
   3163           var time = lastMoveEvent.time - velocityEvent.time;
   3164           swiper.velocity = distance / time;
   3165           swiper.velocity /= 2;
   3166           if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) {
   3167             swiper.velocity = 0;
   3168           }
   3169           // this implies that the user stopped moving a finger then released.
   3170           // There would be no events with distance zero, so the last event is stale.
   3171           if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) {
   3172             swiper.velocity = 0;
   3173           }
   3174         } else {
   3175           swiper.velocity = 0;
   3176         }
   3177         swiper.velocity *= params.freeModeMomentumVelocityRatio;
   3178 
   3179         data.velocities.length = 0;
   3180         var momentumDuration = 1000 * params.freeModeMomentumRatio;
   3181         var momentumDistance = swiper.velocity * momentumDuration;
   3182 
   3183         var newPosition = swiper.translate + momentumDistance;
   3184         if (rtl) { newPosition = -newPosition; }
   3185 
   3186         var doBounce = false;
   3187         var afterBouncePosition;
   3188         var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio;
   3189         var needsLoopFix;
   3190         if (newPosition < swiper.maxTranslate()) {
   3191           if (params.freeModeMomentumBounce) {
   3192             if (newPosition + swiper.maxTranslate() < -bounceAmount) {
   3193               newPosition = swiper.maxTranslate() - bounceAmount;
   3194             }
   3195             afterBouncePosition = swiper.maxTranslate();
   3196             doBounce = true;
   3197             data.allowMomentumBounce = true;
   3198           } else {
   3199             newPosition = swiper.maxTranslate();
   3200           }
   3201           if (params.loop && params.centeredSlides) { needsLoopFix = true; }
   3202         } else if (newPosition > swiper.minTranslate()) {
   3203           if (params.freeModeMomentumBounce) {
   3204             if (newPosition - swiper.minTranslate() > bounceAmount) {
   3205               newPosition = swiper.minTranslate() + bounceAmount;
   3206             }
   3207             afterBouncePosition = swiper.minTranslate();
   3208             doBounce = true;
   3209             data.allowMomentumBounce = true;
   3210           } else {
   3211             newPosition = swiper.minTranslate();
   3212           }
   3213           if (params.loop && params.centeredSlides) { needsLoopFix = true; }
   3214         } else if (params.freeModeSticky) {
   3215           var nextSlide;
   3216           for (var j = 0; j < snapGrid.length; j += 1) {
   3217             if (snapGrid[j] > -newPosition) {
   3218               nextSlide = j;
   3219               break;
   3220             }
   3221           }
   3222 
   3223           if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {
   3224             newPosition = snapGrid[nextSlide];
   3225           } else {
   3226             newPosition = snapGrid[nextSlide - 1];
   3227           }
   3228           newPosition = -newPosition;
   3229         }
   3230         if (needsLoopFix) {
   3231           swiper.once('transitionEnd', function () {
   3232             swiper.loopFix();
   3233           });
   3234         }
   3235         // Fix duration
   3236         if (swiper.velocity !== 0) {
   3237           if (rtl) {
   3238             momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
   3239           } else {
   3240             momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
   3241           }
   3242           if (params.freeModeSticky) {
   3243             // If freeModeSticky is active and the user ends a swipe with a slow-velocity
   3244             // event, then durations can be 20+ seconds to slide one (or zero!) slides.
   3245             // It's easy to see this when simulating touch with mouse events. To fix this,
   3246             // limit single-slide swipes to the default slide duration. This also has the
   3247             // nice side effect of matching slide speed if the user stopped moving before
   3248             // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.
   3249             // For faster swipes, also apply limits (albeit higher ones).
   3250             var moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);
   3251             var currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];
   3252             if (moveDistance < currentSlideSize) {
   3253               momentumDuration = params.speed;
   3254             } else if (moveDistance < 2 * currentSlideSize) {
   3255               momentumDuration = params.speed * 1.5;
   3256             } else {
   3257               momentumDuration = params.speed * 2.5;
   3258             }
   3259           }
   3260         } else if (params.freeModeSticky) {
   3261           swiper.slideToClosest();
   3262           return;
   3263         }
   3264 
   3265         if (params.freeModeMomentumBounce && doBounce) {
   3266           swiper.updateProgress(afterBouncePosition);
   3267           swiper.setTransition(momentumDuration);
   3268           swiper.setTranslate(newPosition);
   3269           swiper.transitionStart(true, swiper.swipeDirection);
   3270           swiper.animating = true;
   3271           $wrapperEl.transitionEnd(function () {
   3272             if (!swiper || swiper.destroyed || !data.allowMomentumBounce) { return; }
   3273             swiper.emit('momentumBounce');
   3274 
   3275             swiper.setTransition(params.speed);
   3276             swiper.setTranslate(afterBouncePosition);
   3277             $wrapperEl.transitionEnd(function () {
   3278               if (!swiper || swiper.destroyed) { return; }
   3279               swiper.transitionEnd();
   3280             });
   3281           });
   3282         } else if (swiper.velocity) {
   3283           swiper.updateProgress(newPosition);
   3284           swiper.setTransition(momentumDuration);
   3285           swiper.setTranslate(newPosition);
   3286           swiper.transitionStart(true, swiper.swipeDirection);
   3287           if (!swiper.animating) {
   3288             swiper.animating = true;
   3289             $wrapperEl.transitionEnd(function () {
   3290               if (!swiper || swiper.destroyed) { return; }
   3291               swiper.transitionEnd();
   3292             });
   3293           }
   3294         } else {
   3295           swiper.updateProgress(newPosition);
   3296         }
   3297 
   3298         swiper.updateActiveIndex();
   3299         swiper.updateSlidesClasses();
   3300       } else if (params.freeModeSticky) {
   3301         swiper.slideToClosest();
   3302         return;
   3303       }
   3304 
   3305       if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) {
   3306         swiper.updateProgress();
   3307         swiper.updateActiveIndex();
   3308         swiper.updateSlidesClasses();
   3309       }
   3310       return;
   3311     }
   3312 
   3313     // Find current slide
   3314     var stopIndex = 0;
   3315     var groupSize = swiper.slidesSizesGrid[0];
   3316     for (var i = 0; i < slidesGrid.length; i += (i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup)) {
   3317       var increment$1 = (i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup);
   3318       if (typeof slidesGrid[i + increment$1] !== 'undefined') {
   3319         if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment$1]) {
   3320           stopIndex = i;
   3321           groupSize = slidesGrid[i + increment$1] - slidesGrid[i];
   3322         }
   3323       } else if (currentPos >= slidesGrid[i]) {
   3324         stopIndex = i;
   3325         groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
   3326       }
   3327     }
   3328 
   3329     // Find current slide size
   3330     var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
   3331     var increment = (stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup);
   3332 
   3333     if (timeDiff > params.longSwipesMs) {
   3334       // Long touches
   3335       if (!params.longSwipes) {
   3336         swiper.slideTo(swiper.activeIndex);
   3337         return;
   3338       }
   3339       if (swiper.swipeDirection === 'next') {
   3340         if (ratio >= params.longSwipesRatio) { swiper.slideTo(stopIndex + increment); }
   3341         else { swiper.slideTo(stopIndex); }
   3342       }
   3343       if (swiper.swipeDirection === 'prev') {
   3344         if (ratio > (1 - params.longSwipesRatio)) { swiper.slideTo(stopIndex + increment); }
   3345         else { swiper.slideTo(stopIndex); }
   3346       }
   3347     } else {
   3348       // Short swipes
   3349       if (!params.shortSwipes) {
   3350         swiper.slideTo(swiper.activeIndex);
   3351         return;
   3352       }
   3353       var isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
   3354       if (!isNavButtonTarget) {
   3355         if (swiper.swipeDirection === 'next') {
   3356           swiper.slideTo(stopIndex + increment);
   3357         }
   3358         if (swiper.swipeDirection === 'prev') {
   3359           swiper.slideTo(stopIndex);
   3360         }
   3361       } else if (e.target === swiper.navigation.nextEl) {
   3362         swiper.slideTo(stopIndex + increment);
   3363       } else {
   3364         swiper.slideTo(stopIndex);
   3365       }
   3366     }
   3367   }
   3368 
   3369   function onResize () {
   3370     var swiper = this;
   3371 
   3372     var params = swiper.params;
   3373     var el = swiper.el;
   3374 
   3375     if (el && el.offsetWidth === 0) { return; }
   3376 
   3377     // Breakpoints
   3378     if (params.breakpoints) {
   3379       swiper.setBreakpoint();
   3380     }
   3381 
   3382     // Save locks
   3383     var allowSlideNext = swiper.allowSlideNext;
   3384     var allowSlidePrev = swiper.allowSlidePrev;
   3385     var snapGrid = swiper.snapGrid;
   3386 
   3387     // Disable locks on resize
   3388     swiper.allowSlideNext = true;
   3389     swiper.allowSlidePrev = true;
   3390 
   3391     swiper.updateSize();
   3392     swiper.updateSlides();
   3393 
   3394     swiper.updateSlidesClasses();
   3395     if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
   3396       swiper.slideTo(swiper.slides.length - 1, 0, false, true);
   3397     } else {
   3398       swiper.slideTo(swiper.activeIndex, 0, false, true);
   3399     }
   3400 
   3401     if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
   3402       swiper.autoplay.run();
   3403     }
   3404     // Return locks after resize
   3405     swiper.allowSlidePrev = allowSlidePrev;
   3406     swiper.allowSlideNext = allowSlideNext;
   3407 
   3408     if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
   3409       swiper.checkOverflow();
   3410     }
   3411   }
   3412 
   3413   function onClick (e) {
   3414     var swiper = this;
   3415     if (!swiper.allowClick) {
   3416       if (swiper.params.preventClicks) { e.preventDefault(); }
   3417       if (swiper.params.preventClicksPropagation && swiper.animating) {
   3418         e.stopPropagation();
   3419         e.stopImmediatePropagation();
   3420       }
   3421     }
   3422   }
   3423 
   3424   function onScroll () {
   3425     var swiper = this;
   3426     var wrapperEl = swiper.wrapperEl;
   3427     swiper.previousTranslate = swiper.translate;
   3428     swiper.translate = swiper.isHorizontal() ? -wrapperEl.scrollLeft : -wrapperEl.scrollTop;
   3429     // eslint-disable-next-line
   3430     if (swiper.translate === -0) { swiper.translate = 0; }
   3431 
   3432     swiper.updateActiveIndex();
   3433     swiper.updateSlidesClasses();
   3434 
   3435     var newProgress;
   3436     var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
   3437     if (translatesDiff === 0) {
   3438       newProgress = 0;
   3439     } else {
   3440       newProgress = (swiper.translate - swiper.minTranslate()) / (translatesDiff);
   3441     }
   3442     if (newProgress !== swiper.progress) {
   3443       swiper.updateProgress(swiper.translate);
   3444     }
   3445 
   3446     swiper.emit('setTranslate', swiper.translate, false);
   3447   }
   3448 
   3449   var dummyEventAttached = false;
   3450   function dummyEventListener() {}
   3451 
   3452   function attachEvents() {
   3453     var swiper = this;
   3454     var params = swiper.params;
   3455     var touchEvents = swiper.touchEvents;
   3456     var el = swiper.el;
   3457     var wrapperEl = swiper.wrapperEl;
   3458 
   3459     swiper.onTouchStart = onTouchStart.bind(swiper);
   3460     swiper.onTouchMove = onTouchMove.bind(swiper);
   3461     swiper.onTouchEnd = onTouchEnd.bind(swiper);
   3462     if (params.cssMode) {
   3463       swiper.onScroll = onScroll.bind(swiper);
   3464     }
   3465 
   3466     swiper.onClick = onClick.bind(swiper);
   3467 
   3468     var capture = !!params.nested;
   3469 
   3470     // Touch Events
   3471     if (!Support.touch && Support.pointerEvents) {
   3472       el.addEventListener(touchEvents.start, swiper.onTouchStart, false);
   3473       doc.addEventListener(touchEvents.move, swiper.onTouchMove, capture);
   3474       doc.addEventListener(touchEvents.end, swiper.onTouchEnd, false);
   3475     } else {
   3476       if (Support.touch) {
   3477         var passiveListener = touchEvents.start === 'touchstart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
   3478         el.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
   3479         el.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture: capture } : capture);
   3480         el.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
   3481         if (touchEvents.cancel) {
   3482           el.addEventListener(touchEvents.cancel, swiper.onTouchEnd, passiveListener);
   3483         }
   3484         if (!dummyEventAttached) {
   3485           doc.addEventListener('touchstart', dummyEventListener);
   3486           dummyEventAttached = true;
   3487         }
   3488       }
   3489       if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
   3490         el.addEventListener('mousedown', swiper.onTouchStart, false);
   3491         doc.addEventListener('mousemove', swiper.onTouchMove, capture);
   3492         doc.addEventListener('mouseup', swiper.onTouchEnd, false);
   3493       }
   3494     }
   3495     // Prevent Links Clicks
   3496     if (params.preventClicks || params.preventClicksPropagation) {
   3497       el.addEventListener('click', swiper.onClick, true);
   3498     }
   3499     if (params.cssMode) {
   3500       wrapperEl.addEventListener('scroll', swiper.onScroll);
   3501     }
   3502 
   3503     // Resize handler
   3504     if (params.updateOnWindowResize) {
   3505       swiper.on((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize, true);
   3506     } else {
   3507       swiper.on('observerUpdate', onResize, true);
   3508     }
   3509   }
   3510 
   3511   function detachEvents() {
   3512     var swiper = this;
   3513 
   3514     var params = swiper.params;
   3515     var touchEvents = swiper.touchEvents;
   3516     var el = swiper.el;
   3517     var wrapperEl = swiper.wrapperEl;
   3518 
   3519     var capture = !!params.nested;
   3520 
   3521     // Touch Events
   3522     if (!Support.touch && Support.pointerEvents) {
   3523       el.removeEventListener(touchEvents.start, swiper.onTouchStart, false);
   3524       doc.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
   3525       doc.removeEventListener(touchEvents.end, swiper.onTouchEnd, false);
   3526     } else {
   3527       if (Support.touch) {
   3528         var passiveListener = touchEvents.start === 'onTouchStart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
   3529         el.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
   3530         el.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
   3531         el.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
   3532         if (touchEvents.cancel) {
   3533           el.removeEventListener(touchEvents.cancel, swiper.onTouchEnd, passiveListener);
   3534         }
   3535       }
   3536       if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
   3537         el.removeEventListener('mousedown', swiper.onTouchStart, false);
   3538         doc.removeEventListener('mousemove', swiper.onTouchMove, capture);
   3539         doc.removeEventListener('mouseup', swiper.onTouchEnd, false);
   3540       }
   3541     }
   3542     // Prevent Links Clicks
   3543     if (params.preventClicks || params.preventClicksPropagation) {
   3544       el.removeEventListener('click', swiper.onClick, true);
   3545     }
   3546 
   3547     if (params.cssMode) {
   3548       wrapperEl.removeEventListener('scroll', swiper.onScroll);
   3549     }
   3550 
   3551     // Resize handler
   3552     swiper.off((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize);
   3553   }
   3554 
   3555   var events = {
   3556     attachEvents: attachEvents,
   3557     detachEvents: detachEvents,
   3558   };
   3559 
   3560   function setBreakpoint () {
   3561     var swiper = this;
   3562     var activeIndex = swiper.activeIndex;
   3563     var initialized = swiper.initialized;
   3564     var loopedSlides = swiper.loopedSlides; if ( loopedSlides === void 0 ) loopedSlides = 0;
   3565     var params = swiper.params;
   3566     var $el = swiper.$el;
   3567     var breakpoints = params.breakpoints;
   3568     if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) { return; }
   3569 
   3570     // Get breakpoint for window width and update parameters
   3571     var breakpoint = swiper.getBreakpoint(breakpoints);
   3572 
   3573     if (breakpoint && swiper.currentBreakpoint !== breakpoint) {
   3574       var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
   3575       if (breakpointOnlyParams) {
   3576         ['slidesPerView', 'spaceBetween', 'slidesPerGroup', 'slidesPerGroupSkip', 'slidesPerColumn'].forEach(function (param) {
   3577           var paramValue = breakpointOnlyParams[param];
   3578           if (typeof paramValue === 'undefined') { return; }
   3579           if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) {
   3580             breakpointOnlyParams[param] = 'auto';
   3581           } else if (param === 'slidesPerView') {
   3582             breakpointOnlyParams[param] = parseFloat(paramValue);
   3583           } else {
   3584             breakpointOnlyParams[param] = parseInt(paramValue, 10);
   3585           }
   3586         });
   3587       }
   3588 
   3589       var breakpointParams = breakpointOnlyParams || swiper.originalParams;
   3590       var wasMultiRow = params.slidesPerColumn > 1;
   3591       var isMultiRow = breakpointParams.slidesPerColumn > 1;
   3592       if (wasMultiRow && !isMultiRow) {
   3593         $el.removeClass(((params.containerModifierClass) + "multirow " + (params.containerModifierClass) + "multirow-column"));
   3594       } else if (!wasMultiRow && isMultiRow) {
   3595         $el.addClass(((params.containerModifierClass) + "multirow"));
   3596         if (breakpointParams.slidesPerColumnFill === 'column') {
   3597           $el.addClass(((params.containerModifierClass) + "multirow-column"));
   3598         }
   3599       }
   3600 
   3601       var directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
   3602       var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
   3603 
   3604       if (directionChanged && initialized) {
   3605         swiper.changeDirection();
   3606       }
   3607 
   3608       Utils.extend(swiper.params, breakpointParams);
   3609 
   3610       Utils.extend(swiper, {
   3611         allowTouchMove: swiper.params.allowTouchMove,
   3612         allowSlideNext: swiper.params.allowSlideNext,
   3613         allowSlidePrev: swiper.params.allowSlidePrev,
   3614       });
   3615 
   3616       swiper.currentBreakpoint = breakpoint;
   3617 
   3618       if (needsReLoop && initialized) {
   3619         swiper.loopDestroy();
   3620         swiper.loopCreate();
   3621         swiper.updateSlides();
   3622         swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false);
   3623       }
   3624 
   3625       swiper.emit('breakpoint', breakpointParams);
   3626     }
   3627   }
   3628 
   3629   function getBreakpoint (breakpoints) {
   3630     // Get breakpoint for window width
   3631     if (!breakpoints) { return undefined; }
   3632     var breakpoint = false;
   3633 
   3634     var points = Object.keys(breakpoints).map(function (point) {
   3635       if (typeof point === 'string' && point.indexOf('@') === 0) {
   3636         var minRatio = parseFloat(point.substr(1));
   3637         var value = win.innerHeight * minRatio;
   3638         return { value: value, point: point };
   3639       }
   3640       return { value: point, point: point };
   3641     });
   3642 
   3643     points.sort(function (a, b) { return parseInt(a.value, 10) - parseInt(b.value, 10); });
   3644     for (var i = 0; i < points.length; i += 1) {
   3645       var ref = points[i];
   3646       var point = ref.point;
   3647       var value = ref.value;
   3648       if (value <= win.innerWidth) {
   3649         breakpoint = point;
   3650       }
   3651     }
   3652     return breakpoint || 'max';
   3653   }
   3654 
   3655   var breakpoints = { setBreakpoint: setBreakpoint, getBreakpoint: getBreakpoint };
   3656 
   3657   function addClasses () {
   3658     var swiper = this;
   3659     var classNames = swiper.classNames;
   3660     var params = swiper.params;
   3661     var rtl = swiper.rtl;
   3662     var $el = swiper.$el;
   3663     var suffixes = [];
   3664 
   3665     suffixes.push('initialized');
   3666     suffixes.push(params.direction);
   3667 
   3668     if (params.freeMode) {
   3669       suffixes.push('free-mode');
   3670     }
   3671     if (params.autoHeight) {
   3672       suffixes.push('autoheight');
   3673     }
   3674     if (rtl) {
   3675       suffixes.push('rtl');
   3676     }
   3677     if (params.slidesPerColumn > 1) {
   3678       suffixes.push('multirow');
   3679       if (params.slidesPerColumnFill === 'column') {
   3680         suffixes.push('multirow-column');
   3681       }
   3682     }
   3683     if (Device.android) {
   3684       suffixes.push('android');
   3685     }
   3686     if (Device.ios) {
   3687       suffixes.push('ios');
   3688     }
   3689 
   3690     if (params.cssMode) {
   3691       suffixes.push('css-mode');
   3692     }
   3693 
   3694     suffixes.forEach(function (suffix) {
   3695       classNames.push(params.containerModifierClass + suffix);
   3696     });
   3697 
   3698     $el.addClass(classNames.join(' '));
   3699   }
   3700 
   3701   function removeClasses () {
   3702     var swiper = this;
   3703     var $el = swiper.$el;
   3704     var classNames = swiper.classNames;
   3705 
   3706     $el.removeClass(classNames.join(' '));
   3707   }
   3708 
   3709   var classes = { addClasses: addClasses, removeClasses: removeClasses };
   3710 
   3711   function loadImage (imageEl, src, srcset, sizes, checkForComplete, callback) {
   3712     var image;
   3713     function onReady() {
   3714       if (callback) { callback(); }
   3715     }
   3716     if (!imageEl.complete || !checkForComplete) {
   3717       if (src) {
   3718         image = new win.Image();
   3719         image.onload = onReady;
   3720         image.onerror = onReady;
   3721         if (sizes) {
   3722           image.sizes = sizes;
   3723         }
   3724         if (srcset) {
   3725           image.srcset = srcset;
   3726         }
   3727         if (src) {
   3728           image.src = src;
   3729         }
   3730       } else {
   3731         onReady();
   3732       }
   3733     } else {
   3734       // image already loaded...
   3735       onReady();
   3736     }
   3737   }
   3738 
   3739   function preloadImages () {
   3740     var swiper = this;
   3741     swiper.imagesToLoad = swiper.$el.find('img');
   3742     function onReady() {
   3743       if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) { return; }
   3744       if (swiper.imagesLoaded !== undefined) { swiper.imagesLoaded += 1; }
   3745       if (swiper.imagesLoaded === swiper.imagesToLoad.length) {
   3746         if (swiper.params.updateOnImagesReady) { swiper.update(); }
   3747         swiper.emit('imagesReady');
   3748       }
   3749     }
   3750     for (var i = 0; i < swiper.imagesToLoad.length; i += 1) {
   3751       var imageEl = swiper.imagesToLoad[i];
   3752       swiper.loadImage(
   3753         imageEl,
   3754         imageEl.currentSrc || imageEl.getAttribute('src'),
   3755         imageEl.srcset || imageEl.getAttribute('srcset'),
   3756         imageEl.sizes || imageEl.getAttribute('sizes'),
   3757         true,
   3758         onReady
   3759       );
   3760     }
   3761   }
   3762 
   3763   var images = {
   3764     loadImage: loadImage,
   3765     preloadImages: preloadImages,
   3766   };
   3767 
   3768   function checkOverflow() {
   3769     var swiper = this;
   3770     var params = swiper.params;
   3771     var wasLocked = swiper.isLocked;
   3772     var lastSlidePosition = swiper.slides.length > 0 && (params.slidesOffsetBefore + (params.spaceBetween * (swiper.slides.length - 1)) + ((swiper.slides[0]).offsetWidth) * swiper.slides.length);
   3773 
   3774     if (params.slidesOffsetBefore && params.slidesOffsetAfter && lastSlidePosition) {
   3775       swiper.isLocked = lastSlidePosition <= swiper.size;
   3776     } else {
   3777       swiper.isLocked = swiper.snapGrid.length === 1;
   3778     }
   3779 
   3780     swiper.allowSlideNext = !swiper.isLocked;
   3781     swiper.allowSlidePrev = !swiper.isLocked;
   3782 
   3783     // events
   3784     if (wasLocked !== swiper.isLocked) { swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); }
   3785 
   3786     if (wasLocked && wasLocked !== swiper.isLocked) {
   3787       swiper.isEnd = false;
   3788       swiper.navigation.update();
   3789     }
   3790   }
   3791 
   3792   var checkOverflow$1 = { checkOverflow: checkOverflow };
   3793 
   3794   var defaults = {
   3795     init: true,
   3796     direction: 'horizontal',
   3797     touchEventsTarget: 'container',
   3798     initialSlide: 0,
   3799     speed: 300,
   3800     cssMode: false,
   3801     updateOnWindowResize: true,
   3802     //
   3803     preventInteractionOnTransition: false,
   3804 
   3805     // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView).
   3806     edgeSwipeDetection: false,
   3807     edgeSwipeThreshold: 20,
   3808 
   3809     // Free mode
   3810     freeMode: false,
   3811     freeModeMomentum: true,
   3812     freeModeMomentumRatio: 1,
   3813     freeModeMomentumBounce: true,
   3814     freeModeMomentumBounceRatio: 1,
   3815     freeModeMomentumVelocityRatio: 1,
   3816     freeModeSticky: false,
   3817     freeModeMinimumVelocity: 0.02,
   3818 
   3819     // Autoheight
   3820     autoHeight: false,
   3821 
   3822     // Set wrapper width
   3823     setWrapperSize: false,
   3824 
   3825     // Virtual Translate
   3826     virtualTranslate: false,
   3827 
   3828     // Effects
   3829     effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
   3830 
   3831     // Breakpoints
   3832     breakpoints: undefined,
   3833 
   3834     // Slides grid
   3835     spaceBetween: 0,
   3836     slidesPerView: 1,
   3837     slidesPerColumn: 1,
   3838     slidesPerColumnFill: 'column',
   3839     slidesPerGroup: 1,
   3840     slidesPerGroupSkip: 0,
   3841     centeredSlides: false,
   3842     centeredSlidesBounds: false,
   3843     slidesOffsetBefore: 0, // in px
   3844     slidesOffsetAfter: 0, // in px
   3845     normalizeSlideIndex: true,
   3846     centerInsufficientSlides: false,
   3847 
   3848     // Disable swiper and hide navigation when container not overflow
   3849     watchOverflow: false,
   3850 
   3851     // Round length
   3852     roundLengths: false,
   3853 
   3854     // Touches
   3855     touchRatio: 1,
   3856     touchAngle: 45,
   3857     simulateTouch: true,
   3858     shortSwipes: true,
   3859     longSwipes: true,
   3860     longSwipesRatio: 0.5,
   3861     longSwipesMs: 300,
   3862     followFinger: true,
   3863     allowTouchMove: true,
   3864     threshold: 0,
   3865     touchMoveStopPropagation: false,
   3866     touchStartPreventDefault: true,
   3867     touchStartForcePreventDefault: false,
   3868     touchReleaseOnEdges: false,
   3869 
   3870     // Unique Navigation Elements
   3871     uniqueNavElements: true,
   3872 
   3873     // Resistance
   3874     resistance: true,
   3875     resistanceRatio: 0.85,
   3876 
   3877     // Progress
   3878     watchSlidesProgress: false,
   3879     watchSlidesVisibility: false,
   3880 
   3881     // Cursor
   3882     grabCursor: false,
   3883 
   3884     // Clicks
   3885     preventClicks: true,
   3886     preventClicksPropagation: true,
   3887     slideToClickedSlide: false,
   3888 
   3889     // Images
   3890     preloadImages: true,
   3891     updateOnImagesReady: true,
   3892 
   3893     // loop
   3894     loop: false,
   3895     loopAdditionalSlides: 0,
   3896     loopedSlides: null,
   3897     loopFillGroupWithBlank: false,
   3898 
   3899     // Swiping/no swiping
   3900     allowSlidePrev: true,
   3901     allowSlideNext: true,
   3902     swipeHandler: null, // '.swipe-handler',
   3903     noSwiping: true,
   3904     noSwipingClass: 'swiper-no-swiping',
   3905     noSwipingSelector: null,
   3906 
   3907     // Passive Listeners
   3908     passiveListeners: true,
   3909 
   3910     // NS
   3911     containerModifierClass: 'swiper-container-', // NEW
   3912     slideClass: 'swiper-slide',
   3913     slideBlankClass: 'swiper-slide-invisible-blank',
   3914     slideActiveClass: 'swiper-slide-active',
   3915     slideDuplicateActiveClass: 'swiper-slide-duplicate-active',
   3916     slideVisibleClass: 'swiper-slide-visible',
   3917     slideDuplicateClass: 'swiper-slide-duplicate',
   3918     slideNextClass: 'swiper-slide-next',
   3919     slideDuplicateNextClass: 'swiper-slide-duplicate-next',
   3920     slidePrevClass: 'swiper-slide-prev',
   3921     slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',
   3922     wrapperClass: 'swiper-wrapper',
   3923 
   3924     // Callbacks
   3925     runCallbacksOnInit: true,
   3926   };
   3927 
   3928   /* eslint no-param-reassign: "off" */
   3929 
   3930   var prototypes = {
   3931     update: update,
   3932     translate: translate,
   3933     transition: transition$1,
   3934     slide: slide,
   3935     loop: loop,
   3936     grabCursor: grabCursor,
   3937     manipulation: manipulation,
   3938     events: events,
   3939     breakpoints: breakpoints,
   3940     checkOverflow: checkOverflow$1,
   3941     classes: classes,
   3942     images: images,
   3943   };
   3944 
   3945   var extendedDefaults = {};
   3946 
   3947   var Swiper = /*@__PURE__*/(function (SwiperClass) {
   3948     function Swiper() {
   3949       var assign;
   3950 
   3951       var args = [], len = arguments.length;
   3952       while ( len-- ) args[ len ] = arguments[ len ];
   3953       var el;
   3954       var params;
   3955       if (args.length === 1 && args[0].constructor && args[0].constructor === Object) {
   3956         params = args[0];
   3957       } else {
   3958         (assign = args, el = assign[0], params = assign[1]);
   3959       }
   3960       if (!params) { params = {}; }
   3961 
   3962       params = Utils.extend({}, params);
   3963       if (el && !params.el) { params.el = el; }
   3964 
   3965       SwiperClass.call(this, params);
   3966 
   3967       Object.keys(prototypes).forEach(function (prototypeGroup) {
   3968         Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) {
   3969           if (!Swiper.prototype[protoMethod]) {
   3970             Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
   3971           }
   3972         });
   3973       });
   3974 
   3975       // Swiper Instance
   3976       var swiper = this;
   3977       if (typeof swiper.modules === 'undefined') {
   3978         swiper.modules = {};
   3979       }
   3980       Object.keys(swiper.modules).forEach(function (moduleName) {
   3981         var module = swiper.modules[moduleName];
   3982         if (module.params) {
   3983           var moduleParamName = Object.keys(module.params)[0];
   3984           var moduleParams = module.params[moduleParamName];
   3985           if (typeof moduleParams !== 'object' || moduleParams === null) { return; }
   3986           if (!(moduleParamName in params && 'enabled' in moduleParams)) { return; }
   3987           if (params[moduleParamName] === true) {
   3988             params[moduleParamName] = { enabled: true };
   3989           }
   3990           if (
   3991             typeof params[moduleParamName] === 'object'
   3992             && !('enabled' in params[moduleParamName])
   3993           ) {
   3994             params[moduleParamName].enabled = true;
   3995           }
   3996           if (!params[moduleParamName]) { params[moduleParamName] = { enabled: false }; }
   3997         }
   3998       });
   3999 
   4000       // Extend defaults with modules params
   4001       var swiperParams = Utils.extend({}, defaults);
   4002       swiper.useModulesParams(swiperParams);
   4003 
   4004       // Extend defaults with passed params
   4005       swiper.params = Utils.extend({}, swiperParams, extendedDefaults, params);
   4006       swiper.originalParams = Utils.extend({}, swiper.params);
   4007       swiper.passedParams = Utils.extend({}, params);
   4008 
   4009       // Save Dom lib
   4010       swiper.$ = $;
   4011 
   4012       // Find el
   4013       var $el = $(swiper.params.el);
   4014       el = $el[0];
   4015 
   4016       if (!el) {
   4017         return undefined;
   4018       }
   4019 
   4020       if ($el.length > 1) {
   4021         var swipers = [];
   4022         $el.each(function (index, containerEl) {
   4023           var newParams = Utils.extend({}, params, { el: containerEl });
   4024           swipers.push(new Swiper(newParams));
   4025         });
   4026         return swipers;
   4027       }
   4028 
   4029       el.swiper = swiper;
   4030       $el.data('swiper', swiper);
   4031 
   4032       // Find Wrapper
   4033       var $wrapperEl;
   4034       if (el && el.shadowRoot && el.shadowRoot.querySelector) {
   4035         $wrapperEl = $(el.shadowRoot.querySelector(("." + (swiper.params.wrapperClass))));
   4036         // Children needs to return slot items
   4037         $wrapperEl.children = function (options) { return $el.children(options); };
   4038       } else {
   4039         $wrapperEl = $el.children(("." + (swiper.params.wrapperClass)));
   4040       }
   4041       // Extend Swiper
   4042       Utils.extend(swiper, {
   4043         $el: $el,
   4044         el: el,
   4045         $wrapperEl: $wrapperEl,
   4046         wrapperEl: $wrapperEl[0],
   4047 
   4048         // Classes
   4049         classNames: [],
   4050 
   4051         // Slides
   4052         slides: $(),
   4053         slidesGrid: [],
   4054         snapGrid: [],
   4055         slidesSizesGrid: [],
   4056 
   4057         // isDirection
   4058         isHorizontal: function isHorizontal() {
   4059           return swiper.params.direction === 'horizontal';
   4060         },
   4061         isVertical: function isVertical() {
   4062           return swiper.params.direction === 'vertical';
   4063         },
   4064         // RTL
   4065         rtl: (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
   4066         rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
   4067         wrongRTL: $wrapperEl.css('display') === '-webkit-box',
   4068 
   4069         // Indexes
   4070         activeIndex: 0,
   4071         realIndex: 0,
   4072 
   4073         //
   4074         isBeginning: true,
   4075         isEnd: false,
   4076 
   4077         // Props
   4078         translate: 0,
   4079         previousTranslate: 0,
   4080         progress: 0,
   4081         velocity: 0,
   4082         animating: false,
   4083 
   4084         // Locks
   4085         allowSlideNext: swiper.params.allowSlideNext,
   4086         allowSlidePrev: swiper.params.allowSlidePrev,
   4087 
   4088         // Touch Events
   4089         touchEvents: (function touchEvents() {
   4090           var touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];
   4091           var desktop = ['mousedown', 'mousemove', 'mouseup'];
   4092           if (Support.pointerEvents) {
   4093             desktop = ['pointerdown', 'pointermove', 'pointerup'];
   4094           }
   4095           swiper.touchEventsTouch = {
   4096             start: touch[0],
   4097             move: touch[1],
   4098             end: touch[2],
   4099             cancel: touch[3],
   4100           };
   4101           swiper.touchEventsDesktop = {
   4102             start: desktop[0],
   4103             move: desktop[1],
   4104             end: desktop[2],
   4105           };
   4106           return Support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;
   4107         }()),
   4108         touchEventsData: {
   4109           isTouched: undefined,
   4110           isMoved: undefined,
   4111           allowTouchCallbacks: undefined,
   4112           touchStartTime: undefined,
   4113           isScrolling: undefined,
   4114           currentTranslate: undefined,
   4115           startTranslate: undefined,
   4116           allowThresholdMove: undefined,
   4117           // Form elements to match
   4118           formElements: 'input, select, option, textarea, button, video, label',
   4119           // Last click time
   4120           lastClickTime: Utils.now(),
   4121           clickTimeout: undefined,
   4122           // Velocities
   4123           velocities: [],
   4124           allowMomentumBounce: undefined,
   4125           isTouchEvent: undefined,
   4126           startMoving: undefined,
   4127         },
   4128 
   4129         // Clicks
   4130         allowClick: true,
   4131 
   4132         // Touches
   4133         allowTouchMove: swiper.params.allowTouchMove,
   4134 
   4135         touches: {
   4136           startX: 0,
   4137           startY: 0,
   4138           currentX: 0,
   4139           currentY: 0,
   4140           diff: 0,
   4141         },
   4142 
   4143         // Images
   4144         imagesToLoad: [],
   4145         imagesLoaded: 0,
   4146 
   4147       });
   4148 
   4149       // Install Modules
   4150       swiper.useModules();
   4151 
   4152       // Init
   4153       if (swiper.params.init) {
   4154         swiper.init();
   4155       }
   4156 
   4157       // Return app instance
   4158       return swiper;
   4159     }
   4160 
   4161     if ( SwiperClass ) Swiper.__proto__ = SwiperClass;
   4162     Swiper.prototype = Object.create( SwiperClass && SwiperClass.prototype );
   4163     Swiper.prototype.constructor = Swiper;
   4164 
   4165     var staticAccessors = { extendedDefaults: { configurable: true },defaults: { configurable: true },Class: { configurable: true },$: { configurable: true } };
   4166 
   4167     Swiper.prototype.slidesPerViewDynamic = function slidesPerViewDynamic () {
   4168       var swiper = this;
   4169       var params = swiper.params;
   4170       var slides = swiper.slides;
   4171       var slidesGrid = swiper.slidesGrid;
   4172       var swiperSize = swiper.size;
   4173       var activeIndex = swiper.activeIndex;
   4174       var spv = 1;
   4175       if (params.centeredSlides) {
   4176         var slideSize = slides[activeIndex].swiperSlideSize;
   4177         var breakLoop;
   4178         for (var i = activeIndex + 1; i < slides.length; i += 1) {
   4179           if (slides[i] && !breakLoop) {
   4180             slideSize += slides[i].swiperSlideSize;
   4181             spv += 1;
   4182             if (slideSize > swiperSize) { breakLoop = true; }
   4183           }
   4184         }
   4185         for (var i$1 = activeIndex - 1; i$1 >= 0; i$1 -= 1) {
   4186           if (slides[i$1] && !breakLoop) {
   4187             slideSize += slides[i$1].swiperSlideSize;
   4188             spv += 1;
   4189             if (slideSize > swiperSize) { breakLoop = true; }
   4190           }
   4191         }
   4192       } else {
   4193         for (var i$2 = activeIndex + 1; i$2 < slides.length; i$2 += 1) {
   4194           if (slidesGrid[i$2] - slidesGrid[activeIndex] < swiperSize) {
   4195             spv += 1;
   4196           }
   4197         }
   4198       }
   4199       return spv;
   4200     };
   4201 
   4202     Swiper.prototype.update = function update () {
   4203       var swiper = this;
   4204       if (!swiper || swiper.destroyed) { return; }
   4205       var snapGrid = swiper.snapGrid;
   4206       var params = swiper.params;
   4207       // Breakpoints
   4208       if (params.breakpoints) {
   4209         swiper.setBreakpoint();
   4210       }
   4211       swiper.updateSize();
   4212       swiper.updateSlides();
   4213       swiper.updateProgress();
   4214       swiper.updateSlidesClasses();
   4215 
   4216       function setTranslate() {
   4217         var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
   4218         var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
   4219         swiper.setTranslate(newTranslate);
   4220         swiper.updateActiveIndex();
   4221         swiper.updateSlidesClasses();
   4222       }
   4223       var translated;
   4224       if (swiper.params.freeMode) {
   4225         setTranslate();
   4226         if (swiper.params.autoHeight) {
   4227           swiper.updateAutoHeight();
   4228         }
   4229       } else {
   4230         if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
   4231           translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);
   4232         } else {
   4233           translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
   4234         }
   4235         if (!translated) {
   4236           setTranslate();
   4237         }
   4238       }
   4239       if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
   4240         swiper.checkOverflow();
   4241       }
   4242       swiper.emit('update');
   4243     };
   4244 
   4245     Swiper.prototype.changeDirection = function changeDirection (newDirection, needUpdate) {
   4246       if ( needUpdate === void 0 ) needUpdate = true;
   4247 
   4248       var swiper = this;
   4249       var currentDirection = swiper.params.direction;
   4250       if (!newDirection) {
   4251         // eslint-disable-next-line
   4252         newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';
   4253       }
   4254       if ((newDirection === currentDirection) || (newDirection !== 'horizontal' && newDirection !== 'vertical')) {
   4255         return swiper;
   4256       }
   4257 
   4258       swiper.$el
   4259         .removeClass(("" + (swiper.params.containerModifierClass) + currentDirection))
   4260         .addClass(("" + (swiper.params.containerModifierClass) + newDirection));
   4261 
   4262       swiper.params.direction = newDirection;
   4263 
   4264       swiper.slides.each(function (slideIndex, slideEl) {
   4265         if (newDirection === 'vertical') {
   4266           slideEl.style.width = '';
   4267         } else {
   4268           slideEl.style.height = '';
   4269         }
   4270       });
   4271 
   4272       swiper.emit('changeDirection');
   4273       if (needUpdate) { swiper.update(); }
   4274 
   4275       return swiper;
   4276     };
   4277 
   4278     Swiper.prototype.init = function init () {
   4279       var swiper = this;
   4280       if (swiper.initialized) { return; }
   4281 
   4282       swiper.emit('beforeInit');
   4283 
   4284       // Set breakpoint
   4285       if (swiper.params.breakpoints) {
   4286         swiper.setBreakpoint();
   4287       }
   4288 
   4289       // Add Classes
   4290       swiper.addClasses();
   4291 
   4292       // Create loop
   4293       if (swiper.params.loop) {
   4294         swiper.loopCreate();
   4295       }
   4296 
   4297       // Update size
   4298       swiper.updateSize();
   4299 
   4300       // Update slides
   4301       swiper.updateSlides();
   4302 
   4303       if (swiper.params.watchOverflow) {
   4304         swiper.checkOverflow();
   4305       }
   4306 
   4307       // Set Grab Cursor
   4308       if (swiper.params.grabCursor) {
   4309         swiper.setGrabCursor();
   4310       }
   4311 
   4312       if (swiper.params.preloadImages) {
   4313         swiper.preloadImages();
   4314       }
   4315 
   4316       // Slide To Initial Slide
   4317       if (swiper.params.loop) {
   4318         swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit);
   4319       } else {
   4320         swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit);
   4321       }
   4322 
   4323       // Attach events
   4324       swiper.attachEvents();
   4325 
   4326       // Init Flag
   4327       swiper.initialized = true;
   4328 
   4329       // Emit
   4330       swiper.emit('init');
   4331     };
   4332 
   4333     Swiper.prototype.destroy = function destroy (deleteInstance, cleanStyles) {
   4334       if ( deleteInstance === void 0 ) deleteInstance = true;
   4335       if ( cleanStyles === void 0 ) cleanStyles = true;
   4336 
   4337       var swiper = this;
   4338       var params = swiper.params;
   4339       var $el = swiper.$el;
   4340       var $wrapperEl = swiper.$wrapperEl;
   4341       var slides = swiper.slides;
   4342 
   4343       if (typeof swiper.params === 'undefined' || swiper.destroyed) {
   4344         return null;
   4345       }
   4346 
   4347       swiper.emit('beforeDestroy');
   4348 
   4349       // Init Flag
   4350       swiper.initialized = false;
   4351 
   4352       // Detach events
   4353       swiper.detachEvents();
   4354 
   4355       // Destroy loop
   4356       if (params.loop) {
   4357         swiper.loopDestroy();
   4358       }
   4359 
   4360       // Cleanup styles
   4361       if (cleanStyles) {
   4362         swiper.removeClasses();
   4363         $el.removeAttr('style');
   4364         $wrapperEl.removeAttr('style');
   4365         if (slides && slides.length) {
   4366           slides
   4367             .removeClass([
   4368               params.slideVisibleClass,
   4369               params.slideActiveClass,
   4370               params.slideNextClass,
   4371               params.slidePrevClass ].join(' '))
   4372             .removeAttr('style')
   4373             .removeAttr('data-swiper-slide-index');
   4374         }
   4375       }
   4376 
   4377       swiper.emit('destroy');
   4378 
   4379       // Detach emitter events
   4380       Object.keys(swiper.eventsListeners).forEach(function (eventName) {
   4381         swiper.off(eventName);
   4382       });
   4383 
   4384       if (deleteInstance !== false) {
   4385         swiper.$el[0].swiper = null;
   4386         swiper.$el.data('swiper', null);
   4387         Utils.deleteProps(swiper);
   4388       }
   4389       swiper.destroyed = true;
   4390 
   4391       return null;
   4392     };
   4393 
   4394     Swiper.extendDefaults = function extendDefaults (newDefaults) {
   4395       Utils.extend(extendedDefaults, newDefaults);
   4396     };
   4397 
   4398     staticAccessors.extendedDefaults.get = function () {
   4399       return extendedDefaults;
   4400     };
   4401 
   4402     staticAccessors.defaults.get = function () {
   4403       return defaults;
   4404     };
   4405 
   4406     staticAccessors.Class.get = function () {
   4407       return SwiperClass;
   4408     };
   4409 
   4410     staticAccessors.$.get = function () {
   4411       return $;
   4412     };
   4413 
   4414     Object.defineProperties( Swiper, staticAccessors );
   4415 
   4416     return Swiper;
   4417   }(SwiperClass));
   4418 
   4419   var Device$1 = {
   4420     name: 'device',
   4421     proto: {
   4422       device: Device,
   4423     },
   4424     static: {
   4425       device: Device,
   4426     },
   4427   };
   4428 
   4429   var Support$1 = {
   4430     name: 'support',
   4431     proto: {
   4432       support: Support,
   4433     },
   4434     static: {
   4435       support: Support,
   4436     },
   4437   };
   4438 
   4439   var Browser = (function Browser() {
   4440     function isSafari() {
   4441       var ua = win.navigator.userAgent.toLowerCase();
   4442       return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0);
   4443     }
   4444     return {
   4445       isEdge: !!win.navigator.userAgent.match(/Edge/g),
   4446       isSafari: isSafari(),
   4447       isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(win.navigator.userAgent),
   4448     };
   4449   }());
   4450 
   4451   var Browser$1 = {
   4452     name: 'browser',
   4453     proto: {
   4454       browser: Browser,
   4455     },
   4456     static: {
   4457       browser: Browser,
   4458     },
   4459   };
   4460 
   4461   var Resize = {
   4462     name: 'resize',
   4463     create: function create() {
   4464       var swiper = this;
   4465       Utils.extend(swiper, {
   4466         resize: {
   4467           resizeHandler: function resizeHandler() {
   4468             if (!swiper || swiper.destroyed || !swiper.initialized) { return; }
   4469             swiper.emit('beforeResize');
   4470             swiper.emit('resize');
   4471           },
   4472           orientationChangeHandler: function orientationChangeHandler() {
   4473             if (!swiper || swiper.destroyed || !swiper.initialized) { return; }
   4474             swiper.emit('orientationchange');
   4475           },
   4476         },
   4477       });
   4478     },
   4479     on: {
   4480       init: function init() {
   4481         var swiper = this;
   4482         // Emit resize
   4483         win.addEventListener('resize', swiper.resize.resizeHandler);
   4484 
   4485         // Emit orientationchange
   4486         win.addEventListener('orientationchange', swiper.resize.orientationChangeHandler);
   4487       },
   4488       destroy: function destroy() {
   4489         var swiper = this;
   4490         win.removeEventListener('resize', swiper.resize.resizeHandler);
   4491         win.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler);
   4492       },
   4493     },
   4494   };
   4495 
   4496   var Observer = {
   4497     func: win.MutationObserver || win.WebkitMutationObserver,
   4498     attach: function attach(target, options) {
   4499       if ( options === void 0 ) options = {};
   4500 
   4501       var swiper = this;
   4502 
   4503       var ObserverFunc = Observer.func;
   4504       var observer = new ObserverFunc(function (mutations) {
   4505         // The observerUpdate event should only be triggered
   4506         // once despite the number of mutations.  Additional
   4507         // triggers are redundant and are very costly
   4508         if (mutations.length === 1) {
   4509           swiper.emit('observerUpdate', mutations[0]);
   4510           return;
   4511         }
   4512         var observerUpdate = function observerUpdate() {
   4513           swiper.emit('observerUpdate', mutations[0]);
   4514         };
   4515 
   4516         if (win.requestAnimationFrame) {
   4517           win.requestAnimationFrame(observerUpdate);
   4518         } else {
   4519           win.setTimeout(observerUpdate, 0);
   4520         }
   4521       });
   4522 
   4523       observer.observe(target, {
   4524         attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
   4525         childList: typeof options.childList === 'undefined' ? true : options.childList,
   4526         characterData: typeof options.characterData === 'undefined' ? true : options.characterData,
   4527       });
   4528 
   4529       swiper.observer.observers.push(observer);
   4530     },
   4531     init: function init() {
   4532       var swiper = this;
   4533       if (!Support.observer || !swiper.params.observer) { return; }
   4534       if (swiper.params.observeParents) {
   4535         var containerParents = swiper.$el.parents();
   4536         for (var i = 0; i < containerParents.length; i += 1) {
   4537           swiper.observer.attach(containerParents[i]);
   4538         }
   4539       }
   4540       // Observe container
   4541       swiper.observer.attach(swiper.$el[0], { childList: swiper.params.observeSlideChildren });
   4542 
   4543       // Observe wrapper
   4544       swiper.observer.attach(swiper.$wrapperEl[0], { attributes: false });
   4545     },
   4546     destroy: function destroy() {
   4547       var swiper = this;
   4548       swiper.observer.observers.forEach(function (observer) {
   4549         observer.disconnect();
   4550       });
   4551       swiper.observer.observers = [];
   4552     },
   4553   };
   4554 
   4555   var Observer$1 = {
   4556     name: 'observer',
   4557     params: {
   4558       observer: false,
   4559       observeParents: false,
   4560       observeSlideChildren: false,
   4561     },
   4562     create: function create() {
   4563       var swiper = this;
   4564       Utils.extend(swiper, {
   4565         observer: {
   4566           init: Observer.init.bind(swiper),
   4567           attach: Observer.attach.bind(swiper),
   4568           destroy: Observer.destroy.bind(swiper),
   4569           observers: [],
   4570         },
   4571       });
   4572     },
   4573     on: {
   4574       init: function init() {
   4575         var swiper = this;
   4576         swiper.observer.init();
   4577       },
   4578       destroy: function destroy() {
   4579         var swiper = this;
   4580         swiper.observer.destroy();
   4581       },
   4582     },
   4583   };
   4584 
   4585   var Virtual = {
   4586     update: function update(force) {
   4587       var swiper = this;
   4588       var ref = swiper.params;
   4589       var slidesPerView = ref.slidesPerView;
   4590       var slidesPerGroup = ref.slidesPerGroup;
   4591       var centeredSlides = ref.centeredSlides;
   4592       var ref$1 = swiper.params.virtual;
   4593       var addSlidesBefore = ref$1.addSlidesBefore;
   4594       var addSlidesAfter = ref$1.addSlidesAfter;
   4595       var ref$2 = swiper.virtual;
   4596       var previousFrom = ref$2.from;
   4597       var previousTo = ref$2.to;
   4598       var slides = ref$2.slides;
   4599       var previousSlidesGrid = ref$2.slidesGrid;
   4600       var renderSlide = ref$2.renderSlide;
   4601       var previousOffset = ref$2.offset;
   4602       swiper.updateActiveIndex();
   4603       var activeIndex = swiper.activeIndex || 0;
   4604 
   4605       var offsetProp;
   4606       if (swiper.rtlTranslate) { offsetProp = 'right'; }
   4607       else { offsetProp = swiper.isHorizontal() ? 'left' : 'top'; }
   4608 
   4609       var slidesAfter;
   4610       var slidesBefore;
   4611       if (centeredSlides) {
   4612         slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;
   4613         slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;
   4614       } else {
   4615         slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesBefore;
   4616         slidesBefore = slidesPerGroup + addSlidesAfter;
   4617       }
   4618       var from = Math.max((activeIndex || 0) - slidesBefore, 0);
   4619       var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);
   4620       var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);
   4621 
   4622       Utils.extend(swiper.virtual, {
   4623         from: from,
   4624         to: to,
   4625         offset: offset,
   4626         slidesGrid: swiper.slidesGrid,
   4627       });
   4628 
   4629       function onRendered() {
   4630         swiper.updateSlides();
   4631         swiper.updateProgress();
   4632         swiper.updateSlidesClasses();
   4633         if (swiper.lazy && swiper.params.lazy.enabled) {
   4634           swiper.lazy.load();
   4635         }
   4636       }
   4637 
   4638       if (previousFrom === from && previousTo === to && !force) {
   4639         if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
   4640           swiper.slides.css(offsetProp, (offset + "px"));
   4641         }
   4642         swiper.updateProgress();
   4643         return;
   4644       }
   4645       if (swiper.params.virtual.renderExternal) {
   4646         swiper.params.virtual.renderExternal.call(swiper, {
   4647           offset: offset,
   4648           from: from,
   4649           to: to,
   4650           slides: (function getSlides() {
   4651             var slidesToRender = [];
   4652             for (var i = from; i <= to; i += 1) {
   4653               slidesToRender.push(slides[i]);
   4654             }
   4655             return slidesToRender;
   4656           }()),
   4657         });
   4658         onRendered();
   4659         return;
   4660       }
   4661       var prependIndexes = [];
   4662       var appendIndexes = [];
   4663       if (force) {
   4664         swiper.$wrapperEl.find(("." + (swiper.params.slideClass))).remove();
   4665       } else {
   4666         for (var i = previousFrom; i <= previousTo; i += 1) {
   4667           if (i < from || i > to) {
   4668             swiper.$wrapperEl.find(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + i + "\"]")).remove();
   4669           }
   4670         }
   4671       }
   4672       for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
   4673         if (i$1 >= from && i$1 <= to) {
   4674           if (typeof previousTo === 'undefined' || force) {
   4675             appendIndexes.push(i$1);
   4676           } else {
   4677             if (i$1 > previousTo) { appendIndexes.push(i$1); }
   4678             if (i$1 < previousFrom) { prependIndexes.push(i$1); }
   4679           }
   4680         }
   4681       }
   4682       appendIndexes.forEach(function (index) {
   4683         swiper.$wrapperEl.append(renderSlide(slides[index], index));
   4684       });
   4685       prependIndexes.sort(function (a, b) { return b - a; }).forEach(function (index) {
   4686         swiper.$wrapperEl.prepend(renderSlide(slides[index], index));
   4687       });
   4688       swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, (offset + "px"));
   4689       onRendered();
   4690     },
   4691     renderSlide: function renderSlide(slide, index) {
   4692       var swiper = this;
   4693       var params = swiper.params.virtual;
   4694       if (params.cache && swiper.virtual.cache[index]) {
   4695         return swiper.virtual.cache[index];
   4696       }
   4697       var $slideEl = params.renderSlide
   4698         ? $(params.renderSlide.call(swiper, slide, index))
   4699         : $(("<div class=\"" + (swiper.params.slideClass) + "\" data-swiper-slide-index=\"" + index + "\">" + slide + "</div>"));
   4700       if (!$slideEl.attr('data-swiper-slide-index')) { $slideEl.attr('data-swiper-slide-index', index); }
   4701       if (params.cache) { swiper.virtual.cache[index] = $slideEl; }
   4702       return $slideEl;
   4703     },
   4704     appendSlide: function appendSlide(slides) {
   4705       var swiper = this;
   4706       if (typeof slides === 'object' && 'length' in slides) {
   4707         for (var i = 0; i < slides.length; i += 1) {
   4708           if (slides[i]) { swiper.virtual.slides.push(slides[i]); }
   4709         }
   4710       } else {
   4711         swiper.virtual.slides.push(slides);
   4712       }
   4713       swiper.virtual.update(true);
   4714     },
   4715     prependSlide: function prependSlide(slides) {
   4716       var swiper = this;
   4717       var activeIndex = swiper.activeIndex;
   4718       var newActiveIndex = activeIndex + 1;
   4719       var numberOfNewSlides = 1;
   4720 
   4721       if (Array.isArray(slides)) {
   4722         for (var i = 0; i < slides.length; i += 1) {
   4723           if (slides[i]) { swiper.virtual.slides.unshift(slides[i]); }
   4724         }
   4725         newActiveIndex = activeIndex + slides.length;
   4726         numberOfNewSlides = slides.length;
   4727       } else {
   4728         swiper.virtual.slides.unshift(slides);
   4729       }
   4730       if (swiper.params.virtual.cache) {
   4731         var cache = swiper.virtual.cache;
   4732         var newCache = {};
   4733         Object.keys(cache).forEach(function (cachedIndex) {
   4734           var $cachedEl = cache[cachedIndex];
   4735           var cachedElIndex = $cachedEl.attr('data-swiper-slide-index');
   4736           if (cachedElIndex) {
   4737             $cachedEl.attr('data-swiper-slide-index', parseInt(cachedElIndex, 10) + 1);
   4738           }
   4739           newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl;
   4740         });
   4741         swiper.virtual.cache = newCache;
   4742       }
   4743       swiper.virtual.update(true);
   4744       swiper.slideTo(newActiveIndex, 0);
   4745     },
   4746     removeSlide: function removeSlide(slidesIndexes) {
   4747       var swiper = this;
   4748       if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) { return; }
   4749       var activeIndex = swiper.activeIndex;
   4750       if (Array.isArray(slidesIndexes)) {
   4751         for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) {
   4752           swiper.virtual.slides.splice(slidesIndexes[i], 1);
   4753           if (swiper.params.virtual.cache) {
   4754             delete swiper.virtual.cache[slidesIndexes[i]];
   4755           }
   4756           if (slidesIndexes[i] < activeIndex) { activeIndex -= 1; }
   4757           activeIndex = Math.max(activeIndex, 0);
   4758         }
   4759       } else {
   4760         swiper.virtual.slides.splice(slidesIndexes, 1);
   4761         if (swiper.params.virtual.cache) {
   4762           delete swiper.virtual.cache[slidesIndexes];
   4763         }
   4764         if (slidesIndexes < activeIndex) { activeIndex -= 1; }
   4765         activeIndex = Math.max(activeIndex, 0);
   4766       }
   4767       swiper.virtual.update(true);
   4768       swiper.slideTo(activeIndex, 0);
   4769     },
   4770     removeAllSlides: function removeAllSlides() {
   4771       var swiper = this;
   4772       swiper.virtual.slides = [];
   4773       if (swiper.params.virtual.cache) {
   4774         swiper.virtual.cache = {};
   4775       }
   4776       swiper.virtual.update(true);
   4777       swiper.slideTo(0, 0);
   4778     },
   4779   };
   4780 
   4781   var Virtual$1 = {
   4782     name: 'virtual',
   4783     params: {
   4784       virtual: {
   4785         enabled: false,
   4786         slides: [],
   4787         cache: true,
   4788         renderSlide: null,
   4789         renderExternal: null,
   4790         addSlidesBefore: 0,
   4791         addSlidesAfter: 0,
   4792       },
   4793     },
   4794     create: function create() {
   4795       var swiper = this;
   4796       Utils.extend(swiper, {
   4797         virtual: {
   4798           update: Virtual.update.bind(swiper),
   4799           appendSlide: Virtual.appendSlide.bind(swiper),
   4800           prependSlide: Virtual.prependSlide.bind(swiper),
   4801           removeSlide: Virtual.removeSlide.bind(swiper),
   4802           removeAllSlides: Virtual.removeAllSlides.bind(swiper),
   4803           renderSlide: Virtual.renderSlide.bind(swiper),
   4804           slides: swiper.params.virtual.slides,
   4805           cache: {},
   4806         },
   4807       });
   4808     },
   4809     on: {
   4810       beforeInit: function beforeInit() {
   4811         var swiper = this;
   4812         if (!swiper.params.virtual.enabled) { return; }
   4813         swiper.classNames.push(((swiper.params.containerModifierClass) + "virtual"));
   4814         var overwriteParams = {
   4815           watchSlidesProgress: true,
   4816         };
   4817         Utils.extend(swiper.params, overwriteParams);
   4818         Utils.extend(swiper.originalParams, overwriteParams);
   4819 
   4820         if (!swiper.params.initialSlide) {
   4821           swiper.virtual.update();
   4822         }
   4823       },
   4824       setTranslate: function setTranslate() {
   4825         var swiper = this;
   4826         if (!swiper.params.virtual.enabled) { return; }
   4827         swiper.virtual.update();
   4828       },
   4829     },
   4830   };
   4831 
   4832   var Keyboard = {
   4833     handle: function handle(event) {
   4834       var swiper = this;
   4835       var rtl = swiper.rtlTranslate;
   4836       var e = event;
   4837       if (e.originalEvent) { e = e.originalEvent; } // jquery fix
   4838       var kc = e.keyCode || e.charCode;
   4839       // Directions locks
   4840       if (!swiper.allowSlideNext && ((swiper.isHorizontal() && kc === 39) || (swiper.isVertical() && kc === 40) || kc === 34)) {
   4841         return false;
   4842       }
   4843       if (!swiper.allowSlidePrev && ((swiper.isHorizontal() && kc === 37) || (swiper.isVertical() && kc === 38) || kc === 33)) {
   4844         return false;
   4845       }
   4846       if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {
   4847         return undefined;
   4848       }
   4849       if (doc.activeElement && doc.activeElement.nodeName && (doc.activeElement.nodeName.toLowerCase() === 'input' || doc.activeElement.nodeName.toLowerCase() === 'textarea')) {
   4850         return undefined;
   4851       }
   4852       if (swiper.params.keyboard.onlyInViewport && (kc === 33 || kc === 34 || kc === 37 || kc === 39 || kc === 38 || kc === 40)) {
   4853         var inView = false;
   4854         // Check that swiper should be inside of visible area of window
   4855         if (swiper.$el.parents(("." + (swiper.params.slideClass))).length > 0 && swiper.$el.parents(("." + (swiper.params.slideActiveClass))).length === 0) {
   4856           return undefined;
   4857         }
   4858         var windowWidth = win.innerWidth;
   4859         var windowHeight = win.innerHeight;
   4860         var swiperOffset = swiper.$el.offset();
   4861         if (rtl) { swiperOffset.left -= swiper.$el[0].scrollLeft; }
   4862         var swiperCoord = [
   4863           [swiperOffset.left, swiperOffset.top],
   4864           [swiperOffset.left + swiper.width, swiperOffset.top],
   4865           [swiperOffset.left, swiperOffset.top + swiper.height],
   4866           [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height] ];
   4867         for (var i = 0; i < swiperCoord.length; i += 1) {
   4868           var point = swiperCoord[i];
   4869           if (
   4870             point[0] >= 0 && point[0] <= windowWidth
   4871             && point[1] >= 0 && point[1] <= windowHeight
   4872           ) {
   4873             inView = true;
   4874           }
   4875         }
   4876         if (!inView) { return undefined; }
   4877       }
   4878       if (swiper.isHorizontal()) {
   4879         if (kc === 33 || kc === 34 || kc === 37 || kc === 39) {
   4880           if (e.preventDefault) { e.preventDefault(); }
   4881           else { e.returnValue = false; }
   4882         }
   4883         if (((kc === 34 || kc === 39) && !rtl) || ((kc === 33 || kc === 37) && rtl)) { swiper.slideNext(); }
   4884         if (((kc === 33 || kc === 37) && !rtl) || ((kc === 34 || kc === 39) && rtl)) { swiper.slidePrev(); }
   4885       } else {
   4886         if (kc === 33 || kc === 34 || kc === 38 || kc === 40) {
   4887           if (e.preventDefault) { e.preventDefault(); }
   4888           else { e.returnValue = false; }
   4889         }
   4890         if (kc === 34 || kc === 40) { swiper.slideNext(); }
   4891         if (kc === 33 || kc === 38) { swiper.slidePrev(); }
   4892       }
   4893       swiper.emit('keyPress', kc);
   4894       return undefined;
   4895     },
   4896     enable: function enable() {
   4897       var swiper = this;
   4898       if (swiper.keyboard.enabled) { return; }
   4899       $(doc).on('keydown', swiper.keyboard.handle);
   4900       swiper.keyboard.enabled = true;
   4901     },
   4902     disable: function disable() {
   4903       var swiper = this;
   4904       if (!swiper.keyboard.enabled) { return; }
   4905       $(doc).off('keydown', swiper.keyboard.handle);
   4906       swiper.keyboard.enabled = false;
   4907     },
   4908   };
   4909 
   4910   var Keyboard$1 = {
   4911     name: 'keyboard',
   4912     params: {
   4913       keyboard: {
   4914         enabled: false,
   4915         onlyInViewport: true,
   4916       },
   4917     },
   4918     create: function create() {
   4919       var swiper = this;
   4920       Utils.extend(swiper, {
   4921         keyboard: {
   4922           enabled: false,
   4923           enable: Keyboard.enable.bind(swiper),
   4924           disable: Keyboard.disable.bind(swiper),
   4925           handle: Keyboard.handle.bind(swiper),
   4926         },
   4927       });
   4928     },
   4929     on: {
   4930       init: function init() {
   4931         var swiper = this;
   4932         if (swiper.params.keyboard.enabled) {
   4933           swiper.keyboard.enable();
   4934         }
   4935       },
   4936       destroy: function destroy() {
   4937         var swiper = this;
   4938         if (swiper.keyboard.enabled) {
   4939           swiper.keyboard.disable();
   4940         }
   4941       },
   4942     },
   4943   };
   4944 
   4945   function isEventSupported() {
   4946     var eventName = 'onwheel';
   4947     var isSupported = eventName in doc;
   4948 
   4949     if (!isSupported) {
   4950       var element = doc.createElement('div');
   4951       element.setAttribute(eventName, 'return;');
   4952       isSupported = typeof element[eventName] === 'function';
   4953     }
   4954 
   4955     if (!isSupported
   4956       && doc.implementation
   4957       && doc.implementation.hasFeature
   4958       // always returns true in newer browsers as per the standard.
   4959       // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
   4960       && doc.implementation.hasFeature('', '') !== true
   4961     ) {
   4962       // This is the only way to test support for the `wheel` event in IE9+.
   4963       isSupported = doc.implementation.hasFeature('Events.wheel', '3.0');
   4964     }
   4965 
   4966     return isSupported;
   4967   }
   4968   var Mousewheel = {
   4969     lastScrollTime: Utils.now(),
   4970     lastEventBeforeSnap: undefined,
   4971     recentWheelEvents: [],
   4972     event: function event() {
   4973       if (win.navigator.userAgent.indexOf('firefox') > -1) { return 'DOMMouseScroll'; }
   4974       return isEventSupported() ? 'wheel' : 'mousewheel';
   4975     },
   4976     normalize: function normalize(e) {
   4977       // Reasonable defaults
   4978       var PIXEL_STEP = 10;
   4979       var LINE_HEIGHT = 40;
   4980       var PAGE_HEIGHT = 800;
   4981 
   4982       var sX = 0;
   4983       var sY = 0; // spinX, spinY
   4984       var pX = 0;
   4985       var pY = 0; // pixelX, pixelY
   4986 
   4987       // Legacy
   4988       if ('detail' in e) {
   4989         sY = e.detail;
   4990       }
   4991       if ('wheelDelta' in e) {
   4992         sY = -e.wheelDelta / 120;
   4993       }
   4994       if ('wheelDeltaY' in e) {
   4995         sY = -e.wheelDeltaY / 120;
   4996       }
   4997       if ('wheelDeltaX' in e) {
   4998         sX = -e.wheelDeltaX / 120;
   4999       }
   5000 
   5001       // side scrolling on FF with DOMMouseScroll
   5002       if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {
   5003         sX = sY;
   5004         sY = 0;
   5005       }
   5006 
   5007       pX = sX * PIXEL_STEP;
   5008       pY = sY * PIXEL_STEP;
   5009 
   5010       if ('deltaY' in e) {
   5011         pY = e.deltaY;
   5012       }
   5013       if ('deltaX' in e) {
   5014         pX = e.deltaX;
   5015       }
   5016 
   5017       if (e.shiftKey && !pX) { // if user scrolls with shift he wants horizontal scroll
   5018         pX = pY;
   5019         pY = 0;
   5020       }
   5021 
   5022       if ((pX || pY) && e.deltaMode) {
   5023         if (e.deltaMode === 1) { // delta in LINE units
   5024           pX *= LINE_HEIGHT;
   5025           pY *= LINE_HEIGHT;
   5026         } else { // delta in PAGE units
   5027           pX *= PAGE_HEIGHT;
   5028           pY *= PAGE_HEIGHT;
   5029         }
   5030       }
   5031 
   5032       // Fall-back if spin cannot be determined
   5033       if (pX && !sX) {
   5034         sX = (pX < 1) ? -1 : 1;
   5035       }
   5036       if (pY && !sY) {
   5037         sY = (pY < 1) ? -1 : 1;
   5038       }
   5039 
   5040       return {
   5041         spinX: sX,
   5042         spinY: sY,
   5043         pixelX: pX,
   5044         pixelY: pY,
   5045       };
   5046     },
   5047     handleMouseEnter: function handleMouseEnter() {
   5048       var swiper = this;
   5049       swiper.mouseEntered = true;
   5050     },
   5051     handleMouseLeave: function handleMouseLeave() {
   5052       var swiper = this;
   5053       swiper.mouseEntered = false;
   5054     },
   5055     handle: function handle(event) {
   5056       var e = event;
   5057       var swiper = this;
   5058       var params = swiper.params.mousewheel;
   5059 
   5060       if (swiper.params.cssMode) {
   5061         e.preventDefault();
   5062       }
   5063 
   5064       var target = swiper.$el;
   5065       if (swiper.params.mousewheel.eventsTarged !== 'container') {
   5066         target = $(swiper.params.mousewheel.eventsTarged);
   5067       }
   5068       if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges) { return true; }
   5069 
   5070       if (e.originalEvent) { e = e.originalEvent; } // jquery fix
   5071       var delta = 0;
   5072       var rtlFactor = swiper.rtlTranslate ? -1 : 1;
   5073 
   5074       var data = Mousewheel.normalize(e);
   5075 
   5076       if (params.forceToAxis) {
   5077         if (swiper.isHorizontal()) {
   5078           if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) { delta = data.pixelX * rtlFactor; }
   5079           else { return true; }
   5080         } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) { delta = data.pixelY; }
   5081         else { return true; }
   5082       } else {
   5083         delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;
   5084       }
   5085 
   5086       if (delta === 0) { return true; }
   5087 
   5088       if (params.invert) { delta = -delta; }
   5089 
   5090       if (!swiper.params.freeMode) {
   5091         // Register the new event in a variable which stores the relevant data
   5092         var newEvent = {
   5093           time: Utils.now(),
   5094           delta: Math.abs(delta),
   5095           direction: Math.sign(delta),
   5096           raw: event,
   5097         };
   5098 
   5099         // Keep the most recent events
   5100         var recentWheelEvents = swiper.mousewheel.recentWheelEvents;
   5101         if (recentWheelEvents.length >= 2) {
   5102           recentWheelEvents.shift(); // only store the last N events
   5103         }
   5104         var prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
   5105         recentWheelEvents.push(newEvent);
   5106 
   5107         // If there is at least one previous recorded event:
   5108         //   If direction has changed or
   5109         //   if the scroll is quicker than the previous one:
   5110         //     Animate the slider.
   5111         // Else (this is the first time the wheel is moved):
   5112         //     Animate the slider.
   5113         if (prevEvent) {
   5114           if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta) {
   5115             swiper.mousewheel.animateSlider(newEvent);
   5116           }
   5117         } else {
   5118           swiper.mousewheel.animateSlider(newEvent);
   5119         }
   5120 
   5121         // If it's time to release the scroll:
   5122         //   Return now so you don't hit the preventDefault.
   5123         if (swiper.mousewheel.releaseScroll(newEvent)) {
   5124           return true;
   5125         }
   5126       } else {
   5127         // Freemode or scrollContainer:
   5128 
   5129         // If we recently snapped after a momentum scroll, then ignore wheel events
   5130         // to give time for the deceleration to finish. Stop ignoring after 500 msecs
   5131         // or if it's a new scroll (larger delta or inverse sign as last event before
   5132         // an end-of-momentum snap).
   5133         var newEvent$1 = { time: Utils.now(), delta: Math.abs(delta), direction: Math.sign(delta) };
   5134         var ref = swiper.mousewheel;
   5135         var lastEventBeforeSnap = ref.lastEventBeforeSnap;
   5136         var ignoreWheelEvents = lastEventBeforeSnap
   5137           && newEvent$1.time < lastEventBeforeSnap.time + 500
   5138           && newEvent$1.delta <= lastEventBeforeSnap.delta
   5139           && newEvent$1.direction === lastEventBeforeSnap.direction;
   5140         if (!ignoreWheelEvents) {
   5141           swiper.mousewheel.lastEventBeforeSnap = undefined;
   5142 
   5143           if (swiper.params.loop) {
   5144             swiper.loopFix();
   5145           }
   5146           var position = swiper.getTranslate() + (delta * params.sensitivity);
   5147           var wasBeginning = swiper.isBeginning;
   5148           var wasEnd = swiper.isEnd;
   5149 
   5150           if (position >= swiper.minTranslate()) { position = swiper.minTranslate(); }
   5151           if (position <= swiper.maxTranslate()) { position = swiper.maxTranslate(); }
   5152 
   5153           swiper.setTransition(0);
   5154           swiper.setTranslate(position);
   5155           swiper.updateProgress();
   5156           swiper.updateActiveIndex();
   5157           swiper.updateSlidesClasses();
   5158 
   5159           if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {
   5160             swiper.updateSlidesClasses();
   5161           }
   5162 
   5163           if (swiper.params.freeModeSticky) {
   5164             // When wheel scrolling starts with sticky (aka snap) enabled, then detect
   5165             // the end of a momentum scroll by storing recent (N=15?) wheel events.
   5166             // 1. do all N events have decreasing or same (absolute value) delta?
   5167             // 2. did all N events arrive in the last M (M=500?) msecs?
   5168             // 3. does the earliest event have an (absolute value) delta that's
   5169             //    at least P (P=1?) larger than the most recent event's delta?
   5170             // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?
   5171             // If 1-4 are "yes" then we're near the end of a momuntum scroll deceleration.
   5172             // Snap immediately and ignore remaining wheel events in this scroll.
   5173             // See comment above for "remaining wheel events in this scroll" determination.
   5174             // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.
   5175             clearTimeout(swiper.mousewheel.timeout);
   5176             swiper.mousewheel.timeout = undefined;
   5177             var recentWheelEvents$1 = swiper.mousewheel.recentWheelEvents;
   5178             if (recentWheelEvents$1.length >= 15) {
   5179               recentWheelEvents$1.shift(); // only store the last N events
   5180             }
   5181             var prevEvent$1 = recentWheelEvents$1.length ? recentWheelEvents$1[recentWheelEvents$1.length - 1] : undefined;
   5182             var firstEvent = recentWheelEvents$1[0];
   5183             recentWheelEvents$1.push(newEvent$1);
   5184             if (prevEvent$1 && (newEvent$1.delta > prevEvent$1.delta || newEvent$1.direction !== prevEvent$1.direction)) {
   5185               // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.
   5186               recentWheelEvents$1.splice(0);
   5187             } else if (recentWheelEvents$1.length >= 15
   5188                 && newEvent$1.time - firstEvent.time < 500
   5189                 && firstEvent.delta - newEvent$1.delta >= 1
   5190                 && newEvent$1.delta <= 6
   5191             ) {
   5192               // We're at the end of the deceleration of a momentum scroll, so there's no need
   5193               // to wait for more events. Snap ASAP on the next tick.
   5194               // Also, because there's some remaining momentum we'll bias the snap in the
   5195               // direction of the ongoing scroll because it's better UX for the scroll to snap
   5196               // in the same direction as the scroll instead of reversing to snap.  Therefore,
   5197               // if it's already scrolled more than 20% in the current direction, keep going.
   5198               var snapToThreshold = delta > 0 ? 0.8 : 0.2;
   5199               swiper.mousewheel.lastEventBeforeSnap = newEvent$1;
   5200               recentWheelEvents$1.splice(0);
   5201               swiper.mousewheel.timeout = Utils.nextTick(function () {
   5202                 swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
   5203               }, 0); // no delay; move on next tick
   5204             }
   5205             if (!swiper.mousewheel.timeout) {
   5206               // if we get here, then we haven't detected the end of a momentum scroll, so
   5207               // we'll consider a scroll "complete" when there haven't been any wheel events
   5208               // for 500ms.
   5209               swiper.mousewheel.timeout = Utils.nextTick(function () {
   5210                 var snapToThreshold = 0.5;
   5211                 swiper.mousewheel.lastEventBeforeSnap = newEvent$1;
   5212                 recentWheelEvents$1.splice(0);
   5213                 swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
   5214               }, 500);
   5215             }
   5216           }
   5217 
   5218           // Emit event
   5219           if (!ignoreWheelEvents) { swiper.emit('scroll', e); }
   5220 
   5221           // Stop autoplay
   5222           if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) { swiper.autoplay.stop(); }
   5223           // Return page scroll on edge positions
   5224           if (position === swiper.minTranslate() || position === swiper.maxTranslate()) { return true; }
   5225         }
   5226       }
   5227 
   5228       if (e.preventDefault) { e.preventDefault(); }
   5229       else { e.returnValue = false; }
   5230       return false;
   5231     },
   5232     animateSlider: function animateSlider(newEvent) {
   5233       var swiper = this;
   5234       // If the movement is NOT big enough and
   5235       // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):
   5236       //   Don't go any further (avoid insignificant scroll movement).
   5237       if (newEvent.delta >= 6 && Utils.now() - swiper.mousewheel.lastScrollTime < 60) {
   5238         // Return false as a default
   5239         return true;
   5240       }
   5241       // If user is scrolling towards the end:
   5242       //   If the slider hasn't hit the latest slide or
   5243       //   if the slider is a loop and
   5244       //   if the slider isn't moving right now:
   5245       //     Go to next slide and
   5246       //     emit a scroll event.
   5247       // Else (the user is scrolling towards the beginning) and
   5248       // if the slider hasn't hit the first slide or
   5249       // if the slider is a loop and
   5250       // if the slider isn't moving right now:
   5251       //   Go to prev slide and
   5252       //   emit a scroll event.
   5253       if (newEvent.direction < 0) {
   5254         if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {
   5255           swiper.slideNext();
   5256           swiper.emit('scroll', newEvent.raw);
   5257         }
   5258       } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {
   5259         swiper.slidePrev();
   5260         swiper.emit('scroll', newEvent.raw);
   5261       }
   5262       // If you got here is because an animation has been triggered so store the current time
   5263       swiper.mousewheel.lastScrollTime = (new win.Date()).getTime();
   5264       // Return false as a default
   5265       return false;
   5266     },
   5267     releaseScroll: function releaseScroll(newEvent) {
   5268       var swiper = this;
   5269       var params = swiper.params.mousewheel;
   5270       if (newEvent.direction < 0) {
   5271         if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {
   5272           // Return true to animate scroll on edges
   5273           return true;
   5274         }
   5275       } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {
   5276         // Return true to animate scroll on edges
   5277         return true;
   5278       }
   5279       return false;
   5280     },
   5281     enable: function enable() {
   5282       var swiper = this;
   5283       var event = Mousewheel.event();
   5284       if (swiper.params.cssMode) {
   5285         swiper.wrapperEl.removeEventListener(event, swiper.mousewheel.handle);
   5286         return true;
   5287       }
   5288       if (!event) { return false; }
   5289       if (swiper.mousewheel.enabled) { return false; }
   5290       var target = swiper.$el;
   5291       if (swiper.params.mousewheel.eventsTarged !== 'container') {
   5292         target = $(swiper.params.mousewheel.eventsTarged);
   5293       }
   5294       target.on('mouseenter', swiper.mousewheel.handleMouseEnter);
   5295       target.on('mouseleave', swiper.mousewheel.handleMouseLeave);
   5296       target.on(event, swiper.mousewheel.handle);
   5297       swiper.mousewheel.enabled = true;
   5298       return true;
   5299     },
   5300     disable: function disable() {
   5301       var swiper = this;
   5302       var event = Mousewheel.event();
   5303       if (swiper.params.cssMode) {
   5304         swiper.wrapperEl.addEventListener(event, swiper.mousewheel.handle);
   5305         return true;
   5306       }
   5307       if (!event) { return false; }
   5308       if (!swiper.mousewheel.enabled) { return false; }
   5309       var target = swiper.$el;
   5310       if (swiper.params.mousewheel.eventsTarged !== 'container') {
   5311         target = $(swiper.params.mousewheel.eventsTarged);
   5312       }
   5313       target.off(event, swiper.mousewheel.handle);
   5314       swiper.mousewheel.enabled = false;
   5315       return true;
   5316     },
   5317   };
   5318 
   5319   var Mousewheel$1 = {
   5320     name: 'mousewheel',
   5321     params: {
   5322       mousewheel: {
   5323         enabled: false,
   5324         releaseOnEdges: false,
   5325         invert: false,
   5326         forceToAxis: false,
   5327         sensitivity: 1,
   5328         eventsTarged: 'container',
   5329       },
   5330     },
   5331     create: function create() {
   5332       var swiper = this;
   5333       Utils.extend(swiper, {
   5334         mousewheel: {
   5335           enabled: false,
   5336           enable: Mousewheel.enable.bind(swiper),
   5337           disable: Mousewheel.disable.bind(swiper),
   5338           handle: Mousewheel.handle.bind(swiper),
   5339           handleMouseEnter: Mousewheel.handleMouseEnter.bind(swiper),
   5340           handleMouseLeave: Mousewheel.handleMouseLeave.bind(swiper),
   5341           animateSlider: Mousewheel.animateSlider.bind(swiper),
   5342           releaseScroll: Mousewheel.releaseScroll.bind(swiper),
   5343           lastScrollTime: Utils.now(),
   5344           lastEventBeforeSnap: undefined,
   5345           recentWheelEvents: [],
   5346         },
   5347       });
   5348     },
   5349     on: {
   5350       init: function init() {
   5351         var swiper = this;
   5352         if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {
   5353           swiper.mousewheel.disable();
   5354         }
   5355         if (swiper.params.mousewheel.enabled) { swiper.mousewheel.enable(); }
   5356       },
   5357       destroy: function destroy() {
   5358         var swiper = this;
   5359         if (swiper.params.cssMode) {
   5360           swiper.mousewheel.enable();
   5361         }
   5362         if (swiper.mousewheel.enabled) { swiper.mousewheel.disable(); }
   5363       },
   5364     },
   5365   };
   5366 
   5367   var Navigation = {
   5368     update: function update() {
   5369       // Update Navigation Buttons
   5370       var swiper = this;
   5371       var params = swiper.params.navigation;
   5372 
   5373       if (swiper.params.loop) { return; }
   5374       var ref = swiper.navigation;
   5375       var $nextEl = ref.$nextEl;
   5376       var $prevEl = ref.$prevEl;
   5377 
   5378       if ($prevEl && $prevEl.length > 0) {
   5379         if (swiper.isBeginning) {
   5380           $prevEl.addClass(params.disabledClass);
   5381         } else {
   5382           $prevEl.removeClass(params.disabledClass);
   5383         }
   5384         $prevEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
   5385       }
   5386       if ($nextEl && $nextEl.length > 0) {
   5387         if (swiper.isEnd) {
   5388           $nextEl.addClass(params.disabledClass);
   5389         } else {
   5390           $nextEl.removeClass(params.disabledClass);
   5391         }
   5392         $nextEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
   5393       }
   5394     },
   5395     onPrevClick: function onPrevClick(e) {
   5396       var swiper = this;
   5397       e.preventDefault();
   5398       if (swiper.isBeginning && !swiper.params.loop) { return; }
   5399       swiper.slidePrev();
   5400     },
   5401     onNextClick: function onNextClick(e) {
   5402       var swiper = this;
   5403       e.preventDefault();
   5404       if (swiper.isEnd && !swiper.params.loop) { return; }
   5405       swiper.slideNext();
   5406     },
   5407     init: function init() {
   5408       var swiper = this;
   5409       var params = swiper.params.navigation;
   5410       if (!(params.nextEl || params.prevEl)) { return; }
   5411 
   5412       var $nextEl;
   5413       var $prevEl;
   5414       if (params.nextEl) {
   5415         $nextEl = $(params.nextEl);
   5416         if (
   5417           swiper.params.uniqueNavElements
   5418           && typeof params.nextEl === 'string'
   5419           && $nextEl.length > 1
   5420           && swiper.$el.find(params.nextEl).length === 1
   5421         ) {
   5422           $nextEl = swiper.$el.find(params.nextEl);
   5423         }
   5424       }
   5425       if (params.prevEl) {
   5426         $prevEl = $(params.prevEl);
   5427         if (
   5428           swiper.params.uniqueNavElements
   5429           && typeof params.prevEl === 'string'
   5430           && $prevEl.length > 1
   5431           && swiper.$el.find(params.prevEl).length === 1
   5432         ) {
   5433           $prevEl = swiper.$el.find(params.prevEl);
   5434         }
   5435       }
   5436 
   5437       if ($nextEl && $nextEl.length > 0) {
   5438         $nextEl.on('click', swiper.navigation.onNextClick);
   5439       }
   5440       if ($prevEl && $prevEl.length > 0) {
   5441         $prevEl.on('click', swiper.navigation.onPrevClick);
   5442       }
   5443 
   5444       Utils.extend(swiper.navigation, {
   5445         $nextEl: $nextEl,
   5446         nextEl: $nextEl && $nextEl[0],
   5447         $prevEl: $prevEl,
   5448         prevEl: $prevEl && $prevEl[0],
   5449       });
   5450     },
   5451     destroy: function destroy() {
   5452       var swiper = this;
   5453       var ref = swiper.navigation;
   5454       var $nextEl = ref.$nextEl;
   5455       var $prevEl = ref.$prevEl;
   5456       if ($nextEl && $nextEl.length) {
   5457         $nextEl.off('click', swiper.navigation.onNextClick);
   5458         $nextEl.removeClass(swiper.params.navigation.disabledClass);
   5459       }
   5460       if ($prevEl && $prevEl.length) {
   5461         $prevEl.off('click', swiper.navigation.onPrevClick);
   5462         $prevEl.removeClass(swiper.params.navigation.disabledClass);
   5463       }
   5464     },
   5465   };
   5466 
   5467   var Navigation$1 = {
   5468     name: 'navigation',
   5469     params: {
   5470       navigation: {
   5471         nextEl: null,
   5472         prevEl: null,
   5473 
   5474         hideOnClick: false,
   5475         disabledClass: 'swiper-button-disabled',
   5476         hiddenClass: 'swiper-button-hidden',
   5477         lockClass: 'swiper-button-lock',
   5478       },
   5479     },
   5480     create: function create() {
   5481       var swiper = this;
   5482       Utils.extend(swiper, {
   5483         navigation: {
   5484           init: Navigation.init.bind(swiper),
   5485           update: Navigation.update.bind(swiper),
   5486           destroy: Navigation.destroy.bind(swiper),
   5487           onNextClick: Navigation.onNextClick.bind(swiper),
   5488           onPrevClick: Navigation.onPrevClick.bind(swiper),
   5489         },
   5490       });
   5491     },
   5492     on: {
   5493       init: function init() {
   5494         var swiper = this;
   5495         swiper.navigation.init();
   5496         swiper.navigation.update();
   5497       },
   5498       toEdge: function toEdge() {
   5499         var swiper = this;
   5500         swiper.navigation.update();
   5501       },
   5502       fromEdge: function fromEdge() {
   5503         var swiper = this;
   5504         swiper.navigation.update();
   5505       },
   5506       destroy: function destroy() {
   5507         var swiper = this;
   5508         swiper.navigation.destroy();
   5509       },
   5510       click: function click(e) {
   5511         var swiper = this;
   5512         var ref = swiper.navigation;
   5513         var $nextEl = ref.$nextEl;
   5514         var $prevEl = ref.$prevEl;
   5515         if (
   5516           swiper.params.navigation.hideOnClick
   5517           && !$(e.target).is($prevEl)
   5518           && !$(e.target).is($nextEl)
   5519         ) {
   5520           var isHidden;
   5521           if ($nextEl) {
   5522             isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);
   5523           } else if ($prevEl) {
   5524             isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);
   5525           }
   5526           if (isHidden === true) {
   5527             swiper.emit('navigationShow', swiper);
   5528           } else {
   5529             swiper.emit('navigationHide', swiper);
   5530           }
   5531           if ($nextEl) {
   5532             $nextEl.toggleClass(swiper.params.navigation.hiddenClass);
   5533           }
   5534           if ($prevEl) {
   5535             $prevEl.toggleClass(swiper.params.navigation.hiddenClass);
   5536           }
   5537         }
   5538       },
   5539     },
   5540   };
   5541 
   5542   var Pagination = {
   5543     update: function update() {
   5544       // Render || Update Pagination bullets/items
   5545       var swiper = this;
   5546       var rtl = swiper.rtl;
   5547       var params = swiper.params.pagination;
   5548       if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
   5549       var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
   5550       var $el = swiper.pagination.$el;
   5551       // Current/Total
   5552       var current;
   5553       var total = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
   5554       if (swiper.params.loop) {
   5555         current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);
   5556         if (current > slidesLength - 1 - (swiper.loopedSlides * 2)) {
   5557           current -= (slidesLength - (swiper.loopedSlides * 2));
   5558         }
   5559         if (current > total - 1) { current -= total; }
   5560         if (current < 0 && swiper.params.paginationType !== 'bullets') { current = total + current; }
   5561       } else if (typeof swiper.snapIndex !== 'undefined') {
   5562         current = swiper.snapIndex;
   5563       } else {
   5564         current = swiper.activeIndex || 0;
   5565       }
   5566       // Types
   5567       if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {
   5568         var bullets = swiper.pagination.bullets;
   5569         var firstIndex;
   5570         var lastIndex;
   5571         var midIndex;
   5572         if (params.dynamicBullets) {
   5573           swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);
   5574           $el.css(swiper.isHorizontal() ? 'width' : 'height', ((swiper.pagination.bulletSize * (params.dynamicMainBullets + 4)) + "px"));
   5575           if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {
   5576             swiper.pagination.dynamicBulletIndex += (current - swiper.previousIndex);
   5577             if (swiper.pagination.dynamicBulletIndex > (params.dynamicMainBullets - 1)) {
   5578               swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1;
   5579             } else if (swiper.pagination.dynamicBulletIndex < 0) {
   5580               swiper.pagination.dynamicBulletIndex = 0;
   5581             }
   5582           }
   5583           firstIndex = current - swiper.pagination.dynamicBulletIndex;
   5584           lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);
   5585           midIndex = (lastIndex + firstIndex) / 2;
   5586         }
   5587         bullets.removeClass(((params.bulletActiveClass) + " " + (params.bulletActiveClass) + "-next " + (params.bulletActiveClass) + "-next-next " + (params.bulletActiveClass) + "-prev " + (params.bulletActiveClass) + "-prev-prev " + (params.bulletActiveClass) + "-main"));
   5588         if ($el.length > 1) {
   5589           bullets.each(function (index, bullet) {
   5590             var $bullet = $(bullet);
   5591             var bulletIndex = $bullet.index();
   5592             if (bulletIndex === current) {
   5593               $bullet.addClass(params.bulletActiveClass);
   5594             }
   5595             if (params.dynamicBullets) {
   5596               if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {
   5597                 $bullet.addClass(((params.bulletActiveClass) + "-main"));
   5598               }
   5599               if (bulletIndex === firstIndex) {
   5600                 $bullet
   5601                   .prev()
   5602                   .addClass(((params.bulletActiveClass) + "-prev"))
   5603                   .prev()
   5604                   .addClass(((params.bulletActiveClass) + "-prev-prev"));
   5605               }
   5606               if (bulletIndex === lastIndex) {
   5607                 $bullet
   5608                   .next()
   5609                   .addClass(((params.bulletActiveClass) + "-next"))
   5610                   .next()
   5611                   .addClass(((params.bulletActiveClass) + "-next-next"));
   5612               }
   5613             }
   5614           });
   5615         } else {
   5616           var $bullet = bullets.eq(current);
   5617           var bulletIndex = $bullet.index();
   5618           $bullet.addClass(params.bulletActiveClass);
   5619           if (params.dynamicBullets) {
   5620             var $firstDisplayedBullet = bullets.eq(firstIndex);
   5621             var $lastDisplayedBullet = bullets.eq(lastIndex);
   5622             for (var i = firstIndex; i <= lastIndex; i += 1) {
   5623               bullets.eq(i).addClass(((params.bulletActiveClass) + "-main"));
   5624             }
   5625             if (swiper.params.loop) {
   5626               if (bulletIndex >= bullets.length - params.dynamicMainBullets) {
   5627                 for (var i$1 = params.dynamicMainBullets; i$1 >= 0; i$1 -= 1) {
   5628                   bullets.eq(bullets.length - i$1).addClass(((params.bulletActiveClass) + "-main"));
   5629                 }
   5630                 bullets.eq(bullets.length - params.dynamicMainBullets - 1).addClass(((params.bulletActiveClass) + "-prev"));
   5631               } else {
   5632                 $firstDisplayedBullet
   5633                   .prev()
   5634                   .addClass(((params.bulletActiveClass) + "-prev"))
   5635                   .prev()
   5636                   .addClass(((params.bulletActiveClass) + "-prev-prev"));
   5637                 $lastDisplayedBullet
   5638                   .next()
   5639                   .addClass(((params.bulletActiveClass) + "-next"))
   5640                   .next()
   5641                   .addClass(((params.bulletActiveClass) + "-next-next"));
   5642               }
   5643             } else {
   5644               $firstDisplayedBullet
   5645                 .prev()
   5646                 .addClass(((params.bulletActiveClass) + "-prev"))
   5647                 .prev()
   5648                 .addClass(((params.bulletActiveClass) + "-prev-prev"));
   5649               $lastDisplayedBullet
   5650                 .next()
   5651                 .addClass(((params.bulletActiveClass) + "-next"))
   5652                 .next()
   5653                 .addClass(((params.bulletActiveClass) + "-next-next"));
   5654             }
   5655           }
   5656         }
   5657         if (params.dynamicBullets) {
   5658           var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);
   5659           var bulletsOffset = (((swiper.pagination.bulletSize * dynamicBulletsLength) - (swiper.pagination.bulletSize)) / 2) - (midIndex * swiper.pagination.bulletSize);
   5660           var offsetProp = rtl ? 'right' : 'left';
   5661           bullets.css(swiper.isHorizontal() ? offsetProp : 'top', (bulletsOffset + "px"));
   5662         }
   5663       }
   5664       if (params.type === 'fraction') {
   5665         $el.find(("." + (params.currentClass))).text(params.formatFractionCurrent(current + 1));
   5666         $el.find(("." + (params.totalClass))).text(params.formatFractionTotal(total));
   5667       }
   5668       if (params.type === 'progressbar') {
   5669         var progressbarDirection;
   5670         if (params.progressbarOpposite) {
   5671           progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';
   5672         } else {
   5673           progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';
   5674         }
   5675         var scale = (current + 1) / total;
   5676         var scaleX = 1;
   5677         var scaleY = 1;
   5678         if (progressbarDirection === 'horizontal') {
   5679           scaleX = scale;
   5680         } else {
   5681           scaleY = scale;
   5682         }
   5683         $el.find(("." + (params.progressbarFillClass))).transform(("translate3d(0,0,0) scaleX(" + scaleX + ") scaleY(" + scaleY + ")")).transition(swiper.params.speed);
   5684       }
   5685       if (params.type === 'custom' && params.renderCustom) {
   5686         $el.html(params.renderCustom(swiper, current + 1, total));
   5687         swiper.emit('paginationRender', swiper, $el[0]);
   5688       } else {
   5689         swiper.emit('paginationUpdate', swiper, $el[0]);
   5690       }
   5691       $el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
   5692     },
   5693     render: function render() {
   5694       // Render Container
   5695       var swiper = this;
   5696       var params = swiper.params.pagination;
   5697       if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
   5698       var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
   5699 
   5700       var $el = swiper.pagination.$el;
   5701       var paginationHTML = '';
   5702       if (params.type === 'bullets') {
   5703         var numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
   5704         for (var i = 0; i < numberOfBullets; i += 1) {
   5705           if (params.renderBullet) {
   5706             paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);
   5707           } else {
   5708             paginationHTML += "<" + (params.bulletElement) + " class=\"" + (params.bulletClass) + "\"></" + (params.bulletElement) + ">";
   5709           }
   5710         }
   5711         $el.html(paginationHTML);
   5712         swiper.pagination.bullets = $el.find(("." + (params.bulletClass)));
   5713       }
   5714       if (params.type === 'fraction') {
   5715         if (params.renderFraction) {
   5716           paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);
   5717         } else {
   5718           paginationHTML = "<span class=\"" + (params.currentClass) + "\"></span>"
   5719           + ' / '
   5720           + "<span class=\"" + (params.totalClass) + "\"></span>";
   5721         }
   5722         $el.html(paginationHTML);
   5723       }
   5724       if (params.type === 'progressbar') {
   5725         if (params.renderProgressbar) {
   5726           paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);
   5727         } else {
   5728           paginationHTML = "<span class=\"" + (params.progressbarFillClass) + "\"></span>";
   5729         }
   5730         $el.html(paginationHTML);
   5731       }
   5732       if (params.type !== 'custom') {
   5733         swiper.emit('paginationRender', swiper.pagination.$el[0]);
   5734       }
   5735     },
   5736     init: function init() {
   5737       var swiper = this;
   5738       var params = swiper.params.pagination;
   5739       if (!params.el) { return; }
   5740 
   5741       var $el = $(params.el);
   5742       if ($el.length === 0) { return; }
   5743 
   5744       if (
   5745         swiper.params.uniqueNavElements
   5746         && typeof params.el === 'string'
   5747         && $el.length > 1
   5748         && swiper.$el.find(params.el).length === 1
   5749       ) {
   5750         $el = swiper.$el.find(params.el);
   5751       }
   5752 
   5753       if (params.type === 'bullets' && params.clickable) {
   5754         $el.addClass(params.clickableClass);
   5755       }
   5756 
   5757       $el.addClass(params.modifierClass + params.type);
   5758 
   5759       if (params.type === 'bullets' && params.dynamicBullets) {
   5760         $el.addClass(("" + (params.modifierClass) + (params.type) + "-dynamic"));
   5761         swiper.pagination.dynamicBulletIndex = 0;
   5762         if (params.dynamicMainBullets < 1) {
   5763           params.dynamicMainBullets = 1;
   5764         }
   5765       }
   5766       if (params.type === 'progressbar' && params.progressbarOpposite) {
   5767         $el.addClass(params.progressbarOppositeClass);
   5768       }
   5769 
   5770       if (params.clickable) {
   5771         $el.on('click', ("." + (params.bulletClass)), function onClick(e) {
   5772           e.preventDefault();
   5773           var index = $(this).index() * swiper.params.slidesPerGroup;
   5774           if (swiper.params.loop) { index += swiper.loopedSlides; }
   5775           swiper.slideTo(index);
   5776         });
   5777       }
   5778 
   5779       Utils.extend(swiper.pagination, {
   5780         $el: $el,
   5781         el: $el[0],
   5782       });
   5783     },
   5784     destroy: function destroy() {
   5785       var swiper = this;
   5786       var params = swiper.params.pagination;
   5787       if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
   5788       var $el = swiper.pagination.$el;
   5789 
   5790       $el.removeClass(params.hiddenClass);
   5791       $el.removeClass(params.modifierClass + params.type);
   5792       if (swiper.pagination.bullets) { swiper.pagination.bullets.removeClass(params.bulletActiveClass); }
   5793       if (params.clickable) {
   5794         $el.off('click', ("." + (params.bulletClass)));
   5795       }
   5796     },
   5797   };
   5798 
   5799   var Pagination$1 = {
   5800     name: 'pagination',
   5801     params: {
   5802       pagination: {
   5803         el: null,
   5804         bulletElement: 'span',
   5805         clickable: false,
   5806         hideOnClick: false,
   5807         renderBullet: null,
   5808         renderProgressbar: null,
   5809         renderFraction: null,
   5810         renderCustom: null,
   5811         progressbarOpposite: false,
   5812         type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'
   5813         dynamicBullets: false,
   5814         dynamicMainBullets: 1,
   5815         formatFractionCurrent: function (number) { return number; },
   5816         formatFractionTotal: function (number) { return number; },
   5817         bulletClass: 'swiper-pagination-bullet',
   5818         bulletActiveClass: 'swiper-pagination-bullet-active',
   5819         modifierClass: 'swiper-pagination-', // NEW
   5820         currentClass: 'swiper-pagination-current',
   5821         totalClass: 'swiper-pagination-total',
   5822         hiddenClass: 'swiper-pagination-hidden',
   5823         progressbarFillClass: 'swiper-pagination-progressbar-fill',
   5824         progressbarOppositeClass: 'swiper-pagination-progressbar-opposite',
   5825         clickableClass: 'swiper-pagination-clickable', // NEW
   5826         lockClass: 'swiper-pagination-lock',
   5827       },
   5828     },
   5829     create: function create() {
   5830       var swiper = this;
   5831       Utils.extend(swiper, {
   5832         pagination: {
   5833           init: Pagination.init.bind(swiper),
   5834           render: Pagination.render.bind(swiper),
   5835           update: Pagination.update.bind(swiper),
   5836           destroy: Pagination.destroy.bind(swiper),
   5837           dynamicBulletIndex: 0,
   5838         },
   5839       });
   5840     },
   5841     on: {
   5842       init: function init() {
   5843         var swiper = this;
   5844         swiper.pagination.init();
   5845         swiper.pagination.render();
   5846         swiper.pagination.update();
   5847       },
   5848       activeIndexChange: function activeIndexChange() {
   5849         var swiper = this;
   5850         if (swiper.params.loop) {
   5851           swiper.pagination.update();
   5852         } else if (typeof swiper.snapIndex === 'undefined') {
   5853           swiper.pagination.update();
   5854         }
   5855       },
   5856       snapIndexChange: function snapIndexChange() {
   5857         var swiper = this;
   5858         if (!swiper.params.loop) {
   5859           swiper.pagination.update();
   5860         }
   5861       },
   5862       slidesLengthChange: function slidesLengthChange() {
   5863         var swiper = this;
   5864         if (swiper.params.loop) {
   5865           swiper.pagination.render();
   5866           swiper.pagination.update();
   5867         }
   5868       },
   5869       snapGridLengthChange: function snapGridLengthChange() {
   5870         var swiper = this;
   5871         if (!swiper.params.loop) {
   5872           swiper.pagination.render();
   5873           swiper.pagination.update();
   5874         }
   5875       },
   5876       destroy: function destroy() {
   5877         var swiper = this;
   5878         swiper.pagination.destroy();
   5879       },
   5880       click: function click(e) {
   5881         var swiper = this;
   5882         if (
   5883           swiper.params.pagination.el
   5884           && swiper.params.pagination.hideOnClick
   5885           && swiper.pagination.$el.length > 0
   5886           && !$(e.target).hasClass(swiper.params.pagination.bulletClass)
   5887         ) {
   5888           var isHidden = swiper.pagination.$el.hasClass(swiper.params.pagination.hiddenClass);
   5889           if (isHidden === true) {
   5890             swiper.emit('paginationShow', swiper);
   5891           } else {
   5892             swiper.emit('paginationHide', swiper);
   5893           }
   5894           swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass);
   5895         }
   5896       },
   5897     },
   5898   };
   5899 
   5900   var Scrollbar = {
   5901     setTranslate: function setTranslate() {
   5902       var swiper = this;
   5903       if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
   5904       var scrollbar = swiper.scrollbar;
   5905       var rtl = swiper.rtlTranslate;
   5906       var progress = swiper.progress;
   5907       var dragSize = scrollbar.dragSize;
   5908       var trackSize = scrollbar.trackSize;
   5909       var $dragEl = scrollbar.$dragEl;
   5910       var $el = scrollbar.$el;
   5911       var params = swiper.params.scrollbar;
   5912 
   5913       var newSize = dragSize;
   5914       var newPos = (trackSize - dragSize) * progress;
   5915       if (rtl) {
   5916         newPos = -newPos;
   5917         if (newPos > 0) {
   5918           newSize = dragSize - newPos;
   5919           newPos = 0;
   5920         } else if (-newPos + dragSize > trackSize) {
   5921           newSize = trackSize + newPos;
   5922         }
   5923       } else if (newPos < 0) {
   5924         newSize = dragSize + newPos;
   5925         newPos = 0;
   5926       } else if (newPos + dragSize > trackSize) {
   5927         newSize = trackSize - newPos;
   5928       }
   5929       if (swiper.isHorizontal()) {
   5930         $dragEl.transform(("translate3d(" + newPos + "px, 0, 0)"));
   5931         $dragEl[0].style.width = newSize + "px";
   5932       } else {
   5933         $dragEl.transform(("translate3d(0px, " + newPos + "px, 0)"));
   5934         $dragEl[0].style.height = newSize + "px";
   5935       }
   5936       if (params.hide) {
   5937         clearTimeout(swiper.scrollbar.timeout);
   5938         $el[0].style.opacity = 1;
   5939         swiper.scrollbar.timeout = setTimeout(function () {
   5940           $el[0].style.opacity = 0;
   5941           $el.transition(400);
   5942         }, 1000);
   5943       }
   5944     },
   5945     setTransition: function setTransition(duration) {
   5946       var swiper = this;
   5947       if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
   5948       swiper.scrollbar.$dragEl.transition(duration);
   5949     },
   5950     updateSize: function updateSize() {
   5951       var swiper = this;
   5952       if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
   5953 
   5954       var scrollbar = swiper.scrollbar;
   5955       var $dragEl = scrollbar.$dragEl;
   5956       var $el = scrollbar.$el;
   5957 
   5958       $dragEl[0].style.width = '';
   5959       $dragEl[0].style.height = '';
   5960       var trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;
   5961 
   5962       var divider = swiper.size / swiper.virtualSize;
   5963       var moveDivider = divider * (trackSize / swiper.size);
   5964       var dragSize;
   5965       if (swiper.params.scrollbar.dragSize === 'auto') {
   5966         dragSize = trackSize * divider;
   5967       } else {
   5968         dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);
   5969       }
   5970 
   5971       if (swiper.isHorizontal()) {
   5972         $dragEl[0].style.width = dragSize + "px";
   5973       } else {
   5974         $dragEl[0].style.height = dragSize + "px";
   5975       }
   5976 
   5977       if (divider >= 1) {
   5978         $el[0].style.display = 'none';
   5979       } else {
   5980         $el[0].style.display = '';
   5981       }
   5982       if (swiper.params.scrollbar.hide) {
   5983         $el[0].style.opacity = 0;
   5984       }
   5985       Utils.extend(scrollbar, {
   5986         trackSize: trackSize,
   5987         divider: divider,
   5988         moveDivider: moveDivider,
   5989         dragSize: dragSize,
   5990       });
   5991       scrollbar.$el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);
   5992     },
   5993     getPointerPosition: function getPointerPosition(e) {
   5994       var swiper = this;
   5995       if (swiper.isHorizontal()) {
   5996         return ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].clientX : e.clientX);
   5997       }
   5998       return ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].clientY : e.clientY);
   5999     },
   6000     setDragPosition: function setDragPosition(e) {
   6001       var swiper = this;
   6002       var scrollbar = swiper.scrollbar;
   6003       var rtl = swiper.rtlTranslate;
   6004       var $el = scrollbar.$el;
   6005       var dragSize = scrollbar.dragSize;
   6006       var trackSize = scrollbar.trackSize;
   6007       var dragStartPos = scrollbar.dragStartPos;
   6008 
   6009       var positionRatio;
   6010       positionRatio = ((scrollbar.getPointerPosition(e)) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top']
   6011         - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);
   6012       positionRatio = Math.max(Math.min(positionRatio, 1), 0);
   6013       if (rtl) {
   6014         positionRatio = 1 - positionRatio;
   6015       }
   6016 
   6017       var position = swiper.minTranslate() + ((swiper.maxTranslate() - swiper.minTranslate()) * positionRatio);
   6018 
   6019       swiper.updateProgress(position);
   6020       swiper.setTranslate(position);
   6021       swiper.updateActiveIndex();
   6022       swiper.updateSlidesClasses();
   6023     },
   6024     onDragStart: function onDragStart(e) {
   6025       var swiper = this;
   6026       var params = swiper.params.scrollbar;
   6027       var scrollbar = swiper.scrollbar;
   6028       var $wrapperEl = swiper.$wrapperEl;
   6029       var $el = scrollbar.$el;
   6030       var $dragEl = scrollbar.$dragEl;
   6031       swiper.scrollbar.isTouched = true;
   6032       swiper.scrollbar.dragStartPos = (e.target === $dragEl[0] || e.target === $dragEl)
   6033         ? scrollbar.getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;
   6034       e.preventDefault();
   6035       e.stopPropagation();
   6036 
   6037       $wrapperEl.transition(100);
   6038       $dragEl.transition(100);
   6039       scrollbar.setDragPosition(e);
   6040 
   6041       clearTimeout(swiper.scrollbar.dragTimeout);
   6042 
   6043       $el.transition(0);
   6044       if (params.hide) {
   6045         $el.css('opacity', 1);
   6046       }
   6047       if (swiper.params.cssMode) {
   6048         swiper.$wrapperEl.css('scroll-snap-type', 'none');
   6049       }
   6050       swiper.emit('scrollbarDragStart', e);
   6051     },
   6052     onDragMove: function onDragMove(e) {
   6053       var swiper = this;
   6054       var scrollbar = swiper.scrollbar;
   6055       var $wrapperEl = swiper.$wrapperEl;
   6056       var $el = scrollbar.$el;
   6057       var $dragEl = scrollbar.$dragEl;
   6058 
   6059       if (!swiper.scrollbar.isTouched) { return; }
   6060       if (e.preventDefault) { e.preventDefault(); }
   6061       else { e.returnValue = false; }
   6062       scrollbar.setDragPosition(e);
   6063       $wrapperEl.transition(0);
   6064       $el.transition(0);
   6065       $dragEl.transition(0);
   6066       swiper.emit('scrollbarDragMove', e);
   6067     },
   6068     onDragEnd: function onDragEnd(e) {
   6069       var swiper = this;
   6070 
   6071       var params = swiper.params.scrollbar;
   6072       var scrollbar = swiper.scrollbar;
   6073       var $wrapperEl = swiper.$wrapperEl;
   6074       var $el = scrollbar.$el;
   6075 
   6076       if (!swiper.scrollbar.isTouched) { return; }
   6077       swiper.scrollbar.isTouched = false;
   6078       if (swiper.params.cssMode) {
   6079         swiper.$wrapperEl.css('scroll-snap-type', '');
   6080         $wrapperEl.transition('');
   6081       }
   6082       if (params.hide) {
   6083         clearTimeout(swiper.scrollbar.dragTimeout);
   6084         swiper.scrollbar.dragTimeout = Utils.nextTick(function () {
   6085           $el.css('opacity', 0);
   6086           $el.transition(400);
   6087         }, 1000);
   6088       }
   6089       swiper.emit('scrollbarDragEnd', e);
   6090       if (params.snapOnRelease) {
   6091         swiper.slideToClosest();
   6092       }
   6093     },
   6094     enableDraggable: function enableDraggable() {
   6095       var swiper = this;
   6096       if (!swiper.params.scrollbar.el) { return; }
   6097       var scrollbar = swiper.scrollbar;
   6098       var touchEventsTouch = swiper.touchEventsTouch;
   6099       var touchEventsDesktop = swiper.touchEventsDesktop;
   6100       var params = swiper.params;
   6101       var $el = scrollbar.$el;
   6102       var target = $el[0];
   6103       var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;
   6104       var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
   6105       if (!Support.touch) {
   6106         target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
   6107         doc.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
   6108         doc.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
   6109       } else {
   6110         target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
   6111         target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
   6112         target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
   6113       }
   6114     },
   6115     disableDraggable: function disableDraggable() {
   6116       var swiper = this;
   6117       if (!swiper.params.scrollbar.el) { return; }
   6118       var scrollbar = swiper.scrollbar;
   6119       var touchEventsTouch = swiper.touchEventsTouch;
   6120       var touchEventsDesktop = swiper.touchEventsDesktop;
   6121       var params = swiper.params;
   6122       var $el = scrollbar.$el;
   6123       var target = $el[0];
   6124       var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;
   6125       var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
   6126       if (!Support.touch) {
   6127         target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
   6128         doc.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
   6129         doc.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
   6130       } else {
   6131         target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
   6132         target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
   6133         target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
   6134       }
   6135     },
   6136     init: function init() {
   6137       var swiper = this;
   6138       if (!swiper.params.scrollbar.el) { return; }
   6139       var scrollbar = swiper.scrollbar;
   6140       var $swiperEl = swiper.$el;
   6141       var params = swiper.params.scrollbar;
   6142 
   6143       var $el = $(params.el);
   6144       if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {
   6145         $el = $swiperEl.find(params.el);
   6146       }
   6147 
   6148       var $dragEl = $el.find(("." + (swiper.params.scrollbar.dragClass)));
   6149       if ($dragEl.length === 0) {
   6150         $dragEl = $(("<div class=\"" + (swiper.params.scrollbar.dragClass) + "\"></div>"));
   6151         $el.append($dragEl);
   6152       }
   6153 
   6154       Utils.extend(scrollbar, {
   6155         $el: $el,
   6156         el: $el[0],
   6157         $dragEl: $dragEl,
   6158         dragEl: $dragEl[0],
   6159       });
   6160 
   6161       if (params.draggable) {
   6162         scrollbar.enableDraggable();
   6163       }
   6164     },
   6165     destroy: function destroy() {
   6166       var swiper = this;
   6167       swiper.scrollbar.disableDraggable();
   6168     },
   6169   };
   6170 
   6171   var Scrollbar$1 = {
   6172     name: 'scrollbar',
   6173     params: {
   6174       scrollbar: {
   6175         el: null,
   6176         dragSize: 'auto',
   6177         hide: false,
   6178         draggable: false,
   6179         snapOnRelease: true,
   6180         lockClass: 'swiper-scrollbar-lock',
   6181         dragClass: 'swiper-scrollbar-drag',
   6182       },
   6183     },
   6184     create: function create() {
   6185       var swiper = this;
   6186       Utils.extend(swiper, {
   6187         scrollbar: {
   6188           init: Scrollbar.init.bind(swiper),
   6189           destroy: Scrollbar.destroy.bind(swiper),
   6190           updateSize: Scrollbar.updateSize.bind(swiper),
   6191           setTranslate: Scrollbar.setTranslate.bind(swiper),
   6192           setTransition: Scrollbar.setTransition.bind(swiper),
   6193           enableDraggable: Scrollbar.enableDraggable.bind(swiper),
   6194           disableDraggable: Scrollbar.disableDraggable.bind(swiper),
   6195           setDragPosition: Scrollbar.setDragPosition.bind(swiper),
   6196           getPointerPosition: Scrollbar.getPointerPosition.bind(swiper),
   6197           onDragStart: Scrollbar.onDragStart.bind(swiper),
   6198           onDragMove: Scrollbar.onDragMove.bind(swiper),
   6199           onDragEnd: Scrollbar.onDragEnd.bind(swiper),
   6200           isTouched: false,
   6201           timeout: null,
   6202           dragTimeout: null,
   6203         },
   6204       });
   6205     },
   6206     on: {
   6207       init: function init() {
   6208         var swiper = this;
   6209         swiper.scrollbar.init();
   6210         swiper.scrollbar.updateSize();
   6211         swiper.scrollbar.setTranslate();
   6212       },
   6213       update: function update() {
   6214         var swiper = this;
   6215         swiper.scrollbar.updateSize();
   6216       },
   6217       resize: function resize() {
   6218         var swiper = this;
   6219         swiper.scrollbar.updateSize();
   6220       },
   6221       observerUpdate: function observerUpdate() {
   6222         var swiper = this;
   6223         swiper.scrollbar.updateSize();
   6224       },
   6225       setTranslate: function setTranslate() {
   6226         var swiper = this;
   6227         swiper.scrollbar.setTranslate();
   6228       },
   6229       setTransition: function setTransition(duration) {
   6230         var swiper = this;
   6231         swiper.scrollbar.setTransition(duration);
   6232       },
   6233       destroy: function destroy() {
   6234         var swiper = this;
   6235         swiper.scrollbar.destroy();
   6236       },
   6237     },
   6238   };
   6239 
   6240   var Parallax = {
   6241     setTransform: function setTransform(el, progress) {
   6242       var swiper = this;
   6243       var rtl = swiper.rtl;
   6244 
   6245       var $el = $(el);
   6246       var rtlFactor = rtl ? -1 : 1;
   6247 
   6248       var p = $el.attr('data-swiper-parallax') || '0';
   6249       var x = $el.attr('data-swiper-parallax-x');
   6250       var y = $el.attr('data-swiper-parallax-y');
   6251       var scale = $el.attr('data-swiper-parallax-scale');
   6252       var opacity = $el.attr('data-swiper-parallax-opacity');
   6253 
   6254       if (x || y) {
   6255         x = x || '0';
   6256         y = y || '0';
   6257       } else if (swiper.isHorizontal()) {
   6258         x = p;
   6259         y = '0';
   6260       } else {
   6261         y = p;
   6262         x = '0';
   6263       }
   6264 
   6265       if ((x).indexOf('%') >= 0) {
   6266         x = (parseInt(x, 10) * progress * rtlFactor) + "%";
   6267       } else {
   6268         x = (x * progress * rtlFactor) + "px";
   6269       }
   6270       if ((y).indexOf('%') >= 0) {
   6271         y = (parseInt(y, 10) * progress) + "%";
   6272       } else {
   6273         y = (y * progress) + "px";
   6274       }
   6275 
   6276       if (typeof opacity !== 'undefined' && opacity !== null) {
   6277         var currentOpacity = opacity - ((opacity - 1) * (1 - Math.abs(progress)));
   6278         $el[0].style.opacity = currentOpacity;
   6279       }
   6280       if (typeof scale === 'undefined' || scale === null) {
   6281         $el.transform(("translate3d(" + x + ", " + y + ", 0px)"));
   6282       } else {
   6283         var currentScale = scale - ((scale - 1) * (1 - Math.abs(progress)));
   6284         $el.transform(("translate3d(" + x + ", " + y + ", 0px) scale(" + currentScale + ")"));
   6285       }
   6286     },
   6287     setTranslate: function setTranslate() {
   6288       var swiper = this;
   6289       var $el = swiper.$el;
   6290       var slides = swiper.slides;
   6291       var progress = swiper.progress;
   6292       var snapGrid = swiper.snapGrid;
   6293       $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
   6294         .each(function (index, el) {
   6295           swiper.parallax.setTransform(el, progress);
   6296         });
   6297       slides.each(function (slideIndex, slideEl) {
   6298         var slideProgress = slideEl.progress;
   6299         if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {
   6300           slideProgress += Math.ceil(slideIndex / 2) - (progress * (snapGrid.length - 1));
   6301         }
   6302         slideProgress = Math.min(Math.max(slideProgress, -1), 1);
   6303         $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
   6304           .each(function (index, el) {
   6305             swiper.parallax.setTransform(el, slideProgress);
   6306           });
   6307       });
   6308     },
   6309     setTransition: function setTransition(duration) {
   6310       if ( duration === void 0 ) duration = this.params.speed;
   6311 
   6312       var swiper = this;
   6313       var $el = swiper.$el;
   6314       $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
   6315         .each(function (index, parallaxEl) {
   6316           var $parallaxEl = $(parallaxEl);
   6317           var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;
   6318           if (duration === 0) { parallaxDuration = 0; }
   6319           $parallaxEl.transition(parallaxDuration);
   6320         });
   6321     },
   6322   };
   6323 
   6324   var Parallax$1 = {
   6325     name: 'parallax',
   6326     params: {
   6327       parallax: {
   6328         enabled: false,
   6329       },
   6330     },
   6331     create: function create() {
   6332       var swiper = this;
   6333       Utils.extend(swiper, {
   6334         parallax: {
   6335           setTransform: Parallax.setTransform.bind(swiper),
   6336           setTranslate: Parallax.setTranslate.bind(swiper),
   6337           setTransition: Parallax.setTransition.bind(swiper),
   6338         },
   6339       });
   6340     },
   6341     on: {
   6342       beforeInit: function beforeInit() {
   6343         var swiper = this;
   6344         if (!swiper.params.parallax.enabled) { return; }
   6345         swiper.params.watchSlidesProgress = true;
   6346         swiper.originalParams.watchSlidesProgress = true;
   6347       },
   6348       init: function init() {
   6349         var swiper = this;
   6350         if (!swiper.params.parallax.enabled) { return; }
   6351         swiper.parallax.setTranslate();
   6352       },
   6353       setTranslate: function setTranslate() {
   6354         var swiper = this;
   6355         if (!swiper.params.parallax.enabled) { return; }
   6356         swiper.parallax.setTranslate();
   6357       },
   6358       setTransition: function setTransition(duration) {
   6359         var swiper = this;
   6360         if (!swiper.params.parallax.enabled) { return; }
   6361         swiper.parallax.setTransition(duration);
   6362       },
   6363     },
   6364   };
   6365 
   6366   var Zoom = {
   6367     // Calc Scale From Multi-touches
   6368     getDistanceBetweenTouches: function getDistanceBetweenTouches(e) {
   6369       if (e.targetTouches.length < 2) { return 1; }
   6370       var x1 = e.targetTouches[0].pageX;
   6371       var y1 = e.targetTouches[0].pageY;
   6372       var x2 = e.targetTouches[1].pageX;
   6373       var y2 = e.targetTouches[1].pageY;
   6374       var distance = Math.sqrt((Math.pow( (x2 - x1), 2 )) + (Math.pow( (y2 - y1), 2 )));
   6375       return distance;
   6376     },
   6377     // Events
   6378     onGestureStart: function onGestureStart(e) {
   6379       var swiper = this;
   6380       var params = swiper.params.zoom;
   6381       var zoom = swiper.zoom;
   6382       var gesture = zoom.gesture;
   6383       zoom.fakeGestureTouched = false;
   6384       zoom.fakeGestureMoved = false;
   6385       if (!Support.gestures) {
   6386         if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {
   6387           return;
   6388         }
   6389         zoom.fakeGestureTouched = true;
   6390         gesture.scaleStart = Zoom.getDistanceBetweenTouches(e);
   6391       }
   6392       if (!gesture.$slideEl || !gesture.$slideEl.length) {
   6393         gesture.$slideEl = $(e.target).closest(("." + (swiper.params.slideClass)));
   6394         if (gesture.$slideEl.length === 0) { gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); }
   6395         gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
   6396         gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
   6397         gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
   6398         if (gesture.$imageWrapEl.length === 0) {
   6399           gesture.$imageEl = undefined;
   6400           return;
   6401         }
   6402       }
   6403       gesture.$imageEl.transition(0);
   6404       swiper.zoom.isScaling = true;
   6405     },
   6406     onGestureChange: function onGestureChange(e) {
   6407       var swiper = this;
   6408       var params = swiper.params.zoom;
   6409       var zoom = swiper.zoom;
   6410       var gesture = zoom.gesture;
   6411       if (!Support.gestures) {
   6412         if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {
   6413           return;
   6414         }
   6415         zoom.fakeGestureMoved = true;
   6416         gesture.scaleMove = Zoom.getDistanceBetweenTouches(e);
   6417       }
   6418       if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
   6419       if (Support.gestures) {
   6420         zoom.scale = e.scale * zoom.currentScale;
   6421       } else {
   6422         zoom.scale = (gesture.scaleMove / gesture.scaleStart) * zoom.currentScale;
   6423       }
   6424       if (zoom.scale > gesture.maxRatio) {
   6425         zoom.scale = (gesture.maxRatio - 1) + (Math.pow( ((zoom.scale - gesture.maxRatio) + 1), 0.5 ));
   6426       }
   6427       if (zoom.scale < params.minRatio) {
   6428         zoom.scale = (params.minRatio + 1) - (Math.pow( ((params.minRatio - zoom.scale) + 1), 0.5 ));
   6429       }
   6430       gesture.$imageEl.transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
   6431     },
   6432     onGestureEnd: function onGestureEnd(e) {
   6433       var swiper = this;
   6434       var params = swiper.params.zoom;
   6435       var zoom = swiper.zoom;
   6436       var gesture = zoom.gesture;
   6437       if (!Support.gestures) {
   6438         if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) {
   6439           return;
   6440         }
   6441         if (e.type !== 'touchend' || (e.type === 'touchend' && e.changedTouches.length < 2 && !Device.android)) {
   6442           return;
   6443         }
   6444         zoom.fakeGestureTouched = false;
   6445         zoom.fakeGestureMoved = false;
   6446       }
   6447       if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
   6448       zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);
   6449       gesture.$imageEl.transition(swiper.params.speed).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
   6450       zoom.currentScale = zoom.scale;
   6451       zoom.isScaling = false;
   6452       if (zoom.scale === 1) { gesture.$slideEl = undefined; }
   6453     },
   6454     onTouchStart: function onTouchStart(e) {
   6455       var swiper = this;
   6456       var zoom = swiper.zoom;
   6457       var gesture = zoom.gesture;
   6458       var image = zoom.image;
   6459       if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
   6460       if (image.isTouched) { return; }
   6461       if (Device.android) { e.preventDefault(); }
   6462       image.isTouched = true;
   6463       image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
   6464       image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
   6465     },
   6466     onTouchMove: function onTouchMove(e) {
   6467       var swiper = this;
   6468       var zoom = swiper.zoom;
   6469       var gesture = zoom.gesture;
   6470       var image = zoom.image;
   6471       var velocity = zoom.velocity;
   6472       if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
   6473       swiper.allowClick = false;
   6474       if (!image.isTouched || !gesture.$slideEl) { return; }
   6475 
   6476       if (!image.isMoved) {
   6477         image.width = gesture.$imageEl[0].offsetWidth;
   6478         image.height = gesture.$imageEl[0].offsetHeight;
   6479         image.startX = Utils.getTranslate(gesture.$imageWrapEl[0], 'x') || 0;
   6480         image.startY = Utils.getTranslate(gesture.$imageWrapEl[0], 'y') || 0;
   6481         gesture.slideWidth = gesture.$slideEl[0].offsetWidth;
   6482         gesture.slideHeight = gesture.$slideEl[0].offsetHeight;
   6483         gesture.$imageWrapEl.transition(0);
   6484         if (swiper.rtl) {
   6485           image.startX = -image.startX;
   6486           image.startY = -image.startY;
   6487         }
   6488       }
   6489       // Define if we need image drag
   6490       var scaledWidth = image.width * zoom.scale;
   6491       var scaledHeight = image.height * zoom.scale;
   6492 
   6493       if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) { return; }
   6494 
   6495       image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);
   6496       image.maxX = -image.minX;
   6497       image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);
   6498       image.maxY = -image.minY;
   6499 
   6500       image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
   6501       image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
   6502 
   6503       if (!image.isMoved && !zoom.isScaling) {
   6504         if (
   6505           swiper.isHorizontal()
   6506           && (
   6507             (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x)
   6508             || (Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)
   6509           )
   6510         ) {
   6511           image.isTouched = false;
   6512           return;
   6513         } if (
   6514           !swiper.isHorizontal()
   6515           && (
   6516             (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y)
   6517             || (Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)
   6518           )
   6519         ) {
   6520           image.isTouched = false;
   6521           return;
   6522         }
   6523       }
   6524       e.preventDefault();
   6525       e.stopPropagation();
   6526 
   6527       image.isMoved = true;
   6528       image.currentX = (image.touchesCurrent.x - image.touchesStart.x) + image.startX;
   6529       image.currentY = (image.touchesCurrent.y - image.touchesStart.y) + image.startY;
   6530 
   6531       if (image.currentX < image.minX) {
   6532         image.currentX = (image.minX + 1) - (Math.pow( ((image.minX - image.currentX) + 1), 0.8 ));
   6533       }
   6534       if (image.currentX > image.maxX) {
   6535         image.currentX = (image.maxX - 1) + (Math.pow( ((image.currentX - image.maxX) + 1), 0.8 ));
   6536       }
   6537 
   6538       if (image.currentY < image.minY) {
   6539         image.currentY = (image.minY + 1) - (Math.pow( ((image.minY - image.currentY) + 1), 0.8 ));
   6540       }
   6541       if (image.currentY > image.maxY) {
   6542         image.currentY = (image.maxY - 1) + (Math.pow( ((image.currentY - image.maxY) + 1), 0.8 ));
   6543       }
   6544 
   6545       // Velocity
   6546       if (!velocity.prevPositionX) { velocity.prevPositionX = image.touchesCurrent.x; }
   6547       if (!velocity.prevPositionY) { velocity.prevPositionY = image.touchesCurrent.y; }
   6548       if (!velocity.prevTime) { velocity.prevTime = Date.now(); }
   6549       velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;
   6550       velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;
   6551       if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) { velocity.x = 0; }
   6552       if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) { velocity.y = 0; }
   6553       velocity.prevPositionX = image.touchesCurrent.x;
   6554       velocity.prevPositionY = image.touchesCurrent.y;
   6555       velocity.prevTime = Date.now();
   6556 
   6557       gesture.$imageWrapEl.transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)"));
   6558     },
   6559     onTouchEnd: function onTouchEnd() {
   6560       var swiper = this;
   6561       var zoom = swiper.zoom;
   6562       var gesture = zoom.gesture;
   6563       var image = zoom.image;
   6564       var velocity = zoom.velocity;
   6565       if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
   6566       if (!image.isTouched || !image.isMoved) {
   6567         image.isTouched = false;
   6568         image.isMoved = false;
   6569         return;
   6570       }
   6571       image.isTouched = false;
   6572       image.isMoved = false;
   6573       var momentumDurationX = 300;
   6574       var momentumDurationY = 300;
   6575       var momentumDistanceX = velocity.x * momentumDurationX;
   6576       var newPositionX = image.currentX + momentumDistanceX;
   6577       var momentumDistanceY = velocity.y * momentumDurationY;
   6578       var newPositionY = image.currentY + momentumDistanceY;
   6579 
   6580       // Fix duration
   6581       if (velocity.x !== 0) { momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); }
   6582       if (velocity.y !== 0) { momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); }
   6583       var momentumDuration = Math.max(momentumDurationX, momentumDurationY);
   6584 
   6585       image.currentX = newPositionX;
   6586       image.currentY = newPositionY;
   6587 
   6588       // Define if we need image drag
   6589       var scaledWidth = image.width * zoom.scale;
   6590       var scaledHeight = image.height * zoom.scale;
   6591       image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);
   6592       image.maxX = -image.minX;
   6593       image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);
   6594       image.maxY = -image.minY;
   6595       image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);
   6596       image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);
   6597 
   6598       gesture.$imageWrapEl.transition(momentumDuration).transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)"));
   6599     },
   6600     onTransitionEnd: function onTransitionEnd() {
   6601       var swiper = this;
   6602       var zoom = swiper.zoom;
   6603       var gesture = zoom.gesture;
   6604       if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {
   6605         gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');
   6606         gesture.$imageWrapEl.transform('translate3d(0,0,0)');
   6607 
   6608         zoom.scale = 1;
   6609         zoom.currentScale = 1;
   6610 
   6611         gesture.$slideEl = undefined;
   6612         gesture.$imageEl = undefined;
   6613         gesture.$imageWrapEl = undefined;
   6614       }
   6615     },
   6616     // Toggle Zoom
   6617     toggle: function toggle(e) {
   6618       var swiper = this;
   6619       var zoom = swiper.zoom;
   6620 
   6621       if (zoom.scale && zoom.scale !== 1) {
   6622         // Zoom Out
   6623         zoom.out();
   6624       } else {
   6625         // Zoom In
   6626         zoom.in(e);
   6627       }
   6628     },
   6629     in: function in$1(e) {
   6630       var swiper = this;
   6631 
   6632       var zoom = swiper.zoom;
   6633       var params = swiper.params.zoom;
   6634       var gesture = zoom.gesture;
   6635       var image = zoom.image;
   6636 
   6637       if (!gesture.$slideEl) {
   6638         gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);
   6639         gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
   6640         gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
   6641       }
   6642       if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
   6643 
   6644       gesture.$slideEl.addClass(("" + (params.zoomedSlideClass)));
   6645 
   6646       var touchX;
   6647       var touchY;
   6648       var offsetX;
   6649       var offsetY;
   6650       var diffX;
   6651       var diffY;
   6652       var translateX;
   6653       var translateY;
   6654       var imageWidth;
   6655       var imageHeight;
   6656       var scaledWidth;
   6657       var scaledHeight;
   6658       var translateMinX;
   6659       var translateMinY;
   6660       var translateMaxX;
   6661       var translateMaxY;
   6662       var slideWidth;
   6663       var slideHeight;
   6664 
   6665       if (typeof image.touchesStart.x === 'undefined' && e) {
   6666         touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;
   6667         touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;
   6668       } else {
   6669         touchX = image.touchesStart.x;
   6670         touchY = image.touchesStart.y;
   6671       }
   6672 
   6673       zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
   6674       zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
   6675       if (e) {
   6676         slideWidth = gesture.$slideEl[0].offsetWidth;
   6677         slideHeight = gesture.$slideEl[0].offsetHeight;
   6678         offsetX = gesture.$slideEl.offset().left;
   6679         offsetY = gesture.$slideEl.offset().top;
   6680         diffX = (offsetX + (slideWidth / 2)) - touchX;
   6681         diffY = (offsetY + (slideHeight / 2)) - touchY;
   6682 
   6683         imageWidth = gesture.$imageEl[0].offsetWidth;
   6684         imageHeight = gesture.$imageEl[0].offsetHeight;
   6685         scaledWidth = imageWidth * zoom.scale;
   6686         scaledHeight = imageHeight * zoom.scale;
   6687 
   6688         translateMinX = Math.min(((slideWidth / 2) - (scaledWidth / 2)), 0);
   6689         translateMinY = Math.min(((slideHeight / 2) - (scaledHeight / 2)), 0);
   6690         translateMaxX = -translateMinX;
   6691         translateMaxY = -translateMinY;
   6692 
   6693         translateX = diffX * zoom.scale;
   6694         translateY = diffY * zoom.scale;
   6695 
   6696         if (translateX < translateMinX) {
   6697           translateX = translateMinX;
   6698         }
   6699         if (translateX > translateMaxX) {
   6700           translateX = translateMaxX;
   6701         }
   6702 
   6703         if (translateY < translateMinY) {
   6704           translateY = translateMinY;
   6705         }
   6706         if (translateY > translateMaxY) {
   6707           translateY = translateMaxY;
   6708         }
   6709       } else {
   6710         translateX = 0;
   6711         translateY = 0;
   6712       }
   6713       gesture.$imageWrapEl.transition(300).transform(("translate3d(" + translateX + "px, " + translateY + "px,0)"));
   6714       gesture.$imageEl.transition(300).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
   6715     },
   6716     out: function out() {
   6717       var swiper = this;
   6718 
   6719       var zoom = swiper.zoom;
   6720       var params = swiper.params.zoom;
   6721       var gesture = zoom.gesture;
   6722 
   6723       if (!gesture.$slideEl) {
   6724         gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);
   6725         gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
   6726         gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
   6727       }
   6728       if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
   6729 
   6730       zoom.scale = 1;
   6731       zoom.currentScale = 1;
   6732       gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');
   6733       gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');
   6734       gesture.$slideEl.removeClass(("" + (params.zoomedSlideClass)));
   6735       gesture.$slideEl = undefined;
   6736     },
   6737     // Attach/Detach Events
   6738     enable: function enable() {
   6739       var swiper = this;
   6740       var zoom = swiper.zoom;
   6741       if (zoom.enabled) { return; }
   6742       zoom.enabled = true;
   6743 
   6744       var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;
   6745       var activeListenerWithCapture = Support.passiveListener ? { passive: false, capture: true } : true;
   6746 
   6747       var slideSelector = "." + (swiper.params.slideClass);
   6748 
   6749       // Scale image
   6750       if (Support.gestures) {
   6751         swiper.$wrapperEl.on('gesturestart', slideSelector, zoom.onGestureStart, passiveListener);
   6752         swiper.$wrapperEl.on('gesturechange', slideSelector, zoom.onGestureChange, passiveListener);
   6753         swiper.$wrapperEl.on('gestureend', slideSelector, zoom.onGestureEnd, passiveListener);
   6754       } else if (swiper.touchEvents.start === 'touchstart') {
   6755         swiper.$wrapperEl.on(swiper.touchEvents.start, slideSelector, zoom.onGestureStart, passiveListener);
   6756         swiper.$wrapperEl.on(swiper.touchEvents.move, slideSelector, zoom.onGestureChange, activeListenerWithCapture);
   6757         swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, zoom.onGestureEnd, passiveListener);
   6758         if (swiper.touchEvents.cancel) {
   6759           swiper.$wrapperEl.on(swiper.touchEvents.cancel, slideSelector, zoom.onGestureEnd, passiveListener);
   6760         }
   6761       }
   6762 
   6763       // Move image
   6764       swiper.$wrapperEl.on(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove, activeListenerWithCapture);
   6765     },
   6766     disable: function disable() {
   6767       var swiper = this;
   6768       var zoom = swiper.zoom;
   6769       if (!zoom.enabled) { return; }
   6770 
   6771       swiper.zoom.enabled = false;
   6772 
   6773       var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;
   6774       var activeListenerWithCapture = Support.passiveListener ? { passive: false, capture: true } : true;
   6775 
   6776       var slideSelector = "." + (swiper.params.slideClass);
   6777 
   6778       // Scale image
   6779       if (Support.gestures) {
   6780         swiper.$wrapperEl.off('gesturestart', slideSelector, zoom.onGestureStart, passiveListener);
   6781         swiper.$wrapperEl.off('gesturechange', slideSelector, zoom.onGestureChange, passiveListener);
   6782         swiper.$wrapperEl.off('gestureend', slideSelector, zoom.onGestureEnd, passiveListener);
   6783       } else if (swiper.touchEvents.start === 'touchstart') {
   6784         swiper.$wrapperEl.off(swiper.touchEvents.start, slideSelector, zoom.onGestureStart, passiveListener);
   6785         swiper.$wrapperEl.off(swiper.touchEvents.move, slideSelector, zoom.onGestureChange, activeListenerWithCapture);
   6786         swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, zoom.onGestureEnd, passiveListener);
   6787         if (swiper.touchEvents.cancel) {
   6788           swiper.$wrapperEl.off(swiper.touchEvents.cancel, slideSelector, zoom.onGestureEnd, passiveListener);
   6789         }
   6790       }
   6791 
   6792       // Move image
   6793       swiper.$wrapperEl.off(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove, activeListenerWithCapture);
   6794     },
   6795   };
   6796 
   6797   var Zoom$1 = {
   6798     name: 'zoom',
   6799     params: {
   6800       zoom: {
   6801         enabled: false,
   6802         maxRatio: 3,
   6803         minRatio: 1,
   6804         toggle: true,
   6805         containerClass: 'swiper-zoom-container',
   6806         zoomedSlideClass: 'swiper-slide-zoomed',
   6807       },
   6808     },
   6809     create: function create() {
   6810       var swiper = this;
   6811       var zoom = {
   6812         enabled: false,
   6813         scale: 1,
   6814         currentScale: 1,
   6815         isScaling: false,
   6816         gesture: {
   6817           $slideEl: undefined,
   6818           slideWidth: undefined,
   6819           slideHeight: undefined,
   6820           $imageEl: undefined,
   6821           $imageWrapEl: undefined,
   6822           maxRatio: 3,
   6823         },
   6824         image: {
   6825           isTouched: undefined,
   6826           isMoved: undefined,
   6827           currentX: undefined,
   6828           currentY: undefined,
   6829           minX: undefined,
   6830           minY: undefined,
   6831           maxX: undefined,
   6832           maxY: undefined,
   6833           width: undefined,
   6834           height: undefined,
   6835           startX: undefined,
   6836           startY: undefined,
   6837           touchesStart: {},
   6838           touchesCurrent: {},
   6839         },
   6840         velocity: {
   6841           x: undefined,
   6842           y: undefined,
   6843           prevPositionX: undefined,
   6844           prevPositionY: undefined,
   6845           prevTime: undefined,
   6846         },
   6847       };
   6848 
   6849       ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach(function (methodName) {
   6850         zoom[methodName] = Zoom[methodName].bind(swiper);
   6851       });
   6852       Utils.extend(swiper, {
   6853         zoom: zoom,
   6854       });
   6855 
   6856       var scale = 1;
   6857       Object.defineProperty(swiper.zoom, 'scale', {
   6858         get: function get() {
   6859           return scale;
   6860         },
   6861         set: function set(value) {
   6862           if (scale !== value) {
   6863             var imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined;
   6864             var slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined;
   6865             swiper.emit('zoomChange', value, imageEl, slideEl);
   6866           }
   6867           scale = value;
   6868         },
   6869       });
   6870     },
   6871     on: {
   6872       init: function init() {
   6873         var swiper = this;
   6874         if (swiper.params.zoom.enabled) {
   6875           swiper.zoom.enable();
   6876         }
   6877       },
   6878       destroy: function destroy() {
   6879         var swiper = this;
   6880         swiper.zoom.disable();
   6881       },
   6882       touchStart: function touchStart(e) {
   6883         var swiper = this;
   6884         if (!swiper.zoom.enabled) { return; }
   6885         swiper.zoom.onTouchStart(e);
   6886       },
   6887       touchEnd: function touchEnd(e) {
   6888         var swiper = this;
   6889         if (!swiper.zoom.enabled) { return; }
   6890         swiper.zoom.onTouchEnd(e);
   6891       },
   6892       doubleTap: function doubleTap(e) {
   6893         var swiper = this;
   6894         if (swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {
   6895           swiper.zoom.toggle(e);
   6896         }
   6897       },
   6898       transitionEnd: function transitionEnd() {
   6899         var swiper = this;
   6900         if (swiper.zoom.enabled && swiper.params.zoom.enabled) {
   6901           swiper.zoom.onTransitionEnd();
   6902         }
   6903       },
   6904       slideChange: function slideChange() {
   6905         var swiper = this;
   6906         if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {
   6907           swiper.zoom.onTransitionEnd();
   6908         }
   6909       },
   6910     },
   6911   };
   6912 
   6913   var Lazy = {
   6914     loadInSlide: function loadInSlide(index, loadInDuplicate) {
   6915       if ( loadInDuplicate === void 0 ) loadInDuplicate = true;
   6916 
   6917       var swiper = this;
   6918       var params = swiper.params.lazy;
   6919       if (typeof index === 'undefined') { return; }
   6920       if (swiper.slides.length === 0) { return; }
   6921       var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
   6922 
   6923       var $slideEl = isVirtual
   6924         ? swiper.$wrapperEl.children(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]"))
   6925         : swiper.slides.eq(index);
   6926 
   6927       var $images = $slideEl.find(("." + (params.elementClass) + ":not(." + (params.loadedClass) + "):not(." + (params.loadingClass) + ")"));
   6928       if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) {
   6929         $images = $images.add($slideEl[0]);
   6930       }
   6931       if ($images.length === 0) { return; }
   6932 
   6933       $images.each(function (imageIndex, imageEl) {
   6934         var $imageEl = $(imageEl);
   6935         $imageEl.addClass(params.loadingClass);
   6936 
   6937         var background = $imageEl.attr('data-background');
   6938         var src = $imageEl.attr('data-src');
   6939         var srcset = $imageEl.attr('data-srcset');
   6940         var sizes = $imageEl.attr('data-sizes');
   6941 
   6942         swiper.loadImage($imageEl[0], (src || background), srcset, sizes, false, function () {
   6943           if (typeof swiper === 'undefined' || swiper === null || !swiper || (swiper && !swiper.params) || swiper.destroyed) { return; }
   6944           if (background) {
   6945             $imageEl.css('background-image', ("url(\"" + background + "\")"));
   6946             $imageEl.removeAttr('data-background');
   6947           } else {
   6948             if (srcset) {
   6949               $imageEl.attr('srcset', srcset);
   6950               $imageEl.removeAttr('data-srcset');
   6951             }
   6952             if (sizes) {
   6953               $imageEl.attr('sizes', sizes);
   6954               $imageEl.removeAttr('data-sizes');
   6955             }
   6956             if (src) {
   6957               $imageEl.attr('src', src);
   6958               $imageEl.removeAttr('data-src');
   6959             }
   6960           }
   6961 
   6962           $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);
   6963           $slideEl.find(("." + (params.preloaderClass))).remove();
   6964           if (swiper.params.loop && loadInDuplicate) {
   6965             var slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');
   6966             if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {
   6967               var originalSlide = swiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]:not(." + (swiper.params.slideDuplicateClass) + ")"));
   6968               swiper.lazy.loadInSlide(originalSlide.index(), false);
   6969             } else {
   6970               var duplicatedSlide = swiper.$wrapperEl.children(("." + (swiper.params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]"));
   6971               swiper.lazy.loadInSlide(duplicatedSlide.index(), false);
   6972             }
   6973           }
   6974           swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]);
   6975           if (swiper.params.autoHeight) {
   6976             swiper.updateAutoHeight();
   6977           }
   6978         });
   6979 
   6980         swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]);
   6981       });
   6982     },
   6983     load: function load() {
   6984       var swiper = this;
   6985       var $wrapperEl = swiper.$wrapperEl;
   6986       var swiperParams = swiper.params;
   6987       var slides = swiper.slides;
   6988       var activeIndex = swiper.activeIndex;
   6989       var isVirtual = swiper.virtual && swiperParams.virtual.enabled;
   6990       var params = swiperParams.lazy;
   6991 
   6992       var slidesPerView = swiperParams.slidesPerView;
   6993       if (slidesPerView === 'auto') {
   6994         slidesPerView = 0;
   6995       }
   6996 
   6997       function slideExist(index) {
   6998         if (isVirtual) {
   6999           if ($wrapperEl.children(("." + (swiperParams.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]")).length) {
   7000             return true;
   7001           }
   7002         } else if (slides[index]) { return true; }
   7003         return false;
   7004       }
   7005       function slideIndex(slideEl) {
   7006         if (isVirtual) {
   7007           return $(slideEl).attr('data-swiper-slide-index');
   7008         }
   7009         return $(slideEl).index();
   7010       }
   7011 
   7012       if (!swiper.lazy.initialImageLoaded) { swiper.lazy.initialImageLoaded = true; }
   7013       if (swiper.params.watchSlidesVisibility) {
   7014         $wrapperEl.children(("." + (swiperParams.slideVisibleClass))).each(function (elIndex, slideEl) {
   7015           var index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();
   7016           swiper.lazy.loadInSlide(index);
   7017         });
   7018       } else if (slidesPerView > 1) {
   7019         for (var i = activeIndex; i < activeIndex + slidesPerView; i += 1) {
   7020           if (slideExist(i)) { swiper.lazy.loadInSlide(i); }
   7021         }
   7022       } else {
   7023         swiper.lazy.loadInSlide(activeIndex);
   7024       }
   7025       if (params.loadPrevNext) {
   7026         if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {
   7027           var amount = params.loadPrevNextAmount;
   7028           var spv = slidesPerView;
   7029           var maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);
   7030           var minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);
   7031           // Next Slides
   7032           for (var i$1 = activeIndex + slidesPerView; i$1 < maxIndex; i$1 += 1) {
   7033             if (slideExist(i$1)) { swiper.lazy.loadInSlide(i$1); }
   7034           }
   7035           // Prev Slides
   7036           for (var i$2 = minIndex; i$2 < activeIndex; i$2 += 1) {
   7037             if (slideExist(i$2)) { swiper.lazy.loadInSlide(i$2); }
   7038           }
   7039         } else {
   7040           var nextSlide = $wrapperEl.children(("." + (swiperParams.slideNextClass)));
   7041           if (nextSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(nextSlide)); }
   7042 
   7043           var prevSlide = $wrapperEl.children(("." + (swiperParams.slidePrevClass)));
   7044           if (prevSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(prevSlide)); }
   7045         }
   7046       }
   7047     },
   7048   };
   7049 
   7050   var Lazy$1 = {
   7051     name: 'lazy',
   7052     params: {
   7053       lazy: {
   7054         enabled: false,
   7055         loadPrevNext: false,
   7056         loadPrevNextAmount: 1,
   7057         loadOnTransitionStart: false,
   7058 
   7059         elementClass: 'swiper-lazy',
   7060         loadingClass: 'swiper-lazy-loading',
   7061         loadedClass: 'swiper-lazy-loaded',
   7062         preloaderClass: 'swiper-lazy-preloader',
   7063       },
   7064     },
   7065     create: function create() {
   7066       var swiper = this;
   7067       Utils.extend(swiper, {
   7068         lazy: {
   7069           initialImageLoaded: false,
   7070           load: Lazy.load.bind(swiper),
   7071           loadInSlide: Lazy.loadInSlide.bind(swiper),
   7072         },
   7073       });
   7074     },
   7075     on: {
   7076       beforeInit: function beforeInit() {
   7077         var swiper = this;
   7078         if (swiper.params.lazy.enabled && swiper.params.preloadImages) {
   7079           swiper.params.preloadImages = false;
   7080         }
   7081       },
   7082       init: function init() {
   7083         var swiper = this;
   7084         if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) {
   7085           swiper.lazy.load();
   7086         }
   7087       },
   7088       scroll: function scroll() {
   7089         var swiper = this;
   7090         if (swiper.params.freeMode && !swiper.params.freeModeSticky) {
   7091           swiper.lazy.load();
   7092         }
   7093       },
   7094       resize: function resize() {
   7095         var swiper = this;
   7096         if (swiper.params.lazy.enabled) {
   7097           swiper.lazy.load();
   7098         }
   7099       },
   7100       scrollbarDragMove: function scrollbarDragMove() {
   7101         var swiper = this;
   7102         if (swiper.params.lazy.enabled) {
   7103           swiper.lazy.load();
   7104         }
   7105       },
   7106       transitionStart: function transitionStart() {
   7107         var swiper = this;
   7108         if (swiper.params.lazy.enabled) {
   7109           if (swiper.params.lazy.loadOnTransitionStart || (!swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded)) {
   7110             swiper.lazy.load();
   7111           }
   7112         }
   7113       },
   7114       transitionEnd: function transitionEnd() {
   7115         var swiper = this;
   7116         if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {
   7117           swiper.lazy.load();
   7118         }
   7119       },
   7120       slideChange: function slideChange() {
   7121         var swiper = this;
   7122         if (swiper.params.lazy.enabled && swiper.params.cssMode) {
   7123           swiper.lazy.load();
   7124         }
   7125       },
   7126     },
   7127   };
   7128 
   7129   /* eslint no-bitwise: ["error", { "allow": [">>"] }] */
   7130 
   7131   var Controller = {
   7132     LinearSpline: function LinearSpline(x, y) {
   7133       var binarySearch = (function search() {
   7134         var maxIndex;
   7135         var minIndex;
   7136         var guess;
   7137         return function (array, val) {
   7138           minIndex = -1;
   7139           maxIndex = array.length;
   7140           while (maxIndex - minIndex > 1) {
   7141             guess = maxIndex + minIndex >> 1;
   7142             if (array[guess] <= val) {
   7143               minIndex = guess;
   7144             } else {
   7145               maxIndex = guess;
   7146             }
   7147           }
   7148           return maxIndex;
   7149         };
   7150       }());
   7151       this.x = x;
   7152       this.y = y;
   7153       this.lastIndex = x.length - 1;
   7154       // Given an x value (x2), return the expected y2 value:
   7155       // (x1,y1) is the known point before given value,
   7156       // (x3,y3) is the known point after given value.
   7157       var i1;
   7158       var i3;
   7159 
   7160       this.interpolate = function interpolate(x2) {
   7161         if (!x2) { return 0; }
   7162 
   7163         // Get the indexes of x1 and x3 (the array indexes before and after given x2):
   7164         i3 = binarySearch(this.x, x2);
   7165         i1 = i3 - 1;
   7166 
   7167         // We have our indexes i1 & i3, so we can calculate already:
   7168         // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
   7169         return (((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1])) + this.y[i1];
   7170       };
   7171       return this;
   7172     },
   7173     // xxx: for now i will just save one spline function to to
   7174     getInterpolateFunction: function getInterpolateFunction(c) {
   7175       var swiper = this;
   7176       if (!swiper.controller.spline) {
   7177         swiper.controller.spline = swiper.params.loop
   7178           ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid)
   7179           : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid);
   7180       }
   7181     },
   7182     setTranslate: function setTranslate(setTranslate$1, byController) {
   7183       var swiper = this;
   7184       var controlled = swiper.controller.control;
   7185       var multiplier;
   7186       var controlledTranslate;
   7187       function setControlledTranslate(c) {
   7188         // this will create an Interpolate function based on the snapGrids
   7189         // x is the Grid of the scrolled scroller and y will be the controlled scroller
   7190         // it makes sense to create this only once and recall it for the interpolation
   7191         // the function does a lot of value caching for performance
   7192         var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;
   7193         if (swiper.params.controller.by === 'slide') {
   7194           swiper.controller.getInterpolateFunction(c);
   7195           // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
   7196           // but it did not work out
   7197           controlledTranslate = -swiper.controller.spline.interpolate(-translate);
   7198         }
   7199 
   7200         if (!controlledTranslate || swiper.params.controller.by === 'container') {
   7201           multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());
   7202           controlledTranslate = ((translate - swiper.minTranslate()) * multiplier) + c.minTranslate();
   7203         }
   7204 
   7205         if (swiper.params.controller.inverse) {
   7206           controlledTranslate = c.maxTranslate() - controlledTranslate;
   7207         }
   7208         c.updateProgress(controlledTranslate);
   7209         c.setTranslate(controlledTranslate, swiper);
   7210         c.updateActiveIndex();
   7211         c.updateSlidesClasses();
   7212       }
   7213       if (Array.isArray(controlled)) {
   7214         for (var i = 0; i < controlled.length; i += 1) {
   7215           if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
   7216             setControlledTranslate(controlled[i]);
   7217           }
   7218         }
   7219       } else if (controlled instanceof Swiper && byController !== controlled) {
   7220         setControlledTranslate(controlled);
   7221       }
   7222     },
   7223     setTransition: function setTransition(duration, byController) {
   7224       var swiper = this;
   7225       var controlled = swiper.controller.control;
   7226       var i;
   7227       function setControlledTransition(c) {
   7228         c.setTransition(duration, swiper);
   7229         if (duration !== 0) {
   7230           c.transitionStart();
   7231           if (c.params.autoHeight) {
   7232             Utils.nextTick(function () {
   7233               c.updateAutoHeight();
   7234             });
   7235           }
   7236           c.$wrapperEl.transitionEnd(function () {
   7237             if (!controlled) { return; }
   7238             if (c.params.loop && swiper.params.controller.by === 'slide') {
   7239               c.loopFix();
   7240             }
   7241             c.transitionEnd();
   7242           });
   7243         }
   7244       }
   7245       if (Array.isArray(controlled)) {
   7246         for (i = 0; i < controlled.length; i += 1) {
   7247           if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
   7248             setControlledTransition(controlled[i]);
   7249           }
   7250         }
   7251       } else if (controlled instanceof Swiper && byController !== controlled) {
   7252         setControlledTransition(controlled);
   7253       }
   7254     },
   7255   };
   7256   var Controller$1 = {
   7257     name: 'controller',
   7258     params: {
   7259       controller: {
   7260         control: undefined,
   7261         inverse: false,
   7262         by: 'slide', // or 'container'
   7263       },
   7264     },
   7265     create: function create() {
   7266       var swiper = this;
   7267       Utils.extend(swiper, {
   7268         controller: {
   7269           control: swiper.params.controller.control,
   7270           getInterpolateFunction: Controller.getInterpolateFunction.bind(swiper),
   7271           setTranslate: Controller.setTranslate.bind(swiper),
   7272           setTransition: Controller.setTransition.bind(swiper),
   7273         },
   7274       });
   7275     },
   7276     on: {
   7277       update: function update() {
   7278         var swiper = this;
   7279         if (!swiper.controller.control) { return; }
   7280         if (swiper.controller.spline) {
   7281           swiper.controller.spline = undefined;
   7282           delete swiper.controller.spline;
   7283         }
   7284       },
   7285       resize: function resize() {
   7286         var swiper = this;
   7287         if (!swiper.controller.control) { return; }
   7288         if (swiper.controller.spline) {
   7289           swiper.controller.spline = undefined;
   7290           delete swiper.controller.spline;
   7291         }
   7292       },
   7293       observerUpdate: function observerUpdate() {
   7294         var swiper = this;
   7295         if (!swiper.controller.control) { return; }
   7296         if (swiper.controller.spline) {
   7297           swiper.controller.spline = undefined;
   7298           delete swiper.controller.spline;
   7299         }
   7300       },
   7301       setTranslate: function setTranslate(translate, byController) {
   7302         var swiper = this;
   7303         if (!swiper.controller.control) { return; }
   7304         swiper.controller.setTranslate(translate, byController);
   7305       },
   7306       setTransition: function setTransition(duration, byController) {
   7307         var swiper = this;
   7308         if (!swiper.controller.control) { return; }
   7309         swiper.controller.setTransition(duration, byController);
   7310       },
   7311     },
   7312   };
   7313 
   7314   var a11y = {
   7315     makeElFocusable: function makeElFocusable($el) {
   7316       $el.attr('tabIndex', '0');
   7317       return $el;
   7318     },
   7319     addElRole: function addElRole($el, role) {
   7320       $el.attr('role', role);
   7321       return $el;
   7322     },
   7323     addElLabel: function addElLabel($el, label) {
   7324       $el.attr('aria-label', label);
   7325       return $el;
   7326     },
   7327     disableEl: function disableEl($el) {
   7328       $el.attr('aria-disabled', true);
   7329       return $el;
   7330     },
   7331     enableEl: function enableEl($el) {
   7332       $el.attr('aria-disabled', false);
   7333       return $el;
   7334     },
   7335     onEnterKey: function onEnterKey(e) {
   7336       var swiper = this;
   7337       var params = swiper.params.a11y;
   7338       if (e.keyCode !== 13) { return; }
   7339       var $targetEl = $(e.target);
   7340       if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {
   7341         if (!(swiper.isEnd && !swiper.params.loop)) {
   7342           swiper.slideNext();
   7343         }
   7344         if (swiper.isEnd) {
   7345           swiper.a11y.notify(params.lastSlideMessage);
   7346         } else {
   7347           swiper.a11y.notify(params.nextSlideMessage);
   7348         }
   7349       }
   7350       if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {
   7351         if (!(swiper.isBeginning && !swiper.params.loop)) {
   7352           swiper.slidePrev();
   7353         }
   7354         if (swiper.isBeginning) {
   7355           swiper.a11y.notify(params.firstSlideMessage);
   7356         } else {
   7357           swiper.a11y.notify(params.prevSlideMessage);
   7358         }
   7359       }
   7360       if (swiper.pagination && $targetEl.is(("." + (swiper.params.pagination.bulletClass)))) {
   7361         $targetEl[0].click();
   7362       }
   7363     },
   7364     notify: function notify(message) {
   7365       var swiper = this;
   7366       var notification = swiper.a11y.liveRegion;
   7367       if (notification.length === 0) { return; }
   7368       notification.html('');
   7369       notification.html(message);
   7370     },
   7371     updateNavigation: function updateNavigation() {
   7372       var swiper = this;
   7373 
   7374       if (swiper.params.loop || !swiper.navigation) { return; }
   7375       var ref = swiper.navigation;
   7376       var $nextEl = ref.$nextEl;
   7377       var $prevEl = ref.$prevEl;
   7378 
   7379       if ($prevEl && $prevEl.length > 0) {
   7380         if (swiper.isBeginning) {
   7381           swiper.a11y.disableEl($prevEl);
   7382         } else {
   7383           swiper.a11y.enableEl($prevEl);
   7384         }
   7385       }
   7386       if ($nextEl && $nextEl.length > 0) {
   7387         if (swiper.isEnd) {
   7388           swiper.a11y.disableEl($nextEl);
   7389         } else {
   7390           swiper.a11y.enableEl($nextEl);
   7391         }
   7392       }
   7393     },
   7394     updatePagination: function updatePagination() {
   7395       var swiper = this;
   7396       var params = swiper.params.a11y;
   7397       if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
   7398         swiper.pagination.bullets.each(function (bulletIndex, bulletEl) {
   7399           var $bulletEl = $(bulletEl);
   7400           swiper.a11y.makeElFocusable($bulletEl);
   7401           swiper.a11y.addElRole($bulletEl, 'button');
   7402           swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/{{index}}/, $bulletEl.index() + 1));
   7403         });
   7404       }
   7405     },
   7406     init: function init() {
   7407       var swiper = this;
   7408 
   7409       swiper.$el.append(swiper.a11y.liveRegion);
   7410 
   7411       // Navigation
   7412       var params = swiper.params.a11y;
   7413       var $nextEl;
   7414       var $prevEl;
   7415       if (swiper.navigation && swiper.navigation.$nextEl) {
   7416         $nextEl = swiper.navigation.$nextEl;
   7417       }
   7418       if (swiper.navigation && swiper.navigation.$prevEl) {
   7419         $prevEl = swiper.navigation.$prevEl;
   7420       }
   7421       if ($nextEl) {
   7422         swiper.a11y.makeElFocusable($nextEl);
   7423         swiper.a11y.addElRole($nextEl, 'button');
   7424         swiper.a11y.addElLabel($nextEl, params.nextSlideMessage);
   7425         $nextEl.on('keydown', swiper.a11y.onEnterKey);
   7426       }
   7427       if ($prevEl) {
   7428         swiper.a11y.makeElFocusable($prevEl);
   7429         swiper.a11y.addElRole($prevEl, 'button');
   7430         swiper.a11y.addElLabel($prevEl, params.prevSlideMessage);
   7431         $prevEl.on('keydown', swiper.a11y.onEnterKey);
   7432       }
   7433 
   7434       // Pagination
   7435       if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
   7436         swiper.pagination.$el.on('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);
   7437       }
   7438     },
   7439     destroy: function destroy() {
   7440       var swiper = this;
   7441       if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) { swiper.a11y.liveRegion.remove(); }
   7442 
   7443       var $nextEl;
   7444       var $prevEl;
   7445       if (swiper.navigation && swiper.navigation.$nextEl) {
   7446         $nextEl = swiper.navigation.$nextEl;
   7447       }
   7448       if (swiper.navigation && swiper.navigation.$prevEl) {
   7449         $prevEl = swiper.navigation.$prevEl;
   7450       }
   7451       if ($nextEl) {
   7452         $nextEl.off('keydown', swiper.a11y.onEnterKey);
   7453       }
   7454       if ($prevEl) {
   7455         $prevEl.off('keydown', swiper.a11y.onEnterKey);
   7456       }
   7457 
   7458       // Pagination
   7459       if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
   7460         swiper.pagination.$el.off('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);
   7461       }
   7462     },
   7463   };
   7464   var A11y = {
   7465     name: 'a11y',
   7466     params: {
   7467       a11y: {
   7468         enabled: true,
   7469         notificationClass: 'swiper-notification',
   7470         prevSlideMessage: 'Previous slide',
   7471         nextSlideMessage: 'Next slide',
   7472         firstSlideMessage: 'This is the first slide',
   7473         lastSlideMessage: 'This is the last slide',
   7474         paginationBulletMessage: 'Go to slide {{index}}',
   7475       },
   7476     },
   7477     create: function create() {
   7478       var swiper = this;
   7479       Utils.extend(swiper, {
   7480         a11y: {
   7481           liveRegion: $(("<span class=\"" + (swiper.params.a11y.notificationClass) + "\" aria-live=\"assertive\" aria-atomic=\"true\"></span>")),
   7482         },
   7483       });
   7484       Object.keys(a11y).forEach(function (methodName) {
   7485         swiper.a11y[methodName] = a11y[methodName].bind(swiper);
   7486       });
   7487     },
   7488     on: {
   7489       init: function init() {
   7490         var swiper = this;
   7491         if (!swiper.params.a11y.enabled) { return; }
   7492         swiper.a11y.init();
   7493         swiper.a11y.updateNavigation();
   7494       },
   7495       toEdge: function toEdge() {
   7496         var swiper = this;
   7497         if (!swiper.params.a11y.enabled) { return; }
   7498         swiper.a11y.updateNavigation();
   7499       },
   7500       fromEdge: function fromEdge() {
   7501         var swiper = this;
   7502         if (!swiper.params.a11y.enabled) { return; }
   7503         swiper.a11y.updateNavigation();
   7504       },
   7505       paginationUpdate: function paginationUpdate() {
   7506         var swiper = this;
   7507         if (!swiper.params.a11y.enabled) { return; }
   7508         swiper.a11y.updatePagination();
   7509       },
   7510       destroy: function destroy() {
   7511         var swiper = this;
   7512         if (!swiper.params.a11y.enabled) { return; }
   7513         swiper.a11y.destroy();
   7514       },
   7515     },
   7516   };
   7517 
   7518   var History = {
   7519     init: function init() {
   7520       var swiper = this;
   7521       if (!swiper.params.history) { return; }
   7522       if (!win.history || !win.history.pushState) {
   7523         swiper.params.history.enabled = false;
   7524         swiper.params.hashNavigation.enabled = true;
   7525         return;
   7526       }
   7527       var history = swiper.history;
   7528       history.initialized = true;
   7529       history.paths = History.getPathValues();
   7530       if (!history.paths.key && !history.paths.value) { return; }
   7531       history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit);
   7532       if (!swiper.params.history.replaceState) {
   7533         win.addEventListener('popstate', swiper.history.setHistoryPopState);
   7534       }
   7535     },
   7536     destroy: function destroy() {
   7537       var swiper = this;
   7538       if (!swiper.params.history.replaceState) {
   7539         win.removeEventListener('popstate', swiper.history.setHistoryPopState);
   7540       }
   7541     },
   7542     setHistoryPopState: function setHistoryPopState() {
   7543       var swiper = this;
   7544       swiper.history.paths = History.getPathValues();
   7545       swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false);
   7546     },
   7547     getPathValues: function getPathValues() {
   7548       var pathArray = win.location.pathname.slice(1).split('/').filter(function (part) { return part !== ''; });
   7549       var total = pathArray.length;
   7550       var key = pathArray[total - 2];
   7551       var value = pathArray[total - 1];
   7552       return { key: key, value: value };
   7553     },
   7554     setHistory: function setHistory(key, index) {
   7555       var swiper = this;
   7556       if (!swiper.history.initialized || !swiper.params.history.enabled) { return; }
   7557       var slide = swiper.slides.eq(index);
   7558       var value = History.slugify(slide.attr('data-history'));
   7559       if (!win.location.pathname.includes(key)) {
   7560         value = key + "/" + value;
   7561       }
   7562       var currentState = win.history.state;
   7563       if (currentState && currentState.value === value) {
   7564         return;
   7565       }
   7566       if (swiper.params.history.replaceState) {
   7567         win.history.replaceState({ value: value }, null, value);
   7568       } else {
   7569         win.history.pushState({ value: value }, null, value);
   7570       }
   7571     },
   7572     slugify: function slugify(text) {
   7573       return text.toString()
   7574         .replace(/\s+/g, '-')
   7575         .replace(/[^\w-]+/g, '')
   7576         .replace(/--+/g, '-')
   7577         .replace(/^-+/, '')
   7578         .replace(/-+$/, '');
   7579     },
   7580     scrollToSlide: function scrollToSlide(speed, value, runCallbacks) {
   7581       var swiper = this;
   7582       if (value) {
   7583         for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
   7584           var slide = swiper.slides.eq(i);
   7585           var slideHistory = History.slugify(slide.attr('data-history'));
   7586           if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {
   7587             var index = slide.index();
   7588             swiper.slideTo(index, speed, runCallbacks);
   7589           }
   7590         }
   7591       } else {
   7592         swiper.slideTo(0, speed, runCallbacks);
   7593       }
   7594     },
   7595   };
   7596 
   7597   var History$1 = {
   7598     name: 'history',
   7599     params: {
   7600       history: {
   7601         enabled: false,
   7602         replaceState: false,
   7603         key: 'slides',
   7604       },
   7605     },
   7606     create: function create() {
   7607       var swiper = this;
   7608       Utils.extend(swiper, {
   7609         history: {
   7610           init: History.init.bind(swiper),
   7611           setHistory: History.setHistory.bind(swiper),
   7612           setHistoryPopState: History.setHistoryPopState.bind(swiper),
   7613           scrollToSlide: History.scrollToSlide.bind(swiper),
   7614           destroy: History.destroy.bind(swiper),
   7615         },
   7616       });
   7617     },
   7618     on: {
   7619       init: function init() {
   7620         var swiper = this;
   7621         if (swiper.params.history.enabled) {
   7622           swiper.history.init();
   7623         }
   7624       },
   7625       destroy: function destroy() {
   7626         var swiper = this;
   7627         if (swiper.params.history.enabled) {
   7628           swiper.history.destroy();
   7629         }
   7630       },
   7631       transitionEnd: function transitionEnd() {
   7632         var swiper = this;
   7633         if (swiper.history.initialized) {
   7634           swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
   7635         }
   7636       },
   7637       slideChange: function slideChange() {
   7638         var swiper = this;
   7639         if (swiper.history.initialized && swiper.params.cssMode) {
   7640           swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
   7641         }
   7642       },
   7643     },
   7644   };
   7645 
   7646   var HashNavigation = {
   7647     onHashCange: function onHashCange() {
   7648       var swiper = this;
   7649       var newHash = doc.location.hash.replace('#', '');
   7650       var activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');
   7651       if (newHash !== activeSlideHash) {
   7652         var newIndex = swiper.$wrapperEl.children(("." + (swiper.params.slideClass) + "[data-hash=\"" + newHash + "\"]")).index();
   7653         if (typeof newIndex === 'undefined') { return; }
   7654         swiper.slideTo(newIndex);
   7655       }
   7656     },
   7657     setHash: function setHash() {
   7658       var swiper = this;
   7659       if (!swiper.hashNavigation.initialized || !swiper.params.hashNavigation.enabled) { return; }
   7660       if (swiper.params.hashNavigation.replaceState && win.history && win.history.replaceState) {
   7661         win.history.replaceState(null, null, (("#" + (swiper.slides.eq(swiper.activeIndex).attr('data-hash'))) || ''));
   7662       } else {
   7663         var slide = swiper.slides.eq(swiper.activeIndex);
   7664         var hash = slide.attr('data-hash') || slide.attr('data-history');
   7665         doc.location.hash = hash || '';
   7666       }
   7667     },
   7668     init: function init() {
   7669       var swiper = this;
   7670       if (!swiper.params.hashNavigation.enabled || (swiper.params.history && swiper.params.history.enabled)) { return; }
   7671       swiper.hashNavigation.initialized = true;
   7672       var hash = doc.location.hash.replace('#', '');
   7673       if (hash) {
   7674         var speed = 0;
   7675         for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
   7676           var slide = swiper.slides.eq(i);
   7677           var slideHash = slide.attr('data-hash') || slide.attr('data-history');
   7678           if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {
   7679             var index = slide.index();
   7680             swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);
   7681           }
   7682         }
   7683       }
   7684       if (swiper.params.hashNavigation.watchState) {
   7685         $(win).on('hashchange', swiper.hashNavigation.onHashCange);
   7686       }
   7687     },
   7688     destroy: function destroy() {
   7689       var swiper = this;
   7690       if (swiper.params.hashNavigation.watchState) {
   7691         $(win).off('hashchange', swiper.hashNavigation.onHashCange);
   7692       }
   7693     },
   7694   };
   7695   var HashNavigation$1 = {
   7696     name: 'hash-navigation',
   7697     params: {
   7698       hashNavigation: {
   7699         enabled: false,
   7700         replaceState: false,
   7701         watchState: false,
   7702       },
   7703     },
   7704     create: function create() {
   7705       var swiper = this;
   7706       Utils.extend(swiper, {
   7707         hashNavigation: {
   7708           initialized: false,
   7709           init: HashNavigation.init.bind(swiper),
   7710           destroy: HashNavigation.destroy.bind(swiper),
   7711           setHash: HashNavigation.setHash.bind(swiper),
   7712           onHashCange: HashNavigation.onHashCange.bind(swiper),
   7713         },
   7714       });
   7715     },
   7716     on: {
   7717       init: function init() {
   7718         var swiper = this;
   7719         if (swiper.params.hashNavigation.enabled) {
   7720           swiper.hashNavigation.init();
   7721         }
   7722       },
   7723       destroy: function destroy() {
   7724         var swiper = this;
   7725         if (swiper.params.hashNavigation.enabled) {
   7726           swiper.hashNavigation.destroy();
   7727         }
   7728       },
   7729       transitionEnd: function transitionEnd() {
   7730         var swiper = this;
   7731         if (swiper.hashNavigation.initialized) {
   7732           swiper.hashNavigation.setHash();
   7733         }
   7734       },
   7735       slideChange: function slideChange() {
   7736         var swiper = this;
   7737         if (swiper.hashNavigation.initialized && swiper.params.cssMode) {
   7738           swiper.hashNavigation.setHash();
   7739         }
   7740       },
   7741     },
   7742   };
   7743 
   7744   /* eslint no-underscore-dangle: "off" */
   7745 
   7746   var Autoplay = {
   7747     run: function run() {
   7748       var swiper = this;
   7749       var $activeSlideEl = swiper.slides.eq(swiper.activeIndex);
   7750       var delay = swiper.params.autoplay.delay;
   7751       if ($activeSlideEl.attr('data-swiper-autoplay')) {
   7752         delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;
   7753       }
   7754       clearTimeout(swiper.autoplay.timeout);
   7755       swiper.autoplay.timeout = Utils.nextTick(function () {
   7756         if (swiper.params.autoplay.reverseDirection) {
   7757           if (swiper.params.loop) {
   7758             swiper.loopFix();
   7759             swiper.slidePrev(swiper.params.speed, true, true);
   7760             swiper.emit('autoplay');
   7761           } else if (!swiper.isBeginning) {
   7762             swiper.slidePrev(swiper.params.speed, true, true);
   7763             swiper.emit('autoplay');
   7764           } else if (!swiper.params.autoplay.stopOnLastSlide) {
   7765             swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);
   7766             swiper.emit('autoplay');
   7767           } else {
   7768             swiper.autoplay.stop();
   7769           }
   7770         } else if (swiper.params.loop) {
   7771           swiper.loopFix();
   7772           swiper.slideNext(swiper.params.speed, true, true);
   7773           swiper.emit('autoplay');
   7774         } else if (!swiper.isEnd) {
   7775           swiper.slideNext(swiper.params.speed, true, true);
   7776           swiper.emit('autoplay');
   7777         } else if (!swiper.params.autoplay.stopOnLastSlide) {
   7778           swiper.slideTo(0, swiper.params.speed, true, true);
   7779           swiper.emit('autoplay');
   7780         } else {
   7781           swiper.autoplay.stop();
   7782         }
   7783         if (swiper.params.cssMode && swiper.autoplay.running) { swiper.autoplay.run(); }
   7784       }, delay);
   7785     },
   7786     start: function start() {
   7787       var swiper = this;
   7788       if (typeof swiper.autoplay.timeout !== 'undefined') { return false; }
   7789       if (swiper.autoplay.running) { return false; }
   7790       swiper.autoplay.running = true;
   7791       swiper.emit('autoplayStart');
   7792       swiper.autoplay.run();
   7793       return true;
   7794     },
   7795     stop: function stop() {
   7796       var swiper = this;
   7797       if (!swiper.autoplay.running) { return false; }
   7798       if (typeof swiper.autoplay.timeout === 'undefined') { return false; }
   7799 
   7800       if (swiper.autoplay.timeout) {
   7801         clearTimeout(swiper.autoplay.timeout);
   7802         swiper.autoplay.timeout = undefined;
   7803       }
   7804       swiper.autoplay.running = false;
   7805       swiper.emit('autoplayStop');
   7806       return true;
   7807     },
   7808     pause: function pause(speed) {
   7809       var swiper = this;
   7810       if (!swiper.autoplay.running) { return; }
   7811       if (swiper.autoplay.paused) { return; }
   7812       if (swiper.autoplay.timeout) { clearTimeout(swiper.autoplay.timeout); }
   7813       swiper.autoplay.paused = true;
   7814       if (speed === 0 || !swiper.params.autoplay.waitForTransition) {
   7815         swiper.autoplay.paused = false;
   7816         swiper.autoplay.run();
   7817       } else {
   7818         swiper.$wrapperEl[0].addEventListener('transitionend', swiper.autoplay.onTransitionEnd);
   7819         swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
   7820       }
   7821     },
   7822   };
   7823 
   7824   var Autoplay$1 = {
   7825     name: 'autoplay',
   7826     params: {
   7827       autoplay: {
   7828         enabled: false,
   7829         delay: 3000,
   7830         waitForTransition: true,
   7831         disableOnInteraction: true,
   7832         stopOnLastSlide: false,
   7833         reverseDirection: false,
   7834       },
   7835     },
   7836     create: function create() {
   7837       var swiper = this;
   7838       Utils.extend(swiper, {
   7839         autoplay: {
   7840           running: false,
   7841           paused: false,
   7842           run: Autoplay.run.bind(swiper),
   7843           start: Autoplay.start.bind(swiper),
   7844           stop: Autoplay.stop.bind(swiper),
   7845           pause: Autoplay.pause.bind(swiper),
   7846           onVisibilityChange: function onVisibilityChange() {
   7847             if (document.visibilityState === 'hidden' && swiper.autoplay.running) {
   7848               swiper.autoplay.pause();
   7849             }
   7850             if (document.visibilityState === 'visible' && swiper.autoplay.paused) {
   7851               swiper.autoplay.run();
   7852               swiper.autoplay.paused = false;
   7853             }
   7854           },
   7855           onTransitionEnd: function onTransitionEnd(e) {
   7856             if (!swiper || swiper.destroyed || !swiper.$wrapperEl) { return; }
   7857             if (e.target !== this) { return; }
   7858             swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.autoplay.onTransitionEnd);
   7859             swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
   7860             swiper.autoplay.paused = false;
   7861             if (!swiper.autoplay.running) {
   7862               swiper.autoplay.stop();
   7863             } else {
   7864               swiper.autoplay.run();
   7865             }
   7866           },
   7867         },
   7868       });
   7869     },
   7870     on: {
   7871       init: function init() {
   7872         var swiper = this;
   7873         if (swiper.params.autoplay.enabled) {
   7874           swiper.autoplay.start();
   7875           document.addEventListener('visibilitychange', swiper.autoplay.onVisibilityChange);
   7876         }
   7877       },
   7878       beforeTransitionStart: function beforeTransitionStart(speed, internal) {
   7879         var swiper = this;
   7880         if (swiper.autoplay.running) {
   7881           if (internal || !swiper.params.autoplay.disableOnInteraction) {
   7882             swiper.autoplay.pause(speed);
   7883           } else {
   7884             swiper.autoplay.stop();
   7885           }
   7886         }
   7887       },
   7888       sliderFirstMove: function sliderFirstMove() {
   7889         var swiper = this;
   7890         if (swiper.autoplay.running) {
   7891           if (swiper.params.autoplay.disableOnInteraction) {
   7892             swiper.autoplay.stop();
   7893           } else {
   7894             swiper.autoplay.pause();
   7895           }
   7896         }
   7897       },
   7898       touchEnd: function touchEnd() {
   7899         var swiper = this;
   7900         if (swiper.params.cssMode && swiper.autoplay.paused && !swiper.params.autoplay.disableOnInteraction) {
   7901           swiper.autoplay.run();
   7902         }
   7903       },
   7904       destroy: function destroy() {
   7905         var swiper = this;
   7906         if (swiper.autoplay.running) {
   7907           swiper.autoplay.stop();
   7908         }
   7909         document.removeEventListener('visibilitychange', swiper.autoplay.onVisibilityChange);
   7910       },
   7911     },
   7912   };
   7913 
   7914   var Fade = {
   7915     setTranslate: function setTranslate() {
   7916       var swiper = this;
   7917       var slides = swiper.slides;
   7918       for (var i = 0; i < slides.length; i += 1) {
   7919         var $slideEl = swiper.slides.eq(i);
   7920         var offset = $slideEl[0].swiperSlideOffset;
   7921         var tx = -offset;
   7922         if (!swiper.params.virtualTranslate) { tx -= swiper.translate; }
   7923         var ty = 0;
   7924         if (!swiper.isHorizontal()) {
   7925           ty = tx;
   7926           tx = 0;
   7927         }
   7928         var slideOpacity = swiper.params.fadeEffect.crossFade
   7929           ? Math.max(1 - Math.abs($slideEl[0].progress), 0)
   7930           : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);
   7931         $slideEl
   7932           .css({
   7933             opacity: slideOpacity,
   7934           })
   7935           .transform(("translate3d(" + tx + "px, " + ty + "px, 0px)"));
   7936       }
   7937     },
   7938     setTransition: function setTransition(duration) {
   7939       var swiper = this;
   7940       var slides = swiper.slides;
   7941       var $wrapperEl = swiper.$wrapperEl;
   7942       slides.transition(duration);
   7943       if (swiper.params.virtualTranslate && duration !== 0) {
   7944         var eventTriggered = false;
   7945         slides.transitionEnd(function () {
   7946           if (eventTriggered) { return; }
   7947           if (!swiper || swiper.destroyed) { return; }
   7948           eventTriggered = true;
   7949           swiper.animating = false;
   7950           var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
   7951           for (var i = 0; i < triggerEvents.length; i += 1) {
   7952             $wrapperEl.trigger(triggerEvents[i]);
   7953           }
   7954         });
   7955       }
   7956     },
   7957   };
   7958 
   7959   var EffectFade = {
   7960     name: 'effect-fade',
   7961     params: {
   7962       fadeEffect: {
   7963         crossFade: false,
   7964       },
   7965     },
   7966     create: function create() {
   7967       var swiper = this;
   7968       Utils.extend(swiper, {
   7969         fadeEffect: {
   7970           setTranslate: Fade.setTranslate.bind(swiper),
   7971           setTransition: Fade.setTransition.bind(swiper),
   7972         },
   7973       });
   7974     },
   7975     on: {
   7976       beforeInit: function beforeInit() {
   7977         var swiper = this;
   7978         if (swiper.params.effect !== 'fade') { return; }
   7979         swiper.classNames.push(((swiper.params.containerModifierClass) + "fade"));
   7980         var overwriteParams = {
   7981           slidesPerView: 1,
   7982           slidesPerColumn: 1,
   7983           slidesPerGroup: 1,
   7984           watchSlidesProgress: true,
   7985           spaceBetween: 0,
   7986           virtualTranslate: true,
   7987         };
   7988         Utils.extend(swiper.params, overwriteParams);
   7989         Utils.extend(swiper.originalParams, overwriteParams);
   7990       },
   7991       setTranslate: function setTranslate() {
   7992         var swiper = this;
   7993         if (swiper.params.effect !== 'fade') { return; }
   7994         swiper.fadeEffect.setTranslate();
   7995       },
   7996       setTransition: function setTransition(duration) {
   7997         var swiper = this;
   7998         if (swiper.params.effect !== 'fade') { return; }
   7999         swiper.fadeEffect.setTransition(duration);
   8000       },
   8001     },
   8002   };
   8003 
   8004   var Cube = {
   8005     setTranslate: function setTranslate() {
   8006       var swiper = this;
   8007       var $el = swiper.$el;
   8008       var $wrapperEl = swiper.$wrapperEl;
   8009       var slides = swiper.slides;
   8010       var swiperWidth = swiper.width;
   8011       var swiperHeight = swiper.height;
   8012       var rtl = swiper.rtlTranslate;
   8013       var swiperSize = swiper.size;
   8014       var params = swiper.params.cubeEffect;
   8015       var isHorizontal = swiper.isHorizontal();
   8016       var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
   8017       var wrapperRotate = 0;
   8018       var $cubeShadowEl;
   8019       if (params.shadow) {
   8020         if (isHorizontal) {
   8021           $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');
   8022           if ($cubeShadowEl.length === 0) {
   8023             $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
   8024             $wrapperEl.append($cubeShadowEl);
   8025           }
   8026           $cubeShadowEl.css({ height: (swiperWidth + "px") });
   8027         } else {
   8028           $cubeShadowEl = $el.find('.swiper-cube-shadow');
   8029           if ($cubeShadowEl.length === 0) {
   8030             $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
   8031             $el.append($cubeShadowEl);
   8032           }
   8033         }
   8034       }
   8035       for (var i = 0; i < slides.length; i += 1) {
   8036         var $slideEl = slides.eq(i);
   8037         var slideIndex = i;
   8038         if (isVirtual) {
   8039           slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);
   8040         }
   8041         var slideAngle = slideIndex * 90;
   8042         var round = Math.floor(slideAngle / 360);
   8043         if (rtl) {
   8044           slideAngle = -slideAngle;
   8045           round = Math.floor(-slideAngle / 360);
   8046         }
   8047         var progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
   8048         var tx = 0;
   8049         var ty = 0;
   8050         var tz = 0;
   8051         if (slideIndex % 4 === 0) {
   8052           tx = -round * 4 * swiperSize;
   8053           tz = 0;
   8054         } else if ((slideIndex - 1) % 4 === 0) {
   8055           tx = 0;
   8056           tz = -round * 4 * swiperSize;
   8057         } else if ((slideIndex - 2) % 4 === 0) {
   8058           tx = swiperSize + (round * 4 * swiperSize);
   8059           tz = swiperSize;
   8060         } else if ((slideIndex - 3) % 4 === 0) {
   8061           tx = -swiperSize;
   8062           tz = (3 * swiperSize) + (swiperSize * 4 * round);
   8063         }
   8064         if (rtl) {
   8065           tx = -tx;
   8066         }
   8067 
   8068         if (!isHorizontal) {
   8069           ty = tx;
   8070           tx = 0;
   8071         }
   8072 
   8073         var transform = "rotateX(" + (isHorizontal ? 0 : -slideAngle) + "deg) rotateY(" + (isHorizontal ? slideAngle : 0) + "deg) translate3d(" + tx + "px, " + ty + "px, " + tz + "px)";
   8074         if (progress <= 1 && progress > -1) {
   8075           wrapperRotate = (slideIndex * 90) + (progress * 90);
   8076           if (rtl) { wrapperRotate = (-slideIndex * 90) - (progress * 90); }
   8077         }
   8078         $slideEl.transform(transform);
   8079         if (params.slideShadows) {
   8080           // Set shadows
   8081           var shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
   8082           var shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
   8083           if (shadowBefore.length === 0) {
   8084             shadowBefore = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>"));
   8085             $slideEl.append(shadowBefore);
   8086           }
   8087           if (shadowAfter.length === 0) {
   8088             shadowAfter = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>"));
   8089             $slideEl.append(shadowAfter);
   8090           }
   8091           if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }
   8092           if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }
   8093         }
   8094       }
   8095       $wrapperEl.css({
   8096         '-webkit-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
   8097         '-moz-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
   8098         '-ms-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
   8099         'transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
   8100       });
   8101 
   8102       if (params.shadow) {
   8103         if (isHorizontal) {
   8104           $cubeShadowEl.transform(("translate3d(0px, " + ((swiperWidth / 2) + params.shadowOffset) + "px, " + (-swiperWidth / 2) + "px) rotateX(90deg) rotateZ(0deg) scale(" + (params.shadowScale) + ")"));
   8105         } else {
   8106           var shadowAngle = Math.abs(wrapperRotate) - (Math.floor(Math.abs(wrapperRotate) / 90) * 90);
   8107           var multiplier = 1.5 - (
   8108             (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2)
   8109             + (Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2)
   8110           );
   8111           var scale1 = params.shadowScale;
   8112           var scale2 = params.shadowScale / multiplier;
   8113           var offset = params.shadowOffset;
   8114           $cubeShadowEl.transform(("scale3d(" + scale1 + ", 1, " + scale2 + ") translate3d(0px, " + ((swiperHeight / 2) + offset) + "px, " + (-swiperHeight / 2 / scale2) + "px) rotateX(-90deg)"));
   8115         }
   8116       }
   8117       var zFactor = (Browser.isSafari || Browser.isUiWebView) ? (-swiperSize / 2) : 0;
   8118       $wrapperEl
   8119         .transform(("translate3d(0px,0," + zFactor + "px) rotateX(" + (swiper.isHorizontal() ? 0 : wrapperRotate) + "deg) rotateY(" + (swiper.isHorizontal() ? -wrapperRotate : 0) + "deg)"));
   8120     },
   8121     setTransition: function setTransition(duration) {
   8122       var swiper = this;
   8123       var $el = swiper.$el;
   8124       var slides = swiper.slides;
   8125       slides
   8126         .transition(duration)
   8127         .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
   8128         .transition(duration);
   8129       if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {
   8130         $el.find('.swiper-cube-shadow').transition(duration);
   8131       }
   8132     },
   8133   };
   8134 
   8135   var EffectCube = {
   8136     name: 'effect-cube',
   8137     params: {
   8138       cubeEffect: {
   8139         slideShadows: true,
   8140         shadow: true,
   8141         shadowOffset: 20,
   8142         shadowScale: 0.94,
   8143       },
   8144     },
   8145     create: function create() {
   8146       var swiper = this;
   8147       Utils.extend(swiper, {
   8148         cubeEffect: {
   8149           setTranslate: Cube.setTranslate.bind(swiper),
   8150           setTransition: Cube.setTransition.bind(swiper),
   8151         },
   8152       });
   8153     },
   8154     on: {
   8155       beforeInit: function beforeInit() {
   8156         var swiper = this;
   8157         if (swiper.params.effect !== 'cube') { return; }
   8158         swiper.classNames.push(((swiper.params.containerModifierClass) + "cube"));
   8159         swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
   8160         var overwriteParams = {
   8161           slidesPerView: 1,
   8162           slidesPerColumn: 1,
   8163           slidesPerGroup: 1,
   8164           watchSlidesProgress: true,
   8165           resistanceRatio: 0,
   8166           spaceBetween: 0,
   8167           centeredSlides: false,
   8168           virtualTranslate: true,
   8169         };
   8170         Utils.extend(swiper.params, overwriteParams);
   8171         Utils.extend(swiper.originalParams, overwriteParams);
   8172       },
   8173       setTranslate: function setTranslate() {
   8174         var swiper = this;
   8175         if (swiper.params.effect !== 'cube') { return; }
   8176         swiper.cubeEffect.setTranslate();
   8177       },
   8178       setTransition: function setTransition(duration) {
   8179         var swiper = this;
   8180         if (swiper.params.effect !== 'cube') { return; }
   8181         swiper.cubeEffect.setTransition(duration);
   8182       },
   8183     },
   8184   };
   8185 
   8186   var Flip = {
   8187     setTranslate: function setTranslate() {
   8188       var swiper = this;
   8189       var slides = swiper.slides;
   8190       var rtl = swiper.rtlTranslate;
   8191       for (var i = 0; i < slides.length; i += 1) {
   8192         var $slideEl = slides.eq(i);
   8193         var progress = $slideEl[0].progress;
   8194         if (swiper.params.flipEffect.limitRotation) {
   8195           progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
   8196         }
   8197         var offset = $slideEl[0].swiperSlideOffset;
   8198         var rotate = -180 * progress;
   8199         var rotateY = rotate;
   8200         var rotateX = 0;
   8201         var tx = -offset;
   8202         var ty = 0;
   8203         if (!swiper.isHorizontal()) {
   8204           ty = tx;
   8205           tx = 0;
   8206           rotateX = -rotateY;
   8207           rotateY = 0;
   8208         } else if (rtl) {
   8209           rotateY = -rotateY;
   8210         }
   8211 
   8212         $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
   8213 
   8214         if (swiper.params.flipEffect.slideShadows) {
   8215           // Set shadows
   8216           var shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
   8217           var shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
   8218           if (shadowBefore.length === 0) {
   8219             shadowBefore = $(("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'left' : 'top') + "\"></div>"));
   8220             $slideEl.append(shadowBefore);
   8221           }
   8222           if (shadowAfter.length === 0) {
   8223             shadowAfter = $(("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'right' : 'bottom') + "\"></div>"));
   8224             $slideEl.append(shadowAfter);
   8225           }
   8226           if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }
   8227           if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }
   8228         }
   8229         $slideEl
   8230           .transform(("translate3d(" + tx + "px, " + ty + "px, 0px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)"));
   8231       }
   8232     },
   8233     setTransition: function setTransition(duration) {
   8234       var swiper = this;
   8235       var slides = swiper.slides;
   8236       var activeIndex = swiper.activeIndex;
   8237       var $wrapperEl = swiper.$wrapperEl;
   8238       slides
   8239         .transition(duration)
   8240         .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
   8241         .transition(duration);
   8242       if (swiper.params.virtualTranslate && duration !== 0) {
   8243         var eventTriggered = false;
   8244         // eslint-disable-next-line
   8245         slides.eq(activeIndex).transitionEnd(function onTransitionEnd() {
   8246           if (eventTriggered) { return; }
   8247           if (!swiper || swiper.destroyed) { return; }
   8248           // if (!$(this).hasClass(swiper.params.slideActiveClass)) return;
   8249           eventTriggered = true;
   8250           swiper.animating = false;
   8251           var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
   8252           for (var i = 0; i < triggerEvents.length; i += 1) {
   8253             $wrapperEl.trigger(triggerEvents[i]);
   8254           }
   8255         });
   8256       }
   8257     },
   8258   };
   8259 
   8260   var EffectFlip = {
   8261     name: 'effect-flip',
   8262     params: {
   8263       flipEffect: {
   8264         slideShadows: true,
   8265         limitRotation: true,
   8266       },
   8267     },
   8268     create: function create() {
   8269       var swiper = this;
   8270       Utils.extend(swiper, {
   8271         flipEffect: {
   8272           setTranslate: Flip.setTranslate.bind(swiper),
   8273           setTransition: Flip.setTransition.bind(swiper),
   8274         },
   8275       });
   8276     },
   8277     on: {
   8278       beforeInit: function beforeInit() {
   8279         var swiper = this;
   8280         if (swiper.params.effect !== 'flip') { return; }
   8281         swiper.classNames.push(((swiper.params.containerModifierClass) + "flip"));
   8282         swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
   8283         var overwriteParams = {
   8284           slidesPerView: 1,
   8285           slidesPerColumn: 1,
   8286           slidesPerGroup: 1,
   8287           watchSlidesProgress: true,
   8288           spaceBetween: 0,
   8289           virtualTranslate: true,
   8290         };
   8291         Utils.extend(swiper.params, overwriteParams);
   8292         Utils.extend(swiper.originalParams, overwriteParams);
   8293       },
   8294       setTranslate: function setTranslate() {
   8295         var swiper = this;
   8296         if (swiper.params.effect !== 'flip') { return; }
   8297         swiper.flipEffect.setTranslate();
   8298       },
   8299       setTransition: function setTransition(duration) {
   8300         var swiper = this;
   8301         if (swiper.params.effect !== 'flip') { return; }
   8302         swiper.flipEffect.setTransition(duration);
   8303       },
   8304     },
   8305   };
   8306 
   8307   var Coverflow = {
   8308     setTranslate: function setTranslate() {
   8309       var swiper = this;
   8310       var swiperWidth = swiper.width;
   8311       var swiperHeight = swiper.height;
   8312       var slides = swiper.slides;
   8313       var $wrapperEl = swiper.$wrapperEl;
   8314       var slidesSizesGrid = swiper.slidesSizesGrid;
   8315       var params = swiper.params.coverflowEffect;
   8316       var isHorizontal = swiper.isHorizontal();
   8317       var transform = swiper.translate;
   8318       var center = isHorizontal ? -transform + (swiperWidth / 2) : -transform + (swiperHeight / 2);
   8319       var rotate = isHorizontal ? params.rotate : -params.rotate;
   8320       var translate = params.depth;
   8321       // Each slide offset from center
   8322       for (var i = 0, length = slides.length; i < length; i += 1) {
   8323         var $slideEl = slides.eq(i);
   8324         var slideSize = slidesSizesGrid[i];
   8325         var slideOffset = $slideEl[0].swiperSlideOffset;
   8326         var offsetMultiplier = ((center - slideOffset - (slideSize / 2)) / slideSize) * params.modifier;
   8327 
   8328         var rotateY = isHorizontal ? rotate * offsetMultiplier : 0;
   8329         var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;
   8330         // var rotateZ = 0
   8331         var translateZ = -translate * Math.abs(offsetMultiplier);
   8332 
   8333         var stretch = params.stretch;
   8334         // Allow percentage to make a relative stretch for responsive sliders
   8335         if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {
   8336           stretch = ((parseFloat(params.stretch) / 100) * slideSize);
   8337         }
   8338         var translateY = isHorizontal ? 0 : stretch * (offsetMultiplier);
   8339         var translateX = isHorizontal ? stretch * (offsetMultiplier) : 0;
   8340 
   8341         // Fix for ultra small values
   8342         if (Math.abs(translateX) < 0.001) { translateX = 0; }
   8343         if (Math.abs(translateY) < 0.001) { translateY = 0; }
   8344         if (Math.abs(translateZ) < 0.001) { translateZ = 0; }
   8345         if (Math.abs(rotateY) < 0.001) { rotateY = 0; }
   8346         if (Math.abs(rotateX) < 0.001) { rotateX = 0; }
   8347 
   8348         var slideTransform = "translate3d(" + translateX + "px," + translateY + "px," + translateZ + "px)  rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)";
   8349 
   8350         $slideEl.transform(slideTransform);
   8351         $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
   8352         if (params.slideShadows) {
   8353           // Set shadows
   8354           var $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
   8355           var $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
   8356           if ($shadowBeforeEl.length === 0) {
   8357             $shadowBeforeEl = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>"));
   8358             $slideEl.append($shadowBeforeEl);
   8359           }
   8360           if ($shadowAfterEl.length === 0) {
   8361             $shadowAfterEl = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>"));
   8362             $slideEl.append($shadowAfterEl);
   8363           }
   8364           if ($shadowBeforeEl.length) { $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; }
   8365           if ($shadowAfterEl.length) { $shadowAfterEl[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; }
   8366         }
   8367       }
   8368 
   8369       // Set correct perspective for IE10
   8370       if (Support.pointerEvents || Support.prefixedPointerEvents) {
   8371         var ws = $wrapperEl[0].style;
   8372         ws.perspectiveOrigin = center + "px 50%";
   8373       }
   8374     },
   8375     setTransition: function setTransition(duration) {
   8376       var swiper = this;
   8377       swiper.slides
   8378         .transition(duration)
   8379         .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
   8380         .transition(duration);
   8381     },
   8382   };
   8383 
   8384   var EffectCoverflow = {
   8385     name: 'effect-coverflow',
   8386     params: {
   8387       coverflowEffect: {
   8388         rotate: 50,
   8389         stretch: 0,
   8390         depth: 100,
   8391         modifier: 1,
   8392         slideShadows: true,
   8393       },
   8394     },
   8395     create: function create() {
   8396       var swiper = this;
   8397       Utils.extend(swiper, {
   8398         coverflowEffect: {
   8399           setTranslate: Coverflow.setTranslate.bind(swiper),
   8400           setTransition: Coverflow.setTransition.bind(swiper),
   8401         },
   8402       });
   8403     },
   8404     on: {
   8405       beforeInit: function beforeInit() {
   8406         var swiper = this;
   8407         if (swiper.params.effect !== 'coverflow') { return; }
   8408 
   8409         swiper.classNames.push(((swiper.params.containerModifierClass) + "coverflow"));
   8410         swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
   8411 
   8412         swiper.params.watchSlidesProgress = true;
   8413         swiper.originalParams.watchSlidesProgress = true;
   8414       },
   8415       setTranslate: function setTranslate() {
   8416         var swiper = this;
   8417         if (swiper.params.effect !== 'coverflow') { return; }
   8418         swiper.coverflowEffect.setTranslate();
   8419       },
   8420       setTransition: function setTransition(duration) {
   8421         var swiper = this;
   8422         if (swiper.params.effect !== 'coverflow') { return; }
   8423         swiper.coverflowEffect.setTransition(duration);
   8424       },
   8425     },
   8426   };
   8427 
   8428   var Thumbs = {
   8429     init: function init() {
   8430       var swiper = this;
   8431       var ref = swiper.params;
   8432       var thumbsParams = ref.thumbs;
   8433       var SwiperClass = swiper.constructor;
   8434       if (thumbsParams.swiper instanceof SwiperClass) {
   8435         swiper.thumbs.swiper = thumbsParams.swiper;
   8436         Utils.extend(swiper.thumbs.swiper.originalParams, {
   8437           watchSlidesProgress: true,
   8438           slideToClickedSlide: false,
   8439         });
   8440         Utils.extend(swiper.thumbs.swiper.params, {
   8441           watchSlidesProgress: true,
   8442           slideToClickedSlide: false,
   8443         });
   8444       } else if (Utils.isObject(thumbsParams.swiper)) {
   8445         swiper.thumbs.swiper = new SwiperClass(Utils.extend({}, thumbsParams.swiper, {
   8446           watchSlidesVisibility: true,
   8447           watchSlidesProgress: true,
   8448           slideToClickedSlide: false,
   8449         }));
   8450         swiper.thumbs.swiperCreated = true;
   8451       }
   8452       swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);
   8453       swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick);
   8454     },
   8455     onThumbClick: function onThumbClick() {
   8456       var swiper = this;
   8457       var thumbsSwiper = swiper.thumbs.swiper;
   8458       if (!thumbsSwiper) { return; }
   8459       var clickedIndex = thumbsSwiper.clickedIndex;
   8460       var clickedSlide = thumbsSwiper.clickedSlide;
   8461       if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) { return; }
   8462       if (typeof clickedIndex === 'undefined' || clickedIndex === null) { return; }
   8463       var slideToIndex;
   8464       if (thumbsSwiper.params.loop) {
   8465         slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);
   8466       } else {
   8467         slideToIndex = clickedIndex;
   8468       }
   8469       if (swiper.params.loop) {
   8470         var currentIndex = swiper.activeIndex;
   8471         if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {
   8472           swiper.loopFix();
   8473           // eslint-disable-next-line
   8474           swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
   8475           currentIndex = swiper.activeIndex;
   8476         }
   8477         var prevIndex = swiper.slides.eq(currentIndex).prevAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index();
   8478         var nextIndex = swiper.slides.eq(currentIndex).nextAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index();
   8479         if (typeof prevIndex === 'undefined') { slideToIndex = nextIndex; }
   8480         else if (typeof nextIndex === 'undefined') { slideToIndex = prevIndex; }
   8481         else if (nextIndex - currentIndex < currentIndex - prevIndex) { slideToIndex = nextIndex; }
   8482         else { slideToIndex = prevIndex; }
   8483       }
   8484       swiper.slideTo(slideToIndex);
   8485     },
   8486     update: function update(initial) {
   8487       var swiper = this;
   8488       var thumbsSwiper = swiper.thumbs.swiper;
   8489       if (!thumbsSwiper) { return; }
   8490 
   8491       var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto'
   8492         ? thumbsSwiper.slidesPerViewDynamic()
   8493         : thumbsSwiper.params.slidesPerView;
   8494 
   8495       if (swiper.realIndex !== thumbsSwiper.realIndex) {
   8496         var currentThumbsIndex = thumbsSwiper.activeIndex;
   8497         var newThumbsIndex;
   8498         if (thumbsSwiper.params.loop) {
   8499           if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) {
   8500             thumbsSwiper.loopFix();
   8501             // eslint-disable-next-line
   8502             thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;
   8503             currentThumbsIndex = thumbsSwiper.activeIndex;
   8504           }
   8505           // Find actual thumbs index to slide to
   8506           var prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0).index();
   8507           var nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0).index();
   8508           if (typeof prevThumbsIndex === 'undefined') { newThumbsIndex = nextThumbsIndex; }
   8509           else if (typeof nextThumbsIndex === 'undefined') { newThumbsIndex = prevThumbsIndex; }
   8510           else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = currentThumbsIndex; }
   8511           else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = nextThumbsIndex; }
   8512           else { newThumbsIndex = prevThumbsIndex; }
   8513         } else {
   8514           newThumbsIndex = swiper.realIndex;
   8515         }
   8516         if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {
   8517           if (thumbsSwiper.params.centeredSlides) {
   8518             if (newThumbsIndex > currentThumbsIndex) {
   8519               newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
   8520             } else {
   8521               newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
   8522             }
   8523           } else if (newThumbsIndex > currentThumbsIndex) {
   8524             newThumbsIndex = newThumbsIndex - slidesPerView + 1;
   8525           }
   8526           thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);
   8527         }
   8528       }
   8529 
   8530       // Activate thumbs
   8531       var thumbsToActivate = 1;
   8532       var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
   8533 
   8534       if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
   8535         thumbsToActivate = swiper.params.slidesPerView;
   8536       }
   8537 
   8538       if (!swiper.params.thumbs.multipleActiveThumbs) {
   8539         thumbsToActivate = 1;
   8540       }
   8541 
   8542       thumbsToActivate = Math.floor(thumbsToActivate);
   8543 
   8544       thumbsSwiper.slides.removeClass(thumbActiveClass);
   8545       if (thumbsSwiper.params.loop || (thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled)) {
   8546         for (var i = 0; i < thumbsToActivate; i += 1) {
   8547           thumbsSwiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + (swiper.realIndex + i) + "\"]")).addClass(thumbActiveClass);
   8548         }
   8549       } else {
   8550         for (var i$1 = 0; i$1 < thumbsToActivate; i$1 += 1) {
   8551           thumbsSwiper.slides.eq(swiper.realIndex + i$1).addClass(thumbActiveClass);
   8552         }
   8553       }
   8554     },
   8555   };
   8556   var Thumbs$1 = {
   8557     name: 'thumbs',
   8558     params: {
   8559       thumbs: {
   8560         multipleActiveThumbs: true,
   8561         swiper: null,
   8562         slideThumbActiveClass: 'swiper-slide-thumb-active',
   8563         thumbsContainerClass: 'swiper-container-thumbs',
   8564       },
   8565     },
   8566     create: function create() {
   8567       var swiper = this;
   8568       Utils.extend(swiper, {
   8569         thumbs: {
   8570           swiper: null,
   8571           init: Thumbs.init.bind(swiper),
   8572           update: Thumbs.update.bind(swiper),
   8573           onThumbClick: Thumbs.onThumbClick.bind(swiper),
   8574         },
   8575       });
   8576     },
   8577     on: {
   8578       beforeInit: function beforeInit() {
   8579         var swiper = this;
   8580         var ref = swiper.params;
   8581         var thumbs = ref.thumbs;
   8582         if (!thumbs || !thumbs.swiper) { return; }
   8583         swiper.thumbs.init();
   8584         swiper.thumbs.update(true);
   8585       },
   8586       slideChange: function slideChange() {
   8587         var swiper = this;
   8588         if (!swiper.thumbs.swiper) { return; }
   8589         swiper.thumbs.update();
   8590       },
   8591       update: function update() {
   8592         var swiper = this;
   8593         if (!swiper.thumbs.swiper) { return; }
   8594         swiper.thumbs.update();
   8595       },
   8596       resize: function resize() {
   8597         var swiper = this;
   8598         if (!swiper.thumbs.swiper) { return; }
   8599         swiper.thumbs.update();
   8600       },
   8601       observerUpdate: function observerUpdate() {
   8602         var swiper = this;
   8603         if (!swiper.thumbs.swiper) { return; }
   8604         swiper.thumbs.update();
   8605       },
   8606       setTransition: function setTransition(duration) {
   8607         var swiper = this;
   8608         var thumbsSwiper = swiper.thumbs.swiper;
   8609         if (!thumbsSwiper) { return; }
   8610         thumbsSwiper.setTransition(duration);
   8611       },
   8612       beforeDestroy: function beforeDestroy() {
   8613         var swiper = this;
   8614         var thumbsSwiper = swiper.thumbs.swiper;
   8615         if (!thumbsSwiper) { return; }
   8616         if (swiper.thumbs.swiperCreated && thumbsSwiper) {
   8617           thumbsSwiper.destroy();
   8618         }
   8619       },
   8620     },
   8621   };
   8622 
   8623   // Swiper Class
   8624 
   8625   var components = [
   8626     Device$1,
   8627     Support$1,
   8628     Browser$1,
   8629     Resize,
   8630     Observer$1,
   8631     Virtual$1,
   8632     Keyboard$1,
   8633     Mousewheel$1,
   8634     Navigation$1,
   8635     Pagination$1,
   8636     Scrollbar$1,
   8637     Parallax$1,
   8638     Zoom$1,
   8639     Lazy$1,
   8640     Controller$1,
   8641     A11y,
   8642     History$1,
   8643     HashNavigation$1,
   8644     Autoplay$1,
   8645     EffectFade,
   8646     EffectCube,
   8647     EffectFlip,
   8648     EffectCoverflow,
   8649     Thumbs$1
   8650   ];
   8651 
   8652   if (typeof Swiper.use === 'undefined') {
   8653     Swiper.use = Swiper.Class.use;
   8654     Swiper.installModule = Swiper.Class.installModule;
   8655   }
   8656 
   8657   Swiper.use(components);
   8658 
   8659   return Swiper;
   8660 
   8661 }));