PageSourceSearch

https://fairchildgarden.org/wp-content/themes/ftg-2019/script.min.js?v=77500015

js fairchildgarden.org collected 2026-10-01 10:27:24 UTC 307,346 bytes, 8,855 lines download raw bytes

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

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.