PageSourceSearch

https://luzir.es/wp-content/cache/wpfc-minified/fhp17f00/6ez55.js

js luzir.es collected 2026-10-08 16:15:55 UTC 338,226 bytes, 10,281 lines download raw bytes

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

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.