PageSourceSearch

https://busansinbo.or.kr/common/js/opensources/jquery/swiper.js

js busansinbo.or.kr collected 2026-10-05 06:05:53 UTC 288,349 bytes, 8,124 lines download raw bytes

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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.