You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
zhishifufei_php/public/static/plug/vue-photo-preview/vue-photo-preview.js.map

1 lines
439 KiB

{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///vue-photo-preview.js","webpack:///webpack/bootstrap 833d24a31d572e4be08b","webpack:///src/lib/preview.vue","webpack:///./src/lib/index.js","webpack:///./node_modules/_babel-runtime@6.26.0@babel-runtime/regenerator/index.js","webpack:///./node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime-module.js","webpack:///./node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js","webpack:///./src/lib/preview.vue","webpack:///./node_modules/_vue-loader@13.7.3@vue-loader/lib/component-normalizer.js","webpack:///./src/lib/preview.vue?461f","webpack:///./node_modules/_photoswipe@4.1.3@photoswipe/dist/photoswipe.js","webpack:///./node_modules/_photoswipe@4.1.3@photoswipe/dist/photoswipe-ui-default.js"],"names":["root","factory","exports","module","define","amd","self","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","__webpack_exports__","__WEBPACK_IMPORTED_MODULE_0_photoswipe_dist_photoswipe_css__","__WEBPACK_IMPORTED_MODULE_1_photoswipe_dist_default_skin_default_skin_css__","_asyncToGenerator","fn","gen","apply","arguments","Promise","resolve","reject","step","key","arg","info","value","error","done","then","err","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default","__WEBPACK_IMPORTED_MODULE_1__preview_vue__","__WEBPACK_IMPORTED_MODULE_2_photoswipe_dist_photoswipe__","__WEBPACK_IMPORTED_MODULE_2_photoswipe_dist_photoswipe___default","__WEBPACK_IMPORTED_MODULE_3_photoswipe_dist_photoswipe_ui_default__","__WEBPACK_IMPORTED_MODULE_3_photoswipe_dist_photoswipe_ui_default___default","$preview","vuePhotoPreview","install","Vue","opts","Preview","extend","previewComponent","el","document","createElement","body","appendChild","$el","eventName","eventCallback","on","callback","mixin","data","galleryElements","galleryPicLoading","methods","$previewRefresh","_this","setTimeout","querySelectorAll","length","setAttribute","onclick","onThumbnailsClick","e","window","event","preventDefault","returnValue","thumbElements","eTarget","target","srcElement","group","getAttribute","index","clickedGallery","openPhotoSwipe","$emit","src","galleryElement","disableAnimation","fromURL","_this2","a","mark","_callee","pswpElement","gallery","options","items","j","realViewportWidth","useLargeImages","firstResize","imageSrcWillChange","wrap","_context","prev","next","parseThumbnailElements","sent","getThumbBoundsFn","thumbnail","pageYScroll","pageYOffset","documentElement","scrollTop","rect","getBoundingClientRect","x","left","y","top","w","width","addCaptionHTMLFn","item","captionEl","isFake","title","children","innerHTML","innerText","showHideOpacity","history","shareEl","maxSpreadZoom","getDoubleTapZoom","isMouseClick","initialZoomLevel","galleryPIDs","pid","abrupt","parseInt","isNaN","showAnimationDuration","PhotoSwipe","PhotoSwipeUI_Default","listen","dpiRatio","devicePixelRatio","Math","min","viewportSize","likelyTouchDevice","screen","invalidateCurrItems","h","init","classList","stop","nodeType","naturalWidth","Image","rw","rh","height","naturalHeight","text","author","onload","count","o1","o2","prop","initPreview","gallerySelector","mounted","g","Function","hadRuntime","regeneratorRuntime","getOwnPropertyNames","indexOf","oldRuntime","undefined","global","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","create","context","Context","_invoke","makeInvokeMethod","tryCatch","obj","type","GeneratorFunction","GeneratorFunctionPrototype","defineIteratorMethods","forEach","method","AsyncIterator","invoke","record","result","hasOwn","__await","unwrapped","enqueue","callInvokeWithMethodAndArg","previousPromise","state","GenStateSuspendedStart","GenStateExecuting","Error","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","_sent","dispatchException","GenStateSuspendedYield","iterator","return","TypeError","resultName","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","values","iterable","iteratorMethod","iteratorSymbol","Op","$Symbol","Symbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","inModule","runtime","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","Gp","constructor","displayName","isGeneratorFunction","genFun","ctor","setPrototypeOf","__proto__","awrap","async","iter","toString","keys","reverse","pop","skipTempReset","charAt","slice","rootEntry","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_13_7_3_vue_loader_lib_selector_type_script_index_0_preview_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_13_7_3_vue_loader_lib_template_compiler_index_id_data_v_befa1362_hasScoped_false_buble_transforms_node_modules_vue_loader_13_7_3_vue_loader_lib_selector_type_template_index_0_preview_vue__","normalizeComponent","Component","rawScriptExports","compiledTemplate","functionalTemplate","injectStyles","scopeId","moduleIdentifier","esModule","scriptExports","default","render","staticRenderFns","_compiled","functional","_scopeId","hook","$vnode","ssrContext","parent","__VUE_SSR_CONTEXT__","_registeredComponents","add","_ssrRegister","existing","beforeCreate","_injectStyles","concat","_vm","_h","$createElement","_self","_c","_m","staticClass","attrs","tabindex","role","aria-hidden","_v","esExports","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_RESULT__","template","UiClass","framework","features","bind","listener","unbind","methodName","split","isArray","Array","createEl","classes","tag","className","getScrollY","yOffset","removeClass","reg","RegExp","replace","addClass","hasClass","test","getChildByClass","parentEl","childClassName","node","firstChild","nextSibling","arraySearch","array","preventOverwrite","easing","sine","out","k","sin","PI","inOut","cos","cubic","detectFeatures","helperEl","helperStyle","style","vendor","oldIE","all","addEventListener","touch","requestAnimationFrame","raf","caf","cancelAnimationFrame","pointerEvent","navigator","msPointerEnabled","ua","userAgent","platform","v","match","isOldIOSPhone","androidversion","parseFloat","isOldAndroid","androidVersion","isMobileOpera","styleCheckItem","styleName","styleChecks","vendors","toUpperCase","toLowerCase","lastTime","currTime","Date","getTime","timeToCall","max","id","clearTimeout","svg","createElementNS","createSVGRect","evName","_handleEv","handleEvent","_options","allowPanToNext","spacing","bgOpacity","mouseUsed","loop","pinchToClose","closeOnScroll","closeOnVerticalDrag","verticalDragRange","hideAnimationDuration","focus","escKey","arrowKeys","mainScrollEndFriction","panEndFriction","isClickableElement","tagName","modal","scaleMode","_isOpen","_isDestroying","_closedByScroll","_currentItemIndex","_containerStyle","_containerShiftIndex","_upMoveEvents","_downEvents","_globalEventHandlers","_currZoomLevel","_startZoomLevel","_translatePrefix","_translateSufix","_updateSizeInterval","_itemsNeedUpdate","_itemHolders","_prevItemIndex","_dragStartEvent","_dragMoveEvent","_dragEndEvent","_dragCancelEvent","_transformKey","_pointerEventEnabled","_likelyTouchDevice","_requestAF","_cancelAF","_initalClassName","_initalWindowScrollY","_oldIE","_currentWindowScrollY","_features","_orientationChangeTimeout","_gestureStartTime","_gestureCheckSpeedTime","_releaseAnimData","_isZoomingIn","_verticalDragInitiated","_oldAndroidTouchEndTimeout","_isDragging","_isMultitouch","_zoomStarted","_moved","_dragAnimFrame","_mainScrollShifted","_currentPoints","_isZooming","_currPointsDistance","_startPointsDistance","_currPanBounds","_currZoomElementStyle","_mainScrollAnimating","_direction","_isFirstMove","_opacityChanged","_bgOpacity","_wasOverInitialZoom","_tempCounter","_getEmptyPoint","_currPanDist","_startPanOffset","_panOffset","_viewportSize","_currPositionIndex","_offset","_slideSize","_indexDiff","_isFixedPosition","_modules","_windowVisibleSize","_renderMaxResolution","_registerModule","publicMethods","_getLoopedId","numSlides","_getNumItems","_listeners","_listen","_shout","listeners","args","shift","_getCurrentTime","_applyBgOpacity","opacity","bg","_applyZoomTransform","styleObj","zoom","currItem","fitRatio","_applyCurrentZoomPan","allowRenderResolution","_setImageSize","_applyZoomPanToItem","container","initialPosition","_setTranslateX","elStyle","_moveMainScroll","dragging","newSlideIndexOffset","delta","round","_mainScrollPos","_calculatePanOffset","axis","zoomLevel","_midZoomPoint","_equalizePoints","p1","p2","_roundPoint","_mouseMoveTimeout","_onFirstMouseMove","_bindEvents","transform","scrollWrap","_unbindEvents","scroll","_calculatePanBounds","update","bounds","_calculateItemSize","_getMinZoomLevel","_getMaxZoomLevel","_modifyDestPanOffset","destPanBounds","destPanOffset","destZoomLevel","_setupTransforms","allow3dTransform","perspective","zoomRatio","_onKeyDown","keydownAction","keyCode","ctrlKey","altKey","shiftKey","metaKey","_onGlobalClick","stopPropagation","_updatePageScrollOffset","setScrollOffset","_animations","_numAnimations","_stopAnimation","_registerStartAnimation","_stopAllAnimations","_animateProp","b","endProp","easingFn","onUpdate","onComplete","t","startAnimTime","animloop","shout","isMainScrollAnimating","getZoomLevel","getCurrentIndex","isDragging","isZooming","applyZoomPan","panX","panY","itemHolders","display","resize","updateSize","orientationchange","clientWidth","keydown","click","oldPhone","animationName","ui","_getItemAt","position","rootClasses","mainClass","setContent","updateCurrItem","setInterval","close","_showOrHide","destroy","_showOrHideTimeout","clearInterval","_stopDragUpdateLoop","panTo","force","goTo","diff","updateCurrZoomItem","emulateSetContent","zoomElement","center","needsUpdate","beforeAnimation","tempHolder","diffAbs","abs","NUM_HOLDERS","unshift","prevItem","windowScrollY","innerWidth","innerHeight","clientHeight","holder","hIndex","cleanSlide","zoomTo","centerPoint","speed","updateFn","initialPanOffset","now","_currPoint","_startPoint","_currPointers","_startMainScrollPos","_posPoints","_tempPoint","_currZoomedItemIndex","_centerPoint","_lastReleaseTime","_currCenterPoint","_isEqualPoints","_isNearbyPoints","touch0","touch1","_calculatePointsDistance","sqrt","_dragUpdateLoop","_renderMovement","_canPan","_closestElement","parentNode","_preventObj","_preventDefaultEventBehaviour","isDown","prevent","_convertTouchToPoint","pageX","pageY","identifier","_findCenterOfPoints","pCenter","_pushPosPoint","time","_calculateVerticalDragOpacityRatio","_ePoint1","_ePoint2","_tempPointsArr","_getTouchPoints","touches","_panOrMoveMainScroll","panFriction","startOverDiff","newPanPos","newMainScrollPos","newOffset","dir","newMainScrollPosition","mainScrollDiff","_onDragStart","button","_initialZoomRunning","pointerIndex","pointerId","startPointsList","numPoints","_onDragMove","touchesList","pointsDistance","_calculateZoomLevel","zoomFriction","minZoomLevel","maxZoomLevel","minusDiff","percent","opacityRatio","mainScrollChanged","_onDragRelease","releasePoint","splice","MSPOINTER_TYPES","4","2","3","pointerType","gestureType","touchList","changedTouches","releaseTimeDiff","_initDragReleaseAnimationData","calculateSwipeSpeed","initalPanY","initialBgOpacity","itemChanged","_finishSwipeMainScrollGesture","_completeZoomGesture","_completePanGesture","lastFlickDuration","tempReleasePos","lastFlickOffset","lastFlickDist","lastFlickSpeed","slowDownRatio","slowDownRatioReverse","speedDecelerationRatio","speedDecelerationRatioAbs","distanceOffset","backAnimDestination","backAnimStarted","calculateOverBoundsAnimOffset","pos","calculateAnimOffset","timeDiff","panAnimLoop","zoomPan","lastNow","animData","itemsDiff","totalShiftDist","isFastLastFlick","nextCircle","finishAnimDuration","animateToX","animateToDist","touchesDistance","initialOpacity","initGestures","addEventNames","pref","down","move","up","cancel","maxTouchPoints","msMaxTouchPoints","mousedown","mousemove","mouseup","_items","_initialContentSet","_initialIsLoop","img","completeFn","thumbBounds","initialLayout","duration","removeAttribute","closeWithRaf","fadeEverything","loadError","miniImg","webkitBackfaceVisibility","initalBgOpacity","_tempPanAreaSize","_imagesToAppendPool","_controllerDefaultOptions","errorMsg","forceProgressiveLoading","preload","getNumItemsFn","_getZeroBounds","_calculateSingleItemPanBounds","realPanElementW","realPanElementH","vGap","isInitial","bottom","hRatio","vRatio","_appendImage","baseDiv","preventAnimation","keepPlaceholder","imageAppended","loaded","placeholder","_preloadImage","loading","loadComplete","onerror","_checkForError","cleanUp","maxRes","lastChild","_appendImagesPool","poolItem","clearPlaceholder","lazyLoadItem","initController","getItemAt","isNext","preloadBefore","preloadAfter","preloader","allowProgressiveImg","html","placeholderClassName","msrc","tapTimer","tapReleasePoint","_dispatchTapEvent","origEvent","createEvent","eDetail","initCustomEvent","dispatchEvent","initTap","onTapStart","onTapRelease","p0","_wheelDelta","initDesktopZoom","setupDesktopZoom","onInit","events","handleMouseWheel","mouseZoomedIn","hasDraggingClass","updateZoomable","removeDraggingClass","deltaY","deltaMode","deltaX","wheelDeltaX","wheelDeltaY","wheelDelta","detail","newPanX","newPanY","toggleDesktopZoom","doubleTapZoomLevel","zoomOut","_historyUpdateTimeout","_hashChangeTimeout","_hashAnimCheckTimeout","_hashChangedByScript","_hashChangedByHistory","_hashReseted","_initialHash","_historyChanged","_closedFromURL","_urlChangedOnce","_windowLoc","_supportsPushState","_historyDefaultOptions","galleryUID","_getHash","hash","substring","_cleanHistoryTimeouts","_parseItemIndexFromURL","params","vars","pair","searchfor","_updateHash","newHash","newURL","href","location","initHistory","updateURL","onHashChange","returnToOriginal","back","pushState","pathname","search","pswp","_fullscrenAPI","_controls","_captionContainer","_fakeCaptionContainer","_indexIndicator","_shareButton","_shareModal","_initalCloseOnScrollValue","_isIdle","_loadingIndicator","_loadingIndicatorHidden","_loadingIndicatorTimeout","_galleryHasOneSlide","_blockControlsTap","_blockControlsTapTimeout","_idleInterval","_idleTimer","_overlayUIUpdated","_controlsVisible","_shareModalHidden","_defaultUIOptions","barsSize","closeElClasses","timeToIdle","timeToIdleOutside","loadingIndicatorDelay","closeEl","fullscreenEl","zoomEl","counterEl","arrowEl","preloaderEl","tapToClose","tapToToggleControls","clickToCloseNonZoomable","shareButtons","label","url","download","getImageURLForShare","getPageURLForShare","getTextForShare","indexIndicatorSep","fitControlsWidth","_onControlsTap","_onIdleMouseMove","uiElement","found","clickedClass","_uiElements","onTap","tapDelay","_fitControlsInViewport","_togglePswpClass","cName","_countNumItems","hasOneSlide","_toggleShareModalClass","_toggleShareModal","_updateShareURLs","_openWindowPopup","hasAttribute","open","shareButtonData","shareURL","image_url","page_url","share_text","shareButtonOut","encodeURIComponent","parseShareButtonOut","_hasCloseClass","_idleIncrement","setIdle","_onMouseLeaveWindow","from","relatedTarget","toElement","nodeName","_setupFullscreenAPI","getFullscreenAPI","eventK","updateFullscreen","_setupLoadingIndicator","_toggleLoadingIndicator","hide","_applyNavBarGaps","gap","bars","insertBefore","captionSize","_setupIdle","_setupHidingControlsDuringGestures","hideControls","showControls","pinchControlsHidden","option","isFullscreen","exit","enter","_setupUIElements","classAttr","loopThroughChildElements","sChildren","topBar","point","preventObj","onGlobalTap","onMouseOver","removeChild","isIdle","updateIndexIndicator","supportsFullscreen","exitFullscreen","mozCancelFullScreen","webkitExitFullscreen","msExitFullscreen","api","dE","tF","requestFullscreen","enterK","exitK","elementK","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","Element","ALLOW_KEYBOARD_INPUT"],"mappings":"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","file":"vue-photo-preview.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"vue-photo-preview\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vue-photo-preview\"] = factory();\n\telse\n\t\troot[\"vue-photo-preview\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"vue-photo-preview\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vue-photo-preview\"] = factory();\n\telse\n\t\troot[\"vue-photo-preview\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 1);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_photoswipe_dist_photoswipe_css__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_photoswipe_dist_photoswipe_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_photoswipe_dist_photoswipe_css__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_photoswipe_dist_default_skin_default_skin_css__ = __webpack_require__(8);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_photoswipe_dist_default_skin_default_skin_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_photoswipe_dist_default_skin_default_skin_css__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({});\n\n/***/ }),\n/* 1 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__preview_vue__ = __webpack_require__(5);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_photoswipe_dist_photoswipe__ = __webpack_require__(10);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_photoswipe_dist_photoswipe___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_photoswipe_dist_photoswipe__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_photoswipe_dist_photoswipe_ui_default__ = __webpack_require__(11);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_photoswipe_dist_photoswipe_ui_default___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_photoswipe_dist_photoswipe_ui_default__);\n\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\n\n\n\nvar $preview = void 0;\nvar vuePhotoPreview = {\n\tinstall: function install(Vue, opts) {\n\t\tvar Preview = Vue.extend(__WEBPACK_IMPORTED_MODULE_1__preview_vue__[\"a\" /* default */]);\n\t\tvar opts = opts || {};\n\t\tif (!$preview) {\n\t\t\t$preview = new Preview({ el: document.createElement('div') });\n\t\t\tdocument.body.appendChild($preview.$el);\n\t\t}\n\t\tvar eventName = void 0,\n\t\t eventCallback = void 0;\n\t\tVue.prototype.$preview = {\n\t\t\tself: null,\n\t\t\ton: function on(name, callback) {\n\t\t\t\teventName = name;\n\t\t\t\teventCallback = callback;\n\t\t\t}\n\t\t};\n\t\tVue.mixin({\n\t\t\tdata: function data() {\n\t\t\t\treturn {\n\t\t\t\t\tgalleryElements: null,\n\t\t\t\t\tgalleryPicLoading: false\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tmethods: {\n\t\t\t\t$previewRefresh: function $previewRefresh() {\n\t\t\t\t\tvar _this = this;\n\n\t\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t\t_this.galleryElements = document.querySelectorAll('img[preview]');\n\t\t\t\t\t\tfor (var i = 0, l = _this.galleryElements.length; i < l; i++) {\n\t\t\t\t\t\t\t_this.galleryElements[i].setAttribute('data-pswp-uid', i + 1);\n\t\t\t\t\t\t\t_this.galleryElements[i].onclick = _this.onThumbnailsClick;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 200);\n\t\t\t\t},\n\t\t\t\tonThumbnailsClick: function onThumbnailsClick(e) {\n\t\t\t\t\tif (this.galleryPicLoading) return false;\n\t\t\t\t\tthis.galleryPicLoading = true;\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\te.preventDefault ? e.preventDefault() : e.returnValue = false;\n\n\t\t\t\t\tvar eTarget = e.target || e.srcElement;\n\n\t\t\t\t\tvar thumbElements;\n\t\t\t\t\tvar group = eTarget.getAttribute('preview');\n\t\t\t\t\tif (group) {\n\t\t\t\t\t\tthumbElements = document.querySelectorAll('img[preview=\"' + group + '\"]');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthumbElements = document.querySelectorAll('img[preview]');\n\t\t\t\t\t}\n\t\t\t\t\tvar clickedGallery = thumbElements;\n\n\t\t\t\t\tvar index;\n\n\t\t\t\t\tfor (var i = 0; i < clickedGallery.length; i++) {\n\t\t\t\t\t\tif (clickedGallery[i] === eTarget) {\n\t\t\t\t\t\t\tindex = i;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (index >= 0) {\n\t\t\t\t\t\tthis.openPhotoSwipe(index, clickedGallery);\n\t\t\t\t\t\tthis.$emit('preview-open', e, eTarget.src);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\topenPhotoSwipe: function openPhotoSwipe(index, galleryElement, disableAnimation, fromURL) {\n\t\t\t\t\tvar _this2 = this;\n\n\t\t\t\t\treturn _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee() {\n\t\t\t\t\t\tvar pswpElement, gallery, options, items, j, realViewportWidth, useLargeImages, firstResize, imageSrcWillChange;\n\t\t\t\t\t\treturn __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee$(_context) {\n\t\t\t\t\t\t\twhile (1) {\n\t\t\t\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t\t\tpswpElement = document.querySelectorAll('.pswp')[0];\n\t\t\t\t\t\t\t\t\t\t_context.next = 3;\n\t\t\t\t\t\t\t\t\t\treturn _this2.parseThumbnailElements(galleryElement);\n\n\t\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t\titems = _context.sent;\n\n\t\t\t\t\t\t\t\t\t\toptions = {\n\n\t\t\t\t\t\t\t\t\t\t\t// galleryUID: galleryElement.getAttribute('data-pswp-uid'),\n\n\t\t\t\t\t\t\t\t\t\t\tgetThumbBoundsFn: function getThumbBoundsFn(index) {\n\t\t\t\t\t\t\t\t\t\t\t\tvar thumbnail = items[index].el,\n\t\t\t\t\t\t\t\t\t\t\t\t pageYScroll = window.pageYOffset || document.documentElement.scrollTop,\n\t\t\t\t\t\t\t\t\t\t\t\t rect = thumbnail.getBoundingClientRect();\n\t\t\t\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: rect.left,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: rect.top + pageYScroll,\n\t\t\t\t\t\t\t\t\t\t\t\t\tw: rect.width\n\t\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t\t\t\taddCaptionHTMLFn: function addCaptionHTMLFn(item, captionEl, isFake) {\n\t\t\t\t\t\t\t\t\t\t\t\tif (!item.title) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tcaptionEl.children[0].innerText = '';\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tcaptionEl.children[0].innerHTML = item.title;\n\t\t\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tshowHideOpacity: true,\n\t\t\t\t\t\t\t\t\t\t\thistory: false,\n\t\t\t\t\t\t\t\t\t\t\tshareEl: false,\n\t\t\t\t\t\t\t\t\t\t\tmaxSpreadZoom: 3,\n\t\t\t\t\t\t\t\t\t\t\tgetDoubleTapZoom: function getDoubleTapZoom(isMouseClick, item) {\n\t\t\t\t\t\t\t\t\t\t\t\tif (isMouseClick) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn 1.5;\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn item.initialZoomLevel < 0.7 ? 1 : 1.5;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t\t\tif (!fromURL) {\n\t\t\t\t\t\t\t\t\t\t\t_context.next = 20;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (!options.galleryPIDs) {\n\t\t\t\t\t\t\t\t\t\t\t_context.next = 17;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tj = 0;\n\n\t\t\t\t\t\t\t\t\tcase 8:\n\t\t\t\t\t\t\t\t\t\tif (!(j < items.length)) {\n\t\t\t\t\t\t\t\t\t\t\t_context.next = 15;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (!(items[j].pid == index)) {\n\t\t\t\t\t\t\t\t\t\t\t_context.next = 12;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\toptions.index = j;\n\t\t\t\t\t\t\t\t\t\treturn _context.abrupt('break', 15);\n\n\t\t\t\t\t\t\t\t\tcase 12:\n\t\t\t\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t\t\t\t\t_context.next = 8;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 15:\n\t\t\t\t\t\t\t\t\t\t_context.next = 18;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 17:\n\t\t\t\t\t\t\t\t\t\toptions.index = parseInt(index, 10) - 1;\n\n\t\t\t\t\t\t\t\t\tcase 18:\n\t\t\t\t\t\t\t\t\t\t_context.next = 21;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 20:\n\t\t\t\t\t\t\t\t\t\toptions.index = parseInt(index, 10);\n\n\t\t\t\t\t\t\t\t\tcase 21:\n\t\t\t\t\t\t\t\t\t\tif (!isNaN(options.index)) {\n\t\t\t\t\t\t\t\t\t\t\t_context.next = 23;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn _context.abrupt('return');\n\n\t\t\t\t\t\t\t\t\tcase 23:\n\t\t\t\t\t\t\t\t\t\toptions = _this2.extend(options, opts);\n\n\t\t\t\t\t\t\t\t\t\tif (disableAnimation) {\n\t\t\t\t\t\t\t\t\t\t\toptions.showAnimationDuration = 0;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Pass data to PhotoSwipe and initialize it\n\t\t\t\t\t\t\t\t\t\tgallery = new __WEBPACK_IMPORTED_MODULE_2_photoswipe_dist_photoswipe___default.a(pswpElement, __WEBPACK_IMPORTED_MODULE_3_photoswipe_dist_photoswipe_ui_default___default.a, items, options);\n\t\t\t\t\t\t\t\t\t\tVue.prototype.$preview.self = gallery;\n\t\t\t\t\t\t\t\t\t\t// see: http://photoswipe.com/documentation/responsive-images.html\n\t\t\t\t\t\t\t\t\t\tuseLargeImages = false, firstResize = true;\n\n\n\t\t\t\t\t\t\t\t\t\tgallery.listen('beforeResize', function () {\n\n\t\t\t\t\t\t\t\t\t\t\tvar dpiRatio = window.devicePixelRatio ? window.devicePixelRatio : 1;\n\t\t\t\t\t\t\t\t\t\t\tdpiRatio = Math.min(dpiRatio, 2.5);\n\t\t\t\t\t\t\t\t\t\t\trealViewportWidth = gallery.viewportSize.x * dpiRatio;\n\n\t\t\t\t\t\t\t\t\t\t\tif (realViewportWidth >= 1200 || !gallery.likelyTouchDevice && realViewportWidth > 800 || screen.width > 1200) {\n\t\t\t\t\t\t\t\t\t\t\t\tif (!useLargeImages) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tuseLargeImages = true;\n\t\t\t\t\t\t\t\t\t\t\t\t\timageSrcWillChange = true;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\tif (useLargeImages) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tuseLargeImages = false;\n\t\t\t\t\t\t\t\t\t\t\t\t\timageSrcWillChange = true;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tif (imageSrcWillChange && !firstResize) {\n\t\t\t\t\t\t\t\t\t\t\t\tgallery.invalidateCurrItems();\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tif (firstResize) {\n\t\t\t\t\t\t\t\t\t\t\t\tfirstResize = false;\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\timageSrcWillChange = false;\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tgallery.listen('gettingData', function (index, item) {\n\t\t\t\t\t\t\t\t\t\t\tif (item.el.getAttribute('large')) {\n\t\t\t\t\t\t\t\t\t\t\t\titem.src = item.o.src;\n\t\t\t\t\t\t\t\t\t\t\t\titem.w = item.o.w;\n\t\t\t\t\t\t\t\t\t\t\t\titem.h = item.o.h;\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\titem.src = item.m.src;\n\t\t\t\t\t\t\t\t\t\t\t\titem.w = item.m.w;\n\t\t\t\t\t\t\t\t\t\t\t\titem.h = item.m.h;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\tgallery.listen('imageLoadComplete', function (index, item) {\n\t\t\t\t\t\t\t\t\t\t\t_this2.galleryPicLoading = false;\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\tgallery.listen(eventName, eventCallback);\n\t\t\t\t\t\t\t\t\t\tgallery.init();\n\t\t\t\t\t\t\t\t\t\t$preview.$el.classList = $preview.$el.classList + ' pswp--zoom-allowed';\n\n\t\t\t\t\t\t\t\t\tcase 34:\n\t\t\t\t\t\t\t\t\tcase 'end':\n\t\t\t\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, _callee, _this2);\n\t\t\t\t\t}))();\n\t\t\t\t},\n\t\t\t\tparseThumbnailElements: function parseThumbnailElements(thumbElements) {\n\t\t\t\t\treturn new Promise(function (resolve) {\n\t\t\t\t\t\tvar items = [],\n\t\t\t\t\t\t el,\n\t\t\t\t\t\t load = 0,\n\t\t\t\t\t\t item;\n\t\t\t\t\t\titem = {};\n\t\t\t\t\t\tfor (var i = 0; i < thumbElements.length; i++) {\n\t\t\t\t\t\t\tvar getImage = function getImage(index) {\n\t\t\t\t\t\t\t\tvar l = new Image();\n\t\t\t\t\t\t\t\tl.src = el.getAttribute('large') ? el.getAttribute('large') : el.getAttribute('src');\n\t\t\t\t\t\t\t\tl.text = el.getAttribute('preview-text');\n\t\t\t\t\t\t\t\tl.author = el.getAttribute('data-author');\n\t\t\t\t\t\t\t\tl.onload = function () {\n\t\t\t\t\t\t\t\t\titem = {\n\t\t\t\t\t\t\t\t\t\ttitle: l.text,\n\t\t\t\t\t\t\t\t\t\tel: thumbElements[index],\n\t\t\t\t\t\t\t\t\t\tsrc: l.src,\n\t\t\t\t\t\t\t\t\t\tw: rw,\n\t\t\t\t\t\t\t\t\t\th: rh,\n\t\t\t\t\t\t\t\t\t\tauthor: l.author,\n\t\t\t\t\t\t\t\t\t\to: {\n\t\t\t\t\t\t\t\t\t\t\tsrc: l.src,\n\t\t\t\t\t\t\t\t\t\t\tw: this.width,\n\t\t\t\t\t\t\t\t\t\t\th: this.height\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tm: {\n\t\t\t\t\t\t\t\t\t\t\tsrc: l.src,\n\t\t\t\t\t\t\t\t\t\t\tw: this.width,\n\t\t\t\t\t\t\t\t\t\t\th: this.height\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\titems[index] = item;\n\t\t\t\t\t\t\t\t\tcount++;\n\t\t\t\t\t\t\t\t\tif (count == thumbElements.length) {\n\t\t\t\t\t\t\t\t\t\tresolve(items);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tel = thumbElements[i];\n\n\t\t\t\t\t\t\t// include only element nodes \n\t\t\t\t\t\t\tif (el.nodeType !== 1) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (typeof el.naturalWidth == \"undefined\") {\n\t\t\t\t\t\t\t\t// IE 6/7/8\n\n\t\t\t\t\t\t\t\tvar i = new Image();\n\t\t\t\t\t\t\t\ti.src = el.src;\n\t\t\t\t\t\t\t\tvar rw = i.width;\n\t\t\t\t\t\t\t\tvar rh = i.height;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// HTML5 browsers\n\n\t\t\t\t\t\t\t\tvar rw = el.naturalWidth;\n\t\t\t\t\t\t\t\tvar rh = el.naturalHeight;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tgetImage(i);\n\t\t\t\t\t\t\tvar count = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn items;\n\t\t\t\t},\n\t\t\t\textend: function extend(o1, o2) {\n\t\t\t\t\tfor (var prop in o2) {\n\t\t\t\t\t\to1[prop] = o2[prop];\n\t\t\t\t\t}\n\t\t\t\t\treturn o1;\n\t\t\t\t},\n\t\t\t\tinitPreview: function initPreview(gallerySelector) {\n\t\t\t\t\tthis.galleryElements = document.querySelectorAll(gallerySelector);\n\t\t\t\t\tfor (var i = 0, l = this.galleryElements.length; i < l; i++) {\n\t\t\t\t\t\tthis.galleryElements[i].setAttribute('data-pswp-uid', i + 1);\n\t\t\t\t\t\tthis.galleryElements[i].onclick = this.onThumbnailsClick;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tmounted: function mounted() {\n\t\t\t\tthis.initPreview('img[preview]');\n\t\t\t}\n\t\t});\n\t}\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (vuePhotoPreview);\n\nif (typeof window !== 'undefined' && !window.vuePhotoPreview) {\n\twindow.vuePhotoPreview = vuePhotoPreview;\n}\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(3);\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g = (function() { return this })() || Function(\"return this\")();\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = __webpack_require__(4);\n\nif (hadRuntime) {\n // Restore the original runtime.\n g.regeneratorRuntime = oldRuntime;\n} else {\n // Remove the global property added by runtime.js.\n try {\n delete g.regeneratorRuntime;\n } catch(e) {\n g.regeneratorRuntime = undefined;\n }\n}\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // In sloppy mode, unbound `this` refers to the global object, fallback to\n // Function constructor if we're in global strict mode. That is sadly a form\n // of indirect eval which violates Content Security Policy.\n (function() { return this })() || Function(\"return this\")()\n);\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_13_7_3_vue_loader_lib_selector_type_script_index_0_preview_vue__ = __webpack_require__(0);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_13_7_3_vue_loader_lib_template_compiler_index_id_data_v_befa1362_hasScoped_false_buble_transforms_node_modules_vue_loader_13_7_3_vue_loader_lib_selector_type_template_index_0_preview_vue__ = __webpack_require__(9);\nvar normalizeComponent = __webpack_require__(6)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_13_7_3_vue_loader_lib_selector_type_script_index_0_preview_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_13_7_3_vue_loader_lib_template_compiler_index_id_data_v_befa1362_hasScoped_false_buble_transforms_node_modules_vue_loader_13_7_3_vue_loader_lib_selector_type_template_index_0_preview_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports) {\n\n/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file.\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nmodule.exports = function normalizeComponent (\n rawScriptExports,\n compiledTemplate,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier /* server only */\n) {\n var esModule\n var scriptExports = rawScriptExports = rawScriptExports || {}\n\n // ES6 modules interop\n var type = typeof rawScriptExports.default\n if (type === 'object' || type === 'function') {\n esModule = rawScriptExports\n scriptExports = rawScriptExports.default\n }\n\n // Vue.extend constructor export interop\n var options = typeof scriptExports === 'function'\n ? scriptExports.options\n : scriptExports\n\n // render functions\n if (compiledTemplate) {\n options.render = compiledTemplate.render\n options.staticRenderFns = compiledTemplate.staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = scopeId\n }\n\n var hook\n if (moduleIdentifier) { // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = injectStyles\n }\n\n if (hook) {\n var functional = options.functional\n var existing = functional\n ? options.render\n : options.beforeCreate\n\n if (!functional) {\n // inject component registration as beforeCreate hook\n options.beforeCreate = existing\n ? [].concat(existing, hook)\n : [hook]\n } else {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functioal component in vue file\n options.render = function renderWithStyleInjection (h, context) {\n hook.call(context)\n return existing(h, context)\n }\n }\n }\n\n return {\n esModule: esModule,\n exports: scriptExports,\n options: options\n }\n}\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 9 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _vm._m(0)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"pswp\",attrs:{\"tabindex\":\"-1\",\"role\":\"dialog\",\"aria-hidden\":\"true\"}},[_c('div',{staticClass:\"pswp__bg\"}),_vm._v(\" \"),_c('div',{staticClass:\"pswp__scroll-wrap\"},[_c('div',{staticClass:\"pswp__container\"},[_c('div',{staticClass:\"pswp__item\"}),_vm._v(\" \"),_c('div',{staticClass:\"pswp__item\"}),_vm._v(\" \"),_c('div',{staticClass:\"pswp__item\"})]),_vm._v(\" \"),_c('div',{staticClass:\"pswp__ui pswp__ui--hidden\"},[_c('div',{staticClass:\"pswp__top-bar\"},[_c('div',{staticClass:\"pswp__counter\"}),_vm._v(\" \"),_c('button',{staticClass:\"pswp__button pswp__button--close\",attrs:{\"title\":\"Close (Esc)\"}}),_vm._v(\" \"),_c('button',{staticClass:\"pswp__button pswp__button--share\",attrs:{\"title\":\"Share\"}}),_vm._v(\" \"),_c('button',{staticClass:\"pswp__button pswp__button--fs\",attrs:{\"title\":\"Toggle fullscreen\"}}),_vm._v(\" \"),_c('button',{staticClass:\"pswp__button pswp__button--zoom\",attrs:{\"title\":\"Zoom in/out\"}}),_vm._v(\" \"),_c('div',{staticClass:\"pswp__preloader\"},[_c('div',{staticClass:\"pswp__preloader__icn\"},[_c('div',{staticClass:\"pswp__preloader__cut\"},[_c('div',{staticClass:\"pswp__preloader__donut\"})])])])]),_vm._v(\" \"),_c('div',{staticClass:\"pswp__share-modal pswp__share-modal--hidden pswp__single-tap\"},[_c('div',{staticClass:\"pswp__share-tooltip\"})]),_vm._v(\" \"),_c('button',{staticClass:\"pswp__button pswp__button--arrow--left\",attrs:{\"title\":\"Previous (arrow left)\"}}),_vm._v(\" \"),_c('button',{staticClass:\"pswp__button pswp__button--arrow--right\",attrs:{\"title\":\"Next (arrow right)\"}}),_vm._v(\" \"),_c('div',{staticClass:\"pswp__caption\"},[_c('div',{staticClass:\"pswp__caption__center\"})])])])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! PhotoSwipe - v4.1.3 - 2019-01-08\n* http://photoswipe.com\n* Copyright (c) 2019 Dmitry Semenov; */\n(function (root, factory) { \n\tif (true) {\n\t\t!(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.PhotoSwipe = factory();\n\t}\n})(this, function () {\n\n\t'use strict';\n\tvar PhotoSwipe = function(template, UiClass, items, options){\n\n/*>>framework-bridge*/\n/**\n *\n * Set of generic functions used by gallery.\n * \n * You're free to modify anything here as long as functionality is kept.\n * \n */\nvar framework = {\n\tfeatures: null,\n\tbind: function(target, type, listener, unbind) {\n\t\tvar methodName = (unbind ? 'remove' : 'add') + 'EventListener';\n\t\ttype = type.split(' ');\n\t\tfor(var i = 0; i < type.length; i++) {\n\t\t\tif(type[i]) {\n\t\t\t\ttarget[methodName]( type[i], listener, false);\n\t\t\t}\n\t\t}\n\t},\n\tisArray: function(obj) {\n\t\treturn (obj instanceof Array);\n\t},\n\tcreateEl: function(classes, tag) {\n\t\tvar el = document.createElement(tag || 'div');\n\t\tif(classes) {\n\t\t\tel.className = classes;\n\t\t}\n\t\treturn el;\n\t},\n\tgetScrollY: function() {\n\t\tvar yOffset = window.pageYOffset;\n\t\treturn yOffset !== undefined ? yOffset : document.documentElement.scrollTop;\n\t},\n\tunbind: function(target, type, listener) {\n\t\tframework.bind(target,type,listener,true);\n\t},\n\tremoveClass: function(el, className) {\n\t\tvar reg = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)');\n\t\tel.className = el.className.replace(reg, ' ').replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, ''); \n\t},\n\taddClass: function(el, className) {\n\t\tif( !framework.hasClass(el,className) ) {\n\t\t\tel.className += (el.className ? ' ' : '') + className;\n\t\t}\n\t},\n\thasClass: function(el, className) {\n\t\treturn el.className && new RegExp('(^|\\\\s)' + className + '(\\\\s|$)').test(el.className);\n\t},\n\tgetChildByClass: function(parentEl, childClassName) {\n\t\tvar node = parentEl.firstChild;\n\t\twhile(node) {\n\t\t\tif( framework.hasClass(node, childClassName) ) {\n\t\t\t\treturn node;\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t}\n\t},\n\tarraySearch: function(array, value, key) {\n\t\tvar i = array.length;\n\t\twhile(i--) {\n\t\t\tif(array[i][key] === value) {\n\t\t\t\treturn i;\n\t\t\t} \n\t\t}\n\t\treturn -1;\n\t},\n\textend: function(o1, o2, preventOverwrite) {\n\t\tfor (var prop in o2) {\n\t\t\tif (o2.hasOwnProperty(prop)) {\n\t\t\t\tif(preventOverwrite && o1.hasOwnProperty(prop)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\to1[prop] = o2[prop];\n\t\t\t}\n\t\t}\n\t},\n\teasing: {\n\t\tsine: {\n\t\t\tout: function(k) {\n\t\t\t\treturn Math.sin(k * (Math.PI / 2));\n\t\t\t},\n\t\t\tinOut: function(k) {\n\t\t\t\treturn - (Math.cos(Math.PI * k) - 1) / 2;\n\t\t\t}\n\t\t},\n\t\tcubic: {\n\t\t\tout: function(k) {\n\t\t\t\treturn --k * k * k + 1;\n\t\t\t}\n\t\t}\n\t\t/*\n\t\t\telastic: {\n\t\t\t\tout: function ( k ) {\n\n\t\t\t\t\tvar s, a = 0.1, p = 0.4;\n\t\t\t\t\tif ( k === 0 ) return 0;\n\t\t\t\t\tif ( k === 1 ) return 1;\n\t\t\t\t\tif ( !a || a < 1 ) { a = 1; s = p / 4; }\n\t\t\t\t\telse s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n\t\t\t\t\treturn ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );\n\n\t\t\t\t},\n\t\t\t},\n\t\t\tback: {\n\t\t\t\tout: function ( k ) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\treturn --k * k * ( ( s + 1 ) * k + s ) + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t*/\n\t},\n\n\t/**\n\t * \n\t * @return {object}\n\t * \n\t * {\n\t * raf : request animation frame function\n\t * caf : cancel animation frame function\n\t * transfrom : transform property key (with vendor), or null if not supported\n\t * oldIE : IE8 or below\n\t * }\n\t * \n\t */\n\tdetectFeatures: function() {\n\t\tif(framework.features) {\n\t\t\treturn framework.features;\n\t\t}\n\t\tvar helperEl = framework.createEl(),\n\t\t\thelperStyle = helperEl.style,\n\t\t\tvendor = '',\n\t\t\tfeatures = {};\n\n\t\t// IE8 and below\n\t\tfeatures.oldIE = document.all && !document.addEventListener;\n\n\t\tfeatures.touch = 'ontouchstart' in window;\n\n\t\tif(window.requestAnimationFrame) {\n\t\t\tfeatures.raf = window.requestAnimationFrame;\n\t\t\tfeatures.caf = window.cancelAnimationFrame;\n\t\t}\n\n\t\tfeatures.pointerEvent = !!(window.PointerEvent) || navigator.msPointerEnabled;\n\n\t\t// fix false-positive detection of old Android in new IE\n\t\t// (IE11 ua string contains \"Android 4.0\")\n\t\t\n\t\tif(!features.pointerEvent) { \n\n\t\t\tvar ua = navigator.userAgent;\n\n\t\t\t// Detect if device is iPhone or iPod and if it's older than iOS 8\n\t\t\t// http://stackoverflow.com/a/14223920\n\t\t\t// \n\t\t\t// This detection is made because of buggy top/bottom toolbars\n\t\t\t// that don't trigger window.resize event.\n\t\t\t// For more info refer to _isFixedPosition variable in core.js\n\n\t\t\tif (/iP(hone|od)/.test(navigator.platform)) {\n\t\t\t\tvar v = (navigator.appVersion).match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n\t\t\t\tif(v && v.length > 0) {\n\t\t\t\t\tv = parseInt(v[1], 10);\n\t\t\t\t\tif(v >= 1 && v < 8 ) {\n\t\t\t\t\t\tfeatures.isOldIOSPhone = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Detect old Android (before KitKat)\n\t\t\t// due to bugs related to position:fixed\n\t\t\t// http://stackoverflow.com/questions/7184573/pick-up-the-android-version-in-the-browser-by-javascript\n\t\t\t\n\t\t\tvar match = ua.match(/Android\\s([0-9\\.]*)/);\n\t\t\tvar androidversion = match ? match[1] : 0;\n\t\t\tandroidversion = parseFloat(androidversion);\n\t\t\tif(androidversion >= 1 ) {\n\t\t\t\tif(androidversion < 4.4) {\n\t\t\t\t\tfeatures.isOldAndroid = true; // for fixed position bug & performance\n\t\t\t\t}\n\t\t\t\tfeatures.androidVersion = androidversion; // for touchend bug\n\t\t\t}\t\n\t\t\tfeatures.isMobileOpera = /opera mini|opera mobi/i.test(ua);\n\n\t\t\t// p.s. yes, yes, UA sniffing is bad, propose your solution for above bugs.\n\t\t}\n\t\t\n\t\tvar styleChecks = ['transform', 'perspective', 'animationName'],\n\t\t\tvendors = ['', 'webkit','Moz','ms','O'],\n\t\t\tstyleCheckItem,\n\t\t\tstyleName;\n\n\t\tfor(var i = 0; i < 4; i++) {\n\t\t\tvendor = vendors[i];\n\n\t\t\tfor(var a = 0; a < 3; a++) {\n\t\t\t\tstyleCheckItem = styleChecks[a];\n\n\t\t\t\t// uppercase first letter of property name, if vendor is present\n\t\t\t\tstyleName = vendor + (vendor ? \n\t\t\t\t\t\t\t\t\t\tstyleCheckItem.charAt(0).toUpperCase() + styleCheckItem.slice(1) : \n\t\t\t\t\t\t\t\t\t\tstyleCheckItem);\n\t\t\t\n\t\t\t\tif(!features[styleCheckItem] && styleName in helperStyle ) {\n\t\t\t\t\tfeatures[styleCheckItem] = styleName;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(vendor && !features.raf) {\n\t\t\t\tvendor = vendor.toLowerCase();\n\t\t\t\tfeatures.raf = window[vendor+'RequestAnimationFrame'];\n\t\t\t\tif(features.raf) {\n\t\t\t\t\tfeatures.caf = window[vendor+'CancelAnimationFrame'] || \n\t\t\t\t\t\t\t\t\twindow[vendor+'CancelRequestAnimationFrame'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\t\n\t\tif(!features.raf) {\n\t\t\tvar lastTime = 0;\n\t\t\tfeatures.raf = function(fn) {\n\t\t\t\tvar currTime = new Date().getTime();\n\t\t\t\tvar timeToCall = Math.max(0, 16 - (currTime - lastTime));\n\t\t\t\tvar id = window.setTimeout(function() { fn(currTime + timeToCall); }, timeToCall);\n\t\t\t\tlastTime = currTime + timeToCall;\n\t\t\t\treturn id;\n\t\t\t};\n\t\t\tfeatures.caf = function(id) { clearTimeout(id); };\n\t\t}\n\n\t\t// Detect SVG support\n\t\tfeatures.svg = !!document.createElementNS && \n\t\t\t\t\t\t!!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;\n\n\t\tframework.features = features;\n\n\t\treturn features;\n\t}\n};\n\nframework.detectFeatures();\n\n// Override addEventListener for old versions of IE\nif(framework.features.oldIE) {\n\n\tframework.bind = function(target, type, listener, unbind) {\n\t\t\n\t\ttype = type.split(' ');\n\n\t\tvar methodName = (unbind ? 'detach' : 'attach') + 'Event',\n\t\t\tevName,\n\t\t\t_handleEv = function() {\n\t\t\t\tlistener.handleEvent.call(listener);\n\t\t\t};\n\n\t\tfor(var i = 0; i < type.length; i++) {\n\t\t\tevName = type[i];\n\t\t\tif(evName) {\n\n\t\t\t\tif(typeof listener === 'object' && listener.handleEvent) {\n\t\t\t\t\tif(!unbind) {\n\t\t\t\t\t\tlistener['oldIE' + evName] = _handleEv;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(!listener['oldIE' + evName]) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttarget[methodName]( 'on' + evName, listener['oldIE' + evName]);\n\t\t\t\t} else {\n\t\t\t\t\ttarget[methodName]( 'on' + evName, listener);\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t};\n\t\n}\n\n/*>>framework-bridge*/\n\n/*>>core*/\n//function(template, UiClass, items, options)\n\nvar self = this;\n\n/**\n * Static vars, don't change unless you know what you're doing.\n */\nvar DOUBLE_TAP_RADIUS = 25, \n\tNUM_HOLDERS = 3;\n\n/**\n * Options\n */\nvar _options = {\n\tallowPanToNext:true,\n\tspacing: 0.12,\n\tbgOpacity: 1,\n\tmouseUsed: false,\n\tloop: true,\n\tpinchToClose: true,\n\tcloseOnScroll: true,\n\tcloseOnVerticalDrag: true,\n\tverticalDragRange: 0.75,\n\thideAnimationDuration: 333,\n\tshowAnimationDuration: 333,\n\tshowHideOpacity: false,\n\tfocus: true,\n\tescKey: true,\n\tarrowKeys: true,\n\tmainScrollEndFriction: 0.35,\n\tpanEndFriction: 0.35,\n\tisClickableElement: function(el) {\n return el.tagName === 'A';\n },\n getDoubleTapZoom: function(isMouseClick, item) {\n \tif(isMouseClick) {\n \t\treturn 1;\n \t} else {\n \t\treturn item.initialZoomLevel < 0.7 ? 1 : 1.33;\n \t}\n },\n maxSpreadZoom: 1.33,\n\tmodal: true,\n\n\t// not fully implemented yet\n\tscaleMode: 'fit' // TODO\n};\nframework.extend(_options, options);\n\n\n/**\n * Private helper variables & functions\n */\n\nvar _getEmptyPoint = function() { \n\t\treturn {x:0,y:0}; \n\t};\n\nvar _isOpen,\n\t_isDestroying,\n\t_closedByScroll,\n\t_currentItemIndex,\n\t_containerStyle,\n\t_containerShiftIndex,\n\t_currPanDist = _getEmptyPoint(),\n\t_startPanOffset = _getEmptyPoint(),\n\t_panOffset = _getEmptyPoint(),\n\t_upMoveEvents, // drag move, drag end & drag cancel events array\n\t_downEvents, // drag start events array\n\t_globalEventHandlers,\n\t_viewportSize = {},\n\t_currZoomLevel,\n\t_startZoomLevel,\n\t_translatePrefix,\n\t_translateSufix,\n\t_updateSizeInterval,\n\t_itemsNeedUpdate,\n\t_currPositionIndex = 0,\n\t_offset = {},\n\t_slideSize = _getEmptyPoint(), // size of slide area, including spacing\n\t_itemHolders,\n\t_prevItemIndex,\n\t_indexDiff = 0, // difference of indexes since last content update\n\t_dragStartEvent,\n\t_dragMoveEvent,\n\t_dragEndEvent,\n\t_dragCancelEvent,\n\t_transformKey,\n\t_pointerEventEnabled,\n\t_isFixedPosition = true,\n\t_likelyTouchDevice,\n\t_modules = [],\n\t_requestAF,\n\t_cancelAF,\n\t_initalClassName,\n\t_initalWindowScrollY,\n\t_oldIE,\n\t_currentWindowScrollY,\n\t_features,\n\t_windowVisibleSize = {},\n\t_renderMaxResolution = false,\n\t_orientationChangeTimeout,\n\n\n\t// Registers PhotoSWipe module (History, Controller ...)\n\t_registerModule = function(name, module) {\n\t\tframework.extend(self, module.publicMethods);\n\t\t_modules.push(name);\n\t},\n\n\t_getLoopedId = function(index) {\n\t\tvar numSlides = _getNumItems();\n\t\tif(index > numSlides - 1) {\n\t\t\treturn index - numSlides;\n\t\t} else if(index < 0) {\n\t\t\treturn numSlides + index;\n\t\t}\n\t\treturn index;\n\t},\n\t\n\t// Micro bind/trigger\n\t_listeners = {},\n\t_listen = function(name, fn) {\n\t\tif(!_listeners[name]) {\n\t\t\t_listeners[name] = [];\n\t\t}\n\t\treturn _listeners[name].push(fn);\n\t},\n\t_shout = function(name) {\n\t\tvar listeners = _listeners[name];\n\n\t\tif(listeners) {\n\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\targs.shift();\n\n\t\t\tfor(var i = 0; i < listeners.length; i++) {\n\t\t\t\tlisteners[i].apply(self, args);\n\t\t\t}\n\t\t}\n\t},\n\n\t_getCurrentTime = function() {\n\t\treturn new Date().getTime();\n\t},\n\t_applyBgOpacity = function(opacity) {\n\t\t_bgOpacity = opacity;\n\t\tself.bg.style.opacity = opacity * _options.bgOpacity;\n\t},\n\n\t_applyZoomTransform = function(styleObj,x,y,zoom,item) {\n\t\tif(!_renderMaxResolution || (item && item !== self.currItem) ) {\n\t\t\tzoom = zoom / (item ? item.fitRatio : self.currItem.fitRatio);\t\n\t\t}\n\t\t\t\n\t\tstyleObj[_transformKey] = _translatePrefix + x + 'px, ' + y + 'px' + _translateSufix + ' scale(' + zoom + ')';\n\t},\n\t_applyCurrentZoomPan = function( allowRenderResolution ) {\n\t\tif(_currZoomElementStyle) {\n\n\t\t\tif(allowRenderResolution) {\n\t\t\t\tif(_currZoomLevel > self.currItem.fitRatio) {\n\t\t\t\t\tif(!_renderMaxResolution) {\n\t\t\t\t\t\t_setImageSize(self.currItem, false, true);\n\t\t\t\t\t\t_renderMaxResolution = true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif(_renderMaxResolution) {\n\t\t\t\t\t\t_setImageSize(self.currItem);\n\t\t\t\t\t\t_renderMaxResolution = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\n\t\t\t_applyZoomTransform(_currZoomElementStyle, _panOffset.x, _panOffset.y, _currZoomLevel);\n\t\t}\n\t},\n\t_applyZoomPanToItem = function(item) {\n\t\tif(item.container) {\n\n\t\t\t_applyZoomTransform(item.container.style, \n\t\t\t\t\t\t\t\titem.initialPosition.x, \n\t\t\t\t\t\t\t\titem.initialPosition.y, \n\t\t\t\t\t\t\t\titem.initialZoomLevel,\n\t\t\t\t\t\t\t\titem);\n\t\t}\n\t},\n\t_setTranslateX = function(x, elStyle) {\n\t\telStyle[_transformKey] = _translatePrefix + x + 'px, 0px' + _translateSufix;\n\t},\n\t_moveMainScroll = function(x, dragging) {\n\n\t\tif(!_options.loop && dragging) {\n\t\t\tvar newSlideIndexOffset = _currentItemIndex + (_slideSize.x * _currPositionIndex - x) / _slideSize.x,\n\t\t\t\tdelta = Math.round(x - _mainScrollPos.x);\n\n\t\t\tif( (newSlideIndexOffset < 0 && delta > 0) || \n\t\t\t\t(newSlideIndexOffset >= _getNumItems() - 1 && delta < 0) ) {\n\t\t\t\tx = _mainScrollPos.x + delta * _options.mainScrollEndFriction;\n\t\t\t} \n\t\t}\n\t\t\n\t\t_mainScrollPos.x = x;\n\t\t_setTranslateX(x, _containerStyle);\n\t},\n\t_calculatePanOffset = function(axis, zoomLevel) {\n\t\tvar m = _midZoomPoint[axis] - _offset[axis];\n\t\treturn _startPanOffset[axis] + _currPanDist[axis] + m - m * ( zoomLevel / _startZoomLevel );\n\t},\n\t\n\t_equalizePoints = function(p1, p2) {\n\t\tp1.x = p2.x;\n\t\tp1.y = p2.y;\n\t\tif(p2.id) {\n\t\t\tp1.id = p2.id;\n\t\t}\n\t},\n\t_roundPoint = function(p) {\n\t\tp.x = Math.round(p.x);\n\t\tp.y = Math.round(p.y);\n\t},\n\n\t_mouseMoveTimeout = null,\n\t_onFirstMouseMove = function() {\n\t\t// Wait until mouse move event is fired at least twice during 100ms\n\t\t// We do this, because some mobile browsers trigger it on touchstart\n\t\tif(_mouseMoveTimeout ) { \n\t\t\tframework.unbind(document, 'mousemove', _onFirstMouseMove);\n\t\t\tframework.addClass(template, 'pswp--has_mouse');\n\t\t\t_options.mouseUsed = true;\n\t\t\t_shout('mouseUsed');\n\t\t}\n\t\t_mouseMoveTimeout = setTimeout(function() {\n\t\t\t_mouseMoveTimeout = null;\n\t\t}, 100);\n\t},\n\n\t_bindEvents = function() {\n\t\tframework.bind(document, 'keydown', self);\n\n\t\tif(_features.transform) {\n\t\t\t// don't bind click event in browsers that don't support transform (mostly IE8)\n\t\t\tframework.bind(self.scrollWrap, 'click', self);\n\t\t}\n\t\t\n\n\t\tif(!_options.mouseUsed) {\n\t\t\tframework.bind(document, 'mousemove', _onFirstMouseMove);\n\t\t}\n\n\t\tframework.bind(window, 'resize scroll orientationchange', self);\n\n\t\t_shout('bindEvents');\n\t},\n\n\t_unbindEvents = function() {\n\t\tframework.unbind(window, 'resize scroll orientationchange', self);\n\t\tframework.unbind(window, 'scroll', _globalEventHandlers.scroll);\n\t\tframework.unbind(document, 'keydown', self);\n\t\tframework.unbind(document, 'mousemove', _onFirstMouseMove);\n\n\t\tif(_features.transform) {\n\t\t\tframework.unbind(self.scrollWrap, 'click', self);\n\t\t}\n\n\t\tif(_isDragging) {\n\t\t\tframework.unbind(window, _upMoveEvents, self);\n\t\t}\n\n\t\tclearTimeout(_orientationChangeTimeout);\n\n\t\t_shout('unbindEvents');\n\t},\n\t\n\t_calculatePanBounds = function(zoomLevel, update) {\n\t\tvar bounds = _calculateItemSize( self.currItem, _viewportSize, zoomLevel );\n\t\tif(update) {\n\t\t\t_currPanBounds = bounds;\n\t\t}\n\t\treturn bounds;\n\t},\n\t\n\t_getMinZoomLevel = function(item) {\n\t\tif(!item) {\n\t\t\titem = self.currItem;\n\t\t}\n\t\treturn item.initialZoomLevel;\n\t},\n\t_getMaxZoomLevel = function(item) {\n\t\tif(!item) {\n\t\t\titem = self.currItem;\n\t\t}\n\t\treturn item.w > 0 ? _options.maxSpreadZoom : 1;\n\t},\n\n\t// Return true if offset is out of the bounds\n\t_modifyDestPanOffset = function(axis, destPanBounds, destPanOffset, destZoomLevel) {\n\t\tif(destZoomLevel === self.currItem.initialZoomLevel) {\n\t\t\tdestPanOffset[axis] = self.currItem.initialPosition[axis];\n\t\t\treturn true;\n\t\t} else {\n\t\t\tdestPanOffset[axis] = _calculatePanOffset(axis, destZoomLevel); \n\n\t\t\tif(destPanOffset[axis] > destPanBounds.min[axis]) {\n\t\t\t\tdestPanOffset[axis] = destPanBounds.min[axis];\n\t\t\t\treturn true;\n\t\t\t} else if(destPanOffset[axis] < destPanBounds.max[axis] ) {\n\t\t\t\tdestPanOffset[axis] = destPanBounds.max[axis];\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t_setupTransforms = function() {\n\n\t\tif(_transformKey) {\n\t\t\t// setup 3d transforms\n\t\t\tvar allow3dTransform = _features.perspective && !_likelyTouchDevice;\n\t\t\t_translatePrefix = 'translate' + (allow3dTransform ? '3d(' : '(');\n\t\t\t_translateSufix = _features.perspective ? ', 0px)' : ')';\t\n\t\t\treturn;\n\t\t}\n\n\t\t// Override zoom/pan/move functions in case old browser is used (most likely IE)\n\t\t// (so they use left/top/width/height, instead of CSS transform)\n\t\n\t\t_transformKey = 'left';\n\t\tframework.addClass(template, 'pswp--ie');\n\n\t\t_setTranslateX = function(x, elStyle) {\n\t\t\telStyle.left = x + 'px';\n\t\t};\n\t\t_applyZoomPanToItem = function(item) {\n\n\t\t\tvar zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,\n\t\t\t\ts = item.container.style,\n\t\t\t\tw = zoomRatio * item.w,\n\t\t\t\th = zoomRatio * item.h;\n\n\t\t\ts.width = w + 'px';\n\t\t\ts.height = h + 'px';\n\t\t\ts.left = item.initialPosition.x + 'px';\n\t\t\ts.top = item.initialPosition.y + 'px';\n\n\t\t};\n\t\t_applyCurrentZoomPan = function() {\n\t\t\tif(_currZoomElementStyle) {\n\n\t\t\t\tvar s = _currZoomElementStyle,\n\t\t\t\t\titem = self.currItem,\n\t\t\t\t\tzoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,\n\t\t\t\t\tw = zoomRatio * item.w,\n\t\t\t\t\th = zoomRatio * item.h;\n\n\t\t\t\ts.width = w + 'px';\n\t\t\t\ts.height = h + 'px';\n\n\n\t\t\t\ts.left = _panOffset.x + 'px';\n\t\t\t\ts.top = _panOffset.y + 'px';\n\t\t\t}\n\t\t\t\n\t\t};\n\t},\n\n\t_onKeyDown = function(e) {\n\t\tvar keydownAction = '';\n\t\tif(_options.escKey && e.keyCode === 27) { \n\t\t\tkeydownAction = 'close';\n\t\t} else if(_options.arrowKeys) {\n\t\t\tif(e.keyCode === 37) {\n\t\t\t\tkeydownAction = 'prev';\n\t\t\t} else if(e.keyCode === 39) { \n\t\t\t\tkeydownAction = 'next';\n\t\t\t}\n\t\t}\n\n\t\tif(keydownAction) {\n\t\t\t// don't do anything if special key pressed to prevent from overriding default browser actions\n\t\t\t// e.g. in Chrome on Mac cmd+arrow-left returns to previous page\n\t\t\tif( !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey ) {\n\t\t\t\tif(e.preventDefault) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t} else {\n\t\t\t\t\te.returnValue = false;\n\t\t\t\t} \n\t\t\t\tself[keydownAction]();\n\t\t\t}\n\t\t}\n\t},\n\n\t_onGlobalClick = function(e) {\n\t\tif(!e) {\n\t\t\treturn;\n\t\t}\n\n\t\t// don't allow click event to pass through when triggering after drag or some other gesture\n\t\tif(_moved || _zoomStarted || _mainScrollAnimating || _verticalDragInitiated) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\n\t_updatePageScrollOffset = function() {\n\t\tself.setScrollOffset(0, framework.getScrollY());\t\t\n\t};\n\t\n\n\n\t\n\n\n\n// Micro animation engine\nvar _animations = {},\n\t_numAnimations = 0,\n\t_stopAnimation = function(name) {\n\t\tif(_animations[name]) {\n\t\t\tif(_animations[name].raf) {\n\t\t\t\t_cancelAF( _animations[name].raf );\n\t\t\t}\n\t\t\t_numAnimations--;\n\t\t\tdelete _animations[name];\n\t\t}\n\t},\n\t_registerStartAnimation = function(name) {\n\t\tif(_animations[name]) {\n\t\t\t_stopAnimation(name);\n\t\t}\n\t\tif(!_animations[name]) {\n\t\t\t_numAnimations++;\n\t\t\t_animations[name] = {};\n\t\t}\n\t},\n\t_stopAllAnimations = function() {\n\t\tfor (var prop in _animations) {\n\n\t\t\tif( _animations.hasOwnProperty( prop ) ) {\n\t\t\t\t_stopAnimation(prop);\n\t\t\t} \n\t\t\t\n\t\t}\n\t},\n\t_animateProp = function(name, b, endProp, d, easingFn, onUpdate, onComplete) {\n\t\tvar startAnimTime = _getCurrentTime(), t;\n\t\t_registerStartAnimation(name);\n\n\t\tvar animloop = function(){\n\t\t\tif ( _animations[name] ) {\n\t\t\t\t\n\t\t\t\tt = _getCurrentTime() - startAnimTime; // time diff\n\t\t\t\t//b - beginning (start prop)\n\t\t\t\t//d - anim duration\n\n\t\t\t\tif ( t >= d ) {\n\t\t\t\t\t_stopAnimation(name);\n\t\t\t\t\tonUpdate(endProp);\n\t\t\t\t\tif(onComplete) {\n\t\t\t\t\t\tonComplete();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonUpdate( (endProp - b) * easingFn(t/d) + b );\n\n\t\t\t\t_animations[name].raf = _requestAF(animloop);\n\t\t\t}\n\t\t};\n\t\tanimloop();\n\t};\n\t\n\n\nvar publicMethods = {\n\n\t// make a few local variables and functions public\n\tshout: _shout,\n\tlisten: _listen,\n\tviewportSize: _viewportSize,\n\toptions: _options,\n\n\tisMainScrollAnimating: function() {\n\t\treturn _mainScrollAnimating;\n\t},\n\tgetZoomLevel: function() {\n\t\treturn _currZoomLevel;\n\t},\n\tgetCurrentIndex: function() {\n\t\treturn _currentItemIndex;\n\t},\n\tisDragging: function() {\n\t\treturn _isDragging;\n\t},\t\n\tisZooming: function() {\n\t\treturn _isZooming;\n\t},\n\tsetScrollOffset: function(x,y) {\n\t\t_offset.x = x;\n\t\t_currentWindowScrollY = _offset.y = y;\n\t\t_shout('updateScrollOffset', _offset);\n\t},\n\tapplyZoomPan: function(zoomLevel,panX,panY,allowRenderResolution) {\n\t\t_panOffset.x = panX;\n\t\t_panOffset.y = panY;\n\t\t_currZoomLevel = zoomLevel;\n\t\t_applyCurrentZoomPan( allowRenderResolution );\n\t},\n\n\tinit: function() {\n\n\t\tif(_isOpen || _isDestroying) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar i;\n\n\t\tself.framework = framework; // basic functionality\n\t\tself.template = template; // root DOM element of PhotoSwipe\n\t\tself.bg = framework.getChildByClass(template, 'pswp__bg');\n\n\t\t_initalClassName = template.className;\n\t\t_isOpen = true;\n\t\t\t\t\n\t\t_features = framework.detectFeatures();\n\t\t_requestAF = _features.raf;\n\t\t_cancelAF = _features.caf;\n\t\t_transformKey = _features.transform;\n\t\t_oldIE = _features.oldIE;\n\t\t\n\t\tself.scrollWrap = framework.getChildByClass(template, 'pswp__scroll-wrap');\n\t\tself.container = framework.getChildByClass(self.scrollWrap, 'pswp__container');\n\n\t\t_containerStyle = self.container.style; // for fast access\n\n\t\t// Objects that hold slides (there are only 3 in DOM)\n\t\tself.itemHolders = _itemHolders = [\n\t\t\t{el:self.container.children[0] , wrap:0, index: -1},\n\t\t\t{el:self.container.children[1] , wrap:0, index: -1},\n\t\t\t{el:self.container.children[2] , wrap:0, index: -1}\n\t\t];\n\n\t\t// hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\n\t\t_itemHolders[0].el.style.display = _itemHolders[2].el.style.display = 'none';\n\n\t\t_setupTransforms();\n\n\t\t// Setup global events\n\t\t_globalEventHandlers = {\n\t\t\tresize: self.updateSize,\n\n\t\t\t// Fixes: iOS 10.3 resize event\n\t\t\t// does not update scrollWrap.clientWidth instantly after resize\n\t\t\t// https://github.com/dimsemenov/PhotoSwipe/issues/1315\n\t\t\torientationchange: function() {\n\t\t\t\tclearTimeout(_orientationChangeTimeout);\n\t\t\t\t_orientationChangeTimeout = setTimeout(function() {\n\t\t\t\t\tif(_viewportSize.x !== self.scrollWrap.clientWidth) {\n\t\t\t\t\t\tself.updateSize();\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t},\n\t\t\tscroll: _updatePageScrollOffset,\n\t\t\tkeydown: _onKeyDown,\n\t\t\tclick: _onGlobalClick\n\t\t};\n\n\t\t// disable show/hide effects on old browsers that don't support CSS animations or transforms, \n\t\t// old IOS, Android and Opera mobile. Blackberry seems to work fine, even older models.\n\t\tvar oldPhone = _features.isOldIOSPhone || _features.isOldAndroid || _features.isMobileOpera;\n\t\tif(!_features.animationName || !_features.transform || oldPhone) {\n\t\t\t_options.showAnimationDuration = _options.hideAnimationDuration = 0;\n\t\t}\n\n\t\t// init modules\n\t\tfor(i = 0; i < _modules.length; i++) {\n\t\t\tself['init' + _modules[i]]();\n\t\t}\n\t\t\n\t\t// init\n\t\tif(UiClass) {\n\t\t\tvar ui = self.ui = new UiClass(self, framework);\n\t\t\tui.init();\n\t\t}\n\n\t\t_shout('firstUpdate');\n\t\t_currentItemIndex = _currentItemIndex || _options.index || 0;\n\t\t// validate index\n\t\tif( isNaN(_currentItemIndex) || _currentItemIndex < 0 || _currentItemIndex >= _getNumItems() ) {\n\t\t\t_currentItemIndex = 0;\n\t\t}\n\t\tself.currItem = _getItemAt( _currentItemIndex );\n\n\t\t\n\t\tif(_features.isOldIOSPhone || _features.isOldAndroid) {\n\t\t\t_isFixedPosition = false;\n\t\t}\n\t\t\n\t\ttemplate.setAttribute('aria-hidden', 'false');\n\t\tif(_options.modal) {\n\t\t\tif(!_isFixedPosition) {\n\t\t\t\ttemplate.style.position = 'absolute';\n\t\t\t\ttemplate.style.top = framework.getScrollY() + 'px';\n\t\t\t} else {\n\t\t\t\ttemplate.style.position = 'fixed';\n\t\t\t}\n\t\t}\n\n\t\tif(_currentWindowScrollY === undefined) {\n\t\t\t_shout('initialLayout');\n\t\t\t_currentWindowScrollY = _initalWindowScrollY = framework.getScrollY();\n\t\t}\n\t\t\n\t\t// add classes to root element of PhotoSwipe\n\t\tvar rootClasses = 'pswp--open ';\n\t\tif(_options.mainClass) {\n\t\t\trootClasses += _options.mainClass + ' ';\n\t\t}\n\t\tif(_options.showHideOpacity) {\n\t\t\trootClasses += 'pswp--animate_opacity ';\n\t\t}\n\t\trootClasses += _likelyTouchDevice ? 'pswp--touch' : 'pswp--notouch';\n\t\trootClasses += _features.animationName ? ' pswp--css_animation' : '';\n\t\trootClasses += _features.svg ? ' pswp--svg' : '';\n\t\tframework.addClass(template, rootClasses);\n\n\t\tself.updateSize();\n\n\t\t// initial update\n\t\t_containerShiftIndex = -1;\n\t\t_indexDiff = null;\n\t\tfor(i = 0; i < NUM_HOLDERS; i++) {\n\t\t\t_setTranslateX( (i+_containerShiftIndex) * _slideSize.x, _itemHolders[i].el.style);\n\t\t}\n\n\t\tif(!_oldIE) {\n\t\t\tframework.bind(self.scrollWrap, _downEvents, self); // no dragging for old IE\n\t\t}\t\n\n\t\t_listen('initialZoomInEnd', function() {\n\t\t\tself.setContent(_itemHolders[0], _currentItemIndex-1);\n\t\t\tself.setContent(_itemHolders[2], _currentItemIndex+1);\n\n\t\t\t_itemHolders[0].el.style.display = _itemHolders[2].el.style.display = 'block';\n\n\t\t\tif(_options.focus) {\n\t\t\t\t// focus causes layout, \n\t\t\t\t// which causes lag during the animation, \n\t\t\t\t// that's why we delay it untill the initial zoom transition ends\n\t\t\t\ttemplate.focus();\n\t\t\t}\n\t\t\t \n\n\t\t\t_bindEvents();\n\t\t});\n\n\t\t// set content for center slide (first time)\n\t\tself.setContent(_itemHolders[1], _currentItemIndex);\n\t\t\n\t\tself.updateCurrItem();\n\n\t\t_shout('afterInit');\n\n\t\tif(!_isFixedPosition) {\n\n\t\t\t// On all versions of iOS lower than 8.0, we check size of viewport every second.\n\t\t\t// \n\t\t\t// This is done to detect when Safari top & bottom bars appear, \n\t\t\t// as this action doesn't trigger any events (like resize). \n\t\t\t// \n\t\t\t// On iOS8 they fixed this.\n\t\t\t// \n\t\t\t// 10 Nov 2014: iOS 7 usage ~40%. iOS 8 usage 56%.\n\t\t\t\n\t\t\t_updateSizeInterval = setInterval(function() {\n\t\t\t\tif(!_numAnimations && !_isDragging && !_isZooming && (_currZoomLevel === self.currItem.initialZoomLevel) ) {\n\t\t\t\t\tself.updateSize();\n\t\t\t\t}\n\t\t\t}, 1000);\n\t\t}\n\n\t\tframework.addClass(template, 'pswp--visible');\n\t},\n\n\t// Close the gallery, then destroy it\n\tclose: function() {\n\t\tif(!_isOpen) {\n\t\t\treturn;\n\t\t}\n\n\t\t_isOpen = false;\n\t\t_isDestroying = true;\n\t\t_shout('close');\n\t\t_unbindEvents();\n\n\t\t_showOrHide(self.currItem, null, true, self.destroy);\n\t},\n\n\t// destroys the gallery (unbinds events, cleans up intervals and timeouts to avoid memory leaks)\n\tdestroy: function() {\n\t\t_shout('destroy');\n\n\t\tif(_showOrHideTimeout) {\n\t\t\tclearTimeout(_showOrHideTimeout);\n\t\t}\n\t\t\n\t\ttemplate.setAttribute('aria-hidden', 'true');\n\t\ttemplate.className = _initalClassName;\n\n\t\tif(_updateSizeInterval) {\n\t\t\tclearInterval(_updateSizeInterval);\n\t\t}\n\n\t\tframework.unbind(self.scrollWrap, _downEvents, self);\n\n\t\t// we unbind scroll event at the end, as closing animation may depend on it\n\t\tframework.unbind(window, 'scroll', self);\n\n\t\t_stopDragUpdateLoop();\n\n\t\t_stopAllAnimations();\n\n\t\t_listeners = null;\n\t},\n\n\t/**\n\t * Pan image to position\n\t * @param {Number} x \n\t * @param {Number} y \n\t * @param {Boolean} force Will ignore bounds if set to true.\n\t */\n\tpanTo: function(x,y,force) {\n\t\tif(!force) {\n\t\t\tif(x > _currPanBounds.min.x) {\n\t\t\t\tx = _currPanBounds.min.x;\n\t\t\t} else if(x < _currPanBounds.max.x) {\n\t\t\t\tx = _currPanBounds.max.x;\n\t\t\t}\n\n\t\t\tif(y > _currPanBounds.min.y) {\n\t\t\t\ty = _currPanBounds.min.y;\n\t\t\t} else if(y < _currPanBounds.max.y) {\n\t\t\t\ty = _currPanBounds.max.y;\n\t\t\t}\n\t\t}\n\t\t\n\t\t_panOffset.x = x;\n\t\t_panOffset.y = y;\n\t\t_applyCurrentZoomPan();\n\t},\n\t\n\thandleEvent: function (e) {\n\t\te = e || window.event;\n\t\tif(_globalEventHandlers[e.type]) {\n\t\t\t_globalEventHandlers[e.type](e);\n\t\t}\n\t},\n\n\n\tgoTo: function(index) {\n\n\t\tindex = _getLoopedId(index);\n\n\t\tvar diff = index - _currentItemIndex;\n\t\t_indexDiff = diff;\n\n\t\t_currentItemIndex = index;\n\t\tself.currItem = _getItemAt( _currentItemIndex );\n\t\t_currPositionIndex -= diff;\n\t\t\n\t\t_moveMainScroll(_slideSize.x * _currPositionIndex);\n\t\t\n\n\t\t_stopAllAnimations();\n\t\t_mainScrollAnimating = false;\n\n\t\tself.updateCurrItem();\n\t},\n\tnext: function() {\n\t\tself.goTo( _currentItemIndex + 1);\n\t},\n\tprev: function() {\n\t\tself.goTo( _currentItemIndex - 1);\n\t},\n\n\t// update current zoom/pan objects\n\tupdateCurrZoomItem: function(emulateSetContent) {\n\t\tif(emulateSetContent) {\n\t\t\t_shout('beforeChange', 0);\n\t\t}\n\n\t\t// itemHolder[1] is middle (current) item\n\t\tif(_itemHolders[1].el.children.length) {\n\t\t\tvar zoomElement = _itemHolders[1].el.children[0];\n\t\t\tif( framework.hasClass(zoomElement, 'pswp__zoom-wrap') ) {\n\t\t\t\t_currZoomElementStyle = zoomElement.style;\n\t\t\t} else {\n\t\t\t\t_currZoomElementStyle = null;\n\t\t\t}\n\t\t} else {\n\t\t\t_currZoomElementStyle = null;\n\t\t}\n\t\t\n\t\t_currPanBounds = self.currItem.bounds;\t\n\t\t_startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;\n\n\t\t_panOffset.x = _currPanBounds.center.x;\n\t\t_panOffset.y = _currPanBounds.center.y;\n\n\t\tif(emulateSetContent) {\n\t\t\t_shout('afterChange');\n\t\t}\n\t},\n\n\n\tinvalidateCurrItems: function() {\n\t\t_itemsNeedUpdate = true;\n\t\tfor(var i = 0; i < NUM_HOLDERS; i++) {\n\t\t\tif( _itemHolders[i].item ) {\n\t\t\t\t_itemHolders[i].item.needsUpdate = true;\n\t\t\t}\n\t\t}\n\t},\n\n\tupdateCurrItem: function(beforeAnimation) {\n\n\t\tif(_indexDiff === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar diffAbs = Math.abs(_indexDiff),\n\t\t\ttempHolder;\n\n\t\tif(beforeAnimation && diffAbs < 2) {\n\t\t\treturn;\n\t\t}\n\n\n\t\tself.currItem = _getItemAt( _currentItemIndex );\n\t\t_renderMaxResolution = false;\n\t\t\n\t\t_shout('beforeChange', _indexDiff);\n\n\t\tif(diffAbs >= NUM_HOLDERS) {\n\t\t\t_containerShiftIndex += _indexDiff + (_indexDiff > 0 ? -NUM_HOLDERS : NUM_HOLDERS);\n\t\t\tdiffAbs = NUM_HOLDERS;\n\t\t}\n\t\tfor(var i = 0; i < diffAbs; i++) {\n\t\t\tif(_indexDiff > 0) {\n\t\t\t\ttempHolder = _itemHolders.shift();\n\t\t\t\t_itemHolders[NUM_HOLDERS-1] = tempHolder; // move first to last\n\n\t\t\t\t_containerShiftIndex++;\n\t\t\t\t_setTranslateX( (_containerShiftIndex+2) * _slideSize.x, tempHolder.el.style);\n\t\t\t\tself.setContent(tempHolder, _currentItemIndex - diffAbs + i + 1 + 1);\n\t\t\t} else {\n\t\t\t\ttempHolder = _itemHolders.pop();\n\t\t\t\t_itemHolders.unshift( tempHolder ); // move last to first\n\n\t\t\t\t_containerShiftIndex--;\n\t\t\t\t_setTranslateX( _containerShiftIndex * _slideSize.x, tempHolder.el.style);\n\t\t\t\tself.setContent(tempHolder, _currentItemIndex + diffAbs - i - 1 - 1);\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\t// reset zoom/pan on previous item\n\t\tif(_currZoomElementStyle && Math.abs(_indexDiff) === 1) {\n\n\t\t\tvar prevItem = _getItemAt(_prevItemIndex);\n\t\t\tif(prevItem.initialZoomLevel !== _currZoomLevel) {\n\t\t\t\t_calculateItemSize(prevItem , _viewportSize );\n\t\t\t\t_setImageSize(prevItem);\n\t\t\t\t_applyZoomPanToItem( prevItem ); \t\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\t// reset diff after update\n\t\t_indexDiff = 0;\n\n\t\tself.updateCurrZoomItem();\n\n\t\t_prevItemIndex = _currentItemIndex;\n\n\t\t_shout('afterChange');\n\t\t\n\t},\n\n\n\n\tupdateSize: function(force) {\n\t\t\n\t\tif(!_isFixedPosition && _options.modal) {\n\t\t\tvar windowScrollY = framework.getScrollY();\n\t\t\tif(_currentWindowScrollY !== windowScrollY) {\n\t\t\t\ttemplate.style.top = windowScrollY + 'px';\n\t\t\t\t_currentWindowScrollY = windowScrollY;\n\t\t\t}\n\t\t\tif(!force && _windowVisibleSize.x === window.innerWidth && _windowVisibleSize.y === window.innerHeight) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t_windowVisibleSize.x = window.innerWidth;\n\t\t\t_windowVisibleSize.y = window.innerHeight;\n\n\t\t\t//template.style.width = _windowVisibleSize.x + 'px';\n\t\t\ttemplate.style.height = _windowVisibleSize.y + 'px';\n\t\t}\n\n\n\n\t\t_viewportSize.x = self.scrollWrap.clientWidth;\n\t\t_viewportSize.y = self.scrollWrap.clientHeight;\n\n\t\t_updatePageScrollOffset();\n\n\t\t_slideSize.x = _viewportSize.x + Math.round(_viewportSize.x * _options.spacing);\n\t\t_slideSize.y = _viewportSize.y;\n\n\t\t_moveMainScroll(_slideSize.x * _currPositionIndex);\n\n\t\t_shout('beforeResize'); // even may be used for example to switch image sources\n\n\n\t\t// don't re-calculate size on inital size update\n\t\tif(_containerShiftIndex !== undefined) {\n\n\t\t\tvar holder,\n\t\t\t\titem,\n\t\t\t\thIndex;\n\n\t\t\tfor(var i = 0; i < NUM_HOLDERS; i++) {\n\t\t\t\tholder = _itemHolders[i];\n\t\t\t\t_setTranslateX( (i+_containerShiftIndex) * _slideSize.x, holder.el.style);\n\n\t\t\t\thIndex = _currentItemIndex+i-1;\n\n\t\t\t\tif(_options.loop && _getNumItems() > 2) {\n\t\t\t\t\thIndex = _getLoopedId(hIndex);\n\t\t\t\t}\n\n\t\t\t\t// update zoom level on items and refresh source (if needsUpdate)\n\t\t\t\titem = _getItemAt( hIndex );\n\n\t\t\t\t// re-render gallery item if `needsUpdate`,\n\t\t\t\t// or doesn't have `bounds` (entirely new slide object)\n\t\t\t\tif( item && (_itemsNeedUpdate || item.needsUpdate || !item.bounds) ) {\n\n\t\t\t\t\tself.cleanSlide( item );\n\t\t\t\t\t\n\t\t\t\t\tself.setContent( holder, hIndex );\n\n\t\t\t\t\t// if \"center\" slide\n\t\t\t\t\tif(i === 1) {\n\t\t\t\t\t\tself.currItem = item;\n\t\t\t\t\t\tself.updateCurrZoomItem(true);\n\t\t\t\t\t}\n\n\t\t\t\t\titem.needsUpdate = false;\n\n\t\t\t\t} else if(holder.index === -1 && hIndex >= 0) {\n\t\t\t\t\t// add content first time\n\t\t\t\t\tself.setContent( holder, hIndex );\n\t\t\t\t}\n\t\t\t\tif(item && item.container) {\n\t\t\t\t\t_calculateItemSize(item, _viewportSize);\n\t\t\t\t\t_setImageSize(item);\n\t\t\t\t\t_applyZoomPanToItem( item );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t_itemsNeedUpdate = false;\n\t\t}\t\n\n\t\t_startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;\n\t\t_currPanBounds = self.currItem.bounds;\n\n\t\tif(_currPanBounds) {\n\t\t\t_panOffset.x = _currPanBounds.center.x;\n\t\t\t_panOffset.y = _currPanBounds.center.y;\n\t\t\t_applyCurrentZoomPan( true );\n\t\t}\n\t\t\n\t\t_shout('resize');\n\t},\n\t\n\t// Zoom current item to\n\tzoomTo: function(destZoomLevel, centerPoint, speed, easingFn, updateFn) {\n\t\t/*\n\t\t\tif(destZoomLevel === 'fit') {\n\t\t\t\tdestZoomLevel = self.currItem.fitRatio;\n\t\t\t} else if(destZoomLevel === 'fill') {\n\t\t\t\tdestZoomLevel = self.currItem.fillRatio;\n\t\t\t}\n\t\t*/\n\n\t\tif(centerPoint) {\n\t\t\t_startZoomLevel = _currZoomLevel;\n\t\t\t_midZoomPoint.x = Math.abs(centerPoint.x) - _panOffset.x ;\n\t\t\t_midZoomPoint.y = Math.abs(centerPoint.y) - _panOffset.y ;\n\t\t\t_equalizePoints(_startPanOffset, _panOffset);\n\t\t}\n\n\t\tvar destPanBounds = _calculatePanBounds(destZoomLevel, false),\n\t\t\tdestPanOffset = {};\n\n\t\t_modifyDestPanOffset('x', destPanBounds, destPanOffset, destZoomLevel);\n\t\t_modifyDestPanOffset('y', destPanBounds, destPanOffset, destZoomLevel);\n\n\t\tvar initialZoomLevel = _currZoomLevel;\n\t\tvar initialPanOffset = {\n\t\t\tx: _panOffset.x,\n\t\t\ty: _panOffset.y\n\t\t};\n\n\t\t_roundPoint(destPanOffset);\n\n\t\tvar onUpdate = function(now) {\n\t\t\tif(now === 1) {\n\t\t\t\t_currZoomLevel = destZoomLevel;\n\t\t\t\t_panOffset.x = destPanOffset.x;\n\t\t\t\t_panOffset.y = destPanOffset.y;\n\t\t\t} else {\n\t\t\t\t_currZoomLevel = (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;\n\t\t\t\t_panOffset.x = (destPanOffset.x - initialPanOffset.x) * now + initialPanOffset.x;\n\t\t\t\t_panOffset.y = (destPanOffset.y - initialPanOffset.y) * now + initialPanOffset.y;\n\t\t\t}\n\n\t\t\tif(updateFn) {\n\t\t\t\tupdateFn(now);\n\t\t\t}\n\n\t\t\t_applyCurrentZoomPan( now === 1 );\n\t\t};\n\n\t\tif(speed) {\n\t\t\t_animateProp('customZoomTo', 0, 1, speed, easingFn || framework.easing.sine.inOut, onUpdate);\n\t\t} else {\n\t\t\tonUpdate(1);\n\t\t}\n\t}\n\n\n};\n\n\n/*>>core*/\n\n/*>>gestures*/\n/**\n * Mouse/touch/pointer event handlers.\n * \n * separated from @core.js for readability\n */\n\nvar MIN_SWIPE_DISTANCE = 30,\n\tDIRECTION_CHECK_OFFSET = 10; // amount of pixels to drag to determine direction of swipe\n\nvar _gestureStartTime,\n\t_gestureCheckSpeedTime,\n\n\t// pool of objects that are used during dragging of zooming\n\tp = {}, // first point\n\tp2 = {}, // second point (for zoom gesture)\n\tdelta = {},\n\t_currPoint = {},\n\t_startPoint = {},\n\t_currPointers = [],\n\t_startMainScrollPos = {},\n\t_releaseAnimData,\n\t_posPoints = [], // array of points during dragging, used to determine type of gesture\n\t_tempPoint = {},\n\n\t_isZoomingIn,\n\t_verticalDragInitiated,\n\t_oldAndroidTouchEndTimeout,\n\t_currZoomedItemIndex = 0,\n\t_centerPoint = _getEmptyPoint(),\n\t_lastReleaseTime = 0,\n\t_isDragging, // at least one pointer is down\n\t_isMultitouch, // at least two _pointers are down\n\t_zoomStarted, // zoom level changed during zoom gesture\n\t_moved,\n\t_dragAnimFrame,\n\t_mainScrollShifted,\n\t_currentPoints, // array of current touch points\n\t_isZooming,\n\t_currPointsDistance,\n\t_startPointsDistance,\n\t_currPanBounds,\n\t_mainScrollPos = _getEmptyPoint(),\n\t_currZoomElementStyle,\n\t_mainScrollAnimating, // true, if animation after swipe gesture is running\n\t_midZoomPoint = _getEmptyPoint(),\n\t_currCenterPoint = _getEmptyPoint(),\n\t_direction,\n\t_isFirstMove,\n\t_opacityChanged,\n\t_bgOpacity,\n\t_wasOverInitialZoom,\n\n\t_isEqualPoints = function(p1, p2) {\n\t\treturn p1.x === p2.x && p1.y === p2.y;\n\t},\n\t_isNearbyPoints = function(touch0, touch1) {\n\t\treturn Math.abs(touch0.x - touch1.x) < DOUBLE_TAP_RADIUS && Math.abs(touch0.y - touch1.y) < DOUBLE_TAP_RADIUS;\n\t},\n\t_calculatePointsDistance = function(p1, p2) {\n\t\t_tempPoint.x = Math.abs( p1.x - p2.x );\n\t\t_tempPoint.y = Math.abs( p1.y - p2.y );\n\t\treturn Math.sqrt(_tempPoint.x * _tempPoint.x + _tempPoint.y * _tempPoint.y);\n\t},\n\t_stopDragUpdateLoop = function() {\n\t\tif(_dragAnimFrame) {\n\t\t\t_cancelAF(_dragAnimFrame);\n\t\t\t_dragAnimFrame = null;\n\t\t}\n\t},\n\t_dragUpdateLoop = function() {\n\t\tif(_isDragging) {\n\t\t\t_dragAnimFrame = _requestAF(_dragUpdateLoop);\n\t\t\t_renderMovement();\n\t\t}\n\t},\n\t_canPan = function() {\n\t\treturn !(_options.scaleMode === 'fit' && _currZoomLevel === self.currItem.initialZoomLevel);\n\t},\n\t\n\t// find the closest parent DOM element\n\t_closestElement = function(el, fn) {\n\t \tif(!el || el === document) {\n\t \t\treturn false;\n\t \t}\n\n\t \t// don't search elements above pswp__scroll-wrap\n\t \tif(el.getAttribute('class') && el.getAttribute('class').indexOf('pswp__scroll-wrap') > -1 ) {\n\t \t\treturn false;\n\t \t}\n\n\t \tif( fn(el) ) {\n\t \t\treturn el;\n\t \t}\n\n\t \treturn _closestElement(el.parentNode, fn);\n\t},\n\n\t_preventObj = {},\n\t_preventDefaultEventBehaviour = function(e, isDown) {\n\t _preventObj.prevent = !_closestElement(e.target, _options.isClickableElement);\n\n\t\t_shout('preventDragEvent', e, isDown, _preventObj);\n\t\treturn _preventObj.prevent;\n\n\t},\n\t_convertTouchToPoint = function(touch, p) {\n\t\tp.x = touch.pageX;\n\t\tp.y = touch.pageY;\n\t\tp.id = touch.identifier;\n\t\treturn p;\n\t},\n\t_findCenterOfPoints = function(p1, p2, pCenter) {\n\t\tpCenter.x = (p1.x + p2.x) * 0.5;\n\t\tpCenter.y = (p1.y + p2.y) * 0.5;\n\t},\n\t_pushPosPoint = function(time, x, y) {\n\t\tif(time - _gestureCheckSpeedTime > 50) {\n\t\t\tvar o = _posPoints.length > 2 ? _posPoints.shift() : {};\n\t\t\to.x = x;\n\t\t\to.y = y; \n\t\t\t_posPoints.push(o);\n\t\t\t_gestureCheckSpeedTime = time;\n\t\t}\n\t},\n\n\t_calculateVerticalDragOpacityRatio = function() {\n\t\tvar yOffset = _panOffset.y - self.currItem.initialPosition.y; // difference between initial and current position\n\t\treturn 1 - Math.abs( yOffset / (_viewportSize.y / 2) );\n\t},\n\n\t\n\t// points pool, reused during touch events\n\t_ePoint1 = {},\n\t_ePoint2 = {},\n\t_tempPointsArr = [],\n\t_tempCounter,\n\t_getTouchPoints = function(e) {\n\t\t// clean up previous points, without recreating array\n\t\twhile(_tempPointsArr.length > 0) {\n\t\t\t_tempPointsArr.pop();\n\t\t}\n\n\t\tif(!_pointerEventEnabled) {\n\t\t\tif(e.type.indexOf('touch') > -1) {\n\n\t\t\t\tif(e.touches && e.touches.length > 0) {\n\t\t\t\t\t_tempPointsArr[0] = _convertTouchToPoint(e.touches[0], _ePoint1);\n\t\t\t\t\tif(e.touches.length > 1) {\n\t\t\t\t\t\t_tempPointsArr[1] = _convertTouchToPoint(e.touches[1], _ePoint2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t_ePoint1.x = e.pageX;\n\t\t\t\t_ePoint1.y = e.pageY;\n\t\t\t\t_ePoint1.id = '';\n\t\t\t\t_tempPointsArr[0] = _ePoint1;//_ePoint1;\n\t\t\t}\n\t\t} else {\n\t\t\t_tempCounter = 0;\n\t\t\t// we can use forEach, as pointer events are supported only in modern browsers\n\t\t\t_currPointers.forEach(function(p) {\n\t\t\t\tif(_tempCounter === 0) {\n\t\t\t\t\t_tempPointsArr[0] = p;\n\t\t\t\t} else if(_tempCounter === 1) {\n\t\t\t\t\t_tempPointsArr[1] = p;\n\t\t\t\t}\n\t\t\t\t_tempCounter++;\n\n\t\t\t});\n\t\t}\n\t\treturn _tempPointsArr;\n\t},\n\n\t_panOrMoveMainScroll = function(axis, delta) {\n\n\t\tvar panFriction,\n\t\t\toverDiff = 0,\n\t\t\tnewOffset = _panOffset[axis] + delta[axis],\n\t\t\tstartOverDiff,\n\t\t\tdir = delta[axis] > 0,\n\t\t\tnewMainScrollPosition = _mainScrollPos.x + delta.x,\n\t\t\tmainScrollDiff = _mainScrollPos.x - _startMainScrollPos.x,\n\t\t\tnewPanPos,\n\t\t\tnewMainScrollPos;\n\n\t\t// calculate fdistance over the bounds and friction\n\t\tif(newOffset > _currPanBounds.min[axis] || newOffset < _currPanBounds.max[axis]) {\n\t\t\tpanFriction = _options.panEndFriction;\n\t\t\t// Linear increasing of friction, so at 1/4 of viewport it's at max value. \n\t\t\t// Looks not as nice as was expected. Left for history.\n\t\t\t// panFriction = (1 - (_panOffset[axis] + delta[axis] + panBounds.min[axis]) / (_viewportSize[axis] / 4) );\n\t\t} else {\n\t\t\tpanFriction = 1;\n\t\t}\n\t\t\n\t\tnewOffset = _panOffset[axis] + delta[axis] * panFriction;\n\n\t\t// move main scroll or start panning\n\t\tif(_options.allowPanToNext || _currZoomLevel === self.currItem.initialZoomLevel) {\n\n\n\t\t\tif(!_currZoomElementStyle) {\n\t\t\t\t\n\t\t\t\tnewMainScrollPos = newMainScrollPosition;\n\n\t\t\t} else if(_direction === 'h' && axis === 'x' && !_zoomStarted ) {\n\t\t\t\t\n\t\t\t\tif(dir) {\n\t\t\t\t\tif(newOffset > _currPanBounds.min[axis]) {\n\t\t\t\t\t\tpanFriction = _options.panEndFriction;\n\t\t\t\t\t\toverDiff = _currPanBounds.min[axis] - newOffset;\n\t\t\t\t\t\tstartOverDiff = _currPanBounds.min[axis] - _startPanOffset[axis];\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// drag right\n\t\t\t\t\tif( (startOverDiff <= 0 || mainScrollDiff < 0) && _getNumItems() > 1 ) {\n\t\t\t\t\t\tnewMainScrollPos = newMainScrollPosition;\n\t\t\t\t\t\tif(mainScrollDiff < 0 && newMainScrollPosition > _startMainScrollPos.x) {\n\t\t\t\t\t\t\tnewMainScrollPos = _startMainScrollPos.x;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(_currPanBounds.min.x !== _currPanBounds.max.x) {\n\t\t\t\t\t\t\tnewPanPos = newOffset;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif(newOffset < _currPanBounds.max[axis] ) {\n\t\t\t\t\t\tpanFriction =_options.panEndFriction;\n\t\t\t\t\t\toverDiff = newOffset - _currPanBounds.max[axis];\n\t\t\t\t\t\tstartOverDiff = _startPanOffset[axis] - _currPanBounds.max[axis];\n\t\t\t\t\t}\n\n\t\t\t\t\tif( (startOverDiff <= 0 || mainScrollDiff > 0) && _getNumItems() > 1 ) {\n\t\t\t\t\t\tnewMainScrollPos = newMainScrollPosition;\n\n\t\t\t\t\t\tif(mainScrollDiff > 0 && newMainScrollPosition < _startMainScrollPos.x) {\n\t\t\t\t\t\t\tnewMainScrollPos = _startMainScrollPos.x;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(_currPanBounds.min.x !== _currPanBounds.max.x) {\n\t\t\t\t\t\t\tnewPanPos = newOffset;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t\t//\n\t\t\t}\n\n\t\t\tif(axis === 'x') {\n\n\t\t\t\tif(newMainScrollPos !== undefined) {\n\t\t\t\t\t_moveMainScroll(newMainScrollPos, true);\n\t\t\t\t\tif(newMainScrollPos === _startMainScrollPos.x) {\n\t\t\t\t\t\t_mainScrollShifted = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_mainScrollShifted = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(_currPanBounds.min.x !== _currPanBounds.max.x) {\n\t\t\t\t\tif(newPanPos !== undefined) {\n\t\t\t\t\t\t_panOffset.x = newPanPos;\n\t\t\t\t\t} else if(!_mainScrollShifted) {\n\t\t\t\t\t\t_panOffset.x += delta.x * panFriction;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn newMainScrollPos !== undefined;\n\t\t\t}\n\n\t\t}\n\n\t\tif(!_mainScrollAnimating) {\n\t\t\t\n\t\t\tif(!_mainScrollShifted) {\n\t\t\t\tif(_currZoomLevel > self.currItem.fitRatio) {\n\t\t\t\t\t_panOffset[axis] += delta[axis] * panFriction;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t\n\t\t}\n\t\t\n\t},\n\n\t// Pointerdown/touchstart/mousedown handler\n\t_onDragStart = function(e) {\n\n\t\t// Allow dragging only via left mouse button.\n\t\t// As this handler is not added in IE8 - we ignore e.which\n\t\t// \n\t\t// http://www.quirksmode.org/js/events_properties.html\n\t\t// https://developer.mozilla.org/en-US/docs/Web/API/event.button\n\t\tif(e.type === 'mousedown' && e.button > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(_initialZoomRunning) {\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif(_oldAndroidTouchEndTimeout && e.type === 'mousedown') {\n\t\t\treturn;\n\t\t}\n\n\t\tif(_preventDefaultEventBehaviour(e, true)) {\n\t\t\te.preventDefault();\n\t\t}\n\n\n\n\t\t_shout('pointerDown');\n\n\t\tif(_pointerEventEnabled) {\n\t\t\tvar pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\t\t\tif(pointerIndex < 0) {\n\t\t\t\tpointerIndex = _currPointers.length;\n\t\t\t}\n\t\t\t_currPointers[pointerIndex] = {x:e.pageX, y:e.pageY, id: e.pointerId};\n\t\t}\n\t\t\n\n\n\t\tvar startPointsList = _getTouchPoints(e),\n\t\t\tnumPoints = startPointsList.length;\n\n\t\t_currentPoints = null;\n\n\t\t_stopAllAnimations();\n\n\t\t// init drag\n\t\tif(!_isDragging || numPoints === 1) {\n\n\t\t\t\n\n\t\t\t_isDragging = _isFirstMove = true;\n\t\t\tframework.bind(window, _upMoveEvents, self);\n\n\t\t\t_isZoomingIn = \n\t\t\t\t_wasOverInitialZoom = \n\t\t\t\t_opacityChanged = \n\t\t\t\t_verticalDragInitiated = \n\t\t\t\t_mainScrollShifted = \n\t\t\t\t_moved = \n\t\t\t\t_isMultitouch = \n\t\t\t\t_zoomStarted = false;\n\n\t\t\t_direction = null;\n\n\t\t\t_shout('firstTouchStart', startPointsList);\n\n\t\t\t_equalizePoints(_startPanOffset, _panOffset);\n\n\t\t\t_currPanDist.x = _currPanDist.y = 0;\n\t\t\t_equalizePoints(_currPoint, startPointsList[0]);\n\t\t\t_equalizePoints(_startPoint, _currPoint);\n\n\t\t\t//_equalizePoints(_startMainScrollPos, _mainScrollPos);\n\t\t\t_startMainScrollPos.x = _slideSize.x * _currPositionIndex;\n\n\t\t\t_posPoints = [{\n\t\t\t\tx: _currPoint.x,\n\t\t\t\ty: _currPoint.y\n\t\t\t}];\n\n\t\t\t_gestureCheckSpeedTime = _gestureStartTime = _getCurrentTime();\n\n\t\t\t//_mainScrollAnimationEnd(true);\n\t\t\t_calculatePanBounds( _currZoomLevel, true );\n\t\t\t\n\t\t\t// Start rendering\n\t\t\t_stopDragUpdateLoop();\n\t\t\t_dragUpdateLoop();\n\t\t\t\n\t\t}\n\n\t\t// init zoom\n\t\tif(!_isZooming && numPoints > 1 && !_mainScrollAnimating && !_mainScrollShifted) {\n\t\t\t_startZoomLevel = _currZoomLevel;\n\t\t\t_zoomStarted = false; // true if zoom changed at least once\n\n\t\t\t_isZooming = _isMultitouch = true;\n\t\t\t_currPanDist.y = _currPanDist.x = 0;\n\n\t\t\t_equalizePoints(_startPanOffset, _panOffset);\n\n\t\t\t_equalizePoints(p, startPointsList[0]);\n\t\t\t_equalizePoints(p2, startPointsList[1]);\n\n\t\t\t_findCenterOfPoints(p, p2, _currCenterPoint);\n\n\t\t\t_midZoomPoint.x = Math.abs(_currCenterPoint.x) - _panOffset.x;\n\t\t\t_midZoomPoint.y = Math.abs(_currCenterPoint.y) - _panOffset.y;\n\t\t\t_currPointsDistance = _startPointsDistance = _calculatePointsDistance(p, p2);\n\t\t}\n\n\n\t},\n\n\t// Pointermove/touchmove/mousemove handler\n\t_onDragMove = function(e) {\n\n\t\te.preventDefault();\n\n\t\tif(_pointerEventEnabled) {\n\t\t\tvar pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\t\t\tif(pointerIndex > -1) {\n\t\t\t\tvar p = _currPointers[pointerIndex];\n\t\t\t\tp.x = e.pageX;\n\t\t\t\tp.y = e.pageY; \n\t\t\t}\n\t\t}\n\n\t\tif(_isDragging) {\n\t\t\tvar touchesList = _getTouchPoints(e);\n\t\t\tif(!_direction && !_moved && !_isZooming) {\n\n\t\t\t\tif(_mainScrollPos.x !== _slideSize.x * _currPositionIndex) {\n\t\t\t\t\t// if main scroll position is shifted – direction is always horizontal\n\t\t\t\t\t_direction = 'h';\n\t\t\t\t} else {\n\t\t\t\t\tvar diff = Math.abs(touchesList[0].x - _currPoint.x) - Math.abs(touchesList[0].y - _currPoint.y);\n\t\t\t\t\t// check the direction of movement\n\t\t\t\t\tif(Math.abs(diff) >= DIRECTION_CHECK_OFFSET) {\n\t\t\t\t\t\t_direction = diff > 0 ? 'h' : 'v';\n\t\t\t\t\t\t_currentPoints = touchesList;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t_currentPoints = touchesList;\n\t\t\t}\n\t\t}\t\n\t},\n\t// \n\t_renderMovement = function() {\n\n\t\tif(!_currentPoints) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar numPoints = _currentPoints.length;\n\n\t\tif(numPoints === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t_equalizePoints(p, _currentPoints[0]);\n\n\t\tdelta.x = p.x - _currPoint.x;\n\t\tdelta.y = p.y - _currPoint.y;\n\n\t\tif(_isZooming && numPoints > 1) {\n\t\t\t// Handle behaviour for more than 1 point\n\n\t\t\t_currPoint.x = p.x;\n\t\t\t_currPoint.y = p.y;\n\t\t\n\t\t\t// check if one of two points changed\n\t\t\tif( !delta.x && !delta.y && _isEqualPoints(_currentPoints[1], p2) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_equalizePoints(p2, _currentPoints[1]);\n\n\n\t\t\tif(!_zoomStarted) {\n\t\t\t\t_zoomStarted = true;\n\t\t\t\t_shout('zoomGestureStarted');\n\t\t\t}\n\t\t\t\n\t\t\t// Distance between two points\n\t\t\tvar pointsDistance = _calculatePointsDistance(p,p2);\n\n\t\t\tvar zoomLevel = _calculateZoomLevel(pointsDistance);\n\n\t\t\t// slightly over the of initial zoom level\n\t\t\tif(zoomLevel > self.currItem.initialZoomLevel + self.currItem.initialZoomLevel / 15) {\n\t\t\t\t_wasOverInitialZoom = true;\n\t\t\t}\n\n\t\t\t// Apply the friction if zoom level is out of the bounds\n\t\t\tvar zoomFriction = 1,\n\t\t\t\tminZoomLevel = _getMinZoomLevel(),\n\t\t\t\tmaxZoomLevel = _getMaxZoomLevel();\n\n\t\t\tif ( zoomLevel < minZoomLevel ) {\n\t\t\t\t\n\t\t\t\tif(_options.pinchToClose && !_wasOverInitialZoom && _startZoomLevel <= self.currItem.initialZoomLevel) {\n\t\t\t\t\t// fade out background if zooming out\n\t\t\t\t\tvar minusDiff = minZoomLevel - zoomLevel;\n\t\t\t\t\tvar percent = 1 - minusDiff / (minZoomLevel / 1.2);\n\n\t\t\t\t\t_applyBgOpacity(percent);\n\t\t\t\t\t_shout('onPinchClose', percent);\n\t\t\t\t\t_opacityChanged = true;\n\t\t\t\t} else {\n\t\t\t\t\tzoomFriction = (minZoomLevel - zoomLevel) / minZoomLevel;\n\t\t\t\t\tif(zoomFriction > 1) {\n\t\t\t\t\t\tzoomFriction = 1;\n\t\t\t\t\t}\n\t\t\t\t\tzoomLevel = minZoomLevel - zoomFriction * (minZoomLevel / 3);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else if ( zoomLevel > maxZoomLevel ) {\n\t\t\t\t// 1.5 - extra zoom level above the max. E.g. if max is x6, real max 6 + 1.5 = 7.5\n\t\t\t\tzoomFriction = (zoomLevel - maxZoomLevel) / ( minZoomLevel * 6 );\n\t\t\t\tif(zoomFriction > 1) {\n\t\t\t\t\tzoomFriction = 1;\n\t\t\t\t}\n\t\t\t\tzoomLevel = maxZoomLevel + zoomFriction * minZoomLevel;\n\t\t\t}\n\n\t\t\tif(zoomFriction < 0) {\n\t\t\t\tzoomFriction = 0;\n\t\t\t}\n\n\t\t\t// distance between touch points after friction is applied\n\t\t\t_currPointsDistance = pointsDistance;\n\n\t\t\t// _centerPoint - The point in the middle of two pointers\n\t\t\t_findCenterOfPoints(p, p2, _centerPoint);\n\t\t\n\t\t\t// paning with two pointers pressed\n\t\t\t_currPanDist.x += _centerPoint.x - _currCenterPoint.x;\n\t\t\t_currPanDist.y += _centerPoint.y - _currCenterPoint.y;\n\t\t\t_equalizePoints(_currCenterPoint, _centerPoint);\n\n\t\t\t_panOffset.x = _calculatePanOffset('x', zoomLevel);\n\t\t\t_panOffset.y = _calculatePanOffset('y', zoomLevel);\n\n\t\t\t_isZoomingIn = zoomLevel > _currZoomLevel;\n\t\t\t_currZoomLevel = zoomLevel;\n\t\t\t_applyCurrentZoomPan();\n\n\t\t} else {\n\n\t\t\t// handle behaviour for one point (dragging or panning)\n\n\t\t\tif(!_direction) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(_isFirstMove) {\n\t\t\t\t_isFirstMove = false;\n\n\t\t\t\t// subtract drag distance that was used during the detection direction \n\n\t\t\t\tif( Math.abs(delta.x) >= DIRECTION_CHECK_OFFSET) {\n\t\t\t\t\tdelta.x -= _currentPoints[0].x - _startPoint.x;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif( Math.abs(delta.y) >= DIRECTION_CHECK_OFFSET) {\n\t\t\t\t\tdelta.y -= _currentPoints[0].y - _startPoint.y;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_currPoint.x = p.x;\n\t\t\t_currPoint.y = p.y;\n\n\t\t\t// do nothing if pointers position hasn't changed\n\t\t\tif(delta.x === 0 && delta.y === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(_direction === 'v' && _options.closeOnVerticalDrag) {\n\t\t\t\tif(!_canPan()) {\n\t\t\t\t\t_currPanDist.y += delta.y;\n\t\t\t\t\t_panOffset.y += delta.y;\n\n\t\t\t\t\tvar opacityRatio = _calculateVerticalDragOpacityRatio();\n\n\t\t\t\t\t_verticalDragInitiated = true;\n\t\t\t\t\t_shout('onVerticalDrag', opacityRatio);\n\n\t\t\t\t\t_applyBgOpacity(opacityRatio);\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\treturn ;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_pushPosPoint(_getCurrentTime(), p.x, p.y);\n\n\t\t\t_moved = true;\n\t\t\t_currPanBounds = self.currItem.bounds;\n\t\t\t\n\t\t\tvar mainScrollChanged = _panOrMoveMainScroll('x', delta);\n\t\t\tif(!mainScrollChanged) {\n\t\t\t\t_panOrMoveMainScroll('y', delta);\n\n\t\t\t\t_roundPoint(_panOffset);\n\t\t\t\t_applyCurrentZoomPan();\n\t\t\t}\n\n\t\t}\n\n\t},\n\t\n\t// Pointerup/pointercancel/touchend/touchcancel/mouseup event handler\n\t_onDragRelease = function(e) {\n\n\t\tif(_features.isOldAndroid ) {\n\n\t\t\tif(_oldAndroidTouchEndTimeout && e.type === 'mouseup') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// on Android (v4.1, 4.2, 4.3 & possibly older) \n\t\t\t// ghost mousedown/up event isn't preventable via e.preventDefault,\n\t\t\t// which causes fake mousedown event\n\t\t\t// so we block mousedown/up for 600ms\n\t\t\tif( e.type.indexOf('touch') > -1 ) {\n\t\t\t\tclearTimeout(_oldAndroidTouchEndTimeout);\n\t\t\t\t_oldAndroidTouchEndTimeout = setTimeout(function() {\n\t\t\t\t\t_oldAndroidTouchEndTimeout = 0;\n\t\t\t\t}, 600);\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\t_shout('pointerUp');\n\n\t\tif(_preventDefaultEventBehaviour(e, false)) {\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tvar releasePoint;\n\n\t\tif(_pointerEventEnabled) {\n\t\t\tvar pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\t\t\t\n\t\t\tif(pointerIndex > -1) {\n\t\t\t\treleasePoint = _currPointers.splice(pointerIndex, 1)[0];\n\n\t\t\t\tif(navigator.msPointerEnabled) {\n\t\t\t\t\tvar MSPOINTER_TYPES = {\n\t\t\t\t\t\t4: 'mouse', // event.MSPOINTER_TYPE_MOUSE\n\t\t\t\t\t\t2: 'touch', // event.MSPOINTER_TYPE_TOUCH \n\t\t\t\t\t\t3: 'pen' // event.MSPOINTER_TYPE_PEN\n\t\t\t\t\t};\n\t\t\t\t\treleasePoint.type = MSPOINTER_TYPES[e.pointerType];\n\n\t\t\t\t\tif(!releasePoint.type) {\n\t\t\t\t\t\treleasePoint.type = e.pointerType || 'mouse';\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treleasePoint.type = e.pointerType || 'mouse';\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tvar touchList = _getTouchPoints(e),\n\t\t\tgestureType,\n\t\t\tnumPoints = touchList.length;\n\n\t\tif(e.type === 'mouseup') {\n\t\t\tnumPoints = 0;\n\t\t}\n\n\t\t// Do nothing if there were 3 touch points or more\n\t\tif(numPoints === 2) {\n\t\t\t_currentPoints = null;\n\t\t\treturn true;\n\t\t}\n\n\t\t// if second pointer released\n\t\tif(numPoints === 1) {\n\t\t\t_equalizePoints(_startPoint, touchList[0]);\n\t\t}\t\t\t\t\n\n\n\t\t// pointer hasn't moved, send \"tap release\" point\n\t\tif(numPoints === 0 && !_direction && !_mainScrollAnimating) {\n\t\t\tif(!releasePoint) {\n\t\t\t\tif(e.type === 'mouseup') {\n\t\t\t\t\treleasePoint = {x: e.pageX, y: e.pageY, type:'mouse'};\n\t\t\t\t} else if(e.changedTouches && e.changedTouches[0]) {\n\t\t\t\t\treleasePoint = {x: e.changedTouches[0].pageX, y: e.changedTouches[0].pageY, type:'touch'};\n\t\t\t\t}\t\t\n\t\t\t}\n\n\t\t\t_shout('touchRelease', e, releasePoint);\n\t\t}\n\n\t\t// Difference in time between releasing of two last touch points (zoom gesture)\n\t\tvar releaseTimeDiff = -1;\n\n\t\t// Gesture completed, no pointers left\n\t\tif(numPoints === 0) {\n\t\t\t_isDragging = false;\n\t\t\tframework.unbind(window, _upMoveEvents, self);\n\n\t\t\t_stopDragUpdateLoop();\n\n\t\t\tif(_isZooming) {\n\t\t\t\t// Two points released at the same time\n\t\t\t\treleaseTimeDiff = 0;\n\t\t\t} else if(_lastReleaseTime !== -1) {\n\t\t\t\treleaseTimeDiff = _getCurrentTime() - _lastReleaseTime;\n\t\t\t}\n\t\t}\n\t\t_lastReleaseTime = numPoints === 1 ? _getCurrentTime() : -1;\n\t\t\n\t\tif(releaseTimeDiff !== -1 && releaseTimeDiff < 150) {\n\t\t\tgestureType = 'zoom';\n\t\t} else {\n\t\t\tgestureType = 'swipe';\n\t\t}\n\n\t\tif(_isZooming && numPoints < 2) {\n\t\t\t_isZooming = false;\n\n\t\t\t// Only second point released\n\t\t\tif(numPoints === 1) {\n\t\t\t\tgestureType = 'zoomPointerUp';\n\t\t\t}\n\t\t\t_shout('zoomGestureEnded');\n\t\t}\n\n\t\t_currentPoints = null;\n\t\tif(!_moved && !_zoomStarted && !_mainScrollAnimating && !_verticalDragInitiated) {\n\t\t\t// nothing to animate\n\t\t\treturn;\n\t\t}\n\t\n\t\t_stopAllAnimations();\n\n\t\t\n\t\tif(!_releaseAnimData) {\n\t\t\t_releaseAnimData = _initDragReleaseAnimationData();\n\t\t}\n\t\t\n\t\t_releaseAnimData.calculateSwipeSpeed('x');\n\n\n\t\tif(_verticalDragInitiated) {\n\n\t\t\tvar opacityRatio = _calculateVerticalDragOpacityRatio();\n\n\t\t\tif(opacityRatio < _options.verticalDragRange) {\n\t\t\t\tself.close();\n\t\t\t} else {\n\t\t\t\tvar initalPanY = _panOffset.y,\n\t\t\t\t\tinitialBgOpacity = _bgOpacity;\n\n\t\t\t\t_animateProp('verticalDrag', 0, 1, 300, framework.easing.cubic.out, function(now) {\n\t\t\t\t\t\n\t\t\t\t\t_panOffset.y = (self.currItem.initialPosition.y - initalPanY) * now + initalPanY;\n\n\t\t\t\t\t_applyBgOpacity( (1 - initialBgOpacity) * now + initialBgOpacity );\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t});\n\n\t\t\t\t_shout('onVerticalDrag', 1);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\n\t\t// main scroll \n\t\tif( (_mainScrollShifted || _mainScrollAnimating) && numPoints === 0) {\n\t\t\tvar itemChanged = _finishSwipeMainScrollGesture(gestureType, _releaseAnimData);\n\t\t\tif(itemChanged) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgestureType = 'zoomPointerUp';\n\t\t}\n\n\t\t// prevent zoom/pan animation when main scroll animation runs\n\t\tif(_mainScrollAnimating) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Complete simple zoom gesture (reset zoom level if it's out of the bounds) \n\t\tif(gestureType !== 'swipe') {\n\t\t\t_completeZoomGesture();\n\t\t\treturn;\n\t\t}\n\t\n\t\t// Complete pan gesture if main scroll is not shifted, and it's possible to pan current image\n\t\tif(!_mainScrollShifted && _currZoomLevel > self.currItem.fitRatio) {\n\t\t\t_completePanGesture(_releaseAnimData);\n\t\t}\n\t},\n\n\n\t// Returns object with data about gesture\n\t// It's created only once and then reused\n\t_initDragReleaseAnimationData = function() {\n\t\t// temp local vars\n\t\tvar lastFlickDuration,\n\t\t\ttempReleasePos;\n\n\t\t// s = this\n\t\tvar s = {\n\t\t\tlastFlickOffset: {},\n\t\t\tlastFlickDist: {},\n\t\t\tlastFlickSpeed: {},\n\t\t\tslowDownRatio: {},\n\t\t\tslowDownRatioReverse: {},\n\t\t\tspeedDecelerationRatio: {},\n\t\t\tspeedDecelerationRatioAbs: {},\n\t\t\tdistanceOffset: {},\n\t\t\tbackAnimDestination: {},\n\t\t\tbackAnimStarted: {},\n\t\t\tcalculateSwipeSpeed: function(axis) {\n\t\t\t\t\n\n\t\t\t\tif( _posPoints.length > 1) {\n\t\t\t\t\tlastFlickDuration = _getCurrentTime() - _gestureCheckSpeedTime + 50;\n\t\t\t\t\ttempReleasePos = _posPoints[_posPoints.length-2][axis];\n\t\t\t\t} else {\n\t\t\t\t\tlastFlickDuration = _getCurrentTime() - _gestureStartTime; // total gesture duration\n\t\t\t\t\ttempReleasePos = _startPoint[axis];\n\t\t\t\t}\n\t\t\t\ts.lastFlickOffset[axis] = _currPoint[axis] - tempReleasePos;\n\t\t\t\ts.lastFlickDist[axis] = Math.abs(s.lastFlickOffset[axis]);\n\t\t\t\tif(s.lastFlickDist[axis] > 20) {\n\t\t\t\t\ts.lastFlickSpeed[axis] = s.lastFlickOffset[axis] / lastFlickDuration;\n\t\t\t\t} else {\n\t\t\t\t\ts.lastFlickSpeed[axis] = 0;\n\t\t\t\t}\n\t\t\t\tif( Math.abs(s.lastFlickSpeed[axis]) < 0.1 ) {\n\t\t\t\t\ts.lastFlickSpeed[axis] = 0;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ts.slowDownRatio[axis] = 0.95;\n\t\t\t\ts.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];\n\t\t\t\ts.speedDecelerationRatio[axis] = 1;\n\t\t\t},\n\n\t\t\tcalculateOverBoundsAnimOffset: function(axis, speed) {\n\t\t\t\tif(!s.backAnimStarted[axis]) {\n\n\t\t\t\t\tif(_panOffset[axis] > _currPanBounds.min[axis]) {\n\t\t\t\t\t\ts.backAnimDestination[axis] = _currPanBounds.min[axis];\n\t\t\t\t\t\t\n\t\t\t\t\t} else if(_panOffset[axis] < _currPanBounds.max[axis]) {\n\t\t\t\t\t\ts.backAnimDestination[axis] = _currPanBounds.max[axis];\n\t\t\t\t\t}\n\n\t\t\t\t\tif(s.backAnimDestination[axis] !== undefined) {\n\t\t\t\t\t\ts.slowDownRatio[axis] = 0.7;\n\t\t\t\t\t\ts.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];\n\t\t\t\t\t\tif(s.speedDecelerationRatioAbs[axis] < 0.05) {\n\n\t\t\t\t\t\t\ts.lastFlickSpeed[axis] = 0;\n\t\t\t\t\t\t\ts.backAnimStarted[axis] = true;\n\n\t\t\t\t\t\t\t_animateProp('bounceZoomPan'+axis,_panOffset[axis], \n\t\t\t\t\t\t\t\ts.backAnimDestination[axis], \n\t\t\t\t\t\t\t\tspeed || 300, \n\t\t\t\t\t\t\t\tframework.easing.sine.out, \n\t\t\t\t\t\t\t\tfunction(pos) {\n\t\t\t\t\t\t\t\t\t_panOffset[axis] = pos;\n\t\t\t\t\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Reduces the speed by slowDownRatio (per 10ms)\n\t\t\tcalculateAnimOffset: function(axis) {\n\t\t\t\tif(!s.backAnimStarted[axis]) {\n\t\t\t\t\ts.speedDecelerationRatio[axis] = s.speedDecelerationRatio[axis] * (s.slowDownRatio[axis] + \n\t\t\t\t\t\t\t\t\t\t\t\ts.slowDownRatioReverse[axis] - \n\t\t\t\t\t\t\t\t\t\t\t\ts.slowDownRatioReverse[axis] * s.timeDiff / 10);\n\n\t\t\t\t\ts.speedDecelerationRatioAbs[axis] = Math.abs(s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis]);\n\t\t\t\t\ts.distanceOffset[axis] = s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis] * s.timeDiff;\n\t\t\t\t\t_panOffset[axis] += s.distanceOffset[axis];\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tpanAnimLoop: function() {\n\t\t\t\tif ( _animations.zoomPan ) {\n\t\t\t\t\t_animations.zoomPan.raf = _requestAF(s.panAnimLoop);\n\n\t\t\t\t\ts.now = _getCurrentTime();\n\t\t\t\t\ts.timeDiff = s.now - s.lastNow;\n\t\t\t\t\ts.lastNow = s.now;\n\t\t\t\t\t\n\t\t\t\t\ts.calculateAnimOffset('x');\n\t\t\t\t\ts.calculateAnimOffset('y');\n\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\n\t\t\t\t\ts.calculateOverBoundsAnimOffset('x');\n\t\t\t\t\ts.calculateOverBoundsAnimOffset('y');\n\n\n\t\t\t\t\tif (s.speedDecelerationRatioAbs.x < 0.05 && s.speedDecelerationRatioAbs.y < 0.05) {\n\n\t\t\t\t\t\t// round pan position\n\t\t\t\t\t\t_panOffset.x = Math.round(_panOffset.x);\n\t\t\t\t\t\t_panOffset.y = Math.round(_panOffset.y);\n\t\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\t\n\t\t\t\t\t\t_stopAnimation('zoomPan');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t};\n\t\treturn s;\n\t},\n\n\t_completePanGesture = function(animData) {\n\t\t// calculate swipe speed for Y axis (paanning)\n\t\tanimData.calculateSwipeSpeed('y');\n\n\t\t_currPanBounds = self.currItem.bounds;\n\t\t\n\t\tanimData.backAnimDestination = {};\n\t\tanimData.backAnimStarted = {};\n\n\t\t// Avoid acceleration animation if speed is too low\n\t\tif(Math.abs(animData.lastFlickSpeed.x) <= 0.05 && Math.abs(animData.lastFlickSpeed.y) <= 0.05 ) {\n\t\t\tanimData.speedDecelerationRatioAbs.x = animData.speedDecelerationRatioAbs.y = 0;\n\n\t\t\t// Run pan drag release animation. E.g. if you drag image and release finger without momentum.\n\t\t\tanimData.calculateOverBoundsAnimOffset('x');\n\t\t\tanimData.calculateOverBoundsAnimOffset('y');\n\t\t\treturn true;\n\t\t}\n\n\t\t// Animation loop that controls the acceleration after pan gesture ends\n\t\t_registerStartAnimation('zoomPan');\n\t\tanimData.lastNow = _getCurrentTime();\n\t\tanimData.panAnimLoop();\n\t},\n\n\n\t_finishSwipeMainScrollGesture = function(gestureType, _releaseAnimData) {\n\t\tvar itemChanged;\n\t\tif(!_mainScrollAnimating) {\n\t\t\t_currZoomedItemIndex = _currentItemIndex;\n\t\t}\n\n\n\t\t\n\t\tvar itemsDiff;\n\n\t\tif(gestureType === 'swipe') {\n\t\t\tvar totalShiftDist = _currPoint.x - _startPoint.x,\n\t\t\t\tisFastLastFlick = _releaseAnimData.lastFlickDist.x < 10;\n\n\t\t\t// if container is shifted for more than MIN_SWIPE_DISTANCE, \n\t\t\t// and last flick gesture was in right direction\n\t\t\tif(totalShiftDist > MIN_SWIPE_DISTANCE && \n\t\t\t\t(isFastLastFlick || _releaseAnimData.lastFlickOffset.x > 20) ) {\n\t\t\t\t// go to prev item\n\t\t\t\titemsDiff = -1;\n\t\t\t} else if(totalShiftDist < -MIN_SWIPE_DISTANCE && \n\t\t\t\t(isFastLastFlick || _releaseAnimData.lastFlickOffset.x < -20) ) {\n\t\t\t\t// go to next item\n\t\t\t\titemsDiff = 1;\n\t\t\t}\n\t\t}\n\n\t\tvar nextCircle;\n\n\t\tif(itemsDiff) {\n\t\t\t\n\t\t\t_currentItemIndex += itemsDiff;\n\n\t\t\tif(_currentItemIndex < 0) {\n\t\t\t\t_currentItemIndex = _options.loop ? _getNumItems()-1 : 0;\n\t\t\t\tnextCircle = true;\n\t\t\t} else if(_currentItemIndex >= _getNumItems()) {\n\t\t\t\t_currentItemIndex = _options.loop ? 0 : _getNumItems()-1;\n\t\t\t\tnextCircle = true;\n\t\t\t}\n\n\t\t\tif(!nextCircle || _options.loop) {\n\t\t\t\t_indexDiff += itemsDiff;\n\t\t\t\t_currPositionIndex -= itemsDiff;\n\t\t\t\titemChanged = true;\n\t\t\t}\n\t\t\t\n\n\t\t\t\n\t\t}\n\n\t\tvar animateToX = _slideSize.x * _currPositionIndex;\n\t\tvar animateToDist = Math.abs( animateToX - _mainScrollPos.x );\n\t\tvar finishAnimDuration;\n\n\n\t\tif(!itemChanged && animateToX > _mainScrollPos.x !== _releaseAnimData.lastFlickSpeed.x > 0) {\n\t\t\t// \"return to current\" duration, e.g. when dragging from slide 0 to -1\n\t\t\tfinishAnimDuration = 333; \n\t\t} else {\n\t\t\tfinishAnimDuration = Math.abs(_releaseAnimData.lastFlickSpeed.x) > 0 ? \n\t\t\t\t\t\t\t\t\tanimateToDist / Math.abs(_releaseAnimData.lastFlickSpeed.x) : \n\t\t\t\t\t\t\t\t\t333;\n\n\t\t\tfinishAnimDuration = Math.min(finishAnimDuration, 400);\n\t\t\tfinishAnimDuration = Math.max(finishAnimDuration, 250);\n\t\t}\n\n\t\tif(_currZoomedItemIndex === _currentItemIndex) {\n\t\t\titemChanged = false;\n\t\t}\n\t\t\n\t\t_mainScrollAnimating = true;\n\t\t\n\t\t_shout('mainScrollAnimStart');\n\n\t\t_animateProp('mainScroll', _mainScrollPos.x, animateToX, finishAnimDuration, framework.easing.cubic.out, \n\t\t\t_moveMainScroll,\n\t\t\tfunction() {\n\t\t\t\t_stopAllAnimations();\n\t\t\t\t_mainScrollAnimating = false;\n\t\t\t\t_currZoomedItemIndex = -1;\n\t\t\t\t\n\t\t\t\tif(itemChanged || _currZoomedItemIndex !== _currentItemIndex) {\n\t\t\t\t\tself.updateCurrItem();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t_shout('mainScrollAnimComplete');\n\t\t\t}\n\t\t);\n\n\t\tif(itemChanged) {\n\t\t\tself.updateCurrItem(true);\n\t\t}\n\n\t\treturn itemChanged;\n\t},\n\n\t_calculateZoomLevel = function(touchesDistance) {\n\t\treturn 1 / _startPointsDistance * touchesDistance * _startZoomLevel;\n\t},\n\n\t// Resets zoom if it's out of bounds\n\t_completeZoomGesture = function() {\n\t\tvar destZoomLevel = _currZoomLevel,\n\t\t\tminZoomLevel = _getMinZoomLevel(),\n\t\t\tmaxZoomLevel = _getMaxZoomLevel();\n\n\t\tif ( _currZoomLevel < minZoomLevel ) {\n\t\t\tdestZoomLevel = minZoomLevel;\n\t\t} else if ( _currZoomLevel > maxZoomLevel ) {\n\t\t\tdestZoomLevel = maxZoomLevel;\n\t\t}\n\n\t\tvar destOpacity = 1,\n\t\t\tonUpdate,\n\t\t\tinitialOpacity = _bgOpacity;\n\n\t\tif(_opacityChanged && !_isZoomingIn && !_wasOverInitialZoom && _currZoomLevel < minZoomLevel) {\n\t\t\t//_closedByScroll = true;\n\t\t\tself.close();\n\t\t\treturn true;\n\t\t}\n\n\t\tif(_opacityChanged) {\n\t\t\tonUpdate = function(now) {\n\t\t\t\t_applyBgOpacity( (destOpacity - initialOpacity) * now + initialOpacity );\n\t\t\t};\n\t\t}\n\n\t\tself.zoomTo(destZoomLevel, 0, 200, framework.easing.cubic.out, onUpdate);\n\t\treturn true;\n\t};\n\n\n_registerModule('Gestures', {\n\tpublicMethods: {\n\n\t\tinitGestures: function() {\n\n\t\t\t// helper function that builds touch/pointer/mouse events\n\t\t\tvar addEventNames = function(pref, down, move, up, cancel) {\n\t\t\t\t_dragStartEvent = pref + down;\n\t\t\t\t_dragMoveEvent = pref + move;\n\t\t\t\t_dragEndEvent = pref + up;\n\t\t\t\tif(cancel) {\n\t\t\t\t\t_dragCancelEvent = pref + cancel;\n\t\t\t\t} else {\n\t\t\t\t\t_dragCancelEvent = '';\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t_pointerEventEnabled = _features.pointerEvent;\n\t\t\tif(_pointerEventEnabled && _features.touch) {\n\t\t\t\t// we don't need touch events, if browser supports pointer events\n\t\t\t\t_features.touch = false;\n\t\t\t}\n\n\t\t\tif(_pointerEventEnabled) {\n\t\t\t\tif(navigator.msPointerEnabled) {\n\t\t\t\t\t// IE10 pointer events are case-sensitive\n\t\t\t\t\taddEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');\n\t\t\t\t} else {\n\t\t\t\t\taddEventNames('pointer', 'down', 'move', 'up', 'cancel');\n\t\t\t\t}\n\t\t\t} else if(_features.touch) {\n\t\t\t\taddEventNames('touch', 'start', 'move', 'end', 'cancel');\n\t\t\t\t_likelyTouchDevice = true;\n\t\t\t} else {\n\t\t\t\taddEventNames('mouse', 'down', 'move', 'up');\t\n\t\t\t}\n\n\t\t\t_upMoveEvents = _dragMoveEvent + ' ' + _dragEndEvent + ' ' + _dragCancelEvent;\n\t\t\t_downEvents = _dragStartEvent;\n\n\t\t\tif(_pointerEventEnabled && !_likelyTouchDevice) {\n\t\t\t\t_likelyTouchDevice = (navigator.maxTouchPoints > 1) || (navigator.msMaxTouchPoints > 1);\n\t\t\t}\n\t\t\t// make variable public\n\t\t\tself.likelyTouchDevice = _likelyTouchDevice; \n\t\t\t\n\t\t\t_globalEventHandlers[_dragStartEvent] = _onDragStart;\n\t\t\t_globalEventHandlers[_dragMoveEvent] = _onDragMove;\n\t\t\t_globalEventHandlers[_dragEndEvent] = _onDragRelease; // the Kraken\n\n\t\t\tif(_dragCancelEvent) {\n\t\t\t\t_globalEventHandlers[_dragCancelEvent] = _globalEventHandlers[_dragEndEvent];\n\t\t\t}\n\n\t\t\t// Bind mouse events on device with detected hardware touch support, in case it supports multiple types of input.\n\t\t\tif(_features.touch) {\n\t\t\t\t_downEvents += ' mousedown';\n\t\t\t\t_upMoveEvents += ' mousemove mouseup';\n\t\t\t\t_globalEventHandlers.mousedown = _globalEventHandlers[_dragStartEvent];\n\t\t\t\t_globalEventHandlers.mousemove = _globalEventHandlers[_dragMoveEvent];\n\t\t\t\t_globalEventHandlers.mouseup = _globalEventHandlers[_dragEndEvent];\n\t\t\t}\n\n\t\t\tif(!_likelyTouchDevice) {\n\t\t\t\t// don't allow pan to next slide from zoomed state on Desktop\n\t\t\t\t_options.allowPanToNext = false;\n\t\t\t}\n\t\t}\n\n\t}\n});\n\n\n/*>>gestures*/\n\n/*>>show-hide-transition*/\n/**\n * show-hide-transition.js:\n *\n * Manages initial opening or closing transition.\n *\n * If you're not planning to use transition for gallery at all,\n * you may set options hideAnimationDuration and showAnimationDuration to 0,\n * and just delete startAnimation function.\n * \n */\n\n\nvar _showOrHideTimeout,\n\t_showOrHide = function(item, img, out, completeFn) {\n\n\t\tif(_showOrHideTimeout) {\n\t\t\tclearTimeout(_showOrHideTimeout);\n\t\t}\n\n\t\t_initialZoomRunning = true;\n\t\t_initialContentSet = true;\n\t\t\n\t\t// dimensions of small thumbnail {x:,y:,w:}.\n\t\t// Height is optional, as calculated based on large image.\n\t\tvar thumbBounds; \n\t\tif(item.initialLayout) {\n\t\t\tthumbBounds = item.initialLayout;\n\t\t\titem.initialLayout = null;\n\t\t} else {\n\t\t\tthumbBounds = _options.getThumbBoundsFn && _options.getThumbBoundsFn(_currentItemIndex);\n\t\t}\n\n\t\tvar duration = out ? _options.hideAnimationDuration : _options.showAnimationDuration;\n\n\t\tvar onComplete = function() {\n\t\t\t_stopAnimation('initialZoom');\n\t\t\tif(!out) {\n\t\t\t\t_applyBgOpacity(1);\n\t\t\t\tif(img) {\n\t\t\t\t\timg.style.display = 'block';\n\t\t\t\t}\n\t\t\t\tframework.addClass(template, 'pswp--animated-in');\n\t\t\t\t_shout('initialZoom' + (out ? 'OutEnd' : 'InEnd'));\n\t\t\t} else {\n\t\t\t\tself.template.removeAttribute('style');\n\t\t\t\tself.bg.removeAttribute('style');\n\t\t\t}\n\n\t\t\tif(completeFn) {\n\t\t\t\tcompleteFn();\n\t\t\t}\n\t\t\t_initialZoomRunning = false;\n\t\t};\n\n\t\t// if bounds aren't provided, just open gallery without animation\n\t\tif(!duration || !thumbBounds || thumbBounds.x === undefined) {\n\n\t\t\t_shout('initialZoom' + (out ? 'Out' : 'In') );\n\n\t\t\t_currZoomLevel = item.initialZoomLevel;\n\t\t\t_equalizePoints(_panOffset, item.initialPosition );\n\t\t\t_applyCurrentZoomPan();\n\n\t\t\ttemplate.style.opacity = out ? 0 : 1;\n\t\t\t_applyBgOpacity(1);\n\n\t\t\tif(duration) {\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tonComplete();\n\t\t\t\t}, duration);\n\t\t\t} else {\n\t\t\t\tonComplete();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvar startAnimation = function() {\n\t\t\tvar closeWithRaf = _closedByScroll,\n\t\t\t\tfadeEverything = !self.currItem.src || self.currItem.loadError || _options.showHideOpacity;\n\t\t\t\n\t\t\t// apply hw-acceleration to image\n\t\t\tif(item.miniImg) {\n\t\t\t\titem.miniImg.style.webkitBackfaceVisibility = 'hidden';\n\t\t\t}\n\n\t\t\tif(!out) {\n\t\t\t\t_currZoomLevel = thumbBounds.w / item.w;\n\t\t\t\t_panOffset.x = thumbBounds.x;\n\t\t\t\t_panOffset.y = thumbBounds.y - _initalWindowScrollY;\n\n\t\t\t\tself[fadeEverything ? 'template' : 'bg'].style.opacity = 0.001;\n\t\t\t\t_applyCurrentZoomPan();\n\t\t\t}\n\n\t\t\t_registerStartAnimation('initialZoom');\n\t\t\t\n\t\t\tif(out && !closeWithRaf) {\n\t\t\t\tframework.removeClass(template, 'pswp--animated-in');\n\t\t\t}\n\n\t\t\tif(fadeEverything) {\n\t\t\t\tif(out) {\n\t\t\t\t\tframework[ (closeWithRaf ? 'remove' : 'add') + 'Class' ](template, 'pswp--animate_opacity');\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tframework.addClass(template, 'pswp--animate_opacity');\n\t\t\t\t\t}, 30);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_showOrHideTimeout = setTimeout(function() {\n\n\t\t\t\t_shout('initialZoom' + (out ? 'Out' : 'In') );\n\t\t\t\t\n\n\t\t\t\tif(!out) {\n\n\t\t\t\t\t// \"in\" animation always uses CSS transitions (instead of rAF).\n\t\t\t\t\t// CSS transition work faster here, \n\t\t\t\t\t// as developer may also want to animate other things, \n\t\t\t\t\t// like ui on top of sliding area, which can be animated just via CSS\n\t\t\t\t\t\n\t\t\t\t\t_currZoomLevel = item.initialZoomLevel;\n\t\t\t\t\t_equalizePoints(_panOffset, item.initialPosition );\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t_applyBgOpacity(1);\n\n\t\t\t\t\tif(fadeEverything) {\n\t\t\t\t\t\ttemplate.style.opacity = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_applyBgOpacity(1);\n\t\t\t\t\t}\n\n\t\t\t\t\t_showOrHideTimeout = setTimeout(onComplete, duration + 20);\n\t\t\t\t} else {\n\n\t\t\t\t\t// \"out\" animation uses rAF only when PhotoSwipe is closed by browser scroll, to recalculate position\n\t\t\t\t\tvar destZoomLevel = thumbBounds.w / item.w,\n\t\t\t\t\t\tinitialPanOffset = {\n\t\t\t\t\t\t\tx: _panOffset.x,\n\t\t\t\t\t\t\ty: _panOffset.y\n\t\t\t\t\t\t},\n\t\t\t\t\t\tinitialZoomLevel = _currZoomLevel,\n\t\t\t\t\t\tinitalBgOpacity = _bgOpacity,\n\t\t\t\t\t\tonUpdate = function(now) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(now === 1) {\n\t\t\t\t\t\t\t\t_currZoomLevel = destZoomLevel;\n\t\t\t\t\t\t\t\t_panOffset.x = thumbBounds.x;\n\t\t\t\t\t\t\t\t_panOffset.y = thumbBounds.y - _currentWindowScrollY;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_currZoomLevel = (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;\n\t\t\t\t\t\t\t\t_panOffset.x = (thumbBounds.x - initialPanOffset.x) * now + initialPanOffset.x;\n\t\t\t\t\t\t\t\t_panOffset.y = (thumbBounds.y - _currentWindowScrollY - initialPanOffset.y) * now + initialPanOffset.y;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\t\tif(fadeEverything) {\n\t\t\t\t\t\t\t\ttemplate.style.opacity = 1 - now;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_applyBgOpacity( initalBgOpacity - now * initalBgOpacity );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\tif(closeWithRaf) {\n\t\t\t\t\t\t_animateProp('initialZoom', 0, 1, duration, framework.easing.cubic.out, onUpdate, onComplete);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonUpdate(1);\n\t\t\t\t\t\t_showOrHideTimeout = setTimeout(onComplete, duration + 20);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t}, out ? 25 : 90); // Main purpose of this delay is to give browser time to paint and\n\t\t\t\t\t// create composite layers of PhotoSwipe UI parts (background, controls, caption, arrows).\n\t\t\t\t\t// Which avoids lag at the beginning of scale transition.\n\t\t};\n\t\tstartAnimation();\n\n\t\t\n\t};\n\n/*>>show-hide-transition*/\n\n/*>>items-controller*/\n/**\n*\n* Controller manages gallery items, their dimensions, and their content.\n* \n*/\n\nvar _items,\n\t_tempPanAreaSize = {},\n\t_imagesToAppendPool = [],\n\t_initialContentSet,\n\t_initialZoomRunning,\n\t_controllerDefaultOptions = {\n\t\tindex: 0,\n\t\terrorMsg: '<div class=\"pswp__error-msg\"><a href=\"%url%\" target=\"_blank\">The image</a> could not be loaded.</div>',\n\t\tforceProgressiveLoading: false, // TODO\n\t\tpreload: [1,1],\n\t\tgetNumItemsFn: function() {\n\t\t\treturn _items.length;\n\t\t}\n\t};\n\n\nvar _getItemAt,\n\t_getNumItems,\n\t_initialIsLoop,\n\t_getZeroBounds = function() {\n\t\treturn {\n\t\t\tcenter:{x:0,y:0}, \n\t\t\tmax:{x:0,y:0}, \n\t\t\tmin:{x:0,y:0}\n\t\t};\n\t},\n\t_calculateSingleItemPanBounds = function(item, realPanElementW, realPanElementH ) {\n\t\tvar bounds = item.bounds;\n\n\t\t// position of element when it's centered\n\t\tbounds.center.x = Math.round((_tempPanAreaSize.x - realPanElementW) / 2);\n\t\tbounds.center.y = Math.round((_tempPanAreaSize.y - realPanElementH) / 2) + item.vGap.top;\n\n\t\t// maximum pan position\n\t\tbounds.max.x = (realPanElementW > _tempPanAreaSize.x) ? \n\t\t\t\t\t\t\tMath.round(_tempPanAreaSize.x - realPanElementW) : \n\t\t\t\t\t\t\tbounds.center.x;\n\t\t\n\t\tbounds.max.y = (realPanElementH > _tempPanAreaSize.y) ? \n\t\t\t\t\t\t\tMath.round(_tempPanAreaSize.y - realPanElementH) + item.vGap.top : \n\t\t\t\t\t\t\tbounds.center.y;\n\t\t\n\t\t// minimum pan position\n\t\tbounds.min.x = (realPanElementW > _tempPanAreaSize.x) ? 0 : bounds.center.x;\n\t\tbounds.min.y = (realPanElementH > _tempPanAreaSize.y) ? item.vGap.top : bounds.center.y;\n\t},\n\t_calculateItemSize = function(item, viewportSize, zoomLevel) {\n\n\t\tif (item.src && !item.loadError) {\n\t\t\tvar isInitial = !zoomLevel;\n\t\t\t\n\t\t\tif(isInitial) {\n\t\t\t\tif(!item.vGap) {\n\t\t\t\t\titem.vGap = {top:0,bottom:0};\n\t\t\t\t}\n\t\t\t\t// allows overriding vertical margin for individual items\n\t\t\t\t_shout('parseVerticalMargin', item);\n\t\t\t}\n\n\n\t\t\t_tempPanAreaSize.x = viewportSize.x;\n\t\t\t_tempPanAreaSize.y = viewportSize.y - item.vGap.top - item.vGap.bottom;\n\n\t\t\tif (isInitial) {\n\t\t\t\tvar hRatio = _tempPanAreaSize.x / item.w;\n\t\t\t\tvar vRatio = _tempPanAreaSize.y / item.h;\n\n\t\t\t\titem.fitRatio = hRatio < vRatio ? hRatio : vRatio;\n\t\t\t\t//item.fillRatio = hRatio > vRatio ? hRatio : vRatio;\n\n\t\t\t\tvar scaleMode = _options.scaleMode;\n\n\t\t\t\tif (scaleMode === 'orig') {\n\t\t\t\t\tzoomLevel = 1;\n\t\t\t\t} else if (scaleMode === 'fit') {\n\t\t\t\t\tzoomLevel = item.fitRatio;\n\t\t\t\t}\n\n\t\t\t\tif (zoomLevel > 1) {\n\t\t\t\t\tzoomLevel = 1;\n\t\t\t\t}\n\n\t\t\t\titem.initialZoomLevel = zoomLevel;\n\t\t\t\t\n\t\t\t\tif(!item.bounds) {\n\t\t\t\t\t// reuse bounds object\n\t\t\t\t\titem.bounds = _getZeroBounds(); \n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!zoomLevel) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_calculateSingleItemPanBounds(item, item.w * zoomLevel, item.h * zoomLevel);\n\n\t\t\tif (isInitial && zoomLevel === item.initialZoomLevel) {\n\t\t\t\titem.initialPosition = item.bounds.center;\n\t\t\t}\n\n\t\t\treturn item.bounds;\n\t\t} else {\n\t\t\titem.w = item.h = 0;\n\t\t\titem.initialZoomLevel = item.fitRatio = 1;\n\t\t\titem.bounds = _getZeroBounds();\n\t\t\titem.initialPosition = item.bounds.center;\n\n\t\t\t// if it's not image, we return zero bounds (content is not zoomable)\n\t\t\treturn item.bounds;\n\t\t}\n\t\t\n\t},\n\n\t\n\n\n\t_appendImage = function(index, item, baseDiv, img, preventAnimation, keepPlaceholder) {\n\t\t\n\n\t\tif(item.loadError) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(img) {\n\n\t\t\titem.imageAppended = true;\n\t\t\t_setImageSize(item, img, (item === self.currItem && _renderMaxResolution) );\n\t\t\t\n\t\t\tbaseDiv.appendChild(img);\n\n\t\t\tif(keepPlaceholder) {\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tif(item && item.loaded && item.placeholder) {\n\t\t\t\t\t\titem.placeholder.style.display = 'none';\n\t\t\t\t\t\titem.placeholder = null;\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t}\n\t\t}\n\t},\n\t\n\n\n\t_preloadImage = function(item) {\n\t\titem.loading = true;\n\t\titem.loaded = false;\n\t\tvar img = item.img = framework.createEl('pswp__img', 'img');\n\t\tvar onComplete = function() {\n\t\t\titem.loading = false;\n\t\t\titem.loaded = true;\n\n\t\t\tif(item.loadComplete) {\n\t\t\t\titem.loadComplete(item);\n\t\t\t} else {\n\t\t\t\titem.img = null; // no need to store image object\n\t\t\t}\n\t\t\timg.onload = img.onerror = null;\n\t\t\timg = null;\n\t\t};\n\t\timg.onload = onComplete;\n\t\timg.onerror = function() {\n\t\t\titem.loadError = true;\n\t\t\tonComplete();\n\t\t};\t\t\n\n\t\timg.src = item.src;// + '?a=' + Math.random();\n\n\t\treturn img;\n\t},\n\t_checkForError = function(item, cleanUp) {\n\t\tif(item.src && item.loadError && item.container) {\n\n\t\t\tif(cleanUp) {\n\t\t\t\titem.container.innerHTML = '';\n\t\t\t}\n\n\t\t\titem.container.innerHTML = _options.errorMsg.replace('%url%', item.src );\n\t\t\treturn true;\n\t\t\t\n\t\t}\n\t},\n\t_setImageSize = function(item, img, maxRes) {\n\t\tif(!item.src) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(!img) {\n\t\t\timg = item.container.lastChild;\n\t\t}\n\n\t\tvar w = maxRes ? item.w : Math.round(item.w * item.fitRatio),\n\t\t\th = maxRes ? item.h : Math.round(item.h * item.fitRatio);\n\t\t\n\t\tif(item.placeholder && !item.loaded) {\n\t\t\titem.placeholder.style.width = w + 'px';\n\t\t\titem.placeholder.style.height = h + 'px';\n\t\t}\n\n\t\timg.style.width = w + 'px';\n\t\timg.style.height = h + 'px';\n\t},\n\t_appendImagesPool = function() {\n\n\t\tif(_imagesToAppendPool.length) {\n\t\t\tvar poolItem;\n\n\t\t\tfor(var i = 0; i < _imagesToAppendPool.length; i++) {\n\t\t\t\tpoolItem = _imagesToAppendPool[i];\n\t\t\t\tif( poolItem.holder.index === poolItem.index ) {\n\t\t\t\t\t_appendImage(poolItem.index, poolItem.item, poolItem.baseDiv, poolItem.img, false, poolItem.clearPlaceholder);\n\t\t\t\t}\n\t\t\t}\n\t\t\t_imagesToAppendPool = [];\n\t\t}\n\t};\n\t\n\n\n_registerModule('Controller', {\n\n\tpublicMethods: {\n\n\t\tlazyLoadItem: function(index) {\n\t\t\tindex = _getLoopedId(index);\n\t\t\tvar item = _getItemAt(index);\n\n\t\t\tif(!item || ((item.loaded || item.loading) && !_itemsNeedUpdate)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_shout('gettingData', index, item);\n\n\t\t\tif (!item.src) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_preloadImage(item);\n\t\t},\n\t\tinitController: function() {\n\t\t\tframework.extend(_options, _controllerDefaultOptions, true);\n\t\t\tself.items = _items = items;\n\t\t\t_getItemAt = self.getItemAt;\n\t\t\t_getNumItems = _options.getNumItemsFn; //self.getNumItems;\n\n\n\n\t\t\t_initialIsLoop = _options.loop;\n\t\t\tif(_getNumItems() < 3) {\n\t\t\t\t_options.loop = false; // disable loop if less then 3 items\n\t\t\t}\n\n\t\t\t_listen('beforeChange', function(diff) {\n\n\t\t\t\tvar p = _options.preload,\n\t\t\t\t\tisNext = diff === null ? true : (diff >= 0),\n\t\t\t\t\tpreloadBefore = Math.min(p[0], _getNumItems() ),\n\t\t\t\t\tpreloadAfter = Math.min(p[1], _getNumItems() ),\n\t\t\t\t\ti;\n\n\n\t\t\t\tfor(i = 1; i <= (isNext ? preloadAfter : preloadBefore); i++) {\n\t\t\t\t\tself.lazyLoadItem(_currentItemIndex+i);\n\t\t\t\t}\n\t\t\t\tfor(i = 1; i <= (isNext ? preloadBefore : preloadAfter); i++) {\n\t\t\t\t\tself.lazyLoadItem(_currentItemIndex-i);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_listen('initialLayout', function() {\n\t\t\t\tself.currItem.initialLayout = _options.getThumbBoundsFn && _options.getThumbBoundsFn(_currentItemIndex);\n\t\t\t});\n\n\t\t\t_listen('mainScrollAnimComplete', _appendImagesPool);\n\t\t\t_listen('initialZoomInEnd', _appendImagesPool);\n\n\n\n\t\t\t_listen('destroy', function() {\n\t\t\t\tvar item;\n\t\t\t\tfor(var i = 0; i < _items.length; i++) {\n\t\t\t\t\titem = _items[i];\n\t\t\t\t\t// remove reference to DOM elements, for GC\n\t\t\t\t\tif(item.container) {\n\t\t\t\t\t\titem.container = null; \n\t\t\t\t\t}\n\t\t\t\t\tif(item.placeholder) {\n\t\t\t\t\t\titem.placeholder = null;\n\t\t\t\t\t}\n\t\t\t\t\tif(item.img) {\n\t\t\t\t\t\titem.img = null;\n\t\t\t\t\t}\n\t\t\t\t\tif(item.preloader) {\n\t\t\t\t\t\titem.preloader = null;\n\t\t\t\t\t}\n\t\t\t\t\tif(item.loadError) {\n\t\t\t\t\t\titem.loaded = item.loadError = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t_imagesToAppendPool = null;\n\t\t\t});\n\t\t},\n\n\n\t\tgetItemAt: function(index) {\n\t\t\tif (index >= 0) {\n\t\t\t\treturn _items[index] !== undefined ? _items[index] : false;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\tallowProgressiveImg: function() {\n\t\t\t// 1. Progressive image loading isn't working on webkit/blink \n\t\t\t// when hw-acceleration (e.g. translateZ) is applied to IMG element.\n\t\t\t// That's why in PhotoSwipe parent element gets zoom transform, not image itself.\n\t\t\t// \n\t\t\t// 2. Progressive image loading sometimes blinks in webkit/blink when applying animation to parent element.\n\t\t\t// That's why it's disabled on touch devices (mainly because of swipe transition)\n\t\t\t// \n\t\t\t// 3. Progressive image loading sometimes doesn't work in IE (up to 11).\n\n\t\t\t// Don't allow progressive loading on non-large touch devices\n\t\t\treturn _options.forceProgressiveLoading || !_likelyTouchDevice || _options.mouseUsed || screen.width > 1200; \n\t\t\t// 1200 - to eliminate touch devices with large screen (like Chromebook Pixel)\n\t\t},\n\n\t\tsetContent: function(holder, index) {\n\n\t\t\tif(_options.loop) {\n\t\t\t\tindex = _getLoopedId(index);\n\t\t\t}\n\n\t\t\tvar prevItem = self.getItemAt(holder.index);\n\t\t\tif(prevItem) {\n\t\t\t\tprevItem.container = null;\n\t\t\t}\n\t\n\t\t\tvar item = self.getItemAt(index),\n\t\t\t\timg;\n\t\t\t\n\t\t\tif(!item) {\n\t\t\t\tholder.el.innerHTML = '';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// allow to override data\n\t\t\t_shout('gettingData', index, item);\n\n\t\t\tholder.index = index;\n\t\t\tholder.item = item;\n\n\t\t\t// base container DIV is created only once for each of 3 holders\n\t\t\tvar baseDiv = item.container = framework.createEl('pswp__zoom-wrap'); \n\n\t\t\t\n\n\t\t\tif(!item.src && item.html) {\n\t\t\t\tif(item.html.tagName) {\n\t\t\t\t\tbaseDiv.appendChild(item.html);\n\t\t\t\t} else {\n\t\t\t\t\tbaseDiv.innerHTML = item.html;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_checkForError(item);\n\n\t\t\t_calculateItemSize(item, _viewportSize);\n\t\t\t\n\t\t\tif(item.src && !item.loadError && !item.loaded) {\n\n\t\t\t\titem.loadComplete = function(item) {\n\n\t\t\t\t\t// gallery closed before image finished loading\n\t\t\t\t\tif(!_isOpen) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// check if holder hasn't changed while image was loading\n\t\t\t\t\tif(holder && holder.index === index ) {\n\t\t\t\t\t\tif( _checkForError(item, true) ) {\n\t\t\t\t\t\t\titem.loadComplete = item.img = null;\n\t\t\t\t\t\t\t_calculateItemSize(item, _viewportSize);\n\t\t\t\t\t\t\t_applyZoomPanToItem(item);\n\n\t\t\t\t\t\t\tif(holder.index === _currentItemIndex) {\n\t\t\t\t\t\t\t\t// recalculate dimensions\n\t\t\t\t\t\t\t\tself.updateCurrZoomItem();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( !item.imageAppended ) {\n\t\t\t\t\t\t\tif(_features.transform && (_mainScrollAnimating || _initialZoomRunning) ) {\n\t\t\t\t\t\t\t\t_imagesToAppendPool.push({\n\t\t\t\t\t\t\t\t\titem:item,\n\t\t\t\t\t\t\t\t\tbaseDiv:baseDiv,\n\t\t\t\t\t\t\t\t\timg:item.img,\n\t\t\t\t\t\t\t\t\tindex:index,\n\t\t\t\t\t\t\t\t\tholder:holder,\n\t\t\t\t\t\t\t\t\tclearPlaceholder:true\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_appendImage(index, item, baseDiv, item.img, _mainScrollAnimating || _initialZoomRunning, true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// remove preloader & mini-img\n\t\t\t\t\t\t\tif(!_initialZoomRunning && item.placeholder) {\n\t\t\t\t\t\t\t\titem.placeholder.style.display = 'none';\n\t\t\t\t\t\t\t\titem.placeholder = null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\titem.loadComplete = null;\n\t\t\t\t\titem.img = null; // no need to store image element after it's added\n\n\t\t\t\t\t_shout('imageLoadComplete', index, item);\n\t\t\t\t};\n\n\t\t\t\tif(framework.features.transform) {\n\t\t\t\t\t\n\t\t\t\t\tvar placeholderClassName = 'pswp__img pswp__img--placeholder'; \n\t\t\t\t\tplaceholderClassName += (item.msrc ? '' : ' pswp__img--placeholder--blank');\n\n\t\t\t\t\tvar placeholder = framework.createEl(placeholderClassName, item.msrc ? 'img' : '');\n\t\t\t\t\tif(item.msrc) {\n\t\t\t\t\t\tplaceholder.src = item.msrc;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t_setImageSize(item, placeholder);\n\n\t\t\t\t\tbaseDiv.appendChild(placeholder);\n\t\t\t\t\titem.placeholder = placeholder;\n\n\t\t\t\t}\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\tif(!item.loading) {\n\t\t\t\t\t_preloadImage(item);\n\t\t\t\t}\n\n\n\t\t\t\tif( self.allowProgressiveImg() ) {\n\t\t\t\t\t// just append image\n\t\t\t\t\tif(!_initialContentSet && _features.transform) {\n\t\t\t\t\t\t_imagesToAppendPool.push({\n\t\t\t\t\t\t\titem:item, \n\t\t\t\t\t\t\tbaseDiv:baseDiv, \n\t\t\t\t\t\t\timg:item.img, \n\t\t\t\t\t\t\tindex:index, \n\t\t\t\t\t\t\tholder:holder\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_appendImage(index, item, baseDiv, item.img, true, true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else if(item.src && !item.loadError) {\n\t\t\t\t// image object is created every time, due to bugs of image loading & delay when switching images\n\t\t\t\timg = framework.createEl('pswp__img', 'img');\n\t\t\t\timg.style.opacity = 1;\n\t\t\t\timg.src = item.src;\n\t\t\t\t_setImageSize(item, img);\n\t\t\t\t_appendImage(index, item, baseDiv, img, true);\n\t\t\t}\n\t\t\t\n\n\t\t\tif(!_initialContentSet && index === _currentItemIndex) {\n\t\t\t\t_currZoomElementStyle = baseDiv.style;\n\t\t\t\t_showOrHide(item, (img ||item.img) );\n\t\t\t} else {\n\t\t\t\t_applyZoomPanToItem(item);\n\t\t\t}\n\n\t\t\tholder.el.innerHTML = '';\n\t\t\tholder.el.appendChild(baseDiv);\n\t\t},\n\n\t\tcleanSlide: function( item ) {\n\t\t\tif(item.img ) {\n\t\t\t\titem.img.onload = item.img.onerror = null;\n\t\t\t}\n\t\t\titem.loaded = item.loading = item.img = item.imageAppended = false;\n\t\t}\n\n\t}\n});\n\n/*>>items-controller*/\n\n/*>>tap*/\n/**\n * tap.js:\n *\n * Displatches tap and double-tap events.\n * \n */\n\nvar tapTimer,\n\ttapReleasePoint = {},\n\t_dispatchTapEvent = function(origEvent, releasePoint, pointerType) {\t\t\n\t\tvar e = document.createEvent( 'CustomEvent' ),\n\t\t\teDetail = {\n\t\t\t\torigEvent:origEvent, \n\t\t\t\ttarget:origEvent.target, \n\t\t\t\treleasePoint: releasePoint, \n\t\t\t\tpointerType:pointerType || 'touch'\n\t\t\t};\n\n\t\te.initCustomEvent( 'pswpTap', true, true, eDetail );\n\t\torigEvent.target.dispatchEvent(e);\n\t};\n\n_registerModule('Tap', {\n\tpublicMethods: {\n\t\tinitTap: function() {\n\t\t\t_listen('firstTouchStart', self.onTapStart);\n\t\t\t_listen('touchRelease', self.onTapRelease);\n\t\t\t_listen('destroy', function() {\n\t\t\t\ttapReleasePoint = {};\n\t\t\t\ttapTimer = null;\n\t\t\t});\n\t\t},\n\t\tonTapStart: function(touchList) {\n\t\t\tif(touchList.length > 1) {\n\t\t\t\tclearTimeout(tapTimer);\n\t\t\t\ttapTimer = null;\n\t\t\t}\n\t\t},\n\t\tonTapRelease: function(e, releasePoint) {\n\t\t\tif(!releasePoint) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(!_moved && !_isMultitouch && !_numAnimations) {\n\t\t\t\tvar p0 = releasePoint;\n\t\t\t\tif(tapTimer) {\n\t\t\t\t\tclearTimeout(tapTimer);\n\t\t\t\t\ttapTimer = null;\n\n\t\t\t\t\t// Check if taped on the same place\n\t\t\t\t\tif ( _isNearbyPoints(p0, tapReleasePoint) ) {\n\t\t\t\t\t\t_shout('doubleTap', p0);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(releasePoint.type === 'mouse') {\n\t\t\t\t\t_dispatchTapEvent(e, releasePoint, 'mouse');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar clickedTagName = e.target.tagName.toUpperCase();\n\t\t\t\t// avoid double tap delay on buttons and elements that have class pswp__single-tap\n\t\t\t\tif(clickedTagName === 'BUTTON' || framework.hasClass(e.target, 'pswp__single-tap') ) {\n\t\t\t\t\t_dispatchTapEvent(e, releasePoint);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t_equalizePoints(tapReleasePoint, p0);\n\n\t\t\t\ttapTimer = setTimeout(function() {\n\t\t\t\t\t_dispatchTapEvent(e, releasePoint);\n\t\t\t\t\ttapTimer = null;\n\t\t\t\t}, 300);\n\t\t\t}\n\t\t}\n\t}\n});\n\n/*>>tap*/\n\n/*>>desktop-zoom*/\n/**\n *\n * desktop-zoom.js:\n *\n * - Binds mousewheel event for paning zoomed image.\n * - Manages \"dragging\", \"zoomed-in\", \"zoom-out\" classes.\n * (which are used for cursors and zoom icon)\n * - Adds toggleDesktopZoom function.\n * \n */\n\nvar _wheelDelta;\n\t\n_registerModule('DesktopZoom', {\n\n\tpublicMethods: {\n\n\t\tinitDesktopZoom: function() {\n\n\t\t\tif(_oldIE) {\n\t\t\t\t// no zoom for old IE (<=8)\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(_likelyTouchDevice) {\n\t\t\t\t// if detected hardware touch support, we wait until mouse is used,\n\t\t\t\t// and only then apply desktop-zoom features\n\t\t\t\t_listen('mouseUsed', function() {\n\t\t\t\t\tself.setupDesktopZoom();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tself.setupDesktopZoom(true);\n\t\t\t}\n\n\t\t},\n\n\t\tsetupDesktopZoom: function(onInit) {\n\n\t\t\t_wheelDelta = {};\n\n\t\t\tvar events = 'wheel mousewheel DOMMouseScroll';\n\t\t\t\n\t\t\t_listen('bindEvents', function() {\n\t\t\t\tframework.bind(template, events, self.handleMouseWheel);\n\t\t\t});\n\n\t\t\t_listen('unbindEvents', function() {\n\t\t\t\tif(_wheelDelta) {\n\t\t\t\t\tframework.unbind(template, events, self.handleMouseWheel);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tself.mouseZoomedIn = false;\n\n\t\t\tvar hasDraggingClass,\n\t\t\t\tupdateZoomable = function() {\n\t\t\t\t\tif(self.mouseZoomedIn) {\n\t\t\t\t\t\tframework.removeClass(template, 'pswp--zoomed-in');\n\t\t\t\t\t\tself.mouseZoomedIn = false;\n\t\t\t\t\t}\n\t\t\t\t\tif(_currZoomLevel < 1) {\n\t\t\t\t\t\tframework.addClass(template, 'pswp--zoom-allowed');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tframework.removeClass(template, 'pswp--zoom-allowed');\n\t\t\t\t\t}\n\t\t\t\t\tremoveDraggingClass();\n\t\t\t\t},\n\t\t\t\tremoveDraggingClass = function() {\n\t\t\t\t\tif(hasDraggingClass) {\n\t\t\t\t\t\tframework.removeClass(template, 'pswp--dragging');\n\t\t\t\t\t\thasDraggingClass = false;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t_listen('resize' , updateZoomable);\n\t\t\t_listen('afterChange' , updateZoomable);\n\t\t\t_listen('pointerDown', function() {\n\t\t\t\tif(self.mouseZoomedIn) {\n\t\t\t\t\thasDraggingClass = true;\n\t\t\t\t\tframework.addClass(template, 'pswp--dragging');\n\t\t\t\t}\n\t\t\t});\n\t\t\t_listen('pointerUp', removeDraggingClass);\n\n\t\t\tif(!onInit) {\n\t\t\t\tupdateZoomable();\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\thandleMouseWheel: function(e) {\n\n\t\t\tif(_currZoomLevel <= self.currItem.fitRatio) {\n\t\t\t\tif( _options.modal ) {\n\n\t\t\t\t\tif (!_options.closeOnScroll || _numAnimations || _isDragging) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t} else if(_transformKey && Math.abs(e.deltaY) > 2) {\n\t\t\t\t\t\t// close PhotoSwipe\n\t\t\t\t\t\t// if browser supports transforms & scroll changed enough\n\t\t\t\t\t\t_closedByScroll = true;\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// allow just one event to fire\n\t\t\te.stopPropagation();\n\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/Events/wheel\n\t\t\t_wheelDelta.x = 0;\n\n\t\t\tif('deltaX' in e) {\n\t\t\t\tif(e.deltaMode === 1 /* DOM_DELTA_LINE */) {\n\t\t\t\t\t// 18 - average line height\n\t\t\t\t\t_wheelDelta.x = e.deltaX * 18;\n\t\t\t\t\t_wheelDelta.y = e.deltaY * 18;\n\t\t\t\t} else {\n\t\t\t\t\t_wheelDelta.x = e.deltaX;\n\t\t\t\t\t_wheelDelta.y = e.deltaY;\n\t\t\t\t}\n\t\t\t} else if('wheelDelta' in e) {\n\t\t\t\tif(e.wheelDeltaX) {\n\t\t\t\t\t_wheelDelta.x = -0.16 * e.wheelDeltaX;\n\t\t\t\t}\n\t\t\t\tif(e.wheelDeltaY) {\n\t\t\t\t\t_wheelDelta.y = -0.16 * e.wheelDeltaY;\n\t\t\t\t} else {\n\t\t\t\t\t_wheelDelta.y = -0.16 * e.wheelDelta;\n\t\t\t\t}\n\t\t\t} else if('detail' in e) {\n\t\t\t\t_wheelDelta.y = e.detail;\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_calculatePanBounds(_currZoomLevel, true);\n\n\t\t\tvar newPanX = _panOffset.x - _wheelDelta.x,\n\t\t\t\tnewPanY = _panOffset.y - _wheelDelta.y;\n\n\t\t\t// only prevent scrolling in nonmodal mode when not at edges\n\t\t\tif (_options.modal ||\n\t\t\t\t(\n\t\t\t\tnewPanX <= _currPanBounds.min.x && newPanX >= _currPanBounds.max.x &&\n\t\t\t\tnewPanY <= _currPanBounds.min.y && newPanY >= _currPanBounds.max.y\n\t\t\t\t) ) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\t// TODO: use rAF instead of mousewheel?\n\t\t\tself.panTo(newPanX, newPanY);\n\t\t},\n\n\t\ttoggleDesktopZoom: function(centerPoint) {\n\t\t\tcenterPoint = centerPoint || {x:_viewportSize.x/2 + _offset.x, y:_viewportSize.y/2 + _offset.y };\n\n\t\t\tvar doubleTapZoomLevel = _options.getDoubleTapZoom(true, self.currItem);\n\t\t\tvar zoomOut = _currZoomLevel === doubleTapZoomLevel;\n\t\t\t\n\t\t\tself.mouseZoomedIn = !zoomOut;\n\n\t\t\tself.zoomTo(zoomOut ? self.currItem.initialZoomLevel : doubleTapZoomLevel, centerPoint, 333);\n\t\t\tframework[ (!zoomOut ? 'add' : 'remove') + 'Class'](template, 'pswp--zoomed-in');\n\t\t}\n\n\t}\n});\n\n\n/*>>desktop-zoom*/\n\n/*>>history*/\n/**\n *\n * history.js:\n *\n * - Back button to close gallery.\n * \n * - Unique URL for each slide: example.com/&pid=1&gid=3\n * (where PID is picture index, and GID and gallery index)\n * \n * - Switch URL when slides change.\n * \n */\n\n\nvar _historyDefaultOptions = {\n\thistory: true,\n\tgalleryUID: 1\n};\n\nvar _historyUpdateTimeout,\n\t_hashChangeTimeout,\n\t_hashAnimCheckTimeout,\n\t_hashChangedByScript,\n\t_hashChangedByHistory,\n\t_hashReseted,\n\t_initialHash,\n\t_historyChanged,\n\t_closedFromURL,\n\t_urlChangedOnce,\n\t_windowLoc,\n\n\t_supportsPushState,\n\n\t_getHash = function() {\n\t\treturn _windowLoc.hash.substring(1);\n\t},\n\t_cleanHistoryTimeouts = function() {\n\n\t\tif(_historyUpdateTimeout) {\n\t\t\tclearTimeout(_historyUpdateTimeout);\n\t\t}\n\n\t\tif(_hashAnimCheckTimeout) {\n\t\t\tclearTimeout(_hashAnimCheckTimeout);\n\t\t}\n\t},\n\n\t// pid - Picture index\n\t// gid - Gallery index\n\t_parseItemIndexFromURL = function() {\n\t\tvar hash = _getHash(),\n\t\t\tparams = {};\n\n\t\tif(hash.length < 5) { // pid=1\n\t\t\treturn params;\n\t\t}\n\n\t\tvar i, vars = hash.split('&');\n\t\tfor (i = 0; i < vars.length; i++) {\n\t\t\tif(!vars[i]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar pair = vars[i].split('=');\t\n\t\t\tif(pair.length < 2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tparams[pair[0]] = pair[1];\n\t\t}\n\t\tif(_options.galleryPIDs) {\n\t\t\t// detect custom pid in hash and search for it among the items collection\n\t\t\tvar searchfor = params.pid;\n\t\t\tparams.pid = 0; // if custom pid cannot be found, fallback to the first item\n\t\t\tfor(i = 0; i < _items.length; i++) {\n\t\t\t\tif(_items[i].pid === searchfor) {\n\t\t\t\t\tparams.pid = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tparams.pid = parseInt(params.pid,10)-1;\n\t\t}\n\t\tif( params.pid < 0 ) {\n\t\t\tparams.pid = 0;\n\t\t}\n\t\treturn params;\n\t},\n\t_updateHash = function() {\n\n\t\tif(_hashAnimCheckTimeout) {\n\t\t\tclearTimeout(_hashAnimCheckTimeout);\n\t\t}\n\n\n\t\tif(_numAnimations || _isDragging) {\n\t\t\t// changing browser URL forces layout/paint in some browsers, which causes noticable lag during animation\n\t\t\t// that's why we update hash only when no animations running\n\t\t\t_hashAnimCheckTimeout = setTimeout(_updateHash, 500);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif(_hashChangedByScript) {\n\t\t\tclearTimeout(_hashChangeTimeout);\n\t\t} else {\n\t\t\t_hashChangedByScript = true;\n\t\t}\n\n\n\t\tvar pid = (_currentItemIndex + 1);\n\t\tvar item = _getItemAt( _currentItemIndex );\n\t\tif(item.hasOwnProperty('pid')) {\n\t\t\t// carry forward any custom pid assigned to the item\n\t\t\tpid = item.pid;\n\t\t}\n\t\tvar newHash = _initialHash + '&' + 'gid=' + _options.galleryUID + '&' + 'pid=' + pid;\n\n\t\tif(!_historyChanged) {\n\t\t\tif(_windowLoc.hash.indexOf(newHash) === -1) {\n\t\t\t\t_urlChangedOnce = true;\n\t\t\t}\n\t\t\t// first time - add new hisory record, then just replace\n\t\t}\n\n\t\tvar newURL = _windowLoc.href.split('#')[0] + '#' + newHash;\n\n\t\tif( _supportsPushState ) {\n\n\t\t\tif('#' + newHash !== window.location.hash) {\n\t\t\t\thistory[_historyChanged ? 'replaceState' : 'pushState']('', document.title, newURL);\n\t\t\t}\n\n\t\t} else {\n\t\t\tif(_historyChanged) {\n\t\t\t\t_windowLoc.replace( newURL );\n\t\t\t} else {\n\t\t\t\t_windowLoc.hash = newHash;\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\n\t\t_historyChanged = true;\n\t\t_hashChangeTimeout = setTimeout(function() {\n\t\t\t_hashChangedByScript = false;\n\t\t}, 60);\n\t};\n\n\n\n\t\n\n_registerModule('History', {\n\n\t\n\n\tpublicMethods: {\n\t\tinitHistory: function() {\n\n\t\t\tframework.extend(_options, _historyDefaultOptions, true);\n\n\t\t\tif( !_options.history ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\t_windowLoc = window.location;\n\t\t\t_urlChangedOnce = false;\n\t\t\t_closedFromURL = false;\n\t\t\t_historyChanged = false;\n\t\t\t_initialHash = _getHash();\n\t\t\t_supportsPushState = ('pushState' in history);\n\n\n\t\t\tif(_initialHash.indexOf('gid=') > -1) {\n\t\t\t\t_initialHash = _initialHash.split('&gid=')[0];\n\t\t\t\t_initialHash = _initialHash.split('?gid=')[0];\n\t\t\t}\n\t\t\t\n\n\t\t\t_listen('afterChange', self.updateURL);\n\t\t\t_listen('unbindEvents', function() {\n\t\t\t\tframework.unbind(window, 'hashchange', self.onHashChange);\n\t\t\t});\n\n\n\t\t\tvar returnToOriginal = function() {\n\t\t\t\t_hashReseted = true;\n\t\t\t\tif(!_closedFromURL) {\n\n\t\t\t\t\tif(_urlChangedOnce) {\n\t\t\t\t\t\thistory.back();\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif(_initialHash) {\n\t\t\t\t\t\t\t_windowLoc.hash = _initialHash;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (_supportsPushState) {\n\n\t\t\t\t\t\t\t\t// remove hash from url without refreshing it or scrolling to top\n\t\t\t\t\t\t\t\thistory.pushState('', document.title, _windowLoc.pathname + _windowLoc.search );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_windowLoc.hash = '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\t_cleanHistoryTimeouts();\n\t\t\t};\n\n\n\t\t\t_listen('unbindEvents', function() {\n\t\t\t\tif(_closedByScroll) {\n\t\t\t\t\t// if PhotoSwipe is closed by scroll, we go \"back\" before the closing animation starts\n\t\t\t\t\t// this is done to keep the scroll position\n\t\t\t\t\treturnToOriginal();\n\t\t\t\t}\n\t\t\t});\n\t\t\t_listen('destroy', function() {\n\t\t\t\tif(!_hashReseted) {\n\t\t\t\t\treturnToOriginal();\n\t\t\t\t}\n\t\t\t});\n\t\t\t_listen('firstUpdate', function() {\n\t\t\t\t_currentItemIndex = _parseItemIndexFromURL().pid;\n\t\t\t});\n\n\t\t\t\n\n\t\t\t\n\t\t\tvar index = _initialHash.indexOf('pid=');\n\t\t\tif(index > -1) {\n\t\t\t\t_initialHash = _initialHash.substring(0, index);\n\t\t\t\tif(_initialHash.slice(-1) === '&') {\n\t\t\t\t\t_initialHash = _initialHash.slice(0, -1);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\n\t\t\tsetTimeout(function() {\n\t\t\t\tif(_isOpen) { // hasn't destroyed yet\n\t\t\t\t\tframework.bind(window, 'hashchange', self.onHashChange);\n\t\t\t\t}\n\t\t\t}, 40);\n\t\t\t\n\t\t},\n\t\tonHashChange: function() {\n\n\t\t\tif(_getHash() === _initialHash) {\n\n\t\t\t\t_closedFromURL = true;\n\t\t\t\tself.close();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(!_hashChangedByScript) {\n\n\t\t\t\t_hashChangedByHistory = true;\n\t\t\t\tself.goTo( _parseItemIndexFromURL().pid );\n\t\t\t\t_hashChangedByHistory = false;\n\t\t\t}\n\t\t\t\n\t\t},\n\t\tupdateURL: function() {\n\n\t\t\t// Delay the update of URL, to avoid lag during transition, \n\t\t\t// and to not to trigger actions like \"refresh page sound\" or \"blinking favicon\" to often\n\t\t\t\n\t\t\t_cleanHistoryTimeouts();\n\t\t\t\n\n\t\t\tif(_hashChangedByHistory) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(!_historyChanged) {\n\t\t\t\t_updateHash(); // first time\n\t\t\t} else {\n\t\t\t\t_historyUpdateTimeout = setTimeout(_updateHash, 800);\n\t\t\t}\n\t\t}\n\t\n\t}\n});\n\n\n/*>>history*/\n\tframework.extend(self, publicMethods); };\n\treturn PhotoSwipe;\n});\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! PhotoSwipe Default UI - 4.1.3 - 2019-01-08\n* http://photoswipe.com\n* Copyright (c) 2019 Dmitry Semenov; */\n/**\n*\n* UI on top of main sliding area (caption, arrows, close button, etc.).\n* Built just using public methods/properties of PhotoSwipe.\n* \n*/\n(function (root, factory) { \n\tif (true) {\n\t\t!(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.PhotoSwipeUI_Default = factory();\n\t}\n})(this, function () {\n\n\t'use strict';\n\n\n\nvar PhotoSwipeUI_Default =\n function(pswp, framework) {\n\n\tvar ui = this;\n\tvar _overlayUIUpdated = false,\n\t\t_controlsVisible = true,\n\t\t_fullscrenAPI,\n\t\t_controls,\n\t\t_captionContainer,\n\t\t_fakeCaptionContainer,\n\t\t_indexIndicator,\n\t\t_shareButton,\n\t\t_shareModal,\n\t\t_shareModalHidden = true,\n\t\t_initalCloseOnScrollValue,\n\t\t_isIdle,\n\t\t_listen,\n\n\t\t_loadingIndicator,\n\t\t_loadingIndicatorHidden,\n\t\t_loadingIndicatorTimeout,\n\n\t\t_galleryHasOneSlide,\n\n\t\t_options,\n\t\t_defaultUIOptions = {\n\t\t\tbarsSize: {top:44, bottom:'auto'},\n\t\t\tcloseElClasses: ['item', 'caption', 'zoom-wrap', 'ui', 'top-bar'], \n\t\t\ttimeToIdle: 4000, \n\t\t\ttimeToIdleOutside: 1000,\n\t\t\tloadingIndicatorDelay: 1000, // 2s\n\t\t\t\n\t\t\taddCaptionHTMLFn: function(item, captionEl /*, isFake */) {\n\t\t\t\tif(!item.title) {\n\t\t\t\t\tcaptionEl.children[0].innerHTML = '';\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tcaptionEl.children[0].innerHTML = item.title;\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\tcloseEl:true,\n\t\t\tcaptionEl: true,\n\t\t\tfullscreenEl: true,\n\t\t\tzoomEl: true,\n\t\t\tshareEl: true,\n\t\t\tcounterEl: true,\n\t\t\tarrowEl: true,\n\t\t\tpreloaderEl: true,\n\n\t\t\ttapToClose: false,\n\t\t\ttapToToggleControls: true,\n\n\t\t\tclickToCloseNonZoomable: true,\n\n\t\t\tshareButtons: [\n\t\t\t\t{id:'facebook', label:'Share on Facebook', url:'https://www.facebook.com/sharer/sharer.php?u={{url}}'},\n\t\t\t\t{id:'twitter', label:'Tweet', url:'https://twitter.com/intent/tweet?text={{text}}&url={{url}}'},\n\t\t\t\t{id:'pinterest', label:'Pin it', url:'http://www.pinterest.com/pin/create/button/'+\n\t\t\t\t\t\t\t\t\t\t\t\t\t'?url={{url}}&media={{image_url}}&description={{text}}'},\n\t\t\t\t{id:'download', label:'Download image', url:'{{raw_image_url}}', download:true}\n\t\t\t],\n\t\t\tgetImageURLForShare: function( /* shareButtonData */ ) {\n\t\t\t\treturn pswp.currItem.src || '';\n\t\t\t},\n\t\t\tgetPageURLForShare: function( /* shareButtonData */ ) {\n\t\t\t\treturn window.location.href;\n\t\t\t},\n\t\t\tgetTextForShare: function( /* shareButtonData */ ) {\n\t\t\t\treturn pswp.currItem.title || '';\n\t\t\t},\n\t\t\t\t\n\t\t\tindexIndicatorSep: ' / ',\n\t\t\tfitControlsWidth: 1200\n\n\t\t},\n\t\t_blockControlsTap,\n\t\t_blockControlsTapTimeout;\n\n\n\n\tvar _onControlsTap = function(e) {\n\t\t\tif(_blockControlsTap) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\n\t\t\te = e || window.event;\n\n\t\t\tif(_options.timeToIdle && _options.mouseUsed && !_isIdle) {\n\t\t\t\t// reset idle timer\n\t\t\t\t_onIdleMouseMove();\n\t\t\t}\n\n\n\t\t\tvar target = e.target || e.srcElement,\n\t\t\t\tuiElement,\n\t\t\t\tclickedClass = target.getAttribute('class') || '',\n\t\t\t\tfound;\n\n\t\t\tfor(var i = 0; i < _uiElements.length; i++) {\n\t\t\t\tuiElement = _uiElements[i];\n\t\t\t\tif(uiElement.onTap && clickedClass.indexOf('pswp__' + uiElement.name ) > -1 ) {\n\t\t\t\t\tuiElement.onTap();\n\t\t\t\t\tfound = true;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(found) {\n\t\t\t\tif(e.stopPropagation) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t\t_blockControlsTap = true;\n\n\t\t\t\t// Some versions of Android don't prevent ghost click event \n\t\t\t\t// when preventDefault() was called on touchstart and/or touchend.\n\t\t\t\t// \n\t\t\t\t// This happens on v4.3, 4.2, 4.1, \n\t\t\t\t// older versions strangely work correctly, \n\t\t\t\t// but just in case we add delay on all of them)\t\n\t\t\t\tvar tapDelay = framework.features.isOldAndroid ? 600 : 30;\n\t\t\t\t_blockControlsTapTimeout = setTimeout(function() {\n\t\t\t\t\t_blockControlsTap = false;\n\t\t\t\t}, tapDelay);\n\t\t\t}\n\n\t\t},\n\t\t_fitControlsInViewport = function() {\n\t\t\treturn !pswp.likelyTouchDevice || _options.mouseUsed || screen.width > _options.fitControlsWidth;\n\t\t},\n\t\t_togglePswpClass = function(el, cName, add) {\n\t\t\tframework[ (add ? 'add' : 'remove') + 'Class' ](el, 'pswp__' + cName);\n\t\t},\n\n\t\t// add class when there is just one item in the gallery\n\t\t// (by default it hides left/right arrows and 1ofX counter)\n\t\t_countNumItems = function() {\n\t\t\tvar hasOneSlide = (_options.getNumItemsFn() === 1);\n\n\t\t\tif(hasOneSlide !== _galleryHasOneSlide) {\n\t\t\t\t_togglePswpClass(_controls, 'ui--one-slide', hasOneSlide);\n\t\t\t\t_galleryHasOneSlide = hasOneSlide;\n\t\t\t}\n\t\t},\n\t\t_toggleShareModalClass = function() {\n\t\t\t_togglePswpClass(_shareModal, 'share-modal--hidden', _shareModalHidden);\n\t\t},\n\t\t_toggleShareModal = function() {\n\n\t\t\t_shareModalHidden = !_shareModalHidden;\n\t\t\t\n\t\t\t\n\t\t\tif(!_shareModalHidden) {\n\t\t\t\t_toggleShareModalClass();\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tif(!_shareModalHidden) {\n\t\t\t\t\t\tframework.addClass(_shareModal, 'pswp__share-modal--fade-in');\n\t\t\t\t\t}\n\t\t\t\t}, 30);\n\t\t\t} else {\n\t\t\t\tframework.removeClass(_shareModal, 'pswp__share-modal--fade-in');\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tif(_shareModalHidden) {\n\t\t\t\t\t\t_toggleShareModalClass();\n\t\t\t\t\t}\n\t\t\t\t}, 300);\n\t\t\t}\n\t\t\t\n\t\t\tif(!_shareModalHidden) {\n\t\t\t\t_updateShareURLs();\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\t_openWindowPopup = function(e) {\n\t\t\te = e || window.event;\n\t\t\tvar target = e.target || e.srcElement;\n\n\t\t\tpswp.shout('shareLinkClick', e, target);\n\n\t\t\tif(!target.href) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif( target.hasAttribute('download') ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\twindow.open(target.href, 'pswp_share', 'scrollbars=yes,resizable=yes,toolbar=no,'+\n\t\t\t\t\t\t\t\t\t\t'location=yes,width=550,height=420,top=100,left=' + \n\t\t\t\t\t\t\t\t\t\t(window.screen ? Math.round(screen.width / 2 - 275) : 100) );\n\n\t\t\tif(!_shareModalHidden) {\n\t\t\t\t_toggleShareModal();\n\t\t\t}\n\t\t\t\n\t\t\treturn false;\n\t\t},\n\t\t_updateShareURLs = function() {\n\t\t\tvar shareButtonOut = '',\n\t\t\t\tshareButtonData,\n\t\t\t\tshareURL,\n\t\t\t\timage_url,\n\t\t\t\tpage_url,\n\t\t\t\tshare_text;\n\n\t\t\tfor(var i = 0; i < _options.shareButtons.length; i++) {\n\t\t\t\tshareButtonData = _options.shareButtons[i];\n\n\t\t\t\timage_url = _options.getImageURLForShare(shareButtonData);\n\t\t\t\tpage_url = _options.getPageURLForShare(shareButtonData);\n\t\t\t\tshare_text = _options.getTextForShare(shareButtonData);\n\n\t\t\t\tshareURL = shareButtonData.url.replace('{{url}}', encodeURIComponent(page_url) )\n\t\t\t\t\t\t\t\t\t.replace('{{image_url}}', encodeURIComponent(image_url) )\n\t\t\t\t\t\t\t\t\t.replace('{{raw_image_url}}', image_url )\n\t\t\t\t\t\t\t\t\t.replace('{{text}}', encodeURIComponent(share_text) );\n\n\t\t\t\tshareButtonOut += '<a href=\"' + shareURL + '\" target=\"_blank\" '+\n\t\t\t\t\t\t\t\t\t'class=\"pswp__share--' + shareButtonData.id + '\"' +\n\t\t\t\t\t\t\t\t\t(shareButtonData.download ? 'download' : '') + '>' + \n\t\t\t\t\t\t\t\t\tshareButtonData.label + '</a>';\n\n\t\t\t\tif(_options.parseShareButtonOut) {\n\t\t\t\t\tshareButtonOut = _options.parseShareButtonOut(shareButtonData, shareButtonOut);\n\t\t\t\t}\n\t\t\t}\n\t\t\t_shareModal.children[0].innerHTML = shareButtonOut;\n\t\t\t_shareModal.children[0].onclick = _openWindowPopup;\n\n\t\t},\n\t\t_hasCloseClass = function(target) {\n\t\t\tfor(var i = 0; i < _options.closeElClasses.length; i++) {\n\t\t\t\tif( framework.hasClass(target, 'pswp__' + _options.closeElClasses[i]) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_idleInterval,\n\t\t_idleTimer,\n\t\t_idleIncrement = 0,\n\t\t_onIdleMouseMove = function() {\n\t\t\tclearTimeout(_idleTimer);\n\t\t\t_idleIncrement = 0;\n\t\t\tif(_isIdle) {\n\t\t\t\tui.setIdle(false);\n\t\t\t}\n\t\t},\n\t\t_onMouseLeaveWindow = function(e) {\n\t\t\te = e ? e : window.event;\n\t\t\tvar from = e.relatedTarget || e.toElement;\n\t\t\tif (!from || from.nodeName === 'HTML') {\n\t\t\t\tclearTimeout(_idleTimer);\n\t\t\t\t_idleTimer = setTimeout(function() {\n\t\t\t\t\tui.setIdle(true);\n\t\t\t\t}, _options.timeToIdleOutside);\n\t\t\t}\n\t\t},\n\t\t_setupFullscreenAPI = function() {\n\t\t\tif(_options.fullscreenEl && !framework.features.isOldAndroid) {\n\t\t\t\tif(!_fullscrenAPI) {\n\t\t\t\t\t_fullscrenAPI = ui.getFullscreenAPI();\n\t\t\t\t}\n\t\t\t\tif(_fullscrenAPI) {\n\t\t\t\t\tframework.bind(document, _fullscrenAPI.eventK, ui.updateFullscreen);\n\t\t\t\t\tui.updateFullscreen();\n\t\t\t\t\tframework.addClass(pswp.template, 'pswp--supports-fs');\n\t\t\t\t} else {\n\t\t\t\t\tframework.removeClass(pswp.template, 'pswp--supports-fs');\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_setupLoadingIndicator = function() {\n\t\t\t// Setup loading indicator\n\t\t\tif(_options.preloaderEl) {\n\t\t\t\n\t\t\t\t_toggleLoadingIndicator(true);\n\n\t\t\t\t_listen('beforeChange', function() {\n\n\t\t\t\t\tclearTimeout(_loadingIndicatorTimeout);\n\n\t\t\t\t\t// display loading indicator with delay\n\t\t\t\t\t_loadingIndicatorTimeout = setTimeout(function() {\n\n\t\t\t\t\t\tif(pswp.currItem && pswp.currItem.loading) {\n\n\t\t\t\t\t\t\tif( !pswp.allowProgressiveImg() || (pswp.currItem.img && !pswp.currItem.img.naturalWidth) ) {\n\t\t\t\t\t\t\t\t// show preloader if progressive loading is not enabled, \n\t\t\t\t\t\t\t\t// or image width is not defined yet (because of slow connection)\n\t\t\t\t\t\t\t\t_toggleLoadingIndicator(false); \n\t\t\t\t\t\t\t\t// items-controller.js function allowProgressiveImg\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t_toggleLoadingIndicator(true); // hide preloader\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}, _options.loadingIndicatorDelay);\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t\t_listen('imageLoadComplete', function(index, item) {\n\t\t\t\t\tif(pswp.currItem === item) {\n\t\t\t\t\t\t_toggleLoadingIndicator(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t}\n\t\t},\n\t\t_toggleLoadingIndicator = function(hide) {\n\t\t\tif( _loadingIndicatorHidden !== hide ) {\n\t\t\t\t_togglePswpClass(_loadingIndicator, 'preloader--active', !hide);\n\t\t\t\t_loadingIndicatorHidden = hide;\n\t\t\t}\n\t\t},\n\t\t_applyNavBarGaps = function(item) {\n\t\t\tvar gap = item.vGap;\n\n\t\t\tif( _fitControlsInViewport() ) {\n\t\t\t\t\n\t\t\t\tvar bars = _options.barsSize; \n\t\t\t\tif(_options.captionEl && bars.bottom === 'auto') {\n\t\t\t\t\tif(!_fakeCaptionContainer) {\n\t\t\t\t\t\t_fakeCaptionContainer = framework.createEl('pswp__caption pswp__caption--fake');\n\t\t\t\t\t\t_fakeCaptionContainer.appendChild( framework.createEl('pswp__caption__center') );\n\t\t\t\t\t\t_controls.insertBefore(_fakeCaptionContainer, _captionContainer);\n\t\t\t\t\t\tframework.addClass(_controls, 'pswp__ui--fit');\n\t\t\t\t\t}\n\t\t\t\t\tif( _options.addCaptionHTMLFn(item, _fakeCaptionContainer, true) ) {\n\n\t\t\t\t\t\tvar captionSize = _fakeCaptionContainer.clientHeight;\n\t\t\t\t\t\tgap.bottom = parseInt(captionSize,10) || 44;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgap.bottom = bars.top; // if no caption, set size of bottom gap to size of top\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tgap.bottom = bars.bottom === 'auto' ? 0 : bars.bottom;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// height of top bar is static, no need to calculate it\n\t\t\t\tgap.top = bars.top;\n\t\t\t} else {\n\t\t\t\tgap.top = gap.bottom = 0;\n\t\t\t}\n\t\t},\n\t\t_setupIdle = function() {\n\t\t\t// Hide controls when mouse is used\n\t\t\tif(_options.timeToIdle) {\n\t\t\t\t_listen('mouseUsed', function() {\n\t\t\t\t\t\n\t\t\t\t\tframework.bind(document, 'mousemove', _onIdleMouseMove);\n\t\t\t\t\tframework.bind(document, 'mouseout', _onMouseLeaveWindow);\n\n\t\t\t\t\t_idleInterval = setInterval(function() {\n\t\t\t\t\t\t_idleIncrement++;\n\t\t\t\t\t\tif(_idleIncrement === 2) {\n\t\t\t\t\t\t\tui.setIdle(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, _options.timeToIdle / 2);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t_setupHidingControlsDuringGestures = function() {\n\n\t\t\t// Hide controls on vertical drag\n\t\t\t_listen('onVerticalDrag', function(now) {\n\t\t\t\tif(_controlsVisible && now < 0.95) {\n\t\t\t\t\tui.hideControls();\n\t\t\t\t} else if(!_controlsVisible && now >= 0.95) {\n\t\t\t\t\tui.showControls();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Hide controls when pinching to close\n\t\t\tvar pinchControlsHidden;\n\t\t\t_listen('onPinchClose' , function(now) {\n\t\t\t\tif(_controlsVisible && now < 0.9) {\n\t\t\t\t\tui.hideControls();\n\t\t\t\t\tpinchControlsHidden = true;\n\t\t\t\t} else if(pinchControlsHidden && !_controlsVisible && now > 0.9) {\n\t\t\t\t\tui.showControls();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_listen('zoomGestureEnded', function() {\n\t\t\t\tpinchControlsHidden = false;\n\t\t\t\tif(pinchControlsHidden && !_controlsVisible) {\n\t\t\t\t\tui.showControls();\n\t\t\t\t}\n\t\t\t});\n\n\t\t};\n\n\n\n\tvar _uiElements = [\n\t\t{ \n\t\t\tname: 'caption', \n\t\t\toption: 'captionEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_captionContainer = el; \n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'share-modal', \n\t\t\toption: 'shareEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_shareModal = el;\n\t\t\t},\n\t\t\tonTap: function() {\n\t\t\t\t_toggleShareModal();\n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'button--share', \n\t\t\toption: 'shareEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_shareButton = el;\n\t\t\t},\n\t\t\tonTap: function() {\n\t\t\t\t_toggleShareModal();\n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'button--zoom', \n\t\t\toption: 'zoomEl',\n\t\t\tonTap: pswp.toggleDesktopZoom\n\t\t},\n\t\t{ \n\t\t\tname: 'counter', \n\t\t\toption: 'counterEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_indexIndicator = el;\n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'button--close', \n\t\t\toption: 'closeEl',\n\t\t\tonTap: pswp.close\n\t\t},\n\t\t{ \n\t\t\tname: 'button--arrow--left', \n\t\t\toption: 'arrowEl',\n\t\t\tonTap: pswp.prev\n\t\t},\n\t\t{ \n\t\t\tname: 'button--arrow--right', \n\t\t\toption: 'arrowEl',\n\t\t\tonTap: pswp.next\n\t\t},\n\t\t{ \n\t\t\tname: 'button--fs', \n\t\t\toption: 'fullscreenEl',\n\t\t\tonTap: function() { \n\t\t\t\tif(_fullscrenAPI.isFullscreen()) {\n\t\t\t\t\t_fullscrenAPI.exit();\n\t\t\t\t} else {\n\t\t\t\t\t_fullscrenAPI.enter();\n\t\t\t\t}\n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'preloader', \n\t\t\toption: 'preloaderEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_loadingIndicator = el;\n\t\t\t} \n\t\t}\n\n\t];\n\n\tvar _setupUIElements = function() {\n\t\tvar item,\n\t\t\tclassAttr,\n\t\t\tuiElement;\n\n\t\tvar loopThroughChildElements = function(sChildren) {\n\t\t\tif(!sChildren) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar l = sChildren.length;\n\t\t\tfor(var i = 0; i < l; i++) {\n\t\t\t\titem = sChildren[i];\n\t\t\t\tclassAttr = item.className;\n\n\t\t\t\tfor(var a = 0; a < _uiElements.length; a++) {\n\t\t\t\t\tuiElement = _uiElements[a];\n\n\t\t\t\t\tif(classAttr.indexOf('pswp__' + uiElement.name) > -1 ) {\n\n\t\t\t\t\t\tif( _options[uiElement.option] ) { // if element is not disabled from options\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tframework.removeClass(item, 'pswp__element--disabled');\n\t\t\t\t\t\t\tif(uiElement.onInit) {\n\t\t\t\t\t\t\t\tuiElement.onInit(item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t//item.style.display = 'block';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tframework.addClass(item, 'pswp__element--disabled');\n\t\t\t\t\t\t\t//item.style.display = 'none';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tloopThroughChildElements(_controls.children);\n\n\t\tvar topBar = framework.getChildByClass(_controls, 'pswp__top-bar');\n\t\tif(topBar) {\n\t\t\tloopThroughChildElements( topBar.children );\n\t\t}\n\t};\n\n\n\t\n\n\tui.init = function() {\n\n\t\t// extend options\n\t\tframework.extend(pswp.options, _defaultUIOptions, true);\n\n\t\t// create local link for fast access\n\t\t_options = pswp.options;\n\n\t\t// find pswp__ui element\n\t\t_controls = framework.getChildByClass(pswp.scrollWrap, 'pswp__ui');\n\n\t\t// create local link\n\t\t_listen = pswp.listen;\n\n\n\t\t_setupHidingControlsDuringGestures();\n\n\t\t// update controls when slides change\n\t\t_listen('beforeChange', ui.update);\n\n\t\t// toggle zoom on double-tap\n\t\t_listen('doubleTap', function(point) {\n\t\t\tvar initialZoomLevel = pswp.currItem.initialZoomLevel;\n\t\t\tif(pswp.getZoomLevel() !== initialZoomLevel) {\n\t\t\t\tpswp.zoomTo(initialZoomLevel, point, 333);\n\t\t\t} else {\n\t\t\t\tpswp.zoomTo(_options.getDoubleTapZoom(false, pswp.currItem), point, 333);\n\t\t\t}\n\t\t});\n\n\t\t// Allow text selection in caption\n\t\t_listen('preventDragEvent', function(e, isDown, preventObj) {\n\t\t\tvar t = e.target || e.srcElement;\n\t\t\tif(\n\t\t\t\tt && \n\t\t\t\tt.getAttribute('class') && e.type.indexOf('mouse') > -1 && \n\t\t\t\t( t.getAttribute('class').indexOf('__caption') > 0 || (/(SMALL|STRONG|EM)/i).test(t.tagName) ) \n\t\t\t) {\n\t\t\t\tpreventObj.prevent = false;\n\t\t\t}\n\t\t});\n\n\t\t// bind events for UI\n\t\t_listen('bindEvents', function() {\n\t\t\tframework.bind(_controls, 'pswpTap click', _onControlsTap);\n\t\t\tframework.bind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);\n\n\t\t\tif(!pswp.likelyTouchDevice) {\n\t\t\t\tframework.bind(pswp.scrollWrap, 'mouseover', ui.onMouseOver);\n\t\t\t}\n\t\t});\n\n\t\t// unbind events for UI\n\t\t_listen('unbindEvents', function() {\n\t\t\tif(!_shareModalHidden) {\n\t\t\t\t_toggleShareModal();\n\t\t\t}\n\n\t\t\tif(_idleInterval) {\n\t\t\t\tclearInterval(_idleInterval);\n\t\t\t}\n\t\t\tframework.unbind(document, 'mouseout', _onMouseLeaveWindow);\n\t\t\tframework.unbind(document, 'mousemove', _onIdleMouseMove);\n\t\t\tframework.unbind(_controls, 'pswpTap click', _onControlsTap);\n\t\t\tframework.unbind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);\n\t\t\tframework.unbind(pswp.scrollWrap, 'mouseover', ui.onMouseOver);\n\n\t\t\tif(_fullscrenAPI) {\n\t\t\t\tframework.unbind(document, _fullscrenAPI.eventK, ui.updateFullscreen);\n\t\t\t\tif(_fullscrenAPI.isFullscreen()) {\n\t\t\t\t\t_options.hideAnimationDuration = 0;\n\t\t\t\t\t_fullscrenAPI.exit();\n\t\t\t\t}\n\t\t\t\t_fullscrenAPI = null;\n\t\t\t}\n\t\t});\n\n\n\t\t// clean up things when gallery is destroyed\n\t\t_listen('destroy', function() {\n\t\t\tif(_options.captionEl) {\n\t\t\t\tif(_fakeCaptionContainer) {\n\t\t\t\t\t_controls.removeChild(_fakeCaptionContainer);\n\t\t\t\t}\n\t\t\t\tframework.removeClass(_captionContainer, 'pswp__caption--empty');\n\t\t\t}\n\n\t\t\tif(_shareModal) {\n\t\t\t\t_shareModal.children[0].onclick = null;\n\t\t\t}\n\t\t\tframework.removeClass(_controls, 'pswp__ui--over-close');\n\t\t\tframework.addClass( _controls, 'pswp__ui--hidden');\n\t\t\tui.setIdle(false);\n\t\t});\n\t\t\n\n\t\tif(!_options.showAnimationDuration) {\n\t\t\tframework.removeClass( _controls, 'pswp__ui--hidden');\n\t\t}\n\t\t_listen('initialZoomIn', function() {\n\t\t\tif(_options.showAnimationDuration) {\n\t\t\t\tframework.removeClass( _controls, 'pswp__ui--hidden');\n\t\t\t}\n\t\t});\n\t\t_listen('initialZoomOut', function() {\n\t\t\tframework.addClass( _controls, 'pswp__ui--hidden');\n\t\t});\n\n\t\t_listen('parseVerticalMargin', _applyNavBarGaps);\n\t\t\n\t\t_setupUIElements();\n\n\t\tif(_options.shareEl && _shareButton && _shareModal) {\n\t\t\t_shareModalHidden = true;\n\t\t}\n\n\t\t_countNumItems();\n\n\t\t_setupIdle();\n\n\t\t_setupFullscreenAPI();\n\n\t\t_setupLoadingIndicator();\n\t};\n\n\tui.setIdle = function(isIdle) {\n\t\t_isIdle = isIdle;\n\t\t_togglePswpClass(_controls, 'ui--idle', isIdle);\n\t};\n\n\tui.update = function() {\n\t\t// Don't update UI if it's hidden\n\t\tif(_controlsVisible && pswp.currItem) {\n\t\t\t\n\t\t\tui.updateIndexIndicator();\n\n\t\t\tif(_options.captionEl) {\n\t\t\t\t_options.addCaptionHTMLFn(pswp.currItem, _captionContainer);\n\n\t\t\t\t_togglePswpClass(_captionContainer, 'caption--empty', !pswp.currItem.title);\n\t\t\t}\n\n\t\t\t_overlayUIUpdated = true;\n\n\t\t} else {\n\t\t\t_overlayUIUpdated = false;\n\t\t}\n\n\t\tif(!_shareModalHidden) {\n\t\t\t_toggleShareModal();\n\t\t}\n\n\t\t_countNumItems();\n\t};\n\n\tui.updateFullscreen = function(e) {\n\n\t\tif(e) {\n\t\t\t// some browsers change window scroll position during the fullscreen\n\t\t\t// so PhotoSwipe updates it just in case\n\t\t\tsetTimeout(function() {\n\t\t\t\tpswp.setScrollOffset( 0, framework.getScrollY() );\n\t\t\t}, 50);\n\t\t}\n\t\t\n\t\t// toogle pswp--fs class on root element\n\t\tframework[ (_fullscrenAPI.isFullscreen() ? 'add' : 'remove') + 'Class' ](pswp.template, 'pswp--fs');\n\t};\n\n\tui.updateIndexIndicator = function() {\n\t\tif(_options.counterEl) {\n\t\t\t_indexIndicator.innerHTML = (pswp.getCurrentIndex()+1) + \n\t\t\t\t\t\t\t\t\t\t_options.indexIndicatorSep + \n\t\t\t\t\t\t\t\t\t\t_options.getNumItemsFn();\n\t\t}\n\t};\n\t\n\tui.onGlobalTap = function(e) {\n\t\te = e || window.event;\n\t\tvar target = e.target || e.srcElement;\n\n\t\tif(_blockControlsTap) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(e.detail && e.detail.pointerType === 'mouse') {\n\n\t\t\t// close gallery if clicked outside of the image\n\t\t\tif(_hasCloseClass(target)) {\n\t\t\t\tpswp.close();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(framework.hasClass(target, 'pswp__img')) {\n\t\t\t\tif(pswp.getZoomLevel() === 1 && pswp.getZoomLevel() <= pswp.currItem.fitRatio) {\n\t\t\t\t\tif(_options.clickToCloseNonZoomable) {\n\t\t\t\t\t\tpswp.close();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tpswp.toggleDesktopZoom(e.detail.releasePoint);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t} else {\n\n\t\t\t// tap anywhere (except buttons) to toggle visibility of controls\n\t\t\tif(_options.tapToToggleControls) {\n\t\t\t\tif(_controlsVisible) {\n\t\t\t\t\tui.hideControls();\n\t\t\t\t} else {\n\t\t\t\t\tui.showControls();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// tap to close gallery\n\t\t\tif(_options.tapToClose && (framework.hasClass(target, 'pswp__img') || _hasCloseClass(target)) ) {\n\t\t\t\tpswp.close();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t}\n\t};\n\tui.onMouseOver = function(e) {\n\t\te = e || window.event;\n\t\tvar target = e.target || e.srcElement;\n\n\t\t// add class when mouse is over an element that should close the gallery\n\t\t_togglePswpClass(_controls, 'ui--over-close', _hasCloseClass(target));\n\t};\n\n\tui.hideControls = function() {\n\t\tframework.addClass(_controls,'pswp__ui--hidden');\n\t\t_controlsVisible = false;\n\t};\n\n\tui.showControls = function() {\n\t\t_controlsVisible = true;\n\t\tif(!_overlayUIUpdated) {\n\t\t\tui.update();\n\t\t}\n\t\tframework.removeClass(_controls,'pswp__ui--hidden');\n\t};\n\n\tui.supportsFullscreen = function() {\n\t\tvar d = document;\n\t\treturn !!(d.exitFullscreen || d.mozCancelFullScreen || d.webkitExitFullscreen || d.msExitFullscreen);\n\t};\n\n\tui.getFullscreenAPI = function() {\n\t\tvar dE = document.documentElement,\n\t\t\tapi,\n\t\t\ttF = 'fullscreenchange';\n\n\t\tif (dE.requestFullscreen) {\n\t\t\tapi = {\n\t\t\t\tenterK: 'requestFullscreen',\n\t\t\t\texitK: 'exitFullscreen',\n\t\t\t\telementK: 'fullscreenElement',\n\t\t\t\teventK: tF\n\t\t\t};\n\n\t\t} else if(dE.mozRequestFullScreen ) {\n\t\t\tapi = {\n\t\t\t\tenterK: 'mozRequestFullScreen',\n\t\t\t\texitK: 'mozCancelFullScreen',\n\t\t\t\telementK: 'mozFullScreenElement',\n\t\t\t\teventK: 'moz' + tF\n\t\t\t};\n\n\t\t\t\n\n\t\t} else if(dE.webkitRequestFullscreen) {\n\t\t\tapi = {\n\t\t\t\tenterK: 'webkitRequestFullscreen',\n\t\t\t\texitK: 'webkitExitFullscreen',\n\t\t\t\telementK: 'webkitFullscreenElement',\n\t\t\t\teventK: 'webkit' + tF\n\t\t\t};\n\n\t\t} else if(dE.msRequestFullscreen) {\n\t\t\tapi = {\n\t\t\t\tenterK: 'msRequestFullscreen',\n\t\t\t\texitK: 'msExitFullscreen',\n\t\t\t\telementK: 'msFullscreenElement',\n\t\t\t\teventK: 'MSFullscreenChange'\n\t\t\t};\n\t\t}\n\n\t\tif(api) {\n\t\t\tapi.enter = function() { \n\t\t\t\t// disable close-on-scroll in fullscreen\n\t\t\t\t_initalCloseOnScrollValue = _options.closeOnScroll; \n\t\t\t\t_options.closeOnScroll = false; \n\n\t\t\t\tif(this.enterK === 'webkitRequestFullscreen') {\n\t\t\t\t\tpswp.template[this.enterK]( Element.ALLOW_KEYBOARD_INPUT );\n\t\t\t\t} else {\n\t\t\t\t\treturn pswp.template[this.enterK](); \n\t\t\t\t}\n\t\t\t};\n\t\t\tapi.exit = function() { \n\t\t\t\t_options.closeOnScroll = _initalCloseOnScrollValue;\n\n\t\t\t\treturn document[this.exitK](); \n\n\t\t\t};\n\t\t\tapi.isFullscreen = function() { return document[this.elementK]; };\n\t\t}\n\n\t\treturn api;\n\t};\n\n\n\n};\nreturn PhotoSwipeUI_Default;\n\n\n});\n\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// vue-photo-preview.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/dist/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 833d24a31d572e4be08b","<template>\r\n\t<div class=\"pswp\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\r\n\r\n <!-- Background of PhotoSwipe. \r\n It's a separate element as animating opacity is faster than rgba(). -->\r\n <div class=\"pswp__bg\"></div>\r\n\r\n <!-- Slides wrapper with overflow:hidden. -->\r\n <div class=\"pswp__scroll-wrap\">\r\n\r\n <!-- Container that holds slides. \r\n PhotoSwipe keeps only 3 of them in the DOM to save memory.\r\n Don't modify these 3 pswp__item elements, data is added later on. -->\r\n <div class=\"pswp__container\">\r\n <div class=\"pswp__item\"></div>\r\n <div class=\"pswp__item\"></div>\r\n <div class=\"pswp__item\"></div>\r\n </div>\r\n\r\n <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->\r\n <div class=\"pswp__ui pswp__ui--hidden\">\r\n\r\n <div class=\"pswp__top-bar\">\r\n\r\n <!-- Controls are self-explanatory. Order can be changed. -->\r\n\r\n <div class=\"pswp__counter\"></div>\r\n\r\n <button class=\"pswp__button pswp__button--close\" title=\"Close (Esc)\"></button>\r\n\r\n <button class=\"pswp__button pswp__button--share\" title=\"Share\"></button>\r\n\r\n <button class=\"pswp__button pswp__button--fs\" title=\"Toggle fullscreen\"></button>\r\n\r\n <button class=\"pswp__button pswp__button--zoom\" title=\"Zoom in/out\"></button>\r\n\r\n <!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->\r\n <!-- element will get class pswp__preloader--active when preloader is running -->\r\n <div class=\"pswp__preloader\">\r\n <div class=\"pswp__preloader__icn\">\r\n <div class=\"pswp__preloader__cut\">\r\n <div class=\"pswp__preloader__donut\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pswp__share-modal pswp__share-modal--hidden pswp__single-tap\">\r\n <div class=\"pswp__share-tooltip\"></div> \r\n </div>\r\n\r\n <button class=\"pswp__button pswp__button--arrow--left\" title=\"Previous (arrow left)\">\r\n </button>\r\n\r\n <button class=\"pswp__button pswp__button--arrow--right\" title=\"Next (arrow right)\">\r\n </button>\r\n\r\n <div class=\"pswp__caption\">\r\n <div class=\"pswp__caption__center\"></div>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\n\timport 'photoswipe/dist/photoswipe.css'\r\n import 'photoswipe/dist/default-skin/default-skin.css'\r\n export default{\r\n\r\n }\r\n \r\n</script>\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/lib/preview.vue","import previewComponent from './preview.vue'\r\nimport PhotoSwipe from 'photoswipe/dist/photoswipe'\r\nimport PhotoSwipeUI_Default from 'photoswipe/dist/photoswipe-ui-default'\r\nlet $preview\r\nvar vuePhotoPreview ={\r\n\tinstall (Vue,opts) {\r\n const Preview = Vue.extend(previewComponent)\r\n var opts=opts||{}\r\n if (!$preview) {\r\n $preview = new Preview({el: document.createElement('div')})\r\n\t\t\tdocument.body.appendChild($preview.$el)\r\n\t\t}\r\n\t\tlet eventName,eventCallback\r\n\t\tVue.prototype.$preview={\r\n\t\t\tself:null,\r\n\t\t\ton:(name,callback)=>{\r\n\t\t\t\teventName=name\r\n\t\t\t\teventCallback=callback\r\n\t\t\t}\r\n\t\t}\r\n\t\tVue.mixin({\r\n\t\t\tdata(){\r\n\t\t\t\treturn {\r\n\t\t\t\t\tgalleryElements:null,\r\n\t\t\t\t\tgalleryPicLoading:false\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tmethods:{\r\n\t\t\t\t$previewRefresh(){\r\n\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\tthis.galleryElements = document.querySelectorAll('img[preview]');\r\n\t\t\t\t\t\tfor(var i = 0, l = this.galleryElements.length; i < l; i++) {\r\n\t\t\t\t\t\t\tthis.galleryElements[i].setAttribute('data-pswp-uid', i + 1);\r\n\t\t\t\t\t\t\tthis.galleryElements[i].onclick = this.onThumbnailsClick;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, 200);\r\n\t\t\t\t\t\r\n\t\t\t\t},\r\n\t\t\t\tonThumbnailsClick(e) {\r\n\t\t\t\t\tif(this.galleryPicLoading)return false;\r\n\t\t\t\t\tthis.galleryPicLoading=true\r\n\t\t\t\t\te = e || window.event;\r\n\t\t\t\t\te.preventDefault ? e.preventDefault() : e.returnValue = false;\r\n\r\n\t\t\t\t\tvar eTarget = e.target || e.srcElement;\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\tvar thumbElements;\r\n\t\t\t\t\tvar group = eTarget.getAttribute('preview')\r\n\t\t\t\t\tif(group) {\r\n\t\t\t\t\t\tthumbElements = document.querySelectorAll('img[preview=\"' + group + '\"]')\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthumbElements = document.querySelectorAll('img[preview]')\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar clickedGallery = thumbElements;\r\n\t\t\t\t\t\r\n\t\t\t\t\tvar index;\r\n\r\n\t\t\t\t\tfor(var i = 0; i < clickedGallery.length; i++) {\r\n\t\t\t\t\t\tif(clickedGallery[i] === eTarget) {\r\n\t\t\t\t\t\t\tindex = i;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(index >= 0) {\r\n\t\t\t\t\t\tthis.openPhotoSwipe(index, clickedGallery);\r\n\t\t\t\t\t\tthis.$emit('preview-open',e,eTarget.src)\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t},\r\n\t\t\t\tasync openPhotoSwipe(index, galleryElement, disableAnimation, fromURL) {\r\n\t\t\t\t\tvar pswpElement = document.querySelectorAll('.pswp')[0],\r\n\t\t\t\t\t\tgallery,\r\n\t\t\t\t\t\toptions,\r\n\t\t\t\t\t\titems;\r\n\r\n\t\t\t\t\tvar items = await this.parseThumbnailElements(galleryElement);\r\n\t\t\t\t\toptions = {\r\n\r\n\t\t\t\t\t\t// galleryUID: galleryElement.getAttribute('data-pswp-uid'),\r\n\r\n\t\t\t\t\t\tgetThumbBoundsFn: function(index) {\r\n\t\t\t\t\t\t\tvar thumbnail = items[index].el,\r\n\t\t\t\t\t\t\t\tpageYScroll = window.pageYOffset || document.documentElement.scrollTop,\r\n\t\t\t\t\t\t\t\trect = thumbnail.getBoundingClientRect();\r\n\t\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\t\tx: rect.left,\r\n\t\t\t\t\t\t\t\ty: rect.top + pageYScroll,\r\n\t\t\t\t\t\t\t\tw: rect.width\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t},\r\n\r\n\t\t\t\t\t\taddCaptionHTMLFn: function(item, captionEl, isFake) {\r\n\t\t\t\t\t\t\tif(!item.title) {\r\n\t\t\t\t\t\t\t\tcaptionEl.children[0].innerText = '';\r\n\t\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tcaptionEl.children[0].innerHTML = item.title ;\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tshowHideOpacity:true,\r\n\t\t\t\t\t\thistory:false,\r\n\t\t\t\t\t\tshareEl:false,\r\n\t\t\t\t\t\tmaxSpreadZoom:3,\r\n\t\t\t\t\t\tgetDoubleTapZoom:function(isMouseClick, item){\r\n\t\t\t\t\t\t\tif(isMouseClick) {\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\treturn 1.5;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\treturn item.initialZoomLevel < 0.7 ? 1 : 1.5;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tif(fromURL) {\r\n\t\t\t\t\t\tif(options.galleryPIDs) {\r\n\t\t\t\t\t\t\t// parse real index when custom PIDs are used \r\n\t\t\t\t\t\t\t// http://photoswipe.com/documentation/faq.html#custom-pid-in-url\r\n\t\t\t\t\t\t\tfor(var j = 0; j < items.length; j++) {\r\n\t\t\t\t\t\t\t\tif(items[j].pid == index) {\r\n\t\t\t\t\t\t\t\t\toptions.index = j;\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\toptions.index = parseInt(index, 10) - 1;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\toptions.index = parseInt(index, 10);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// exit if index not found\r\n\t\t\t\t\tif(isNaN(options.index)) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\toptions=this.extend(options,opts)\r\n\r\n\t\t\t\t\tif(disableAnimation) {\r\n\t\t\t\t\t\toptions.showAnimationDuration = 0;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Pass data to PhotoSwipe and initialize it\r\n\t\t\t\t\tgallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);\r\n\t\t\t\t\tVue.prototype.$preview.self=gallery\r\n\t\t\t\t\t// see: http://photoswipe.com/documentation/responsive-images.html\r\n\t\t\t\t\tvar realViewportWidth,\r\n\t\t\t\t\t\tuseLargeImages = false,\r\n\t\t\t\t\t\tfirstResize = true,\r\n\t\t\t\t\t\timageSrcWillChange;\r\n\r\n\t\t\t\t\tgallery.listen('beforeResize', function() {\r\n\r\n\t\t\t\t\t\tvar dpiRatio = window.devicePixelRatio ? window.devicePixelRatio : 1;\r\n\t\t\t\t\t\tdpiRatio = Math.min(dpiRatio, 2.5);\r\n\t\t\t\t\t\trealViewportWidth = gallery.viewportSize.x * dpiRatio;\r\n\r\n\t\t\t\t\t\tif(realViewportWidth >= 1200 || (!gallery.likelyTouchDevice && realViewportWidth > 800) || screen.width > 1200) {\r\n\t\t\t\t\t\t\tif(!useLargeImages) {\r\n\t\t\t\t\t\t\t\tuseLargeImages = true;\r\n\t\t\t\t\t\t\t\timageSrcWillChange = true;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tif(useLargeImages) {\r\n\t\t\t\t\t\t\t\tuseLargeImages = false;\r\n\t\t\t\t\t\t\t\timageSrcWillChange = true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif(imageSrcWillChange && !firstResize) {\r\n\t\t\t\t\t\t\tgallery.invalidateCurrItems();\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif(firstResize) {\r\n\t\t\t\t\t\t\tfirstResize = false;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\timageSrcWillChange = false;\r\n\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tgallery.listen('gettingData', function(index, item) {\r\n\t\t\t\t\t\tif(item.el.getAttribute('large')) {\r\n\t\t\t\t\t\t\titem.src = item.o.src;\r\n\t\t\t\t\t\t\titem.w = item.o.w;\r\n\t\t\t\t\t\t\titem.h = item.o.h;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\titem.src = item.m.src;\r\n\t\t\t\t\t\t\titem.w = item.m.w;\r\n\t\t\t\t\t\t\titem.h = item.m.h;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tgallery.listen('imageLoadComplete', (index, item)=> {\r\n\t\t\t\t\t\tthis.galleryPicLoading=false\r\n\t\t\t\t\t});\r\n\t\t\t\t\tgallery.listen(eventName,eventCallback)\r\n\t\t\t\t\tgallery.init();\r\n\t\t\t\t\t$preview.$el.classList=$preview.$el.classList+' pswp--zoom-allowed'\r\n\t\t\t\t},\r\n\t\t\t\tparseThumbnailElements(thumbElements) {\r\n\t\t\t\t\treturn new Promise(resolve=>{\r\n\t\t\t\t\t\tvar items = [],\r\n\t\t\t\t\t\t\tel,\r\n\t\t\t\t\t\t\tload = 0,\r\n\t\t\t\t\t\t\titem;\r\n\t\t\t\t\t\t\titem = {}\r\n\t\t\t\t\t\tfor(var i = 0; i < thumbElements.length; i++) {\r\n\t\t\t\t\t\t\tel = thumbElements[i];\r\n\r\n\t\t\t\t\t\t\t// include only element nodes \r\n\t\t\t\t\t\t\tif(el.nodeType !== 1) {\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\t\t\tif(typeof el.naturalWidth == \"undefined\") {   // IE 6/7/8\r\n\t\t\t\t\t\t\t\t  \r\n\t\t\t\t\t\t\t\tvar i = new Image();  \r\n\t\t\t\t\t\t\t\ti.src = el.src;  \r\n\t\t\t\t\t\t\t\tvar rw = i.width;  \r\n\t\t\t\t\t\t\t\tvar rh = i.height;\r\n\t\t\t\t\t\t\t} else {   // HTML5 browsers\r\n\t\t\t\t\t\t\t\t  \r\n\t\t\t\t\t\t\t\tvar rw = el.naturalWidth;  \r\n\t\t\t\t\t\t\t\tvar rh = el.naturalHeight;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tgetImage(i)\r\n\t\t\t\t\t\t\tvar count=0\r\n\t\t\t\t\t\t\tfunction getImage(index){\r\n\t\t\t\t\t\t\t\tvar l=new Image()\r\n\t\t\t\t\t\t\t\tl.src=el.getAttribute('large')?el.getAttribute('large'):el.getAttribute('src')\r\n\t\t\t\t\t\t\t\tl.text=el.getAttribute('preview-text')\r\n\t\t\t\t\t\t\t\tl.author=el.getAttribute('data-author')\r\n\t\t\t\t\t\t\t\tl.onload=function(){\r\n\t\t\t\t\t\t\t\t\titem = {\r\n\t\t\t\t\t\t\t\t\t\ttitle: l.text,\r\n\t\t\t\t\t\t\t\t\t\tel: thumbElements[index],\r\n\t\t\t\t\t\t\t\t\t\tsrc: l.src,\r\n\t\t\t\t\t\t\t\t\t\tw: rw,\r\n\t\t\t\t\t\t\t\t\t\th: rh,\r\n\t\t\t\t\t\t\t\t\t\tauthor: l.author,\r\n\t\t\t\t\t\t\t\t\t\to: {\r\n\t\t\t\t\t\t\t\t\t\t\tsrc: l.src,\r\n\t\t\t\t\t\t\t\t\t\t\tw: this.width,\r\n\t\t\t\t\t\t\t\t\t\t\th: this.height,\r\n\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\tm: {\r\n\t\t\t\t\t\t\t\t\t\t\tsrc: l.src,\r\n\t\t\t\t\t\t\t\t\t\t\tw: this.width,\r\n\t\t\t\t\t\t\t\t\t\t\th: this.height,\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\t\titems[index]=item\r\n\t\t\t\t\t\t\t\t\tcount++\r\n\t\t\t\t\t\t\t\t\tif(count==thumbElements.length){\r\n\t\t\t\t\t\t\t\t\t\tresolve(items)\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t\t\r\n\t\t\t\t\treturn items\r\n\r\n\t\t\t\t},\r\n\t\t\t\textend(o1, o2) {\r\n\t\t\t\t\tfor (var prop in o2) {\r\n\t\t\t\t\t\to1[prop] = o2[prop];\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn o1\r\n\t\t\t\t},\r\n\t\t\t\tinitPreview(gallerySelector){\r\n\t\t\t\t\tthis.galleryElements = document.querySelectorAll(gallerySelector);\r\n\t\t\t\t\tfor(var i = 0, l = this.galleryElements.length; i < l; i++) {\r\n\t\t\t\t\t\tthis.galleryElements[i].setAttribute('data-pswp-uid', i + 1);\r\n\t\t\t\t\t\tthis.galleryElements[i].onclick = this.onThumbnailsClick;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t mounted: function () {\r\n\t\t\t\tthis.initPreview('img[preview]')\r\n\t\t \t\r\n\t\t }\r\n\t\t})\r\n\r\n }\r\n}\r\n\r\nexport default vuePhotoPreview\r\n\r\nif (typeof window !== 'undefined' && !window.vuePhotoPreview) {\r\n window.vuePhotoPreview=vuePhotoPreview;\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/lib/index.js","module.exports = require(\"regenerator-runtime\");\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/_babel-runtime@6.26.0@babel-runtime/regenerator/index.js\n// module id = 2\n// module chunks = 0","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g = (function() { return this })() || Function(\"return this\")();\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = require(\"./runtime\");\n\nif (hadRuntime) {\n // Restore the original runtime.\n g.regeneratorRuntime = oldRuntime;\n} else {\n // Remove the global property added by runtime.js.\n try {\n delete g.regeneratorRuntime;\n } catch(e) {\n g.regeneratorRuntime = undefined;\n }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime-module.js\n// module id = 3\n// module chunks = 0","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // In sloppy mode, unbound `this` refers to the global object, fallback to\n // Function constructor if we're in global strict mode. That is sadly a form\n // of indirect eval which violates Content Security Policy.\n (function() { return this })() || Function(\"return this\")()\n);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js\n// module id = 4\n// module chunks = 0","var normalizeComponent = require(\"!../../node_modules/_vue-loader@13.7.3@vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/_vue-loader@13.7.3@vue-loader/lib/selector?type=script&index=0!./preview.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/_vue-loader@13.7.3@vue-loader/lib/selector?type=script&index=0!./preview.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/_vue-loader@13.7.3@vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-befa1362\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/_vue-loader@13.7.3@vue-loader/lib/selector?type=template&index=0!./preview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/lib/preview.vue\n// module id = 5\n// module chunks = 0","/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file.\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nmodule.exports = function normalizeComponent (\n rawScriptExports,\n compiledTemplate,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier /* server only */\n) {\n var esModule\n var scriptExports = rawScriptExports = rawScriptExports || {}\n\n // ES6 modules interop\n var type = typeof rawScriptExports.default\n if (type === 'object' || type === 'function') {\n esModule = rawScriptExports\n scriptExports = rawScriptExports.default\n }\n\n // Vue.extend constructor export interop\n var options = typeof scriptExports === 'function'\n ? scriptExports.options\n : scriptExports\n\n // render functions\n if (compiledTemplate) {\n options.render = compiledTemplate.render\n options.staticRenderFns = compiledTemplate.staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = scopeId\n }\n\n var hook\n if (moduleIdentifier) { // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = injectStyles\n }\n\n if (hook) {\n var functional = options.functional\n var existing = functional\n ? options.render\n : options.beforeCreate\n\n if (!functional) {\n // inject component registration as beforeCreate hook\n options.beforeCreate = existing\n ? [].concat(existing, hook)\n : [hook]\n } else {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functioal component in vue file\n options.render = function renderWithStyleInjection (h, context) {\n hook.call(context)\n return existing(h, context)\n }\n }\n }\n\n return {\n esModule: esModule,\n exports: scriptExports,\n options: options\n }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/_vue-loader@13.7.3@vue-loader/lib/component-normalizer.js\n// module id = 6\n// module chunks = 0","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _vm._m(0)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"pswp\",attrs:{\"tabindex\":\"-1\",\"role\":\"dialog\",\"aria-hidden\":\"true\"}},[_c('div',{staticClass:\"pswp__bg\"}),_vm._v(\" \"),_c('div',{staticClass:\"pswp__scroll-wrap\"},[_c('div',{staticClass:\"pswp__container\"},[_c('div',{staticClass:\"pswp__item\"}),_vm._v(\" \"),_c('div',{staticClass:\"pswp__item\"}),_vm._v(\" \"),_c('div',{staticClass:\"pswp__item\"})]),_vm._v(\" \"),_c('div',{staticClass:\"pswp__ui pswp__ui--hidden\"},[_c('div',{staticClass:\"pswp__top-bar\"},[_c('div',{staticClass:\"pswp__counter\"}),_vm._v(\" \"),_c('button',{staticClass:\"pswp__button pswp__button--close\",attrs:{\"title\":\"Close (Esc)\"}}),_vm._v(\" \"),_c('button',{staticClass:\"pswp__button pswp__button--share\",attrs:{\"title\":\"Share\"}}),_vm._v(\" \"),_c('button',{staticClass:\"pswp__button pswp__button--fs\",attrs:{\"title\":\"Toggle fullscreen\"}}),_vm._v(\" \"),_c('button',{staticClass:\"pswp__button pswp__button--zoom\",attrs:{\"title\":\"Zoom in/out\"}}),_vm._v(\" \"),_c('div',{staticClass:\"pswp__preloader\"},[_c('div',{staticClass:\"pswp__preloader__icn\"},[_c('div',{staticClass:\"pswp__preloader__cut\"},[_c('div',{staticClass:\"pswp__preloader__donut\"})])])])]),_vm._v(\" \"),_c('div',{staticClass:\"pswp__share-modal pswp__share-modal--hidden pswp__single-tap\"},[_c('div',{staticClass:\"pswp__share-tooltip\"})]),_vm._v(\" \"),_c('button',{staticClass:\"pswp__button pswp__button--arrow--left\",attrs:{\"title\":\"Previous (arrow left)\"}}),_vm._v(\" \"),_c('button',{staticClass:\"pswp__button pswp__button--arrow--right\",attrs:{\"title\":\"Next (arrow right)\"}}),_vm._v(\" \"),_c('div',{staticClass:\"pswp__caption\"},[_c('div',{staticClass:\"pswp__caption__center\"})])])])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/_vue-loader@13.7.3@vue-loader/lib/template-compiler?{\"id\":\"data-v-befa1362\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/_vue-loader@13.7.3@vue-loader/lib/selector.js?type=template&index=0!./src/lib/preview.vue\n// module id = 9\n// module chunks = 0","/*! PhotoSwipe - v4.1.3 - 2019-01-08\n* http://photoswipe.com\n* Copyright (c) 2019 Dmitry Semenov; */\n(function (root, factory) { \n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.PhotoSwipe = factory();\n\t}\n})(this, function () {\n\n\t'use strict';\n\tvar PhotoSwipe = function(template, UiClass, items, options){\n\n/*>>framework-bridge*/\n/**\n *\n * Set of generic functions used by gallery.\n * \n * You're free to modify anything here as long as functionality is kept.\n * \n */\nvar framework = {\n\tfeatures: null,\n\tbind: function(target, type, listener, unbind) {\n\t\tvar methodName = (unbind ? 'remove' : 'add') + 'EventListener';\n\t\ttype = type.split(' ');\n\t\tfor(var i = 0; i < type.length; i++) {\n\t\t\tif(type[i]) {\n\t\t\t\ttarget[methodName]( type[i], listener, false);\n\t\t\t}\n\t\t}\n\t},\n\tisArray: function(obj) {\n\t\treturn (obj instanceof Array);\n\t},\n\tcreateEl: function(classes, tag) {\n\t\tvar el = document.createElement(tag || 'div');\n\t\tif(classes) {\n\t\t\tel.className = classes;\n\t\t}\n\t\treturn el;\n\t},\n\tgetScrollY: function() {\n\t\tvar yOffset = window.pageYOffset;\n\t\treturn yOffset !== undefined ? yOffset : document.documentElement.scrollTop;\n\t},\n\tunbind: function(target, type, listener) {\n\t\tframework.bind(target,type,listener,true);\n\t},\n\tremoveClass: function(el, className) {\n\t\tvar reg = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)');\n\t\tel.className = el.className.replace(reg, ' ').replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, ''); \n\t},\n\taddClass: function(el, className) {\n\t\tif( !framework.hasClass(el,className) ) {\n\t\t\tel.className += (el.className ? ' ' : '') + className;\n\t\t}\n\t},\n\thasClass: function(el, className) {\n\t\treturn el.className && new RegExp('(^|\\\\s)' + className + '(\\\\s|$)').test(el.className);\n\t},\n\tgetChildByClass: function(parentEl, childClassName) {\n\t\tvar node = parentEl.firstChild;\n\t\twhile(node) {\n\t\t\tif( framework.hasClass(node, childClassName) ) {\n\t\t\t\treturn node;\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t}\n\t},\n\tarraySearch: function(array, value, key) {\n\t\tvar i = array.length;\n\t\twhile(i--) {\n\t\t\tif(array[i][key] === value) {\n\t\t\t\treturn i;\n\t\t\t} \n\t\t}\n\t\treturn -1;\n\t},\n\textend: function(o1, o2, preventOverwrite) {\n\t\tfor (var prop in o2) {\n\t\t\tif (o2.hasOwnProperty(prop)) {\n\t\t\t\tif(preventOverwrite && o1.hasOwnProperty(prop)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\to1[prop] = o2[prop];\n\t\t\t}\n\t\t}\n\t},\n\teasing: {\n\t\tsine: {\n\t\t\tout: function(k) {\n\t\t\t\treturn Math.sin(k * (Math.PI / 2));\n\t\t\t},\n\t\t\tinOut: function(k) {\n\t\t\t\treturn - (Math.cos(Math.PI * k) - 1) / 2;\n\t\t\t}\n\t\t},\n\t\tcubic: {\n\t\t\tout: function(k) {\n\t\t\t\treturn --k * k * k + 1;\n\t\t\t}\n\t\t}\n\t\t/*\n\t\t\telastic: {\n\t\t\t\tout: function ( k ) {\n\n\t\t\t\t\tvar s, a = 0.1, p = 0.4;\n\t\t\t\t\tif ( k === 0 ) return 0;\n\t\t\t\t\tif ( k === 1 ) return 1;\n\t\t\t\t\tif ( !a || a < 1 ) { a = 1; s = p / 4; }\n\t\t\t\t\telse s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n\t\t\t\t\treturn ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );\n\n\t\t\t\t},\n\t\t\t},\n\t\t\tback: {\n\t\t\t\tout: function ( k ) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\treturn --k * k * ( ( s + 1 ) * k + s ) + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t*/\n\t},\n\n\t/**\n\t * \n\t * @return {object}\n\t * \n\t * {\n\t * raf : request animation frame function\n\t * caf : cancel animation frame function\n\t * transfrom : transform property key (with vendor), or null if not supported\n\t * oldIE : IE8 or below\n\t * }\n\t * \n\t */\n\tdetectFeatures: function() {\n\t\tif(framework.features) {\n\t\t\treturn framework.features;\n\t\t}\n\t\tvar helperEl = framework.createEl(),\n\t\t\thelperStyle = helperEl.style,\n\t\t\tvendor = '',\n\t\t\tfeatures = {};\n\n\t\t// IE8 and below\n\t\tfeatures.oldIE = document.all && !document.addEventListener;\n\n\t\tfeatures.touch = 'ontouchstart' in window;\n\n\t\tif(window.requestAnimationFrame) {\n\t\t\tfeatures.raf = window.requestAnimationFrame;\n\t\t\tfeatures.caf = window.cancelAnimationFrame;\n\t\t}\n\n\t\tfeatures.pointerEvent = !!(window.PointerEvent) || navigator.msPointerEnabled;\n\n\t\t// fix false-positive detection of old Android in new IE\n\t\t// (IE11 ua string contains \"Android 4.0\")\n\t\t\n\t\tif(!features.pointerEvent) { \n\n\t\t\tvar ua = navigator.userAgent;\n\n\t\t\t// Detect if device is iPhone or iPod and if it's older than iOS 8\n\t\t\t// http://stackoverflow.com/a/14223920\n\t\t\t// \n\t\t\t// This detection is made because of buggy top/bottom toolbars\n\t\t\t// that don't trigger window.resize event.\n\t\t\t// For more info refer to _isFixedPosition variable in core.js\n\n\t\t\tif (/iP(hone|od)/.test(navigator.platform)) {\n\t\t\t\tvar v = (navigator.appVersion).match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n\t\t\t\tif(v && v.length > 0) {\n\t\t\t\t\tv = parseInt(v[1], 10);\n\t\t\t\t\tif(v >= 1 && v < 8 ) {\n\t\t\t\t\t\tfeatures.isOldIOSPhone = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Detect old Android (before KitKat)\n\t\t\t// due to bugs related to position:fixed\n\t\t\t// http://stackoverflow.com/questions/7184573/pick-up-the-android-version-in-the-browser-by-javascript\n\t\t\t\n\t\t\tvar match = ua.match(/Android\\s([0-9\\.]*)/);\n\t\t\tvar androidversion = match ? match[1] : 0;\n\t\t\tandroidversion = parseFloat(androidversion);\n\t\t\tif(androidversion >= 1 ) {\n\t\t\t\tif(androidversion < 4.4) {\n\t\t\t\t\tfeatures.isOldAndroid = true; // for fixed position bug & performance\n\t\t\t\t}\n\t\t\t\tfeatures.androidVersion = androidversion; // for touchend bug\n\t\t\t}\t\n\t\t\tfeatures.isMobileOpera = /opera mini|opera mobi/i.test(ua);\n\n\t\t\t// p.s. yes, yes, UA sniffing is bad, propose your solution for above bugs.\n\t\t}\n\t\t\n\t\tvar styleChecks = ['transform', 'perspective', 'animationName'],\n\t\t\tvendors = ['', 'webkit','Moz','ms','O'],\n\t\t\tstyleCheckItem,\n\t\t\tstyleName;\n\n\t\tfor(var i = 0; i < 4; i++) {\n\t\t\tvendor = vendors[i];\n\n\t\t\tfor(var a = 0; a < 3; a++) {\n\t\t\t\tstyleCheckItem = styleChecks[a];\n\n\t\t\t\t// uppercase first letter of property name, if vendor is present\n\t\t\t\tstyleName = vendor + (vendor ? \n\t\t\t\t\t\t\t\t\t\tstyleCheckItem.charAt(0).toUpperCase() + styleCheckItem.slice(1) : \n\t\t\t\t\t\t\t\t\t\tstyleCheckItem);\n\t\t\t\n\t\t\t\tif(!features[styleCheckItem] && styleName in helperStyle ) {\n\t\t\t\t\tfeatures[styleCheckItem] = styleName;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(vendor && !features.raf) {\n\t\t\t\tvendor = vendor.toLowerCase();\n\t\t\t\tfeatures.raf = window[vendor+'RequestAnimationFrame'];\n\t\t\t\tif(features.raf) {\n\t\t\t\t\tfeatures.caf = window[vendor+'CancelAnimationFrame'] || \n\t\t\t\t\t\t\t\t\twindow[vendor+'CancelRequestAnimationFrame'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\t\n\t\tif(!features.raf) {\n\t\t\tvar lastTime = 0;\n\t\t\tfeatures.raf = function(fn) {\n\t\t\t\tvar currTime = new Date().getTime();\n\t\t\t\tvar timeToCall = Math.max(0, 16 - (currTime - lastTime));\n\t\t\t\tvar id = window.setTimeout(function() { fn(currTime + timeToCall); }, timeToCall);\n\t\t\t\tlastTime = currTime + timeToCall;\n\t\t\t\treturn id;\n\t\t\t};\n\t\t\tfeatures.caf = function(id) { clearTimeout(id); };\n\t\t}\n\n\t\t// Detect SVG support\n\t\tfeatures.svg = !!document.createElementNS && \n\t\t\t\t\t\t!!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;\n\n\t\tframework.features = features;\n\n\t\treturn features;\n\t}\n};\n\nframework.detectFeatures();\n\n// Override addEventListener for old versions of IE\nif(framework.features.oldIE) {\n\n\tframework.bind = function(target, type, listener, unbind) {\n\t\t\n\t\ttype = type.split(' ');\n\n\t\tvar methodName = (unbind ? 'detach' : 'attach') + 'Event',\n\t\t\tevName,\n\t\t\t_handleEv = function() {\n\t\t\t\tlistener.handleEvent.call(listener);\n\t\t\t};\n\n\t\tfor(var i = 0; i < type.length; i++) {\n\t\t\tevName = type[i];\n\t\t\tif(evName) {\n\n\t\t\t\tif(typeof listener === 'object' && listener.handleEvent) {\n\t\t\t\t\tif(!unbind) {\n\t\t\t\t\t\tlistener['oldIE' + evName] = _handleEv;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(!listener['oldIE' + evName]) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttarget[methodName]( 'on' + evName, listener['oldIE' + evName]);\n\t\t\t\t} else {\n\t\t\t\t\ttarget[methodName]( 'on' + evName, listener);\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t};\n\t\n}\n\n/*>>framework-bridge*/\n\n/*>>core*/\n//function(template, UiClass, items, options)\n\nvar self = this;\n\n/**\n * Static vars, don't change unless you know what you're doing.\n */\nvar DOUBLE_TAP_RADIUS = 25, \n\tNUM_HOLDERS = 3;\n\n/**\n * Options\n */\nvar _options = {\n\tallowPanToNext:true,\n\tspacing: 0.12,\n\tbgOpacity: 1,\n\tmouseUsed: false,\n\tloop: true,\n\tpinchToClose: true,\n\tcloseOnScroll: true,\n\tcloseOnVerticalDrag: true,\n\tverticalDragRange: 0.75,\n\thideAnimationDuration: 333,\n\tshowAnimationDuration: 333,\n\tshowHideOpacity: false,\n\tfocus: true,\n\tescKey: true,\n\tarrowKeys: true,\n\tmainScrollEndFriction: 0.35,\n\tpanEndFriction: 0.35,\n\tisClickableElement: function(el) {\n return el.tagName === 'A';\n },\n getDoubleTapZoom: function(isMouseClick, item) {\n \tif(isMouseClick) {\n \t\treturn 1;\n \t} else {\n \t\treturn item.initialZoomLevel < 0.7 ? 1 : 1.33;\n \t}\n },\n maxSpreadZoom: 1.33,\n\tmodal: true,\n\n\t// not fully implemented yet\n\tscaleMode: 'fit' // TODO\n};\nframework.extend(_options, options);\n\n\n/**\n * Private helper variables & functions\n */\n\nvar _getEmptyPoint = function() { \n\t\treturn {x:0,y:0}; \n\t};\n\nvar _isOpen,\n\t_isDestroying,\n\t_closedByScroll,\n\t_currentItemIndex,\n\t_containerStyle,\n\t_containerShiftIndex,\n\t_currPanDist = _getEmptyPoint(),\n\t_startPanOffset = _getEmptyPoint(),\n\t_panOffset = _getEmptyPoint(),\n\t_upMoveEvents, // drag move, drag end & drag cancel events array\n\t_downEvents, // drag start events array\n\t_globalEventHandlers,\n\t_viewportSize = {},\n\t_currZoomLevel,\n\t_startZoomLevel,\n\t_translatePrefix,\n\t_translateSufix,\n\t_updateSizeInterval,\n\t_itemsNeedUpdate,\n\t_currPositionIndex = 0,\n\t_offset = {},\n\t_slideSize = _getEmptyPoint(), // size of slide area, including spacing\n\t_itemHolders,\n\t_prevItemIndex,\n\t_indexDiff = 0, // difference of indexes since last content update\n\t_dragStartEvent,\n\t_dragMoveEvent,\n\t_dragEndEvent,\n\t_dragCancelEvent,\n\t_transformKey,\n\t_pointerEventEnabled,\n\t_isFixedPosition = true,\n\t_likelyTouchDevice,\n\t_modules = [],\n\t_requestAF,\n\t_cancelAF,\n\t_initalClassName,\n\t_initalWindowScrollY,\n\t_oldIE,\n\t_currentWindowScrollY,\n\t_features,\n\t_windowVisibleSize = {},\n\t_renderMaxResolution = false,\n\t_orientationChangeTimeout,\n\n\n\t// Registers PhotoSWipe module (History, Controller ...)\n\t_registerModule = function(name, module) {\n\t\tframework.extend(self, module.publicMethods);\n\t\t_modules.push(name);\n\t},\n\n\t_getLoopedId = function(index) {\n\t\tvar numSlides = _getNumItems();\n\t\tif(index > numSlides - 1) {\n\t\t\treturn index - numSlides;\n\t\t} else if(index < 0) {\n\t\t\treturn numSlides + index;\n\t\t}\n\t\treturn index;\n\t},\n\t\n\t// Micro bind/trigger\n\t_listeners = {},\n\t_listen = function(name, fn) {\n\t\tif(!_listeners[name]) {\n\t\t\t_listeners[name] = [];\n\t\t}\n\t\treturn _listeners[name].push(fn);\n\t},\n\t_shout = function(name) {\n\t\tvar listeners = _listeners[name];\n\n\t\tif(listeners) {\n\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\targs.shift();\n\n\t\t\tfor(var i = 0; i < listeners.length; i++) {\n\t\t\t\tlisteners[i].apply(self, args);\n\t\t\t}\n\t\t}\n\t},\n\n\t_getCurrentTime = function() {\n\t\treturn new Date().getTime();\n\t},\n\t_applyBgOpacity = function(opacity) {\n\t\t_bgOpacity = opacity;\n\t\tself.bg.style.opacity = opacity * _options.bgOpacity;\n\t},\n\n\t_applyZoomTransform = function(styleObj,x,y,zoom,item) {\n\t\tif(!_renderMaxResolution || (item && item !== self.currItem) ) {\n\t\t\tzoom = zoom / (item ? item.fitRatio : self.currItem.fitRatio);\t\n\t\t}\n\t\t\t\n\t\tstyleObj[_transformKey] = _translatePrefix + x + 'px, ' + y + 'px' + _translateSufix + ' scale(' + zoom + ')';\n\t},\n\t_applyCurrentZoomPan = function( allowRenderResolution ) {\n\t\tif(_currZoomElementStyle) {\n\n\t\t\tif(allowRenderResolution) {\n\t\t\t\tif(_currZoomLevel > self.currItem.fitRatio) {\n\t\t\t\t\tif(!_renderMaxResolution) {\n\t\t\t\t\t\t_setImageSize(self.currItem, false, true);\n\t\t\t\t\t\t_renderMaxResolution = true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif(_renderMaxResolution) {\n\t\t\t\t\t\t_setImageSize(self.currItem);\n\t\t\t\t\t\t_renderMaxResolution = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\n\t\t\t_applyZoomTransform(_currZoomElementStyle, _panOffset.x, _panOffset.y, _currZoomLevel);\n\t\t}\n\t},\n\t_applyZoomPanToItem = function(item) {\n\t\tif(item.container) {\n\n\t\t\t_applyZoomTransform(item.container.style, \n\t\t\t\t\t\t\t\titem.initialPosition.x, \n\t\t\t\t\t\t\t\titem.initialPosition.y, \n\t\t\t\t\t\t\t\titem.initialZoomLevel,\n\t\t\t\t\t\t\t\titem);\n\t\t}\n\t},\n\t_setTranslateX = function(x, elStyle) {\n\t\telStyle[_transformKey] = _translatePrefix + x + 'px, 0px' + _translateSufix;\n\t},\n\t_moveMainScroll = function(x, dragging) {\n\n\t\tif(!_options.loop && dragging) {\n\t\t\tvar newSlideIndexOffset = _currentItemIndex + (_slideSize.x * _currPositionIndex - x) / _slideSize.x,\n\t\t\t\tdelta = Math.round(x - _mainScrollPos.x);\n\n\t\t\tif( (newSlideIndexOffset < 0 && delta > 0) || \n\t\t\t\t(newSlideIndexOffset >= _getNumItems() - 1 && delta < 0) ) {\n\t\t\t\tx = _mainScrollPos.x + delta * _options.mainScrollEndFriction;\n\t\t\t} \n\t\t}\n\t\t\n\t\t_mainScrollPos.x = x;\n\t\t_setTranslateX(x, _containerStyle);\n\t},\n\t_calculatePanOffset = function(axis, zoomLevel) {\n\t\tvar m = _midZoomPoint[axis] - _offset[axis];\n\t\treturn _startPanOffset[axis] + _currPanDist[axis] + m - m * ( zoomLevel / _startZoomLevel );\n\t},\n\t\n\t_equalizePoints = function(p1, p2) {\n\t\tp1.x = p2.x;\n\t\tp1.y = p2.y;\n\t\tif(p2.id) {\n\t\t\tp1.id = p2.id;\n\t\t}\n\t},\n\t_roundPoint = function(p) {\n\t\tp.x = Math.round(p.x);\n\t\tp.y = Math.round(p.y);\n\t},\n\n\t_mouseMoveTimeout = null,\n\t_onFirstMouseMove = function() {\n\t\t// Wait until mouse move event is fired at least twice during 100ms\n\t\t// We do this, because some mobile browsers trigger it on touchstart\n\t\tif(_mouseMoveTimeout ) { \n\t\t\tframework.unbind(document, 'mousemove', _onFirstMouseMove);\n\t\t\tframework.addClass(template, 'pswp--has_mouse');\n\t\t\t_options.mouseUsed = true;\n\t\t\t_shout('mouseUsed');\n\t\t}\n\t\t_mouseMoveTimeout = setTimeout(function() {\n\t\t\t_mouseMoveTimeout = null;\n\t\t}, 100);\n\t},\n\n\t_bindEvents = function() {\n\t\tframework.bind(document, 'keydown', self);\n\n\t\tif(_features.transform) {\n\t\t\t// don't bind click event in browsers that don't support transform (mostly IE8)\n\t\t\tframework.bind(self.scrollWrap, 'click', self);\n\t\t}\n\t\t\n\n\t\tif(!_options.mouseUsed) {\n\t\t\tframework.bind(document, 'mousemove', _onFirstMouseMove);\n\t\t}\n\n\t\tframework.bind(window, 'resize scroll orientationchange', self);\n\n\t\t_shout('bindEvents');\n\t},\n\n\t_unbindEvents = function() {\n\t\tframework.unbind(window, 'resize scroll orientationchange', self);\n\t\tframework.unbind(window, 'scroll', _globalEventHandlers.scroll);\n\t\tframework.unbind(document, 'keydown', self);\n\t\tframework.unbind(document, 'mousemove', _onFirstMouseMove);\n\n\t\tif(_features.transform) {\n\t\t\tframework.unbind(self.scrollWrap, 'click', self);\n\t\t}\n\n\t\tif(_isDragging) {\n\t\t\tframework.unbind(window, _upMoveEvents, self);\n\t\t}\n\n\t\tclearTimeout(_orientationChangeTimeout);\n\n\t\t_shout('unbindEvents');\n\t},\n\t\n\t_calculatePanBounds = function(zoomLevel, update) {\n\t\tvar bounds = _calculateItemSize( self.currItem, _viewportSize, zoomLevel );\n\t\tif(update) {\n\t\t\t_currPanBounds = bounds;\n\t\t}\n\t\treturn bounds;\n\t},\n\t\n\t_getMinZoomLevel = function(item) {\n\t\tif(!item) {\n\t\t\titem = self.currItem;\n\t\t}\n\t\treturn item.initialZoomLevel;\n\t},\n\t_getMaxZoomLevel = function(item) {\n\t\tif(!item) {\n\t\t\titem = self.currItem;\n\t\t}\n\t\treturn item.w > 0 ? _options.maxSpreadZoom : 1;\n\t},\n\n\t// Return true if offset is out of the bounds\n\t_modifyDestPanOffset = function(axis, destPanBounds, destPanOffset, destZoomLevel) {\n\t\tif(destZoomLevel === self.currItem.initialZoomLevel) {\n\t\t\tdestPanOffset[axis] = self.currItem.initialPosition[axis];\n\t\t\treturn true;\n\t\t} else {\n\t\t\tdestPanOffset[axis] = _calculatePanOffset(axis, destZoomLevel); \n\n\t\t\tif(destPanOffset[axis] > destPanBounds.min[axis]) {\n\t\t\t\tdestPanOffset[axis] = destPanBounds.min[axis];\n\t\t\t\treturn true;\n\t\t\t} else if(destPanOffset[axis] < destPanBounds.max[axis] ) {\n\t\t\t\tdestPanOffset[axis] = destPanBounds.max[axis];\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t_setupTransforms = function() {\n\n\t\tif(_transformKey) {\n\t\t\t// setup 3d transforms\n\t\t\tvar allow3dTransform = _features.perspective && !_likelyTouchDevice;\n\t\t\t_translatePrefix = 'translate' + (allow3dTransform ? '3d(' : '(');\n\t\t\t_translateSufix = _features.perspective ? ', 0px)' : ')';\t\n\t\t\treturn;\n\t\t}\n\n\t\t// Override zoom/pan/move functions in case old browser is used (most likely IE)\n\t\t// (so they use left/top/width/height, instead of CSS transform)\n\t\n\t\t_transformKey = 'left';\n\t\tframework.addClass(template, 'pswp--ie');\n\n\t\t_setTranslateX = function(x, elStyle) {\n\t\t\telStyle.left = x + 'px';\n\t\t};\n\t\t_applyZoomPanToItem = function(item) {\n\n\t\t\tvar zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,\n\t\t\t\ts = item.container.style,\n\t\t\t\tw = zoomRatio * item.w,\n\t\t\t\th = zoomRatio * item.h;\n\n\t\t\ts.width = w + 'px';\n\t\t\ts.height = h + 'px';\n\t\t\ts.left = item.initialPosition.x + 'px';\n\t\t\ts.top = item.initialPosition.y + 'px';\n\n\t\t};\n\t\t_applyCurrentZoomPan = function() {\n\t\t\tif(_currZoomElementStyle) {\n\n\t\t\t\tvar s = _currZoomElementStyle,\n\t\t\t\t\titem = self.currItem,\n\t\t\t\t\tzoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,\n\t\t\t\t\tw = zoomRatio * item.w,\n\t\t\t\t\th = zoomRatio * item.h;\n\n\t\t\t\ts.width = w + 'px';\n\t\t\t\ts.height = h + 'px';\n\n\n\t\t\t\ts.left = _panOffset.x + 'px';\n\t\t\t\ts.top = _panOffset.y + 'px';\n\t\t\t}\n\t\t\t\n\t\t};\n\t},\n\n\t_onKeyDown = function(e) {\n\t\tvar keydownAction = '';\n\t\tif(_options.escKey && e.keyCode === 27) { \n\t\t\tkeydownAction = 'close';\n\t\t} else if(_options.arrowKeys) {\n\t\t\tif(e.keyCode === 37) {\n\t\t\t\tkeydownAction = 'prev';\n\t\t\t} else if(e.keyCode === 39) { \n\t\t\t\tkeydownAction = 'next';\n\t\t\t}\n\t\t}\n\n\t\tif(keydownAction) {\n\t\t\t// don't do anything if special key pressed to prevent from overriding default browser actions\n\t\t\t// e.g. in Chrome on Mac cmd+arrow-left returns to previous page\n\t\t\tif( !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey ) {\n\t\t\t\tif(e.preventDefault) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t} else {\n\t\t\t\t\te.returnValue = false;\n\t\t\t\t} \n\t\t\t\tself[keydownAction]();\n\t\t\t}\n\t\t}\n\t},\n\n\t_onGlobalClick = function(e) {\n\t\tif(!e) {\n\t\t\treturn;\n\t\t}\n\n\t\t// don't allow click event to pass through when triggering after drag or some other gesture\n\t\tif(_moved || _zoomStarted || _mainScrollAnimating || _verticalDragInitiated) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\n\t_updatePageScrollOffset = function() {\n\t\tself.setScrollOffset(0, framework.getScrollY());\t\t\n\t};\n\t\n\n\n\t\n\n\n\n// Micro animation engine\nvar _animations = {},\n\t_numAnimations = 0,\n\t_stopAnimation = function(name) {\n\t\tif(_animations[name]) {\n\t\t\tif(_animations[name].raf) {\n\t\t\t\t_cancelAF( _animations[name].raf );\n\t\t\t}\n\t\t\t_numAnimations--;\n\t\t\tdelete _animations[name];\n\t\t}\n\t},\n\t_registerStartAnimation = function(name) {\n\t\tif(_animations[name]) {\n\t\t\t_stopAnimation(name);\n\t\t}\n\t\tif(!_animations[name]) {\n\t\t\t_numAnimations++;\n\t\t\t_animations[name] = {};\n\t\t}\n\t},\n\t_stopAllAnimations = function() {\n\t\tfor (var prop in _animations) {\n\n\t\t\tif( _animations.hasOwnProperty( prop ) ) {\n\t\t\t\t_stopAnimation(prop);\n\t\t\t} \n\t\t\t\n\t\t}\n\t},\n\t_animateProp = function(name, b, endProp, d, easingFn, onUpdate, onComplete) {\n\t\tvar startAnimTime = _getCurrentTime(), t;\n\t\t_registerStartAnimation(name);\n\n\t\tvar animloop = function(){\n\t\t\tif ( _animations[name] ) {\n\t\t\t\t\n\t\t\t\tt = _getCurrentTime() - startAnimTime; // time diff\n\t\t\t\t//b - beginning (start prop)\n\t\t\t\t//d - anim duration\n\n\t\t\t\tif ( t >= d ) {\n\t\t\t\t\t_stopAnimation(name);\n\t\t\t\t\tonUpdate(endProp);\n\t\t\t\t\tif(onComplete) {\n\t\t\t\t\t\tonComplete();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonUpdate( (endProp - b) * easingFn(t/d) + b );\n\n\t\t\t\t_animations[name].raf = _requestAF(animloop);\n\t\t\t}\n\t\t};\n\t\tanimloop();\n\t};\n\t\n\n\nvar publicMethods = {\n\n\t// make a few local variables and functions public\n\tshout: _shout,\n\tlisten: _listen,\n\tviewportSize: _viewportSize,\n\toptions: _options,\n\n\tisMainScrollAnimating: function() {\n\t\treturn _mainScrollAnimating;\n\t},\n\tgetZoomLevel: function() {\n\t\treturn _currZoomLevel;\n\t},\n\tgetCurrentIndex: function() {\n\t\treturn _currentItemIndex;\n\t},\n\tisDragging: function() {\n\t\treturn _isDragging;\n\t},\t\n\tisZooming: function() {\n\t\treturn _isZooming;\n\t},\n\tsetScrollOffset: function(x,y) {\n\t\t_offset.x = x;\n\t\t_currentWindowScrollY = _offset.y = y;\n\t\t_shout('updateScrollOffset', _offset);\n\t},\n\tapplyZoomPan: function(zoomLevel,panX,panY,allowRenderResolution) {\n\t\t_panOffset.x = panX;\n\t\t_panOffset.y = panY;\n\t\t_currZoomLevel = zoomLevel;\n\t\t_applyCurrentZoomPan( allowRenderResolution );\n\t},\n\n\tinit: function() {\n\n\t\tif(_isOpen || _isDestroying) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar i;\n\n\t\tself.framework = framework; // basic functionality\n\t\tself.template = template; // root DOM element of PhotoSwipe\n\t\tself.bg = framework.getChildByClass(template, 'pswp__bg');\n\n\t\t_initalClassName = template.className;\n\t\t_isOpen = true;\n\t\t\t\t\n\t\t_features = framework.detectFeatures();\n\t\t_requestAF = _features.raf;\n\t\t_cancelAF = _features.caf;\n\t\t_transformKey = _features.transform;\n\t\t_oldIE = _features.oldIE;\n\t\t\n\t\tself.scrollWrap = framework.getChildByClass(template, 'pswp__scroll-wrap');\n\t\tself.container = framework.getChildByClass(self.scrollWrap, 'pswp__container');\n\n\t\t_containerStyle = self.container.style; // for fast access\n\n\t\t// Objects that hold slides (there are only 3 in DOM)\n\t\tself.itemHolders = _itemHolders = [\n\t\t\t{el:self.container.children[0] , wrap:0, index: -1},\n\t\t\t{el:self.container.children[1] , wrap:0, index: -1},\n\t\t\t{el:self.container.children[2] , wrap:0, index: -1}\n\t\t];\n\n\t\t// hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\n\t\t_itemHolders[0].el.style.display = _itemHolders[2].el.style.display = 'none';\n\n\t\t_setupTransforms();\n\n\t\t// Setup global events\n\t\t_globalEventHandlers = {\n\t\t\tresize: self.updateSize,\n\n\t\t\t// Fixes: iOS 10.3 resize event\n\t\t\t// does not update scrollWrap.clientWidth instantly after resize\n\t\t\t// https://github.com/dimsemenov/PhotoSwipe/issues/1315\n\t\t\torientationchange: function() {\n\t\t\t\tclearTimeout(_orientationChangeTimeout);\n\t\t\t\t_orientationChangeTimeout = setTimeout(function() {\n\t\t\t\t\tif(_viewportSize.x !== self.scrollWrap.clientWidth) {\n\t\t\t\t\t\tself.updateSize();\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t},\n\t\t\tscroll: _updatePageScrollOffset,\n\t\t\tkeydown: _onKeyDown,\n\t\t\tclick: _onGlobalClick\n\t\t};\n\n\t\t// disable show/hide effects on old browsers that don't support CSS animations or transforms, \n\t\t// old IOS, Android and Opera mobile. Blackberry seems to work fine, even older models.\n\t\tvar oldPhone = _features.isOldIOSPhone || _features.isOldAndroid || _features.isMobileOpera;\n\t\tif(!_features.animationName || !_features.transform || oldPhone) {\n\t\t\t_options.showAnimationDuration = _options.hideAnimationDuration = 0;\n\t\t}\n\n\t\t// init modules\n\t\tfor(i = 0; i < _modules.length; i++) {\n\t\t\tself['init' + _modules[i]]();\n\t\t}\n\t\t\n\t\t// init\n\t\tif(UiClass) {\n\t\t\tvar ui = self.ui = new UiClass(self, framework);\n\t\t\tui.init();\n\t\t}\n\n\t\t_shout('firstUpdate');\n\t\t_currentItemIndex = _currentItemIndex || _options.index || 0;\n\t\t// validate index\n\t\tif( isNaN(_currentItemIndex) || _currentItemIndex < 0 || _currentItemIndex >= _getNumItems() ) {\n\t\t\t_currentItemIndex = 0;\n\t\t}\n\t\tself.currItem = _getItemAt( _currentItemIndex );\n\n\t\t\n\t\tif(_features.isOldIOSPhone || _features.isOldAndroid) {\n\t\t\t_isFixedPosition = false;\n\t\t}\n\t\t\n\t\ttemplate.setAttribute('aria-hidden', 'false');\n\t\tif(_options.modal) {\n\t\t\tif(!_isFixedPosition) {\n\t\t\t\ttemplate.style.position = 'absolute';\n\t\t\t\ttemplate.style.top = framework.getScrollY() + 'px';\n\t\t\t} else {\n\t\t\t\ttemplate.style.position = 'fixed';\n\t\t\t}\n\t\t}\n\n\t\tif(_currentWindowScrollY === undefined) {\n\t\t\t_shout('initialLayout');\n\t\t\t_currentWindowScrollY = _initalWindowScrollY = framework.getScrollY();\n\t\t}\n\t\t\n\t\t// add classes to root element of PhotoSwipe\n\t\tvar rootClasses = 'pswp--open ';\n\t\tif(_options.mainClass) {\n\t\t\trootClasses += _options.mainClass + ' ';\n\t\t}\n\t\tif(_options.showHideOpacity) {\n\t\t\trootClasses += 'pswp--animate_opacity ';\n\t\t}\n\t\trootClasses += _likelyTouchDevice ? 'pswp--touch' : 'pswp--notouch';\n\t\trootClasses += _features.animationName ? ' pswp--css_animation' : '';\n\t\trootClasses += _features.svg ? ' pswp--svg' : '';\n\t\tframework.addClass(template, rootClasses);\n\n\t\tself.updateSize();\n\n\t\t// initial update\n\t\t_containerShiftIndex = -1;\n\t\t_indexDiff = null;\n\t\tfor(i = 0; i < NUM_HOLDERS; i++) {\n\t\t\t_setTranslateX( (i+_containerShiftIndex) * _slideSize.x, _itemHolders[i].el.style);\n\t\t}\n\n\t\tif(!_oldIE) {\n\t\t\tframework.bind(self.scrollWrap, _downEvents, self); // no dragging for old IE\n\t\t}\t\n\n\t\t_listen('initialZoomInEnd', function() {\n\t\t\tself.setContent(_itemHolders[0], _currentItemIndex-1);\n\t\t\tself.setContent(_itemHolders[2], _currentItemIndex+1);\n\n\t\t\t_itemHolders[0].el.style.display = _itemHolders[2].el.style.display = 'block';\n\n\t\t\tif(_options.focus) {\n\t\t\t\t// focus causes layout, \n\t\t\t\t// which causes lag during the animation, \n\t\t\t\t// that's why we delay it untill the initial zoom transition ends\n\t\t\t\ttemplate.focus();\n\t\t\t}\n\t\t\t \n\n\t\t\t_bindEvents();\n\t\t});\n\n\t\t// set content for center slide (first time)\n\t\tself.setContent(_itemHolders[1], _currentItemIndex);\n\t\t\n\t\tself.updateCurrItem();\n\n\t\t_shout('afterInit');\n\n\t\tif(!_isFixedPosition) {\n\n\t\t\t// On all versions of iOS lower than 8.0, we check size of viewport every second.\n\t\t\t// \n\t\t\t// This is done to detect when Safari top & bottom bars appear, \n\t\t\t// as this action doesn't trigger any events (like resize). \n\t\t\t// \n\t\t\t// On iOS8 they fixed this.\n\t\t\t// \n\t\t\t// 10 Nov 2014: iOS 7 usage ~40%. iOS 8 usage 56%.\n\t\t\t\n\t\t\t_updateSizeInterval = setInterval(function() {\n\t\t\t\tif(!_numAnimations && !_isDragging && !_isZooming && (_currZoomLevel === self.currItem.initialZoomLevel) ) {\n\t\t\t\t\tself.updateSize();\n\t\t\t\t}\n\t\t\t}, 1000);\n\t\t}\n\n\t\tframework.addClass(template, 'pswp--visible');\n\t},\n\n\t// Close the gallery, then destroy it\n\tclose: function() {\n\t\tif(!_isOpen) {\n\t\t\treturn;\n\t\t}\n\n\t\t_isOpen = false;\n\t\t_isDestroying = true;\n\t\t_shout('close');\n\t\t_unbindEvents();\n\n\t\t_showOrHide(self.currItem, null, true, self.destroy);\n\t},\n\n\t// destroys the gallery (unbinds events, cleans up intervals and timeouts to avoid memory leaks)\n\tdestroy: function() {\n\t\t_shout('destroy');\n\n\t\tif(_showOrHideTimeout) {\n\t\t\tclearTimeout(_showOrHideTimeout);\n\t\t}\n\t\t\n\t\ttemplate.setAttribute('aria-hidden', 'true');\n\t\ttemplate.className = _initalClassName;\n\n\t\tif(_updateSizeInterval) {\n\t\t\tclearInterval(_updateSizeInterval);\n\t\t}\n\n\t\tframework.unbind(self.scrollWrap, _downEvents, self);\n\n\t\t// we unbind scroll event at the end, as closing animation may depend on it\n\t\tframework.unbind(window, 'scroll', self);\n\n\t\t_stopDragUpdateLoop();\n\n\t\t_stopAllAnimations();\n\n\t\t_listeners = null;\n\t},\n\n\t/**\n\t * Pan image to position\n\t * @param {Number} x \n\t * @param {Number} y \n\t * @param {Boolean} force Will ignore bounds if set to true.\n\t */\n\tpanTo: function(x,y,force) {\n\t\tif(!force) {\n\t\t\tif(x > _currPanBounds.min.x) {\n\t\t\t\tx = _currPanBounds.min.x;\n\t\t\t} else if(x < _currPanBounds.max.x) {\n\t\t\t\tx = _currPanBounds.max.x;\n\t\t\t}\n\n\t\t\tif(y > _currPanBounds.min.y) {\n\t\t\t\ty = _currPanBounds.min.y;\n\t\t\t} else if(y < _currPanBounds.max.y) {\n\t\t\t\ty = _currPanBounds.max.y;\n\t\t\t}\n\t\t}\n\t\t\n\t\t_panOffset.x = x;\n\t\t_panOffset.y = y;\n\t\t_applyCurrentZoomPan();\n\t},\n\t\n\thandleEvent: function (e) {\n\t\te = e || window.event;\n\t\tif(_globalEventHandlers[e.type]) {\n\t\t\t_globalEventHandlers[e.type](e);\n\t\t}\n\t},\n\n\n\tgoTo: function(index) {\n\n\t\tindex = _getLoopedId(index);\n\n\t\tvar diff = index - _currentItemIndex;\n\t\t_indexDiff = diff;\n\n\t\t_currentItemIndex = index;\n\t\tself.currItem = _getItemAt( _currentItemIndex );\n\t\t_currPositionIndex -= diff;\n\t\t\n\t\t_moveMainScroll(_slideSize.x * _currPositionIndex);\n\t\t\n\n\t\t_stopAllAnimations();\n\t\t_mainScrollAnimating = false;\n\n\t\tself.updateCurrItem();\n\t},\n\tnext: function() {\n\t\tself.goTo( _currentItemIndex + 1);\n\t},\n\tprev: function() {\n\t\tself.goTo( _currentItemIndex - 1);\n\t},\n\n\t// update current zoom/pan objects\n\tupdateCurrZoomItem: function(emulateSetContent) {\n\t\tif(emulateSetContent) {\n\t\t\t_shout('beforeChange', 0);\n\t\t}\n\n\t\t// itemHolder[1] is middle (current) item\n\t\tif(_itemHolders[1].el.children.length) {\n\t\t\tvar zoomElement = _itemHolders[1].el.children[0];\n\t\t\tif( framework.hasClass(zoomElement, 'pswp__zoom-wrap') ) {\n\t\t\t\t_currZoomElementStyle = zoomElement.style;\n\t\t\t} else {\n\t\t\t\t_currZoomElementStyle = null;\n\t\t\t}\n\t\t} else {\n\t\t\t_currZoomElementStyle = null;\n\t\t}\n\t\t\n\t\t_currPanBounds = self.currItem.bounds;\t\n\t\t_startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;\n\n\t\t_panOffset.x = _currPanBounds.center.x;\n\t\t_panOffset.y = _currPanBounds.center.y;\n\n\t\tif(emulateSetContent) {\n\t\t\t_shout('afterChange');\n\t\t}\n\t},\n\n\n\tinvalidateCurrItems: function() {\n\t\t_itemsNeedUpdate = true;\n\t\tfor(var i = 0; i < NUM_HOLDERS; i++) {\n\t\t\tif( _itemHolders[i].item ) {\n\t\t\t\t_itemHolders[i].item.needsUpdate = true;\n\t\t\t}\n\t\t}\n\t},\n\n\tupdateCurrItem: function(beforeAnimation) {\n\n\t\tif(_indexDiff === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar diffAbs = Math.abs(_indexDiff),\n\t\t\ttempHolder;\n\n\t\tif(beforeAnimation && diffAbs < 2) {\n\t\t\treturn;\n\t\t}\n\n\n\t\tself.currItem = _getItemAt( _currentItemIndex );\n\t\t_renderMaxResolution = false;\n\t\t\n\t\t_shout('beforeChange', _indexDiff);\n\n\t\tif(diffAbs >= NUM_HOLDERS) {\n\t\t\t_containerShiftIndex += _indexDiff + (_indexDiff > 0 ? -NUM_HOLDERS : NUM_HOLDERS);\n\t\t\tdiffAbs = NUM_HOLDERS;\n\t\t}\n\t\tfor(var i = 0; i < diffAbs; i++) {\n\t\t\tif(_indexDiff > 0) {\n\t\t\t\ttempHolder = _itemHolders.shift();\n\t\t\t\t_itemHolders[NUM_HOLDERS-1] = tempHolder; // move first to last\n\n\t\t\t\t_containerShiftIndex++;\n\t\t\t\t_setTranslateX( (_containerShiftIndex+2) * _slideSize.x, tempHolder.el.style);\n\t\t\t\tself.setContent(tempHolder, _currentItemIndex - diffAbs + i + 1 + 1);\n\t\t\t} else {\n\t\t\t\ttempHolder = _itemHolders.pop();\n\t\t\t\t_itemHolders.unshift( tempHolder ); // move last to first\n\n\t\t\t\t_containerShiftIndex--;\n\t\t\t\t_setTranslateX( _containerShiftIndex * _slideSize.x, tempHolder.el.style);\n\t\t\t\tself.setContent(tempHolder, _currentItemIndex + diffAbs - i - 1 - 1);\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\t// reset zoom/pan on previous item\n\t\tif(_currZoomElementStyle && Math.abs(_indexDiff) === 1) {\n\n\t\t\tvar prevItem = _getItemAt(_prevItemIndex);\n\t\t\tif(prevItem.initialZoomLevel !== _currZoomLevel) {\n\t\t\t\t_calculateItemSize(prevItem , _viewportSize );\n\t\t\t\t_setImageSize(prevItem);\n\t\t\t\t_applyZoomPanToItem( prevItem ); \t\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\t// reset diff after update\n\t\t_indexDiff = 0;\n\n\t\tself.updateCurrZoomItem();\n\n\t\t_prevItemIndex = _currentItemIndex;\n\n\t\t_shout('afterChange');\n\t\t\n\t},\n\n\n\n\tupdateSize: function(force) {\n\t\t\n\t\tif(!_isFixedPosition && _options.modal) {\n\t\t\tvar windowScrollY = framework.getScrollY();\n\t\t\tif(_currentWindowScrollY !== windowScrollY) {\n\t\t\t\ttemplate.style.top = windowScrollY + 'px';\n\t\t\t\t_currentWindowScrollY = windowScrollY;\n\t\t\t}\n\t\t\tif(!force && _windowVisibleSize.x === window.innerWidth && _windowVisibleSize.y === window.innerHeight) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t_windowVisibleSize.x = window.innerWidth;\n\t\t\t_windowVisibleSize.y = window.innerHeight;\n\n\t\t\t//template.style.width = _windowVisibleSize.x + 'px';\n\t\t\ttemplate.style.height = _windowVisibleSize.y + 'px';\n\t\t}\n\n\n\n\t\t_viewportSize.x = self.scrollWrap.clientWidth;\n\t\t_viewportSize.y = self.scrollWrap.clientHeight;\n\n\t\t_updatePageScrollOffset();\n\n\t\t_slideSize.x = _viewportSize.x + Math.round(_viewportSize.x * _options.spacing);\n\t\t_slideSize.y = _viewportSize.y;\n\n\t\t_moveMainScroll(_slideSize.x * _currPositionIndex);\n\n\t\t_shout('beforeResize'); // even may be used for example to switch image sources\n\n\n\t\t// don't re-calculate size on inital size update\n\t\tif(_containerShiftIndex !== undefined) {\n\n\t\t\tvar holder,\n\t\t\t\titem,\n\t\t\t\thIndex;\n\n\t\t\tfor(var i = 0; i < NUM_HOLDERS; i++) {\n\t\t\t\tholder = _itemHolders[i];\n\t\t\t\t_setTranslateX( (i+_containerShiftIndex) * _slideSize.x, holder.el.style);\n\n\t\t\t\thIndex = _currentItemIndex+i-1;\n\n\t\t\t\tif(_options.loop && _getNumItems() > 2) {\n\t\t\t\t\thIndex = _getLoopedId(hIndex);\n\t\t\t\t}\n\n\t\t\t\t// update zoom level on items and refresh source (if needsUpdate)\n\t\t\t\titem = _getItemAt( hIndex );\n\n\t\t\t\t// re-render gallery item if `needsUpdate`,\n\t\t\t\t// or doesn't have `bounds` (entirely new slide object)\n\t\t\t\tif( item && (_itemsNeedUpdate || item.needsUpdate || !item.bounds) ) {\n\n\t\t\t\t\tself.cleanSlide( item );\n\t\t\t\t\t\n\t\t\t\t\tself.setContent( holder, hIndex );\n\n\t\t\t\t\t// if \"center\" slide\n\t\t\t\t\tif(i === 1) {\n\t\t\t\t\t\tself.currItem = item;\n\t\t\t\t\t\tself.updateCurrZoomItem(true);\n\t\t\t\t\t}\n\n\t\t\t\t\titem.needsUpdate = false;\n\n\t\t\t\t} else if(holder.index === -1 && hIndex >= 0) {\n\t\t\t\t\t// add content first time\n\t\t\t\t\tself.setContent( holder, hIndex );\n\t\t\t\t}\n\t\t\t\tif(item && item.container) {\n\t\t\t\t\t_calculateItemSize(item, _viewportSize);\n\t\t\t\t\t_setImageSize(item);\n\t\t\t\t\t_applyZoomPanToItem( item );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t_itemsNeedUpdate = false;\n\t\t}\t\n\n\t\t_startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;\n\t\t_currPanBounds = self.currItem.bounds;\n\n\t\tif(_currPanBounds) {\n\t\t\t_panOffset.x = _currPanBounds.center.x;\n\t\t\t_panOffset.y = _currPanBounds.center.y;\n\t\t\t_applyCurrentZoomPan( true );\n\t\t}\n\t\t\n\t\t_shout('resize');\n\t},\n\t\n\t// Zoom current item to\n\tzoomTo: function(destZoomLevel, centerPoint, speed, easingFn, updateFn) {\n\t\t/*\n\t\t\tif(destZoomLevel === 'fit') {\n\t\t\t\tdestZoomLevel = self.currItem.fitRatio;\n\t\t\t} else if(destZoomLevel === 'fill') {\n\t\t\t\tdestZoomLevel = self.currItem.fillRatio;\n\t\t\t}\n\t\t*/\n\n\t\tif(centerPoint) {\n\t\t\t_startZoomLevel = _currZoomLevel;\n\t\t\t_midZoomPoint.x = Math.abs(centerPoint.x) - _panOffset.x ;\n\t\t\t_midZoomPoint.y = Math.abs(centerPoint.y) - _panOffset.y ;\n\t\t\t_equalizePoints(_startPanOffset, _panOffset);\n\t\t}\n\n\t\tvar destPanBounds = _calculatePanBounds(destZoomLevel, false),\n\t\t\tdestPanOffset = {};\n\n\t\t_modifyDestPanOffset('x', destPanBounds, destPanOffset, destZoomLevel);\n\t\t_modifyDestPanOffset('y', destPanBounds, destPanOffset, destZoomLevel);\n\n\t\tvar initialZoomLevel = _currZoomLevel;\n\t\tvar initialPanOffset = {\n\t\t\tx: _panOffset.x,\n\t\t\ty: _panOffset.y\n\t\t};\n\n\t\t_roundPoint(destPanOffset);\n\n\t\tvar onUpdate = function(now) {\n\t\t\tif(now === 1) {\n\t\t\t\t_currZoomLevel = destZoomLevel;\n\t\t\t\t_panOffset.x = destPanOffset.x;\n\t\t\t\t_panOffset.y = destPanOffset.y;\n\t\t\t} else {\n\t\t\t\t_currZoomLevel = (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;\n\t\t\t\t_panOffset.x = (destPanOffset.x - initialPanOffset.x) * now + initialPanOffset.x;\n\t\t\t\t_panOffset.y = (destPanOffset.y - initialPanOffset.y) * now + initialPanOffset.y;\n\t\t\t}\n\n\t\t\tif(updateFn) {\n\t\t\t\tupdateFn(now);\n\t\t\t}\n\n\t\t\t_applyCurrentZoomPan( now === 1 );\n\t\t};\n\n\t\tif(speed) {\n\t\t\t_animateProp('customZoomTo', 0, 1, speed, easingFn || framework.easing.sine.inOut, onUpdate);\n\t\t} else {\n\t\t\tonUpdate(1);\n\t\t}\n\t}\n\n\n};\n\n\n/*>>core*/\n\n/*>>gestures*/\n/**\n * Mouse/touch/pointer event handlers.\n * \n * separated from @core.js for readability\n */\n\nvar MIN_SWIPE_DISTANCE = 30,\n\tDIRECTION_CHECK_OFFSET = 10; // amount of pixels to drag to determine direction of swipe\n\nvar _gestureStartTime,\n\t_gestureCheckSpeedTime,\n\n\t// pool of objects that are used during dragging of zooming\n\tp = {}, // first point\n\tp2 = {}, // second point (for zoom gesture)\n\tdelta = {},\n\t_currPoint = {},\n\t_startPoint = {},\n\t_currPointers = [],\n\t_startMainScrollPos = {},\n\t_releaseAnimData,\n\t_posPoints = [], // array of points during dragging, used to determine type of gesture\n\t_tempPoint = {},\n\n\t_isZoomingIn,\n\t_verticalDragInitiated,\n\t_oldAndroidTouchEndTimeout,\n\t_currZoomedItemIndex = 0,\n\t_centerPoint = _getEmptyPoint(),\n\t_lastReleaseTime = 0,\n\t_isDragging, // at least one pointer is down\n\t_isMultitouch, // at least two _pointers are down\n\t_zoomStarted, // zoom level changed during zoom gesture\n\t_moved,\n\t_dragAnimFrame,\n\t_mainScrollShifted,\n\t_currentPoints, // array of current touch points\n\t_isZooming,\n\t_currPointsDistance,\n\t_startPointsDistance,\n\t_currPanBounds,\n\t_mainScrollPos = _getEmptyPoint(),\n\t_currZoomElementStyle,\n\t_mainScrollAnimating, // true, if animation after swipe gesture is running\n\t_midZoomPoint = _getEmptyPoint(),\n\t_currCenterPoint = _getEmptyPoint(),\n\t_direction,\n\t_isFirstMove,\n\t_opacityChanged,\n\t_bgOpacity,\n\t_wasOverInitialZoom,\n\n\t_isEqualPoints = function(p1, p2) {\n\t\treturn p1.x === p2.x && p1.y === p2.y;\n\t},\n\t_isNearbyPoints = function(touch0, touch1) {\n\t\treturn Math.abs(touch0.x - touch1.x) < DOUBLE_TAP_RADIUS && Math.abs(touch0.y - touch1.y) < DOUBLE_TAP_RADIUS;\n\t},\n\t_calculatePointsDistance = function(p1, p2) {\n\t\t_tempPoint.x = Math.abs( p1.x - p2.x );\n\t\t_tempPoint.y = Math.abs( p1.y - p2.y );\n\t\treturn Math.sqrt(_tempPoint.x * _tempPoint.x + _tempPoint.y * _tempPoint.y);\n\t},\n\t_stopDragUpdateLoop = function() {\n\t\tif(_dragAnimFrame) {\n\t\t\t_cancelAF(_dragAnimFrame);\n\t\t\t_dragAnimFrame = null;\n\t\t}\n\t},\n\t_dragUpdateLoop = function() {\n\t\tif(_isDragging) {\n\t\t\t_dragAnimFrame = _requestAF(_dragUpdateLoop);\n\t\t\t_renderMovement();\n\t\t}\n\t},\n\t_canPan = function() {\n\t\treturn !(_options.scaleMode === 'fit' && _currZoomLevel === self.currItem.initialZoomLevel);\n\t},\n\t\n\t// find the closest parent DOM element\n\t_closestElement = function(el, fn) {\n\t \tif(!el || el === document) {\n\t \t\treturn false;\n\t \t}\n\n\t \t// don't search elements above pswp__scroll-wrap\n\t \tif(el.getAttribute('class') && el.getAttribute('class').indexOf('pswp__scroll-wrap') > -1 ) {\n\t \t\treturn false;\n\t \t}\n\n\t \tif( fn(el) ) {\n\t \t\treturn el;\n\t \t}\n\n\t \treturn _closestElement(el.parentNode, fn);\n\t},\n\n\t_preventObj = {},\n\t_preventDefaultEventBehaviour = function(e, isDown) {\n\t _preventObj.prevent = !_closestElement(e.target, _options.isClickableElement);\n\n\t\t_shout('preventDragEvent', e, isDown, _preventObj);\n\t\treturn _preventObj.prevent;\n\n\t},\n\t_convertTouchToPoint = function(touch, p) {\n\t\tp.x = touch.pageX;\n\t\tp.y = touch.pageY;\n\t\tp.id = touch.identifier;\n\t\treturn p;\n\t},\n\t_findCenterOfPoints = function(p1, p2, pCenter) {\n\t\tpCenter.x = (p1.x + p2.x) * 0.5;\n\t\tpCenter.y = (p1.y + p2.y) * 0.5;\n\t},\n\t_pushPosPoint = function(time, x, y) {\n\t\tif(time - _gestureCheckSpeedTime > 50) {\n\t\t\tvar o = _posPoints.length > 2 ? _posPoints.shift() : {};\n\t\t\to.x = x;\n\t\t\to.y = y; \n\t\t\t_posPoints.push(o);\n\t\t\t_gestureCheckSpeedTime = time;\n\t\t}\n\t},\n\n\t_calculateVerticalDragOpacityRatio = function() {\n\t\tvar yOffset = _panOffset.y - self.currItem.initialPosition.y; // difference between initial and current position\n\t\treturn 1 - Math.abs( yOffset / (_viewportSize.y / 2) );\n\t},\n\n\t\n\t// points pool, reused during touch events\n\t_ePoint1 = {},\n\t_ePoint2 = {},\n\t_tempPointsArr = [],\n\t_tempCounter,\n\t_getTouchPoints = function(e) {\n\t\t// clean up previous points, without recreating array\n\t\twhile(_tempPointsArr.length > 0) {\n\t\t\t_tempPointsArr.pop();\n\t\t}\n\n\t\tif(!_pointerEventEnabled) {\n\t\t\tif(e.type.indexOf('touch') > -1) {\n\n\t\t\t\tif(e.touches && e.touches.length > 0) {\n\t\t\t\t\t_tempPointsArr[0] = _convertTouchToPoint(e.touches[0], _ePoint1);\n\t\t\t\t\tif(e.touches.length > 1) {\n\t\t\t\t\t\t_tempPointsArr[1] = _convertTouchToPoint(e.touches[1], _ePoint2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t_ePoint1.x = e.pageX;\n\t\t\t\t_ePoint1.y = e.pageY;\n\t\t\t\t_ePoint1.id = '';\n\t\t\t\t_tempPointsArr[0] = _ePoint1;//_ePoint1;\n\t\t\t}\n\t\t} else {\n\t\t\t_tempCounter = 0;\n\t\t\t// we can use forEach, as pointer events are supported only in modern browsers\n\t\t\t_currPointers.forEach(function(p) {\n\t\t\t\tif(_tempCounter === 0) {\n\t\t\t\t\t_tempPointsArr[0] = p;\n\t\t\t\t} else if(_tempCounter === 1) {\n\t\t\t\t\t_tempPointsArr[1] = p;\n\t\t\t\t}\n\t\t\t\t_tempCounter++;\n\n\t\t\t});\n\t\t}\n\t\treturn _tempPointsArr;\n\t},\n\n\t_panOrMoveMainScroll = function(axis, delta) {\n\n\t\tvar panFriction,\n\t\t\toverDiff = 0,\n\t\t\tnewOffset = _panOffset[axis] + delta[axis],\n\t\t\tstartOverDiff,\n\t\t\tdir = delta[axis] > 0,\n\t\t\tnewMainScrollPosition = _mainScrollPos.x + delta.x,\n\t\t\tmainScrollDiff = _mainScrollPos.x - _startMainScrollPos.x,\n\t\t\tnewPanPos,\n\t\t\tnewMainScrollPos;\n\n\t\t// calculate fdistance over the bounds and friction\n\t\tif(newOffset > _currPanBounds.min[axis] || newOffset < _currPanBounds.max[axis]) {\n\t\t\tpanFriction = _options.panEndFriction;\n\t\t\t// Linear increasing of friction, so at 1/4 of viewport it's at max value. \n\t\t\t// Looks not as nice as was expected. Left for history.\n\t\t\t// panFriction = (1 - (_panOffset[axis] + delta[axis] + panBounds.min[axis]) / (_viewportSize[axis] / 4) );\n\t\t} else {\n\t\t\tpanFriction = 1;\n\t\t}\n\t\t\n\t\tnewOffset = _panOffset[axis] + delta[axis] * panFriction;\n\n\t\t// move main scroll or start panning\n\t\tif(_options.allowPanToNext || _currZoomLevel === self.currItem.initialZoomLevel) {\n\n\n\t\t\tif(!_currZoomElementStyle) {\n\t\t\t\t\n\t\t\t\tnewMainScrollPos = newMainScrollPosition;\n\n\t\t\t} else if(_direction === 'h' && axis === 'x' && !_zoomStarted ) {\n\t\t\t\t\n\t\t\t\tif(dir) {\n\t\t\t\t\tif(newOffset > _currPanBounds.min[axis]) {\n\t\t\t\t\t\tpanFriction = _options.panEndFriction;\n\t\t\t\t\t\toverDiff = _currPanBounds.min[axis] - newOffset;\n\t\t\t\t\t\tstartOverDiff = _currPanBounds.min[axis] - _startPanOffset[axis];\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// drag right\n\t\t\t\t\tif( (startOverDiff <= 0 || mainScrollDiff < 0) && _getNumItems() > 1 ) {\n\t\t\t\t\t\tnewMainScrollPos = newMainScrollPosition;\n\t\t\t\t\t\tif(mainScrollDiff < 0 && newMainScrollPosition > _startMainScrollPos.x) {\n\t\t\t\t\t\t\tnewMainScrollPos = _startMainScrollPos.x;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(_currPanBounds.min.x !== _currPanBounds.max.x) {\n\t\t\t\t\t\t\tnewPanPos = newOffset;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif(newOffset < _currPanBounds.max[axis] ) {\n\t\t\t\t\t\tpanFriction =_options.panEndFriction;\n\t\t\t\t\t\toverDiff = newOffset - _currPanBounds.max[axis];\n\t\t\t\t\t\tstartOverDiff = _startPanOffset[axis] - _currPanBounds.max[axis];\n\t\t\t\t\t}\n\n\t\t\t\t\tif( (startOverDiff <= 0 || mainScrollDiff > 0) && _getNumItems() > 1 ) {\n\t\t\t\t\t\tnewMainScrollPos = newMainScrollPosition;\n\n\t\t\t\t\t\tif(mainScrollDiff > 0 && newMainScrollPosition < _startMainScrollPos.x) {\n\t\t\t\t\t\t\tnewMainScrollPos = _startMainScrollPos.x;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(_currPanBounds.min.x !== _currPanBounds.max.x) {\n\t\t\t\t\t\t\tnewPanPos = newOffset;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t\t//\n\t\t\t}\n\n\t\t\tif(axis === 'x') {\n\n\t\t\t\tif(newMainScrollPos !== undefined) {\n\t\t\t\t\t_moveMainScroll(newMainScrollPos, true);\n\t\t\t\t\tif(newMainScrollPos === _startMainScrollPos.x) {\n\t\t\t\t\t\t_mainScrollShifted = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_mainScrollShifted = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(_currPanBounds.min.x !== _currPanBounds.max.x) {\n\t\t\t\t\tif(newPanPos !== undefined) {\n\t\t\t\t\t\t_panOffset.x = newPanPos;\n\t\t\t\t\t} else if(!_mainScrollShifted) {\n\t\t\t\t\t\t_panOffset.x += delta.x * panFriction;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn newMainScrollPos !== undefined;\n\t\t\t}\n\n\t\t}\n\n\t\tif(!_mainScrollAnimating) {\n\t\t\t\n\t\t\tif(!_mainScrollShifted) {\n\t\t\t\tif(_currZoomLevel > self.currItem.fitRatio) {\n\t\t\t\t\t_panOffset[axis] += delta[axis] * panFriction;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t\n\t\t}\n\t\t\n\t},\n\n\t// Pointerdown/touchstart/mousedown handler\n\t_onDragStart = function(e) {\n\n\t\t// Allow dragging only via left mouse button.\n\t\t// As this handler is not added in IE8 - we ignore e.which\n\t\t// \n\t\t// http://www.quirksmode.org/js/events_properties.html\n\t\t// https://developer.mozilla.org/en-US/docs/Web/API/event.button\n\t\tif(e.type === 'mousedown' && e.button > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(_initialZoomRunning) {\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif(_oldAndroidTouchEndTimeout && e.type === 'mousedown') {\n\t\t\treturn;\n\t\t}\n\n\t\tif(_preventDefaultEventBehaviour(e, true)) {\n\t\t\te.preventDefault();\n\t\t}\n\n\n\n\t\t_shout('pointerDown');\n\n\t\tif(_pointerEventEnabled) {\n\t\t\tvar pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\t\t\tif(pointerIndex < 0) {\n\t\t\t\tpointerIndex = _currPointers.length;\n\t\t\t}\n\t\t\t_currPointers[pointerIndex] = {x:e.pageX, y:e.pageY, id: e.pointerId};\n\t\t}\n\t\t\n\n\n\t\tvar startPointsList = _getTouchPoints(e),\n\t\t\tnumPoints = startPointsList.length;\n\n\t\t_currentPoints = null;\n\n\t\t_stopAllAnimations();\n\n\t\t// init drag\n\t\tif(!_isDragging || numPoints === 1) {\n\n\t\t\t\n\n\t\t\t_isDragging = _isFirstMove = true;\n\t\t\tframework.bind(window, _upMoveEvents, self);\n\n\t\t\t_isZoomingIn = \n\t\t\t\t_wasOverInitialZoom = \n\t\t\t\t_opacityChanged = \n\t\t\t\t_verticalDragInitiated = \n\t\t\t\t_mainScrollShifted = \n\t\t\t\t_moved = \n\t\t\t\t_isMultitouch = \n\t\t\t\t_zoomStarted = false;\n\n\t\t\t_direction = null;\n\n\t\t\t_shout('firstTouchStart', startPointsList);\n\n\t\t\t_equalizePoints(_startPanOffset, _panOffset);\n\n\t\t\t_currPanDist.x = _currPanDist.y = 0;\n\t\t\t_equalizePoints(_currPoint, startPointsList[0]);\n\t\t\t_equalizePoints(_startPoint, _currPoint);\n\n\t\t\t//_equalizePoints(_startMainScrollPos, _mainScrollPos);\n\t\t\t_startMainScrollPos.x = _slideSize.x * _currPositionIndex;\n\n\t\t\t_posPoints = [{\n\t\t\t\tx: _currPoint.x,\n\t\t\t\ty: _currPoint.y\n\t\t\t}];\n\n\t\t\t_gestureCheckSpeedTime = _gestureStartTime = _getCurrentTime();\n\n\t\t\t//_mainScrollAnimationEnd(true);\n\t\t\t_calculatePanBounds( _currZoomLevel, true );\n\t\t\t\n\t\t\t// Start rendering\n\t\t\t_stopDragUpdateLoop();\n\t\t\t_dragUpdateLoop();\n\t\t\t\n\t\t}\n\n\t\t// init zoom\n\t\tif(!_isZooming && numPoints > 1 && !_mainScrollAnimating && !_mainScrollShifted) {\n\t\t\t_startZoomLevel = _currZoomLevel;\n\t\t\t_zoomStarted = false; // true if zoom changed at least once\n\n\t\t\t_isZooming = _isMultitouch = true;\n\t\t\t_currPanDist.y = _currPanDist.x = 0;\n\n\t\t\t_equalizePoints(_startPanOffset, _panOffset);\n\n\t\t\t_equalizePoints(p, startPointsList[0]);\n\t\t\t_equalizePoints(p2, startPointsList[1]);\n\n\t\t\t_findCenterOfPoints(p, p2, _currCenterPoint);\n\n\t\t\t_midZoomPoint.x = Math.abs(_currCenterPoint.x) - _panOffset.x;\n\t\t\t_midZoomPoint.y = Math.abs(_currCenterPoint.y) - _panOffset.y;\n\t\t\t_currPointsDistance = _startPointsDistance = _calculatePointsDistance(p, p2);\n\t\t}\n\n\n\t},\n\n\t// Pointermove/touchmove/mousemove handler\n\t_onDragMove = function(e) {\n\n\t\te.preventDefault();\n\n\t\tif(_pointerEventEnabled) {\n\t\t\tvar pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\t\t\tif(pointerIndex > -1) {\n\t\t\t\tvar p = _currPointers[pointerIndex];\n\t\t\t\tp.x = e.pageX;\n\t\t\t\tp.y = e.pageY; \n\t\t\t}\n\t\t}\n\n\t\tif(_isDragging) {\n\t\t\tvar touchesList = _getTouchPoints(e);\n\t\t\tif(!_direction && !_moved && !_isZooming) {\n\n\t\t\t\tif(_mainScrollPos.x !== _slideSize.x * _currPositionIndex) {\n\t\t\t\t\t// if main scroll position is shifted – direction is always horizontal\n\t\t\t\t\t_direction = 'h';\n\t\t\t\t} else {\n\t\t\t\t\tvar diff = Math.abs(touchesList[0].x - _currPoint.x) - Math.abs(touchesList[0].y - _currPoint.y);\n\t\t\t\t\t// check the direction of movement\n\t\t\t\t\tif(Math.abs(diff) >= DIRECTION_CHECK_OFFSET) {\n\t\t\t\t\t\t_direction = diff > 0 ? 'h' : 'v';\n\t\t\t\t\t\t_currentPoints = touchesList;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t_currentPoints = touchesList;\n\t\t\t}\n\t\t}\t\n\t},\n\t// \n\t_renderMovement = function() {\n\n\t\tif(!_currentPoints) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar numPoints = _currentPoints.length;\n\n\t\tif(numPoints === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t_equalizePoints(p, _currentPoints[0]);\n\n\t\tdelta.x = p.x - _currPoint.x;\n\t\tdelta.y = p.y - _currPoint.y;\n\n\t\tif(_isZooming && numPoints > 1) {\n\t\t\t// Handle behaviour for more than 1 point\n\n\t\t\t_currPoint.x = p.x;\n\t\t\t_currPoint.y = p.y;\n\t\t\n\t\t\t// check if one of two points changed\n\t\t\tif( !delta.x && !delta.y && _isEqualPoints(_currentPoints[1], p2) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_equalizePoints(p2, _currentPoints[1]);\n\n\n\t\t\tif(!_zoomStarted) {\n\t\t\t\t_zoomStarted = true;\n\t\t\t\t_shout('zoomGestureStarted');\n\t\t\t}\n\t\t\t\n\t\t\t// Distance between two points\n\t\t\tvar pointsDistance = _calculatePointsDistance(p,p2);\n\n\t\t\tvar zoomLevel = _calculateZoomLevel(pointsDistance);\n\n\t\t\t// slightly over the of initial zoom level\n\t\t\tif(zoomLevel > self.currItem.initialZoomLevel + self.currItem.initialZoomLevel / 15) {\n\t\t\t\t_wasOverInitialZoom = true;\n\t\t\t}\n\n\t\t\t// Apply the friction if zoom level is out of the bounds\n\t\t\tvar zoomFriction = 1,\n\t\t\t\tminZoomLevel = _getMinZoomLevel(),\n\t\t\t\tmaxZoomLevel = _getMaxZoomLevel();\n\n\t\t\tif ( zoomLevel < minZoomLevel ) {\n\t\t\t\t\n\t\t\t\tif(_options.pinchToClose && !_wasOverInitialZoom && _startZoomLevel <= self.currItem.initialZoomLevel) {\n\t\t\t\t\t// fade out background if zooming out\n\t\t\t\t\tvar minusDiff = minZoomLevel - zoomLevel;\n\t\t\t\t\tvar percent = 1 - minusDiff / (minZoomLevel / 1.2);\n\n\t\t\t\t\t_applyBgOpacity(percent);\n\t\t\t\t\t_shout('onPinchClose', percent);\n\t\t\t\t\t_opacityChanged = true;\n\t\t\t\t} else {\n\t\t\t\t\tzoomFriction = (minZoomLevel - zoomLevel) / minZoomLevel;\n\t\t\t\t\tif(zoomFriction > 1) {\n\t\t\t\t\t\tzoomFriction = 1;\n\t\t\t\t\t}\n\t\t\t\t\tzoomLevel = minZoomLevel - zoomFriction * (minZoomLevel / 3);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else if ( zoomLevel > maxZoomLevel ) {\n\t\t\t\t// 1.5 - extra zoom level above the max. E.g. if max is x6, real max 6 + 1.5 = 7.5\n\t\t\t\tzoomFriction = (zoomLevel - maxZoomLevel) / ( minZoomLevel * 6 );\n\t\t\t\tif(zoomFriction > 1) {\n\t\t\t\t\tzoomFriction = 1;\n\t\t\t\t}\n\t\t\t\tzoomLevel = maxZoomLevel + zoomFriction * minZoomLevel;\n\t\t\t}\n\n\t\t\tif(zoomFriction < 0) {\n\t\t\t\tzoomFriction = 0;\n\t\t\t}\n\n\t\t\t// distance between touch points after friction is applied\n\t\t\t_currPointsDistance = pointsDistance;\n\n\t\t\t// _centerPoint - The point in the middle of two pointers\n\t\t\t_findCenterOfPoints(p, p2, _centerPoint);\n\t\t\n\t\t\t// paning with two pointers pressed\n\t\t\t_currPanDist.x += _centerPoint.x - _currCenterPoint.x;\n\t\t\t_currPanDist.y += _centerPoint.y - _currCenterPoint.y;\n\t\t\t_equalizePoints(_currCenterPoint, _centerPoint);\n\n\t\t\t_panOffset.x = _calculatePanOffset('x', zoomLevel);\n\t\t\t_panOffset.y = _calculatePanOffset('y', zoomLevel);\n\n\t\t\t_isZoomingIn = zoomLevel > _currZoomLevel;\n\t\t\t_currZoomLevel = zoomLevel;\n\t\t\t_applyCurrentZoomPan();\n\n\t\t} else {\n\n\t\t\t// handle behaviour for one point (dragging or panning)\n\n\t\t\tif(!_direction) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(_isFirstMove) {\n\t\t\t\t_isFirstMove = false;\n\n\t\t\t\t// subtract drag distance that was used during the detection direction \n\n\t\t\t\tif( Math.abs(delta.x) >= DIRECTION_CHECK_OFFSET) {\n\t\t\t\t\tdelta.x -= _currentPoints[0].x - _startPoint.x;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif( Math.abs(delta.y) >= DIRECTION_CHECK_OFFSET) {\n\t\t\t\t\tdelta.y -= _currentPoints[0].y - _startPoint.y;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_currPoint.x = p.x;\n\t\t\t_currPoint.y = p.y;\n\n\t\t\t// do nothing if pointers position hasn't changed\n\t\t\tif(delta.x === 0 && delta.y === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(_direction === 'v' && _options.closeOnVerticalDrag) {\n\t\t\t\tif(!_canPan()) {\n\t\t\t\t\t_currPanDist.y += delta.y;\n\t\t\t\t\t_panOffset.y += delta.y;\n\n\t\t\t\t\tvar opacityRatio = _calculateVerticalDragOpacityRatio();\n\n\t\t\t\t\t_verticalDragInitiated = true;\n\t\t\t\t\t_shout('onVerticalDrag', opacityRatio);\n\n\t\t\t\t\t_applyBgOpacity(opacityRatio);\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\treturn ;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_pushPosPoint(_getCurrentTime(), p.x, p.y);\n\n\t\t\t_moved = true;\n\t\t\t_currPanBounds = self.currItem.bounds;\n\t\t\t\n\t\t\tvar mainScrollChanged = _panOrMoveMainScroll('x', delta);\n\t\t\tif(!mainScrollChanged) {\n\t\t\t\t_panOrMoveMainScroll('y', delta);\n\n\t\t\t\t_roundPoint(_panOffset);\n\t\t\t\t_applyCurrentZoomPan();\n\t\t\t}\n\n\t\t}\n\n\t},\n\t\n\t// Pointerup/pointercancel/touchend/touchcancel/mouseup event handler\n\t_onDragRelease = function(e) {\n\n\t\tif(_features.isOldAndroid ) {\n\n\t\t\tif(_oldAndroidTouchEndTimeout && e.type === 'mouseup') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// on Android (v4.1, 4.2, 4.3 & possibly older) \n\t\t\t// ghost mousedown/up event isn't preventable via e.preventDefault,\n\t\t\t// which causes fake mousedown event\n\t\t\t// so we block mousedown/up for 600ms\n\t\t\tif( e.type.indexOf('touch') > -1 ) {\n\t\t\t\tclearTimeout(_oldAndroidTouchEndTimeout);\n\t\t\t\t_oldAndroidTouchEndTimeout = setTimeout(function() {\n\t\t\t\t\t_oldAndroidTouchEndTimeout = 0;\n\t\t\t\t}, 600);\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\t_shout('pointerUp');\n\n\t\tif(_preventDefaultEventBehaviour(e, false)) {\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tvar releasePoint;\n\n\t\tif(_pointerEventEnabled) {\n\t\t\tvar pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\t\t\t\n\t\t\tif(pointerIndex > -1) {\n\t\t\t\treleasePoint = _currPointers.splice(pointerIndex, 1)[0];\n\n\t\t\t\tif(navigator.msPointerEnabled) {\n\t\t\t\t\tvar MSPOINTER_TYPES = {\n\t\t\t\t\t\t4: 'mouse', // event.MSPOINTER_TYPE_MOUSE\n\t\t\t\t\t\t2: 'touch', // event.MSPOINTER_TYPE_TOUCH \n\t\t\t\t\t\t3: 'pen' // event.MSPOINTER_TYPE_PEN\n\t\t\t\t\t};\n\t\t\t\t\treleasePoint.type = MSPOINTER_TYPES[e.pointerType];\n\n\t\t\t\t\tif(!releasePoint.type) {\n\t\t\t\t\t\treleasePoint.type = e.pointerType || 'mouse';\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treleasePoint.type = e.pointerType || 'mouse';\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tvar touchList = _getTouchPoints(e),\n\t\t\tgestureType,\n\t\t\tnumPoints = touchList.length;\n\n\t\tif(e.type === 'mouseup') {\n\t\t\tnumPoints = 0;\n\t\t}\n\n\t\t// Do nothing if there were 3 touch points or more\n\t\tif(numPoints === 2) {\n\t\t\t_currentPoints = null;\n\t\t\treturn true;\n\t\t}\n\n\t\t// if second pointer released\n\t\tif(numPoints === 1) {\n\t\t\t_equalizePoints(_startPoint, touchList[0]);\n\t\t}\t\t\t\t\n\n\n\t\t// pointer hasn't moved, send \"tap release\" point\n\t\tif(numPoints === 0 && !_direction && !_mainScrollAnimating) {\n\t\t\tif(!releasePoint) {\n\t\t\t\tif(e.type === 'mouseup') {\n\t\t\t\t\treleasePoint = {x: e.pageX, y: e.pageY, type:'mouse'};\n\t\t\t\t} else if(e.changedTouches && e.changedTouches[0]) {\n\t\t\t\t\treleasePoint = {x: e.changedTouches[0].pageX, y: e.changedTouches[0].pageY, type:'touch'};\n\t\t\t\t}\t\t\n\t\t\t}\n\n\t\t\t_shout('touchRelease', e, releasePoint);\n\t\t}\n\n\t\t// Difference in time between releasing of two last touch points (zoom gesture)\n\t\tvar releaseTimeDiff = -1;\n\n\t\t// Gesture completed, no pointers left\n\t\tif(numPoints === 0) {\n\t\t\t_isDragging = false;\n\t\t\tframework.unbind(window, _upMoveEvents, self);\n\n\t\t\t_stopDragUpdateLoop();\n\n\t\t\tif(_isZooming) {\n\t\t\t\t// Two points released at the same time\n\t\t\t\treleaseTimeDiff = 0;\n\t\t\t} else if(_lastReleaseTime !== -1) {\n\t\t\t\treleaseTimeDiff = _getCurrentTime() - _lastReleaseTime;\n\t\t\t}\n\t\t}\n\t\t_lastReleaseTime = numPoints === 1 ? _getCurrentTime() : -1;\n\t\t\n\t\tif(releaseTimeDiff !== -1 && releaseTimeDiff < 150) {\n\t\t\tgestureType = 'zoom';\n\t\t} else {\n\t\t\tgestureType = 'swipe';\n\t\t}\n\n\t\tif(_isZooming && numPoints < 2) {\n\t\t\t_isZooming = false;\n\n\t\t\t// Only second point released\n\t\t\tif(numPoints === 1) {\n\t\t\t\tgestureType = 'zoomPointerUp';\n\t\t\t}\n\t\t\t_shout('zoomGestureEnded');\n\t\t}\n\n\t\t_currentPoints = null;\n\t\tif(!_moved && !_zoomStarted && !_mainScrollAnimating && !_verticalDragInitiated) {\n\t\t\t// nothing to animate\n\t\t\treturn;\n\t\t}\n\t\n\t\t_stopAllAnimations();\n\n\t\t\n\t\tif(!_releaseAnimData) {\n\t\t\t_releaseAnimData = _initDragReleaseAnimationData();\n\t\t}\n\t\t\n\t\t_releaseAnimData.calculateSwipeSpeed('x');\n\n\n\t\tif(_verticalDragInitiated) {\n\n\t\t\tvar opacityRatio = _calculateVerticalDragOpacityRatio();\n\n\t\t\tif(opacityRatio < _options.verticalDragRange) {\n\t\t\t\tself.close();\n\t\t\t} else {\n\t\t\t\tvar initalPanY = _panOffset.y,\n\t\t\t\t\tinitialBgOpacity = _bgOpacity;\n\n\t\t\t\t_animateProp('verticalDrag', 0, 1, 300, framework.easing.cubic.out, function(now) {\n\t\t\t\t\t\n\t\t\t\t\t_panOffset.y = (self.currItem.initialPosition.y - initalPanY) * now + initalPanY;\n\n\t\t\t\t\t_applyBgOpacity( (1 - initialBgOpacity) * now + initialBgOpacity );\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t});\n\n\t\t\t\t_shout('onVerticalDrag', 1);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\n\t\t// main scroll \n\t\tif( (_mainScrollShifted || _mainScrollAnimating) && numPoints === 0) {\n\t\t\tvar itemChanged = _finishSwipeMainScrollGesture(gestureType, _releaseAnimData);\n\t\t\tif(itemChanged) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgestureType = 'zoomPointerUp';\n\t\t}\n\n\t\t// prevent zoom/pan animation when main scroll animation runs\n\t\tif(_mainScrollAnimating) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Complete simple zoom gesture (reset zoom level if it's out of the bounds) \n\t\tif(gestureType !== 'swipe') {\n\t\t\t_completeZoomGesture();\n\t\t\treturn;\n\t\t}\n\t\n\t\t// Complete pan gesture if main scroll is not shifted, and it's possible to pan current image\n\t\tif(!_mainScrollShifted && _currZoomLevel > self.currItem.fitRatio) {\n\t\t\t_completePanGesture(_releaseAnimData);\n\t\t}\n\t},\n\n\n\t// Returns object with data about gesture\n\t// It's created only once and then reused\n\t_initDragReleaseAnimationData = function() {\n\t\t// temp local vars\n\t\tvar lastFlickDuration,\n\t\t\ttempReleasePos;\n\n\t\t// s = this\n\t\tvar s = {\n\t\t\tlastFlickOffset: {},\n\t\t\tlastFlickDist: {},\n\t\t\tlastFlickSpeed: {},\n\t\t\tslowDownRatio: {},\n\t\t\tslowDownRatioReverse: {},\n\t\t\tspeedDecelerationRatio: {},\n\t\t\tspeedDecelerationRatioAbs: {},\n\t\t\tdistanceOffset: {},\n\t\t\tbackAnimDestination: {},\n\t\t\tbackAnimStarted: {},\n\t\t\tcalculateSwipeSpeed: function(axis) {\n\t\t\t\t\n\n\t\t\t\tif( _posPoints.length > 1) {\n\t\t\t\t\tlastFlickDuration = _getCurrentTime() - _gestureCheckSpeedTime + 50;\n\t\t\t\t\ttempReleasePos = _posPoints[_posPoints.length-2][axis];\n\t\t\t\t} else {\n\t\t\t\t\tlastFlickDuration = _getCurrentTime() - _gestureStartTime; // total gesture duration\n\t\t\t\t\ttempReleasePos = _startPoint[axis];\n\t\t\t\t}\n\t\t\t\ts.lastFlickOffset[axis] = _currPoint[axis] - tempReleasePos;\n\t\t\t\ts.lastFlickDist[axis] = Math.abs(s.lastFlickOffset[axis]);\n\t\t\t\tif(s.lastFlickDist[axis] > 20) {\n\t\t\t\t\ts.lastFlickSpeed[axis] = s.lastFlickOffset[axis] / lastFlickDuration;\n\t\t\t\t} else {\n\t\t\t\t\ts.lastFlickSpeed[axis] = 0;\n\t\t\t\t}\n\t\t\t\tif( Math.abs(s.lastFlickSpeed[axis]) < 0.1 ) {\n\t\t\t\t\ts.lastFlickSpeed[axis] = 0;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ts.slowDownRatio[axis] = 0.95;\n\t\t\t\ts.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];\n\t\t\t\ts.speedDecelerationRatio[axis] = 1;\n\t\t\t},\n\n\t\t\tcalculateOverBoundsAnimOffset: function(axis, speed) {\n\t\t\t\tif(!s.backAnimStarted[axis]) {\n\n\t\t\t\t\tif(_panOffset[axis] > _currPanBounds.min[axis]) {\n\t\t\t\t\t\ts.backAnimDestination[axis] = _currPanBounds.min[axis];\n\t\t\t\t\t\t\n\t\t\t\t\t} else if(_panOffset[axis] < _currPanBounds.max[axis]) {\n\t\t\t\t\t\ts.backAnimDestination[axis] = _currPanBounds.max[axis];\n\t\t\t\t\t}\n\n\t\t\t\t\tif(s.backAnimDestination[axis] !== undefined) {\n\t\t\t\t\t\ts.slowDownRatio[axis] = 0.7;\n\t\t\t\t\t\ts.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];\n\t\t\t\t\t\tif(s.speedDecelerationRatioAbs[axis] < 0.05) {\n\n\t\t\t\t\t\t\ts.lastFlickSpeed[axis] = 0;\n\t\t\t\t\t\t\ts.backAnimStarted[axis] = true;\n\n\t\t\t\t\t\t\t_animateProp('bounceZoomPan'+axis,_panOffset[axis], \n\t\t\t\t\t\t\t\ts.backAnimDestination[axis], \n\t\t\t\t\t\t\t\tspeed || 300, \n\t\t\t\t\t\t\t\tframework.easing.sine.out, \n\t\t\t\t\t\t\t\tfunction(pos) {\n\t\t\t\t\t\t\t\t\t_panOffset[axis] = pos;\n\t\t\t\t\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Reduces the speed by slowDownRatio (per 10ms)\n\t\t\tcalculateAnimOffset: function(axis) {\n\t\t\t\tif(!s.backAnimStarted[axis]) {\n\t\t\t\t\ts.speedDecelerationRatio[axis] = s.speedDecelerationRatio[axis] * (s.slowDownRatio[axis] + \n\t\t\t\t\t\t\t\t\t\t\t\ts.slowDownRatioReverse[axis] - \n\t\t\t\t\t\t\t\t\t\t\t\ts.slowDownRatioReverse[axis] * s.timeDiff / 10);\n\n\t\t\t\t\ts.speedDecelerationRatioAbs[axis] = Math.abs(s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis]);\n\t\t\t\t\ts.distanceOffset[axis] = s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis] * s.timeDiff;\n\t\t\t\t\t_panOffset[axis] += s.distanceOffset[axis];\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tpanAnimLoop: function() {\n\t\t\t\tif ( _animations.zoomPan ) {\n\t\t\t\t\t_animations.zoomPan.raf = _requestAF(s.panAnimLoop);\n\n\t\t\t\t\ts.now = _getCurrentTime();\n\t\t\t\t\ts.timeDiff = s.now - s.lastNow;\n\t\t\t\t\ts.lastNow = s.now;\n\t\t\t\t\t\n\t\t\t\t\ts.calculateAnimOffset('x');\n\t\t\t\t\ts.calculateAnimOffset('y');\n\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\n\t\t\t\t\ts.calculateOverBoundsAnimOffset('x');\n\t\t\t\t\ts.calculateOverBoundsAnimOffset('y');\n\n\n\t\t\t\t\tif (s.speedDecelerationRatioAbs.x < 0.05 && s.speedDecelerationRatioAbs.y < 0.05) {\n\n\t\t\t\t\t\t// round pan position\n\t\t\t\t\t\t_panOffset.x = Math.round(_panOffset.x);\n\t\t\t\t\t\t_panOffset.y = Math.round(_panOffset.y);\n\t\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\t\n\t\t\t\t\t\t_stopAnimation('zoomPan');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t};\n\t\treturn s;\n\t},\n\n\t_completePanGesture = function(animData) {\n\t\t// calculate swipe speed for Y axis (paanning)\n\t\tanimData.calculateSwipeSpeed('y');\n\n\t\t_currPanBounds = self.currItem.bounds;\n\t\t\n\t\tanimData.backAnimDestination = {};\n\t\tanimData.backAnimStarted = {};\n\n\t\t// Avoid acceleration animation if speed is too low\n\t\tif(Math.abs(animData.lastFlickSpeed.x) <= 0.05 && Math.abs(animData.lastFlickSpeed.y) <= 0.05 ) {\n\t\t\tanimData.speedDecelerationRatioAbs.x = animData.speedDecelerationRatioAbs.y = 0;\n\n\t\t\t// Run pan drag release animation. E.g. if you drag image and release finger without momentum.\n\t\t\tanimData.calculateOverBoundsAnimOffset('x');\n\t\t\tanimData.calculateOverBoundsAnimOffset('y');\n\t\t\treturn true;\n\t\t}\n\n\t\t// Animation loop that controls the acceleration after pan gesture ends\n\t\t_registerStartAnimation('zoomPan');\n\t\tanimData.lastNow = _getCurrentTime();\n\t\tanimData.panAnimLoop();\n\t},\n\n\n\t_finishSwipeMainScrollGesture = function(gestureType, _releaseAnimData) {\n\t\tvar itemChanged;\n\t\tif(!_mainScrollAnimating) {\n\t\t\t_currZoomedItemIndex = _currentItemIndex;\n\t\t}\n\n\n\t\t\n\t\tvar itemsDiff;\n\n\t\tif(gestureType === 'swipe') {\n\t\t\tvar totalShiftDist = _currPoint.x - _startPoint.x,\n\t\t\t\tisFastLastFlick = _releaseAnimData.lastFlickDist.x < 10;\n\n\t\t\t// if container is shifted for more than MIN_SWIPE_DISTANCE, \n\t\t\t// and last flick gesture was in right direction\n\t\t\tif(totalShiftDist > MIN_SWIPE_DISTANCE && \n\t\t\t\t(isFastLastFlick || _releaseAnimData.lastFlickOffset.x > 20) ) {\n\t\t\t\t// go to prev item\n\t\t\t\titemsDiff = -1;\n\t\t\t} else if(totalShiftDist < -MIN_SWIPE_DISTANCE && \n\t\t\t\t(isFastLastFlick || _releaseAnimData.lastFlickOffset.x < -20) ) {\n\t\t\t\t// go to next item\n\t\t\t\titemsDiff = 1;\n\t\t\t}\n\t\t}\n\n\t\tvar nextCircle;\n\n\t\tif(itemsDiff) {\n\t\t\t\n\t\t\t_currentItemIndex += itemsDiff;\n\n\t\t\tif(_currentItemIndex < 0) {\n\t\t\t\t_currentItemIndex = _options.loop ? _getNumItems()-1 : 0;\n\t\t\t\tnextCircle = true;\n\t\t\t} else if(_currentItemIndex >= _getNumItems()) {\n\t\t\t\t_currentItemIndex = _options.loop ? 0 : _getNumItems()-1;\n\t\t\t\tnextCircle = true;\n\t\t\t}\n\n\t\t\tif(!nextCircle || _options.loop) {\n\t\t\t\t_indexDiff += itemsDiff;\n\t\t\t\t_currPositionIndex -= itemsDiff;\n\t\t\t\titemChanged = true;\n\t\t\t}\n\t\t\t\n\n\t\t\t\n\t\t}\n\n\t\tvar animateToX = _slideSize.x * _currPositionIndex;\n\t\tvar animateToDist = Math.abs( animateToX - _mainScrollPos.x );\n\t\tvar finishAnimDuration;\n\n\n\t\tif(!itemChanged && animateToX > _mainScrollPos.x !== _releaseAnimData.lastFlickSpeed.x > 0) {\n\t\t\t// \"return to current\" duration, e.g. when dragging from slide 0 to -1\n\t\t\tfinishAnimDuration = 333; \n\t\t} else {\n\t\t\tfinishAnimDuration = Math.abs(_releaseAnimData.lastFlickSpeed.x) > 0 ? \n\t\t\t\t\t\t\t\t\tanimateToDist / Math.abs(_releaseAnimData.lastFlickSpeed.x) : \n\t\t\t\t\t\t\t\t\t333;\n\n\t\t\tfinishAnimDuration = Math.min(finishAnimDuration, 400);\n\t\t\tfinishAnimDuration = Math.max(finishAnimDuration, 250);\n\t\t}\n\n\t\tif(_currZoomedItemIndex === _currentItemIndex) {\n\t\t\titemChanged = false;\n\t\t}\n\t\t\n\t\t_mainScrollAnimating = true;\n\t\t\n\t\t_shout('mainScrollAnimStart');\n\n\t\t_animateProp('mainScroll', _mainScrollPos.x, animateToX, finishAnimDuration, framework.easing.cubic.out, \n\t\t\t_moveMainScroll,\n\t\t\tfunction() {\n\t\t\t\t_stopAllAnimations();\n\t\t\t\t_mainScrollAnimating = false;\n\t\t\t\t_currZoomedItemIndex = -1;\n\t\t\t\t\n\t\t\t\tif(itemChanged || _currZoomedItemIndex !== _currentItemIndex) {\n\t\t\t\t\tself.updateCurrItem();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t_shout('mainScrollAnimComplete');\n\t\t\t}\n\t\t);\n\n\t\tif(itemChanged) {\n\t\t\tself.updateCurrItem(true);\n\t\t}\n\n\t\treturn itemChanged;\n\t},\n\n\t_calculateZoomLevel = function(touchesDistance) {\n\t\treturn 1 / _startPointsDistance * touchesDistance * _startZoomLevel;\n\t},\n\n\t// Resets zoom if it's out of bounds\n\t_completeZoomGesture = function() {\n\t\tvar destZoomLevel = _currZoomLevel,\n\t\t\tminZoomLevel = _getMinZoomLevel(),\n\t\t\tmaxZoomLevel = _getMaxZoomLevel();\n\n\t\tif ( _currZoomLevel < minZoomLevel ) {\n\t\t\tdestZoomLevel = minZoomLevel;\n\t\t} else if ( _currZoomLevel > maxZoomLevel ) {\n\t\t\tdestZoomLevel = maxZoomLevel;\n\t\t}\n\n\t\tvar destOpacity = 1,\n\t\t\tonUpdate,\n\t\t\tinitialOpacity = _bgOpacity;\n\n\t\tif(_opacityChanged && !_isZoomingIn && !_wasOverInitialZoom && _currZoomLevel < minZoomLevel) {\n\t\t\t//_closedByScroll = true;\n\t\t\tself.close();\n\t\t\treturn true;\n\t\t}\n\n\t\tif(_opacityChanged) {\n\t\t\tonUpdate = function(now) {\n\t\t\t\t_applyBgOpacity( (destOpacity - initialOpacity) * now + initialOpacity );\n\t\t\t};\n\t\t}\n\n\t\tself.zoomTo(destZoomLevel, 0, 200, framework.easing.cubic.out, onUpdate);\n\t\treturn true;\n\t};\n\n\n_registerModule('Gestures', {\n\tpublicMethods: {\n\n\t\tinitGestures: function() {\n\n\t\t\t// helper function that builds touch/pointer/mouse events\n\t\t\tvar addEventNames = function(pref, down, move, up, cancel) {\n\t\t\t\t_dragStartEvent = pref + down;\n\t\t\t\t_dragMoveEvent = pref + move;\n\t\t\t\t_dragEndEvent = pref + up;\n\t\t\t\tif(cancel) {\n\t\t\t\t\t_dragCancelEvent = pref + cancel;\n\t\t\t\t} else {\n\t\t\t\t\t_dragCancelEvent = '';\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t_pointerEventEnabled = _features.pointerEvent;\n\t\t\tif(_pointerEventEnabled && _features.touch) {\n\t\t\t\t// we don't need touch events, if browser supports pointer events\n\t\t\t\t_features.touch = false;\n\t\t\t}\n\n\t\t\tif(_pointerEventEnabled) {\n\t\t\t\tif(navigator.msPointerEnabled) {\n\t\t\t\t\t// IE10 pointer events are case-sensitive\n\t\t\t\t\taddEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');\n\t\t\t\t} else {\n\t\t\t\t\taddEventNames('pointer', 'down', 'move', 'up', 'cancel');\n\t\t\t\t}\n\t\t\t} else if(_features.touch) {\n\t\t\t\taddEventNames('touch', 'start', 'move', 'end', 'cancel');\n\t\t\t\t_likelyTouchDevice = true;\n\t\t\t} else {\n\t\t\t\taddEventNames('mouse', 'down', 'move', 'up');\t\n\t\t\t}\n\n\t\t\t_upMoveEvents = _dragMoveEvent + ' ' + _dragEndEvent + ' ' + _dragCancelEvent;\n\t\t\t_downEvents = _dragStartEvent;\n\n\t\t\tif(_pointerEventEnabled && !_likelyTouchDevice) {\n\t\t\t\t_likelyTouchDevice = (navigator.maxTouchPoints > 1) || (navigator.msMaxTouchPoints > 1);\n\t\t\t}\n\t\t\t// make variable public\n\t\t\tself.likelyTouchDevice = _likelyTouchDevice; \n\t\t\t\n\t\t\t_globalEventHandlers[_dragStartEvent] = _onDragStart;\n\t\t\t_globalEventHandlers[_dragMoveEvent] = _onDragMove;\n\t\t\t_globalEventHandlers[_dragEndEvent] = _onDragRelease; // the Kraken\n\n\t\t\tif(_dragCancelEvent) {\n\t\t\t\t_globalEventHandlers[_dragCancelEvent] = _globalEventHandlers[_dragEndEvent];\n\t\t\t}\n\n\t\t\t// Bind mouse events on device with detected hardware touch support, in case it supports multiple types of input.\n\t\t\tif(_features.touch) {\n\t\t\t\t_downEvents += ' mousedown';\n\t\t\t\t_upMoveEvents += ' mousemove mouseup';\n\t\t\t\t_globalEventHandlers.mousedown = _globalEventHandlers[_dragStartEvent];\n\t\t\t\t_globalEventHandlers.mousemove = _globalEventHandlers[_dragMoveEvent];\n\t\t\t\t_globalEventHandlers.mouseup = _globalEventHandlers[_dragEndEvent];\n\t\t\t}\n\n\t\t\tif(!_likelyTouchDevice) {\n\t\t\t\t// don't allow pan to next slide from zoomed state on Desktop\n\t\t\t\t_options.allowPanToNext = false;\n\t\t\t}\n\t\t}\n\n\t}\n});\n\n\n/*>>gestures*/\n\n/*>>show-hide-transition*/\n/**\n * show-hide-transition.js:\n *\n * Manages initial opening or closing transition.\n *\n * If you're not planning to use transition for gallery at all,\n * you may set options hideAnimationDuration and showAnimationDuration to 0,\n * and just delete startAnimation function.\n * \n */\n\n\nvar _showOrHideTimeout,\n\t_showOrHide = function(item, img, out, completeFn) {\n\n\t\tif(_showOrHideTimeout) {\n\t\t\tclearTimeout(_showOrHideTimeout);\n\t\t}\n\n\t\t_initialZoomRunning = true;\n\t\t_initialContentSet = true;\n\t\t\n\t\t// dimensions of small thumbnail {x:,y:,w:}.\n\t\t// Height is optional, as calculated based on large image.\n\t\tvar thumbBounds; \n\t\tif(item.initialLayout) {\n\t\t\tthumbBounds = item.initialLayout;\n\t\t\titem.initialLayout = null;\n\t\t} else {\n\t\t\tthumbBounds = _options.getThumbBoundsFn && _options.getThumbBoundsFn(_currentItemIndex);\n\t\t}\n\n\t\tvar duration = out ? _options.hideAnimationDuration : _options.showAnimationDuration;\n\n\t\tvar onComplete = function() {\n\t\t\t_stopAnimation('initialZoom');\n\t\t\tif(!out) {\n\t\t\t\t_applyBgOpacity(1);\n\t\t\t\tif(img) {\n\t\t\t\t\timg.style.display = 'block';\n\t\t\t\t}\n\t\t\t\tframework.addClass(template, 'pswp--animated-in');\n\t\t\t\t_shout('initialZoom' + (out ? 'OutEnd' : 'InEnd'));\n\t\t\t} else {\n\t\t\t\tself.template.removeAttribute('style');\n\t\t\t\tself.bg.removeAttribute('style');\n\t\t\t}\n\n\t\t\tif(completeFn) {\n\t\t\t\tcompleteFn();\n\t\t\t}\n\t\t\t_initialZoomRunning = false;\n\t\t};\n\n\t\t// if bounds aren't provided, just open gallery without animation\n\t\tif(!duration || !thumbBounds || thumbBounds.x === undefined) {\n\n\t\t\t_shout('initialZoom' + (out ? 'Out' : 'In') );\n\n\t\t\t_currZoomLevel = item.initialZoomLevel;\n\t\t\t_equalizePoints(_panOffset, item.initialPosition );\n\t\t\t_applyCurrentZoomPan();\n\n\t\t\ttemplate.style.opacity = out ? 0 : 1;\n\t\t\t_applyBgOpacity(1);\n\n\t\t\tif(duration) {\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tonComplete();\n\t\t\t\t}, duration);\n\t\t\t} else {\n\t\t\t\tonComplete();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvar startAnimation = function() {\n\t\t\tvar closeWithRaf = _closedByScroll,\n\t\t\t\tfadeEverything = !self.currItem.src || self.currItem.loadError || _options.showHideOpacity;\n\t\t\t\n\t\t\t// apply hw-acceleration to image\n\t\t\tif(item.miniImg) {\n\t\t\t\titem.miniImg.style.webkitBackfaceVisibility = 'hidden';\n\t\t\t}\n\n\t\t\tif(!out) {\n\t\t\t\t_currZoomLevel = thumbBounds.w / item.w;\n\t\t\t\t_panOffset.x = thumbBounds.x;\n\t\t\t\t_panOffset.y = thumbBounds.y - _initalWindowScrollY;\n\n\t\t\t\tself[fadeEverything ? 'template' : 'bg'].style.opacity = 0.001;\n\t\t\t\t_applyCurrentZoomPan();\n\t\t\t}\n\n\t\t\t_registerStartAnimation('initialZoom');\n\t\t\t\n\t\t\tif(out && !closeWithRaf) {\n\t\t\t\tframework.removeClass(template, 'pswp--animated-in');\n\t\t\t}\n\n\t\t\tif(fadeEverything) {\n\t\t\t\tif(out) {\n\t\t\t\t\tframework[ (closeWithRaf ? 'remove' : 'add') + 'Class' ](template, 'pswp--animate_opacity');\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tframework.addClass(template, 'pswp--animate_opacity');\n\t\t\t\t\t}, 30);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_showOrHideTimeout = setTimeout(function() {\n\n\t\t\t\t_shout('initialZoom' + (out ? 'Out' : 'In') );\n\t\t\t\t\n\n\t\t\t\tif(!out) {\n\n\t\t\t\t\t// \"in\" animation always uses CSS transitions (instead of rAF).\n\t\t\t\t\t// CSS transition work faster here, \n\t\t\t\t\t// as developer may also want to animate other things, \n\t\t\t\t\t// like ui on top of sliding area, which can be animated just via CSS\n\t\t\t\t\t\n\t\t\t\t\t_currZoomLevel = item.initialZoomLevel;\n\t\t\t\t\t_equalizePoints(_panOffset, item.initialPosition );\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t_applyBgOpacity(1);\n\n\t\t\t\t\tif(fadeEverything) {\n\t\t\t\t\t\ttemplate.style.opacity = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_applyBgOpacity(1);\n\t\t\t\t\t}\n\n\t\t\t\t\t_showOrHideTimeout = setTimeout(onComplete, duration + 20);\n\t\t\t\t} else {\n\n\t\t\t\t\t// \"out\" animation uses rAF only when PhotoSwipe is closed by browser scroll, to recalculate position\n\t\t\t\t\tvar destZoomLevel = thumbBounds.w / item.w,\n\t\t\t\t\t\tinitialPanOffset = {\n\t\t\t\t\t\t\tx: _panOffset.x,\n\t\t\t\t\t\t\ty: _panOffset.y\n\t\t\t\t\t\t},\n\t\t\t\t\t\tinitialZoomLevel = _currZoomLevel,\n\t\t\t\t\t\tinitalBgOpacity = _bgOpacity,\n\t\t\t\t\t\tonUpdate = function(now) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(now === 1) {\n\t\t\t\t\t\t\t\t_currZoomLevel = destZoomLevel;\n\t\t\t\t\t\t\t\t_panOffset.x = thumbBounds.x;\n\t\t\t\t\t\t\t\t_panOffset.y = thumbBounds.y - _currentWindowScrollY;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_currZoomLevel = (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;\n\t\t\t\t\t\t\t\t_panOffset.x = (thumbBounds.x - initialPanOffset.x) * now + initialPanOffset.x;\n\t\t\t\t\t\t\t\t_panOffset.y = (thumbBounds.y - _currentWindowScrollY - initialPanOffset.y) * now + initialPanOffset.y;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\t\tif(fadeEverything) {\n\t\t\t\t\t\t\t\ttemplate.style.opacity = 1 - now;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_applyBgOpacity( initalBgOpacity - now * initalBgOpacity );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\tif(closeWithRaf) {\n\t\t\t\t\t\t_animateProp('initialZoom', 0, 1, duration, framework.easing.cubic.out, onUpdate, onComplete);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonUpdate(1);\n\t\t\t\t\t\t_showOrHideTimeout = setTimeout(onComplete, duration + 20);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t}, out ? 25 : 90); // Main purpose of this delay is to give browser time to paint and\n\t\t\t\t\t// create composite layers of PhotoSwipe UI parts (background, controls, caption, arrows).\n\t\t\t\t\t// Which avoids lag at the beginning of scale transition.\n\t\t};\n\t\tstartAnimation();\n\n\t\t\n\t};\n\n/*>>show-hide-transition*/\n\n/*>>items-controller*/\n/**\n*\n* Controller manages gallery items, their dimensions, and their content.\n* \n*/\n\nvar _items,\n\t_tempPanAreaSize = {},\n\t_imagesToAppendPool = [],\n\t_initialContentSet,\n\t_initialZoomRunning,\n\t_controllerDefaultOptions = {\n\t\tindex: 0,\n\t\terrorMsg: '<div class=\"pswp__error-msg\"><a href=\"%url%\" target=\"_blank\">The image</a> could not be loaded.</div>',\n\t\tforceProgressiveLoading: false, // TODO\n\t\tpreload: [1,1],\n\t\tgetNumItemsFn: function() {\n\t\t\treturn _items.length;\n\t\t}\n\t};\n\n\nvar _getItemAt,\n\t_getNumItems,\n\t_initialIsLoop,\n\t_getZeroBounds = function() {\n\t\treturn {\n\t\t\tcenter:{x:0,y:0}, \n\t\t\tmax:{x:0,y:0}, \n\t\t\tmin:{x:0,y:0}\n\t\t};\n\t},\n\t_calculateSingleItemPanBounds = function(item, realPanElementW, realPanElementH ) {\n\t\tvar bounds = item.bounds;\n\n\t\t// position of element when it's centered\n\t\tbounds.center.x = Math.round((_tempPanAreaSize.x - realPanElementW) / 2);\n\t\tbounds.center.y = Math.round((_tempPanAreaSize.y - realPanElementH) / 2) + item.vGap.top;\n\n\t\t// maximum pan position\n\t\tbounds.max.x = (realPanElementW > _tempPanAreaSize.x) ? \n\t\t\t\t\t\t\tMath.round(_tempPanAreaSize.x - realPanElementW) : \n\t\t\t\t\t\t\tbounds.center.x;\n\t\t\n\t\tbounds.max.y = (realPanElementH > _tempPanAreaSize.y) ? \n\t\t\t\t\t\t\tMath.round(_tempPanAreaSize.y - realPanElementH) + item.vGap.top : \n\t\t\t\t\t\t\tbounds.center.y;\n\t\t\n\t\t// minimum pan position\n\t\tbounds.min.x = (realPanElementW > _tempPanAreaSize.x) ? 0 : bounds.center.x;\n\t\tbounds.min.y = (realPanElementH > _tempPanAreaSize.y) ? item.vGap.top : bounds.center.y;\n\t},\n\t_calculateItemSize = function(item, viewportSize, zoomLevel) {\n\n\t\tif (item.src && !item.loadError) {\n\t\t\tvar isInitial = !zoomLevel;\n\t\t\t\n\t\t\tif(isInitial) {\n\t\t\t\tif(!item.vGap) {\n\t\t\t\t\titem.vGap = {top:0,bottom:0};\n\t\t\t\t}\n\t\t\t\t// allows overriding vertical margin for individual items\n\t\t\t\t_shout('parseVerticalMargin', item);\n\t\t\t}\n\n\n\t\t\t_tempPanAreaSize.x = viewportSize.x;\n\t\t\t_tempPanAreaSize.y = viewportSize.y - item.vGap.top - item.vGap.bottom;\n\n\t\t\tif (isInitial) {\n\t\t\t\tvar hRatio = _tempPanAreaSize.x / item.w;\n\t\t\t\tvar vRatio = _tempPanAreaSize.y / item.h;\n\n\t\t\t\titem.fitRatio = hRatio < vRatio ? hRatio : vRatio;\n\t\t\t\t//item.fillRatio = hRatio > vRatio ? hRatio : vRatio;\n\n\t\t\t\tvar scaleMode = _options.scaleMode;\n\n\t\t\t\tif (scaleMode === 'orig') {\n\t\t\t\t\tzoomLevel = 1;\n\t\t\t\t} else if (scaleMode === 'fit') {\n\t\t\t\t\tzoomLevel = item.fitRatio;\n\t\t\t\t}\n\n\t\t\t\tif (zoomLevel > 1) {\n\t\t\t\t\tzoomLevel = 1;\n\t\t\t\t}\n\n\t\t\t\titem.initialZoomLevel = zoomLevel;\n\t\t\t\t\n\t\t\t\tif(!item.bounds) {\n\t\t\t\t\t// reuse bounds object\n\t\t\t\t\titem.bounds = _getZeroBounds(); \n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!zoomLevel) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_calculateSingleItemPanBounds(item, item.w * zoomLevel, item.h * zoomLevel);\n\n\t\t\tif (isInitial && zoomLevel === item.initialZoomLevel) {\n\t\t\t\titem.initialPosition = item.bounds.center;\n\t\t\t}\n\n\t\t\treturn item.bounds;\n\t\t} else {\n\t\t\titem.w = item.h = 0;\n\t\t\titem.initialZoomLevel = item.fitRatio = 1;\n\t\t\titem.bounds = _getZeroBounds();\n\t\t\titem.initialPosition = item.bounds.center;\n\n\t\t\t// if it's not image, we return zero bounds (content is not zoomable)\n\t\t\treturn item.bounds;\n\t\t}\n\t\t\n\t},\n\n\t\n\n\n\t_appendImage = function(index, item, baseDiv, img, preventAnimation, keepPlaceholder) {\n\t\t\n\n\t\tif(item.loadError) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(img) {\n\n\t\t\titem.imageAppended = true;\n\t\t\t_setImageSize(item, img, (item === self.currItem && _renderMaxResolution) );\n\t\t\t\n\t\t\tbaseDiv.appendChild(img);\n\n\t\t\tif(keepPlaceholder) {\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tif(item && item.loaded && item.placeholder) {\n\t\t\t\t\t\titem.placeholder.style.display = 'none';\n\t\t\t\t\t\titem.placeholder = null;\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t}\n\t\t}\n\t},\n\t\n\n\n\t_preloadImage = function(item) {\n\t\titem.loading = true;\n\t\titem.loaded = false;\n\t\tvar img = item.img = framework.createEl('pswp__img', 'img');\n\t\tvar onComplete = function() {\n\t\t\titem.loading = false;\n\t\t\titem.loaded = true;\n\n\t\t\tif(item.loadComplete) {\n\t\t\t\titem.loadComplete(item);\n\t\t\t} else {\n\t\t\t\titem.img = null; // no need to store image object\n\t\t\t}\n\t\t\timg.onload = img.onerror = null;\n\t\t\timg = null;\n\t\t};\n\t\timg.onload = onComplete;\n\t\timg.onerror = function() {\n\t\t\titem.loadError = true;\n\t\t\tonComplete();\n\t\t};\t\t\n\n\t\timg.src = item.src;// + '?a=' + Math.random();\n\n\t\treturn img;\n\t},\n\t_checkForError = function(item, cleanUp) {\n\t\tif(item.src && item.loadError && item.container) {\n\n\t\t\tif(cleanUp) {\n\t\t\t\titem.container.innerHTML = '';\n\t\t\t}\n\n\t\t\titem.container.innerHTML = _options.errorMsg.replace('%url%', item.src );\n\t\t\treturn true;\n\t\t\t\n\t\t}\n\t},\n\t_setImageSize = function(item, img, maxRes) {\n\t\tif(!item.src) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(!img) {\n\t\t\timg = item.container.lastChild;\n\t\t}\n\n\t\tvar w = maxRes ? item.w : Math.round(item.w * item.fitRatio),\n\t\t\th = maxRes ? item.h : Math.round(item.h * item.fitRatio);\n\t\t\n\t\tif(item.placeholder && !item.loaded) {\n\t\t\titem.placeholder.style.width = w + 'px';\n\t\t\titem.placeholder.style.height = h + 'px';\n\t\t}\n\n\t\timg.style.width = w + 'px';\n\t\timg.style.height = h + 'px';\n\t},\n\t_appendImagesPool = function() {\n\n\t\tif(_imagesToAppendPool.length) {\n\t\t\tvar poolItem;\n\n\t\t\tfor(var i = 0; i < _imagesToAppendPool.length; i++) {\n\t\t\t\tpoolItem = _imagesToAppendPool[i];\n\t\t\t\tif( poolItem.holder.index === poolItem.index ) {\n\t\t\t\t\t_appendImage(poolItem.index, poolItem.item, poolItem.baseDiv, poolItem.img, false, poolItem.clearPlaceholder);\n\t\t\t\t}\n\t\t\t}\n\t\t\t_imagesToAppendPool = [];\n\t\t}\n\t};\n\t\n\n\n_registerModule('Controller', {\n\n\tpublicMethods: {\n\n\t\tlazyLoadItem: function(index) {\n\t\t\tindex = _getLoopedId(index);\n\t\t\tvar item = _getItemAt(index);\n\n\t\t\tif(!item || ((item.loaded || item.loading) && !_itemsNeedUpdate)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_shout('gettingData', index, item);\n\n\t\t\tif (!item.src) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_preloadImage(item);\n\t\t},\n\t\tinitController: function() {\n\t\t\tframework.extend(_options, _controllerDefaultOptions, true);\n\t\t\tself.items = _items = items;\n\t\t\t_getItemAt = self.getItemAt;\n\t\t\t_getNumItems = _options.getNumItemsFn; //self.getNumItems;\n\n\n\n\t\t\t_initialIsLoop = _options.loop;\n\t\t\tif(_getNumItems() < 3) {\n\t\t\t\t_options.loop = false; // disable loop if less then 3 items\n\t\t\t}\n\n\t\t\t_listen('beforeChange', function(diff) {\n\n\t\t\t\tvar p = _options.preload,\n\t\t\t\t\tisNext = diff === null ? true : (diff >= 0),\n\t\t\t\t\tpreloadBefore = Math.min(p[0], _getNumItems() ),\n\t\t\t\t\tpreloadAfter = Math.min(p[1], _getNumItems() ),\n\t\t\t\t\ti;\n\n\n\t\t\t\tfor(i = 1; i <= (isNext ? preloadAfter : preloadBefore); i++) {\n\t\t\t\t\tself.lazyLoadItem(_currentItemIndex+i);\n\t\t\t\t}\n\t\t\t\tfor(i = 1; i <= (isNext ? preloadBefore : preloadAfter); i++) {\n\t\t\t\t\tself.lazyLoadItem(_currentItemIndex-i);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_listen('initialLayout', function() {\n\t\t\t\tself.currItem.initialLayout = _options.getThumbBoundsFn && _options.getThumbBoundsFn(_currentItemIndex);\n\t\t\t});\n\n\t\t\t_listen('mainScrollAnimComplete', _appendImagesPool);\n\t\t\t_listen('initialZoomInEnd', _appendImagesPool);\n\n\n\n\t\t\t_listen('destroy', function() {\n\t\t\t\tvar item;\n\t\t\t\tfor(var i = 0; i < _items.length; i++) {\n\t\t\t\t\titem = _items[i];\n\t\t\t\t\t// remove reference to DOM elements, for GC\n\t\t\t\t\tif(item.container) {\n\t\t\t\t\t\titem.container = null; \n\t\t\t\t\t}\n\t\t\t\t\tif(item.placeholder) {\n\t\t\t\t\t\titem.placeholder = null;\n\t\t\t\t\t}\n\t\t\t\t\tif(item.img) {\n\t\t\t\t\t\titem.img = null;\n\t\t\t\t\t}\n\t\t\t\t\tif(item.preloader) {\n\t\t\t\t\t\titem.preloader = null;\n\t\t\t\t\t}\n\t\t\t\t\tif(item.loadError) {\n\t\t\t\t\t\titem.loaded = item.loadError = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t_imagesToAppendPool = null;\n\t\t\t});\n\t\t},\n\n\n\t\tgetItemAt: function(index) {\n\t\t\tif (index >= 0) {\n\t\t\t\treturn _items[index] !== undefined ? _items[index] : false;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\tallowProgressiveImg: function() {\n\t\t\t// 1. Progressive image loading isn't working on webkit/blink \n\t\t\t// when hw-acceleration (e.g. translateZ) is applied to IMG element.\n\t\t\t// That's why in PhotoSwipe parent element gets zoom transform, not image itself.\n\t\t\t// \n\t\t\t// 2. Progressive image loading sometimes blinks in webkit/blink when applying animation to parent element.\n\t\t\t// That's why it's disabled on touch devices (mainly because of swipe transition)\n\t\t\t// \n\t\t\t// 3. Progressive image loading sometimes doesn't work in IE (up to 11).\n\n\t\t\t// Don't allow progressive loading on non-large touch devices\n\t\t\treturn _options.forceProgressiveLoading || !_likelyTouchDevice || _options.mouseUsed || screen.width > 1200; \n\t\t\t// 1200 - to eliminate touch devices with large screen (like Chromebook Pixel)\n\t\t},\n\n\t\tsetContent: function(holder, index) {\n\n\t\t\tif(_options.loop) {\n\t\t\t\tindex = _getLoopedId(index);\n\t\t\t}\n\n\t\t\tvar prevItem = self.getItemAt(holder.index);\n\t\t\tif(prevItem) {\n\t\t\t\tprevItem.container = null;\n\t\t\t}\n\t\n\t\t\tvar item = self.getItemAt(index),\n\t\t\t\timg;\n\t\t\t\n\t\t\tif(!item) {\n\t\t\t\tholder.el.innerHTML = '';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// allow to override data\n\t\t\t_shout('gettingData', index, item);\n\n\t\t\tholder.index = index;\n\t\t\tholder.item = item;\n\n\t\t\t// base container DIV is created only once for each of 3 holders\n\t\t\tvar baseDiv = item.container = framework.createEl('pswp__zoom-wrap'); \n\n\t\t\t\n\n\t\t\tif(!item.src && item.html) {\n\t\t\t\tif(item.html.tagName) {\n\t\t\t\t\tbaseDiv.appendChild(item.html);\n\t\t\t\t} else {\n\t\t\t\t\tbaseDiv.innerHTML = item.html;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_checkForError(item);\n\n\t\t\t_calculateItemSize(item, _viewportSize);\n\t\t\t\n\t\t\tif(item.src && !item.loadError && !item.loaded) {\n\n\t\t\t\titem.loadComplete = function(item) {\n\n\t\t\t\t\t// gallery closed before image finished loading\n\t\t\t\t\tif(!_isOpen) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// check if holder hasn't changed while image was loading\n\t\t\t\t\tif(holder && holder.index === index ) {\n\t\t\t\t\t\tif( _checkForError(item, true) ) {\n\t\t\t\t\t\t\titem.loadComplete = item.img = null;\n\t\t\t\t\t\t\t_calculateItemSize(item, _viewportSize);\n\t\t\t\t\t\t\t_applyZoomPanToItem(item);\n\n\t\t\t\t\t\t\tif(holder.index === _currentItemIndex) {\n\t\t\t\t\t\t\t\t// recalculate dimensions\n\t\t\t\t\t\t\t\tself.updateCurrZoomItem();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( !item.imageAppended ) {\n\t\t\t\t\t\t\tif(_features.transform && (_mainScrollAnimating || _initialZoomRunning) ) {\n\t\t\t\t\t\t\t\t_imagesToAppendPool.push({\n\t\t\t\t\t\t\t\t\titem:item,\n\t\t\t\t\t\t\t\t\tbaseDiv:baseDiv,\n\t\t\t\t\t\t\t\t\timg:item.img,\n\t\t\t\t\t\t\t\t\tindex:index,\n\t\t\t\t\t\t\t\t\tholder:holder,\n\t\t\t\t\t\t\t\t\tclearPlaceholder:true\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_appendImage(index, item, baseDiv, item.img, _mainScrollAnimating || _initialZoomRunning, true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// remove preloader & mini-img\n\t\t\t\t\t\t\tif(!_initialZoomRunning && item.placeholder) {\n\t\t\t\t\t\t\t\titem.placeholder.style.display = 'none';\n\t\t\t\t\t\t\t\titem.placeholder = null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\titem.loadComplete = null;\n\t\t\t\t\titem.img = null; // no need to store image element after it's added\n\n\t\t\t\t\t_shout('imageLoadComplete', index, item);\n\t\t\t\t};\n\n\t\t\t\tif(framework.features.transform) {\n\t\t\t\t\t\n\t\t\t\t\tvar placeholderClassName = 'pswp__img pswp__img--placeholder'; \n\t\t\t\t\tplaceholderClassName += (item.msrc ? '' : ' pswp__img--placeholder--blank');\n\n\t\t\t\t\tvar placeholder = framework.createEl(placeholderClassName, item.msrc ? 'img' : '');\n\t\t\t\t\tif(item.msrc) {\n\t\t\t\t\t\tplaceholder.src = item.msrc;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t_setImageSize(item, placeholder);\n\n\t\t\t\t\tbaseDiv.appendChild(placeholder);\n\t\t\t\t\titem.placeholder = placeholder;\n\n\t\t\t\t}\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\tif(!item.loading) {\n\t\t\t\t\t_preloadImage(item);\n\t\t\t\t}\n\n\n\t\t\t\tif( self.allowProgressiveImg() ) {\n\t\t\t\t\t// just append image\n\t\t\t\t\tif(!_initialContentSet && _features.transform) {\n\t\t\t\t\t\t_imagesToAppendPool.push({\n\t\t\t\t\t\t\titem:item, \n\t\t\t\t\t\t\tbaseDiv:baseDiv, \n\t\t\t\t\t\t\timg:item.img, \n\t\t\t\t\t\t\tindex:index, \n\t\t\t\t\t\t\tholder:holder\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_appendImage(index, item, baseDiv, item.img, true, true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else if(item.src && !item.loadError) {\n\t\t\t\t// image object is created every time, due to bugs of image loading & delay when switching images\n\t\t\t\timg = framework.createEl('pswp__img', 'img');\n\t\t\t\timg.style.opacity = 1;\n\t\t\t\timg.src = item.src;\n\t\t\t\t_setImageSize(item, img);\n\t\t\t\t_appendImage(index, item, baseDiv, img, true);\n\t\t\t}\n\t\t\t\n\n\t\t\tif(!_initialContentSet && index === _currentItemIndex) {\n\t\t\t\t_currZoomElementStyle = baseDiv.style;\n\t\t\t\t_showOrHide(item, (img ||item.img) );\n\t\t\t} else {\n\t\t\t\t_applyZoomPanToItem(item);\n\t\t\t}\n\n\t\t\tholder.el.innerHTML = '';\n\t\t\tholder.el.appendChild(baseDiv);\n\t\t},\n\n\t\tcleanSlide: function( item ) {\n\t\t\tif(item.img ) {\n\t\t\t\titem.img.onload = item.img.onerror = null;\n\t\t\t}\n\t\t\titem.loaded = item.loading = item.img = item.imageAppended = false;\n\t\t}\n\n\t}\n});\n\n/*>>items-controller*/\n\n/*>>tap*/\n/**\n * tap.js:\n *\n * Displatches tap and double-tap events.\n * \n */\n\nvar tapTimer,\n\ttapReleasePoint = {},\n\t_dispatchTapEvent = function(origEvent, releasePoint, pointerType) {\t\t\n\t\tvar e = document.createEvent( 'CustomEvent' ),\n\t\t\teDetail = {\n\t\t\t\torigEvent:origEvent, \n\t\t\t\ttarget:origEvent.target, \n\t\t\t\treleasePoint: releasePoint, \n\t\t\t\tpointerType:pointerType || 'touch'\n\t\t\t};\n\n\t\te.initCustomEvent( 'pswpTap', true, true, eDetail );\n\t\torigEvent.target.dispatchEvent(e);\n\t};\n\n_registerModule('Tap', {\n\tpublicMethods: {\n\t\tinitTap: function() {\n\t\t\t_listen('firstTouchStart', self.onTapStart);\n\t\t\t_listen('touchRelease', self.onTapRelease);\n\t\t\t_listen('destroy', function() {\n\t\t\t\ttapReleasePoint = {};\n\t\t\t\ttapTimer = null;\n\t\t\t});\n\t\t},\n\t\tonTapStart: function(touchList) {\n\t\t\tif(touchList.length > 1) {\n\t\t\t\tclearTimeout(tapTimer);\n\t\t\t\ttapTimer = null;\n\t\t\t}\n\t\t},\n\t\tonTapRelease: function(e, releasePoint) {\n\t\t\tif(!releasePoint) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(!_moved && !_isMultitouch && !_numAnimations) {\n\t\t\t\tvar p0 = releasePoint;\n\t\t\t\tif(tapTimer) {\n\t\t\t\t\tclearTimeout(tapTimer);\n\t\t\t\t\ttapTimer = null;\n\n\t\t\t\t\t// Check if taped on the same place\n\t\t\t\t\tif ( _isNearbyPoints(p0, tapReleasePoint) ) {\n\t\t\t\t\t\t_shout('doubleTap', p0);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(releasePoint.type === 'mouse') {\n\t\t\t\t\t_dispatchTapEvent(e, releasePoint, 'mouse');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar clickedTagName = e.target.tagName.toUpperCase();\n\t\t\t\t// avoid double tap delay on buttons and elements that have class pswp__single-tap\n\t\t\t\tif(clickedTagName === 'BUTTON' || framework.hasClass(e.target, 'pswp__single-tap') ) {\n\t\t\t\t\t_dispatchTapEvent(e, releasePoint);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t_equalizePoints(tapReleasePoint, p0);\n\n\t\t\t\ttapTimer = setTimeout(function() {\n\t\t\t\t\t_dispatchTapEvent(e, releasePoint);\n\t\t\t\t\ttapTimer = null;\n\t\t\t\t}, 300);\n\t\t\t}\n\t\t}\n\t}\n});\n\n/*>>tap*/\n\n/*>>desktop-zoom*/\n/**\n *\n * desktop-zoom.js:\n *\n * - Binds mousewheel event for paning zoomed image.\n * - Manages \"dragging\", \"zoomed-in\", \"zoom-out\" classes.\n * (which are used for cursors and zoom icon)\n * - Adds toggleDesktopZoom function.\n * \n */\n\nvar _wheelDelta;\n\t\n_registerModule('DesktopZoom', {\n\n\tpublicMethods: {\n\n\t\tinitDesktopZoom: function() {\n\n\t\t\tif(_oldIE) {\n\t\t\t\t// no zoom for old IE (<=8)\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(_likelyTouchDevice) {\n\t\t\t\t// if detected hardware touch support, we wait until mouse is used,\n\t\t\t\t// and only then apply desktop-zoom features\n\t\t\t\t_listen('mouseUsed', function() {\n\t\t\t\t\tself.setupDesktopZoom();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tself.setupDesktopZoom(true);\n\t\t\t}\n\n\t\t},\n\n\t\tsetupDesktopZoom: function(onInit) {\n\n\t\t\t_wheelDelta = {};\n\n\t\t\tvar events = 'wheel mousewheel DOMMouseScroll';\n\t\t\t\n\t\t\t_listen('bindEvents', function() {\n\t\t\t\tframework.bind(template, events, self.handleMouseWheel);\n\t\t\t});\n\n\t\t\t_listen('unbindEvents', function() {\n\t\t\t\tif(_wheelDelta) {\n\t\t\t\t\tframework.unbind(template, events, self.handleMouseWheel);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tself.mouseZoomedIn = false;\n\n\t\t\tvar hasDraggingClass,\n\t\t\t\tupdateZoomable = function() {\n\t\t\t\t\tif(self.mouseZoomedIn) {\n\t\t\t\t\t\tframework.removeClass(template, 'pswp--zoomed-in');\n\t\t\t\t\t\tself.mouseZoomedIn = false;\n\t\t\t\t\t}\n\t\t\t\t\tif(_currZoomLevel < 1) {\n\t\t\t\t\t\tframework.addClass(template, 'pswp--zoom-allowed');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tframework.removeClass(template, 'pswp--zoom-allowed');\n\t\t\t\t\t}\n\t\t\t\t\tremoveDraggingClass();\n\t\t\t\t},\n\t\t\t\tremoveDraggingClass = function() {\n\t\t\t\t\tif(hasDraggingClass) {\n\t\t\t\t\t\tframework.removeClass(template, 'pswp--dragging');\n\t\t\t\t\t\thasDraggingClass = false;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t_listen('resize' , updateZoomable);\n\t\t\t_listen('afterChange' , updateZoomable);\n\t\t\t_listen('pointerDown', function() {\n\t\t\t\tif(self.mouseZoomedIn) {\n\t\t\t\t\thasDraggingClass = true;\n\t\t\t\t\tframework.addClass(template, 'pswp--dragging');\n\t\t\t\t}\n\t\t\t});\n\t\t\t_listen('pointerUp', removeDraggingClass);\n\n\t\t\tif(!onInit) {\n\t\t\t\tupdateZoomable();\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\thandleMouseWheel: function(e) {\n\n\t\t\tif(_currZoomLevel <= self.currItem.fitRatio) {\n\t\t\t\tif( _options.modal ) {\n\n\t\t\t\t\tif (!_options.closeOnScroll || _numAnimations || _isDragging) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t} else if(_transformKey && Math.abs(e.deltaY) > 2) {\n\t\t\t\t\t\t// close PhotoSwipe\n\t\t\t\t\t\t// if browser supports transforms & scroll changed enough\n\t\t\t\t\t\t_closedByScroll = true;\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// allow just one event to fire\n\t\t\te.stopPropagation();\n\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/Events/wheel\n\t\t\t_wheelDelta.x = 0;\n\n\t\t\tif('deltaX' in e) {\n\t\t\t\tif(e.deltaMode === 1 /* DOM_DELTA_LINE */) {\n\t\t\t\t\t// 18 - average line height\n\t\t\t\t\t_wheelDelta.x = e.deltaX * 18;\n\t\t\t\t\t_wheelDelta.y = e.deltaY * 18;\n\t\t\t\t} else {\n\t\t\t\t\t_wheelDelta.x = e.deltaX;\n\t\t\t\t\t_wheelDelta.y = e.deltaY;\n\t\t\t\t}\n\t\t\t} else if('wheelDelta' in e) {\n\t\t\t\tif(e.wheelDeltaX) {\n\t\t\t\t\t_wheelDelta.x = -0.16 * e.wheelDeltaX;\n\t\t\t\t}\n\t\t\t\tif(e.wheelDeltaY) {\n\t\t\t\t\t_wheelDelta.y = -0.16 * e.wheelDeltaY;\n\t\t\t\t} else {\n\t\t\t\t\t_wheelDelta.y = -0.16 * e.wheelDelta;\n\t\t\t\t}\n\t\t\t} else if('detail' in e) {\n\t\t\t\t_wheelDelta.y = e.detail;\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_calculatePanBounds(_currZoomLevel, true);\n\n\t\t\tvar newPanX = _panOffset.x - _wheelDelta.x,\n\t\t\t\tnewPanY = _panOffset.y - _wheelDelta.y;\n\n\t\t\t// only prevent scrolling in nonmodal mode when not at edges\n\t\t\tif (_options.modal ||\n\t\t\t\t(\n\t\t\t\tnewPanX <= _currPanBounds.min.x && newPanX >= _currPanBounds.max.x &&\n\t\t\t\tnewPanY <= _currPanBounds.min.y && newPanY >= _currPanBounds.max.y\n\t\t\t\t) ) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\t// TODO: use rAF instead of mousewheel?\n\t\t\tself.panTo(newPanX, newPanY);\n\t\t},\n\n\t\ttoggleDesktopZoom: function(centerPoint) {\n\t\t\tcenterPoint = centerPoint || {x:_viewportSize.x/2 + _offset.x, y:_viewportSize.y/2 + _offset.y };\n\n\t\t\tvar doubleTapZoomLevel = _options.getDoubleTapZoom(true, self.currItem);\n\t\t\tvar zoomOut = _currZoomLevel === doubleTapZoomLevel;\n\t\t\t\n\t\t\tself.mouseZoomedIn = !zoomOut;\n\n\t\t\tself.zoomTo(zoomOut ? self.currItem.initialZoomLevel : doubleTapZoomLevel, centerPoint, 333);\n\t\t\tframework[ (!zoomOut ? 'add' : 'remove') + 'Class'](template, 'pswp--zoomed-in');\n\t\t}\n\n\t}\n});\n\n\n/*>>desktop-zoom*/\n\n/*>>history*/\n/**\n *\n * history.js:\n *\n * - Back button to close gallery.\n * \n * - Unique URL for each slide: example.com/&pid=1&gid=3\n * (where PID is picture index, and GID and gallery index)\n * \n * - Switch URL when slides change.\n * \n */\n\n\nvar _historyDefaultOptions = {\n\thistory: true,\n\tgalleryUID: 1\n};\n\nvar _historyUpdateTimeout,\n\t_hashChangeTimeout,\n\t_hashAnimCheckTimeout,\n\t_hashChangedByScript,\n\t_hashChangedByHistory,\n\t_hashReseted,\n\t_initialHash,\n\t_historyChanged,\n\t_closedFromURL,\n\t_urlChangedOnce,\n\t_windowLoc,\n\n\t_supportsPushState,\n\n\t_getHash = function() {\n\t\treturn _windowLoc.hash.substring(1);\n\t},\n\t_cleanHistoryTimeouts = function() {\n\n\t\tif(_historyUpdateTimeout) {\n\t\t\tclearTimeout(_historyUpdateTimeout);\n\t\t}\n\n\t\tif(_hashAnimCheckTimeout) {\n\t\t\tclearTimeout(_hashAnimCheckTimeout);\n\t\t}\n\t},\n\n\t// pid - Picture index\n\t// gid - Gallery index\n\t_parseItemIndexFromURL = function() {\n\t\tvar hash = _getHash(),\n\t\t\tparams = {};\n\n\t\tif(hash.length < 5) { // pid=1\n\t\t\treturn params;\n\t\t}\n\n\t\tvar i, vars = hash.split('&');\n\t\tfor (i = 0; i < vars.length; i++) {\n\t\t\tif(!vars[i]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar pair = vars[i].split('=');\t\n\t\t\tif(pair.length < 2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tparams[pair[0]] = pair[1];\n\t\t}\n\t\tif(_options.galleryPIDs) {\n\t\t\t// detect custom pid in hash and search for it among the items collection\n\t\t\tvar searchfor = params.pid;\n\t\t\tparams.pid = 0; // if custom pid cannot be found, fallback to the first item\n\t\t\tfor(i = 0; i < _items.length; i++) {\n\t\t\t\tif(_items[i].pid === searchfor) {\n\t\t\t\t\tparams.pid = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tparams.pid = parseInt(params.pid,10)-1;\n\t\t}\n\t\tif( params.pid < 0 ) {\n\t\t\tparams.pid = 0;\n\t\t}\n\t\treturn params;\n\t},\n\t_updateHash = function() {\n\n\t\tif(_hashAnimCheckTimeout) {\n\t\t\tclearTimeout(_hashAnimCheckTimeout);\n\t\t}\n\n\n\t\tif(_numAnimations || _isDragging) {\n\t\t\t// changing browser URL forces layout/paint in some browsers, which causes noticable lag during animation\n\t\t\t// that's why we update hash only when no animations running\n\t\t\t_hashAnimCheckTimeout = setTimeout(_updateHash, 500);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif(_hashChangedByScript) {\n\t\t\tclearTimeout(_hashChangeTimeout);\n\t\t} else {\n\t\t\t_hashChangedByScript = true;\n\t\t}\n\n\n\t\tvar pid = (_currentItemIndex + 1);\n\t\tvar item = _getItemAt( _currentItemIndex );\n\t\tif(item.hasOwnProperty('pid')) {\n\t\t\t// carry forward any custom pid assigned to the item\n\t\t\tpid = item.pid;\n\t\t}\n\t\tvar newHash = _initialHash + '&' + 'gid=' + _options.galleryUID + '&' + 'pid=' + pid;\n\n\t\tif(!_historyChanged) {\n\t\t\tif(_windowLoc.hash.indexOf(newHash) === -1) {\n\t\t\t\t_urlChangedOnce = true;\n\t\t\t}\n\t\t\t// first time - add new hisory record, then just replace\n\t\t}\n\n\t\tvar newURL = _windowLoc.href.split('#')[0] + '#' + newHash;\n\n\t\tif( _supportsPushState ) {\n\n\t\t\tif('#' + newHash !== window.location.hash) {\n\t\t\t\thistory[_historyChanged ? 'replaceState' : 'pushState']('', document.title, newURL);\n\t\t\t}\n\n\t\t} else {\n\t\t\tif(_historyChanged) {\n\t\t\t\t_windowLoc.replace( newURL );\n\t\t\t} else {\n\t\t\t\t_windowLoc.hash = newHash;\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\n\t\t_historyChanged = true;\n\t\t_hashChangeTimeout = setTimeout(function() {\n\t\t\t_hashChangedByScript = false;\n\t\t}, 60);\n\t};\n\n\n\n\t\n\n_registerModule('History', {\n\n\t\n\n\tpublicMethods: {\n\t\tinitHistory: function() {\n\n\t\t\tframework.extend(_options, _historyDefaultOptions, true);\n\n\t\t\tif( !_options.history ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\t_windowLoc = window.location;\n\t\t\t_urlChangedOnce = false;\n\t\t\t_closedFromURL = false;\n\t\t\t_historyChanged = false;\n\t\t\t_initialHash = _getHash();\n\t\t\t_supportsPushState = ('pushState' in history);\n\n\n\t\t\tif(_initialHash.indexOf('gid=') > -1) {\n\t\t\t\t_initialHash = _initialHash.split('&gid=')[0];\n\t\t\t\t_initialHash = _initialHash.split('?gid=')[0];\n\t\t\t}\n\t\t\t\n\n\t\t\t_listen('afterChange', self.updateURL);\n\t\t\t_listen('unbindEvents', function() {\n\t\t\t\tframework.unbind(window, 'hashchange', self.onHashChange);\n\t\t\t});\n\n\n\t\t\tvar returnToOriginal = function() {\n\t\t\t\t_hashReseted = true;\n\t\t\t\tif(!_closedFromURL) {\n\n\t\t\t\t\tif(_urlChangedOnce) {\n\t\t\t\t\t\thistory.back();\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif(_initialHash) {\n\t\t\t\t\t\t\t_windowLoc.hash = _initialHash;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (_supportsPushState) {\n\n\t\t\t\t\t\t\t\t// remove hash from url without refreshing it or scrolling to top\n\t\t\t\t\t\t\t\thistory.pushState('', document.title, _windowLoc.pathname + _windowLoc.search );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_windowLoc.hash = '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\t_cleanHistoryTimeouts();\n\t\t\t};\n\n\n\t\t\t_listen('unbindEvents', function() {\n\t\t\t\tif(_closedByScroll) {\n\t\t\t\t\t// if PhotoSwipe is closed by scroll, we go \"back\" before the closing animation starts\n\t\t\t\t\t// this is done to keep the scroll position\n\t\t\t\t\treturnToOriginal();\n\t\t\t\t}\n\t\t\t});\n\t\t\t_listen('destroy', function() {\n\t\t\t\tif(!_hashReseted) {\n\t\t\t\t\treturnToOriginal();\n\t\t\t\t}\n\t\t\t});\n\t\t\t_listen('firstUpdate', function() {\n\t\t\t\t_currentItemIndex = _parseItemIndexFromURL().pid;\n\t\t\t});\n\n\t\t\t\n\n\t\t\t\n\t\t\tvar index = _initialHash.indexOf('pid=');\n\t\t\tif(index > -1) {\n\t\t\t\t_initialHash = _initialHash.substring(0, index);\n\t\t\t\tif(_initialHash.slice(-1) === '&') {\n\t\t\t\t\t_initialHash = _initialHash.slice(0, -1);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\n\t\t\tsetTimeout(function() {\n\t\t\t\tif(_isOpen) { // hasn't destroyed yet\n\t\t\t\t\tframework.bind(window, 'hashchange', self.onHashChange);\n\t\t\t\t}\n\t\t\t}, 40);\n\t\t\t\n\t\t},\n\t\tonHashChange: function() {\n\n\t\t\tif(_getHash() === _initialHash) {\n\n\t\t\t\t_closedFromURL = true;\n\t\t\t\tself.close();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(!_hashChangedByScript) {\n\n\t\t\t\t_hashChangedByHistory = true;\n\t\t\t\tself.goTo( _parseItemIndexFromURL().pid );\n\t\t\t\t_hashChangedByHistory = false;\n\t\t\t}\n\t\t\t\n\t\t},\n\t\tupdateURL: function() {\n\n\t\t\t// Delay the update of URL, to avoid lag during transition, \n\t\t\t// and to not to trigger actions like \"refresh page sound\" or \"blinking favicon\" to often\n\t\t\t\n\t\t\t_cleanHistoryTimeouts();\n\t\t\t\n\n\t\t\tif(_hashChangedByHistory) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(!_historyChanged) {\n\t\t\t\t_updateHash(); // first time\n\t\t\t} else {\n\t\t\t\t_historyUpdateTimeout = setTimeout(_updateHash, 800);\n\t\t\t}\n\t\t}\n\t\n\t}\n});\n\n\n/*>>history*/\n\tframework.extend(self, publicMethods); };\n\treturn PhotoSwipe;\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/_photoswipe@4.1.3@photoswipe/dist/photoswipe.js\n// module id = 10\n// module chunks = 0","/*! PhotoSwipe Default UI - 4.1.3 - 2019-01-08\n* http://photoswipe.com\n* Copyright (c) 2019 Dmitry Semenov; */\n/**\n*\n* UI on top of main sliding area (caption, arrows, close button, etc.).\n* Built just using public methods/properties of PhotoSwipe.\n* \n*/\n(function (root, factory) { \n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.PhotoSwipeUI_Default = factory();\n\t}\n})(this, function () {\n\n\t'use strict';\n\n\n\nvar PhotoSwipeUI_Default =\n function(pswp, framework) {\n\n\tvar ui = this;\n\tvar _overlayUIUpdated = false,\n\t\t_controlsVisible = true,\n\t\t_fullscrenAPI,\n\t\t_controls,\n\t\t_captionContainer,\n\t\t_fakeCaptionContainer,\n\t\t_indexIndicator,\n\t\t_shareButton,\n\t\t_shareModal,\n\t\t_shareModalHidden = true,\n\t\t_initalCloseOnScrollValue,\n\t\t_isIdle,\n\t\t_listen,\n\n\t\t_loadingIndicator,\n\t\t_loadingIndicatorHidden,\n\t\t_loadingIndicatorTimeout,\n\n\t\t_galleryHasOneSlide,\n\n\t\t_options,\n\t\t_defaultUIOptions = {\n\t\t\tbarsSize: {top:44, bottom:'auto'},\n\t\t\tcloseElClasses: ['item', 'caption', 'zoom-wrap', 'ui', 'top-bar'], \n\t\t\ttimeToIdle: 4000, \n\t\t\ttimeToIdleOutside: 1000,\n\t\t\tloadingIndicatorDelay: 1000, // 2s\n\t\t\t\n\t\t\taddCaptionHTMLFn: function(item, captionEl /*, isFake */) {\n\t\t\t\tif(!item.title) {\n\t\t\t\t\tcaptionEl.children[0].innerHTML = '';\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tcaptionEl.children[0].innerHTML = item.title;\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\tcloseEl:true,\n\t\t\tcaptionEl: true,\n\t\t\tfullscreenEl: true,\n\t\t\tzoomEl: true,\n\t\t\tshareEl: true,\n\t\t\tcounterEl: true,\n\t\t\tarrowEl: true,\n\t\t\tpreloaderEl: true,\n\n\t\t\ttapToClose: false,\n\t\t\ttapToToggleControls: true,\n\n\t\t\tclickToCloseNonZoomable: true,\n\n\t\t\tshareButtons: [\n\t\t\t\t{id:'facebook', label:'Share on Facebook', url:'https://www.facebook.com/sharer/sharer.php?u={{url}}'},\n\t\t\t\t{id:'twitter', label:'Tweet', url:'https://twitter.com/intent/tweet?text={{text}}&url={{url}}'},\n\t\t\t\t{id:'pinterest', label:'Pin it', url:'http://www.pinterest.com/pin/create/button/'+\n\t\t\t\t\t\t\t\t\t\t\t\t\t'?url={{url}}&media={{image_url}}&description={{text}}'},\n\t\t\t\t{id:'download', label:'Download image', url:'{{raw_image_url}}', download:true}\n\t\t\t],\n\t\t\tgetImageURLForShare: function( /* shareButtonData */ ) {\n\t\t\t\treturn pswp.currItem.src || '';\n\t\t\t},\n\t\t\tgetPageURLForShare: function( /* shareButtonData */ ) {\n\t\t\t\treturn window.location.href;\n\t\t\t},\n\t\t\tgetTextForShare: function( /* shareButtonData */ ) {\n\t\t\t\treturn pswp.currItem.title || '';\n\t\t\t},\n\t\t\t\t\n\t\t\tindexIndicatorSep: ' / ',\n\t\t\tfitControlsWidth: 1200\n\n\t\t},\n\t\t_blockControlsTap,\n\t\t_blockControlsTapTimeout;\n\n\n\n\tvar _onControlsTap = function(e) {\n\t\t\tif(_blockControlsTap) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\n\t\t\te = e || window.event;\n\n\t\t\tif(_options.timeToIdle && _options.mouseUsed && !_isIdle) {\n\t\t\t\t// reset idle timer\n\t\t\t\t_onIdleMouseMove();\n\t\t\t}\n\n\n\t\t\tvar target = e.target || e.srcElement,\n\t\t\t\tuiElement,\n\t\t\t\tclickedClass = target.getAttribute('class') || '',\n\t\t\t\tfound;\n\n\t\t\tfor(var i = 0; i < _uiElements.length; i++) {\n\t\t\t\tuiElement = _uiElements[i];\n\t\t\t\tif(uiElement.onTap && clickedClass.indexOf('pswp__' + uiElement.name ) > -1 ) {\n\t\t\t\t\tuiElement.onTap();\n\t\t\t\t\tfound = true;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(found) {\n\t\t\t\tif(e.stopPropagation) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t\t_blockControlsTap = true;\n\n\t\t\t\t// Some versions of Android don't prevent ghost click event \n\t\t\t\t// when preventDefault() was called on touchstart and/or touchend.\n\t\t\t\t// \n\t\t\t\t// This happens on v4.3, 4.2, 4.1, \n\t\t\t\t// older versions strangely work correctly, \n\t\t\t\t// but just in case we add delay on all of them)\t\n\t\t\t\tvar tapDelay = framework.features.isOldAndroid ? 600 : 30;\n\t\t\t\t_blockControlsTapTimeout = setTimeout(function() {\n\t\t\t\t\t_blockControlsTap = false;\n\t\t\t\t}, tapDelay);\n\t\t\t}\n\n\t\t},\n\t\t_fitControlsInViewport = function() {\n\t\t\treturn !pswp.likelyTouchDevice || _options.mouseUsed || screen.width > _options.fitControlsWidth;\n\t\t},\n\t\t_togglePswpClass = function(el, cName, add) {\n\t\t\tframework[ (add ? 'add' : 'remove') + 'Class' ](el, 'pswp__' + cName);\n\t\t},\n\n\t\t// add class when there is just one item in the gallery\n\t\t// (by default it hides left/right arrows and 1ofX counter)\n\t\t_countNumItems = function() {\n\t\t\tvar hasOneSlide = (_options.getNumItemsFn() === 1);\n\n\t\t\tif(hasOneSlide !== _galleryHasOneSlide) {\n\t\t\t\t_togglePswpClass(_controls, 'ui--one-slide', hasOneSlide);\n\t\t\t\t_galleryHasOneSlide = hasOneSlide;\n\t\t\t}\n\t\t},\n\t\t_toggleShareModalClass = function() {\n\t\t\t_togglePswpClass(_shareModal, 'share-modal--hidden', _shareModalHidden);\n\t\t},\n\t\t_toggleShareModal = function() {\n\n\t\t\t_shareModalHidden = !_shareModalHidden;\n\t\t\t\n\t\t\t\n\t\t\tif(!_shareModalHidden) {\n\t\t\t\t_toggleShareModalClass();\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tif(!_shareModalHidden) {\n\t\t\t\t\t\tframework.addClass(_shareModal, 'pswp__share-modal--fade-in');\n\t\t\t\t\t}\n\t\t\t\t}, 30);\n\t\t\t} else {\n\t\t\t\tframework.removeClass(_shareModal, 'pswp__share-modal--fade-in');\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tif(_shareModalHidden) {\n\t\t\t\t\t\t_toggleShareModalClass();\n\t\t\t\t\t}\n\t\t\t\t}, 300);\n\t\t\t}\n\t\t\t\n\t\t\tif(!_shareModalHidden) {\n\t\t\t\t_updateShareURLs();\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\t_openWindowPopup = function(e) {\n\t\t\te = e || window.event;\n\t\t\tvar target = e.target || e.srcElement;\n\n\t\t\tpswp.shout('shareLinkClick', e, target);\n\n\t\t\tif(!target.href) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif( target.hasAttribute('download') ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\twindow.open(target.href, 'pswp_share', 'scrollbars=yes,resizable=yes,toolbar=no,'+\n\t\t\t\t\t\t\t\t\t\t'location=yes,width=550,height=420,top=100,left=' + \n\t\t\t\t\t\t\t\t\t\t(window.screen ? Math.round(screen.width / 2 - 275) : 100) );\n\n\t\t\tif(!_shareModalHidden) {\n\t\t\t\t_toggleShareModal();\n\t\t\t}\n\t\t\t\n\t\t\treturn false;\n\t\t},\n\t\t_updateShareURLs = function() {\n\t\t\tvar shareButtonOut = '',\n\t\t\t\tshareButtonData,\n\t\t\t\tshareURL,\n\t\t\t\timage_url,\n\t\t\t\tpage_url,\n\t\t\t\tshare_text;\n\n\t\t\tfor(var i = 0; i < _options.shareButtons.length; i++) {\n\t\t\t\tshareButtonData = _options.shareButtons[i];\n\n\t\t\t\timage_url = _options.getImageURLForShare(shareButtonData);\n\t\t\t\tpage_url = _options.getPageURLForShare(shareButtonData);\n\t\t\t\tshare_text = _options.getTextForShare(shareButtonData);\n\n\t\t\t\tshareURL = shareButtonData.url.replace('{{url}}', encodeURIComponent(page_url) )\n\t\t\t\t\t\t\t\t\t.replace('{{image_url}}', encodeURIComponent(image_url) )\n\t\t\t\t\t\t\t\t\t.replace('{{raw_image_url}}', image_url )\n\t\t\t\t\t\t\t\t\t.replace('{{text}}', encodeURIComponent(share_text) );\n\n\t\t\t\tshareButtonOut += '<a href=\"' + shareURL + '\" target=\"_blank\" '+\n\t\t\t\t\t\t\t\t\t'class=\"pswp__share--' + shareButtonData.id + '\"' +\n\t\t\t\t\t\t\t\t\t(shareButtonData.download ? 'download' : '') + '>' + \n\t\t\t\t\t\t\t\t\tshareButtonData.label + '</a>';\n\n\t\t\t\tif(_options.parseShareButtonOut) {\n\t\t\t\t\tshareButtonOut = _options.parseShareButtonOut(shareButtonData, shareButtonOut);\n\t\t\t\t}\n\t\t\t}\n\t\t\t_shareModal.children[0].innerHTML = shareButtonOut;\n\t\t\t_shareModal.children[0].onclick = _openWindowPopup;\n\n\t\t},\n\t\t_hasCloseClass = function(target) {\n\t\t\tfor(var i = 0; i < _options.closeElClasses.length; i++) {\n\t\t\t\tif( framework.hasClass(target, 'pswp__' + _options.closeElClasses[i]) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_idleInterval,\n\t\t_idleTimer,\n\t\t_idleIncrement = 0,\n\t\t_onIdleMouseMove = function() {\n\t\t\tclearTimeout(_idleTimer);\n\t\t\t_idleIncrement = 0;\n\t\t\tif(_isIdle) {\n\t\t\t\tui.setIdle(false);\n\t\t\t}\n\t\t},\n\t\t_onMouseLeaveWindow = function(e) {\n\t\t\te = e ? e : window.event;\n\t\t\tvar from = e.relatedTarget || e.toElement;\n\t\t\tif (!from || from.nodeName === 'HTML') {\n\t\t\t\tclearTimeout(_idleTimer);\n\t\t\t\t_idleTimer = setTimeout(function() {\n\t\t\t\t\tui.setIdle(true);\n\t\t\t\t}, _options.timeToIdleOutside);\n\t\t\t}\n\t\t},\n\t\t_setupFullscreenAPI = function() {\n\t\t\tif(_options.fullscreenEl && !framework.features.isOldAndroid) {\n\t\t\t\tif(!_fullscrenAPI) {\n\t\t\t\t\t_fullscrenAPI = ui.getFullscreenAPI();\n\t\t\t\t}\n\t\t\t\tif(_fullscrenAPI) {\n\t\t\t\t\tframework.bind(document, _fullscrenAPI.eventK, ui.updateFullscreen);\n\t\t\t\t\tui.updateFullscreen();\n\t\t\t\t\tframework.addClass(pswp.template, 'pswp--supports-fs');\n\t\t\t\t} else {\n\t\t\t\t\tframework.removeClass(pswp.template, 'pswp--supports-fs');\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_setupLoadingIndicator = function() {\n\t\t\t// Setup loading indicator\n\t\t\tif(_options.preloaderEl) {\n\t\t\t\n\t\t\t\t_toggleLoadingIndicator(true);\n\n\t\t\t\t_listen('beforeChange', function() {\n\n\t\t\t\t\tclearTimeout(_loadingIndicatorTimeout);\n\n\t\t\t\t\t// display loading indicator with delay\n\t\t\t\t\t_loadingIndicatorTimeout = setTimeout(function() {\n\n\t\t\t\t\t\tif(pswp.currItem && pswp.currItem.loading) {\n\n\t\t\t\t\t\t\tif( !pswp.allowProgressiveImg() || (pswp.currItem.img && !pswp.currItem.img.naturalWidth) ) {\n\t\t\t\t\t\t\t\t// show preloader if progressive loading is not enabled, \n\t\t\t\t\t\t\t\t// or image width is not defined yet (because of slow connection)\n\t\t\t\t\t\t\t\t_toggleLoadingIndicator(false); \n\t\t\t\t\t\t\t\t// items-controller.js function allowProgressiveImg\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t_toggleLoadingIndicator(true); // hide preloader\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}, _options.loadingIndicatorDelay);\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t\t_listen('imageLoadComplete', function(index, item) {\n\t\t\t\t\tif(pswp.currItem === item) {\n\t\t\t\t\t\t_toggleLoadingIndicator(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t}\n\t\t},\n\t\t_toggleLoadingIndicator = function(hide) {\n\t\t\tif( _loadingIndicatorHidden !== hide ) {\n\t\t\t\t_togglePswpClass(_loadingIndicator, 'preloader--active', !hide);\n\t\t\t\t_loadingIndicatorHidden = hide;\n\t\t\t}\n\t\t},\n\t\t_applyNavBarGaps = function(item) {\n\t\t\tvar gap = item.vGap;\n\n\t\t\tif( _fitControlsInViewport() ) {\n\t\t\t\t\n\t\t\t\tvar bars = _options.barsSize; \n\t\t\t\tif(_options.captionEl && bars.bottom === 'auto') {\n\t\t\t\t\tif(!_fakeCaptionContainer) {\n\t\t\t\t\t\t_fakeCaptionContainer = framework.createEl('pswp__caption pswp__caption--fake');\n\t\t\t\t\t\t_fakeCaptionContainer.appendChild( framework.createEl('pswp__caption__center') );\n\t\t\t\t\t\t_controls.insertBefore(_fakeCaptionContainer, _captionContainer);\n\t\t\t\t\t\tframework.addClass(_controls, 'pswp__ui--fit');\n\t\t\t\t\t}\n\t\t\t\t\tif( _options.addCaptionHTMLFn(item, _fakeCaptionContainer, true) ) {\n\n\t\t\t\t\t\tvar captionSize = _fakeCaptionContainer.clientHeight;\n\t\t\t\t\t\tgap.bottom = parseInt(captionSize,10) || 44;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgap.bottom = bars.top; // if no caption, set size of bottom gap to size of top\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tgap.bottom = bars.bottom === 'auto' ? 0 : bars.bottom;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// height of top bar is static, no need to calculate it\n\t\t\t\tgap.top = bars.top;\n\t\t\t} else {\n\t\t\t\tgap.top = gap.bottom = 0;\n\t\t\t}\n\t\t},\n\t\t_setupIdle = function() {\n\t\t\t// Hide controls when mouse is used\n\t\t\tif(_options.timeToIdle) {\n\t\t\t\t_listen('mouseUsed', function() {\n\t\t\t\t\t\n\t\t\t\t\tframework.bind(document, 'mousemove', _onIdleMouseMove);\n\t\t\t\t\tframework.bind(document, 'mouseout', _onMouseLeaveWindow);\n\n\t\t\t\t\t_idleInterval = setInterval(function() {\n\t\t\t\t\t\t_idleIncrement++;\n\t\t\t\t\t\tif(_idleIncrement === 2) {\n\t\t\t\t\t\t\tui.setIdle(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, _options.timeToIdle / 2);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t_setupHidingControlsDuringGestures = function() {\n\n\t\t\t// Hide controls on vertical drag\n\t\t\t_listen('onVerticalDrag', function(now) {\n\t\t\t\tif(_controlsVisible && now < 0.95) {\n\t\t\t\t\tui.hideControls();\n\t\t\t\t} else if(!_controlsVisible && now >= 0.95) {\n\t\t\t\t\tui.showControls();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Hide controls when pinching to close\n\t\t\tvar pinchControlsHidden;\n\t\t\t_listen('onPinchClose' , function(now) {\n\t\t\t\tif(_controlsVisible && now < 0.9) {\n\t\t\t\t\tui.hideControls();\n\t\t\t\t\tpinchControlsHidden = true;\n\t\t\t\t} else if(pinchControlsHidden && !_controlsVisible && now > 0.9) {\n\t\t\t\t\tui.showControls();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_listen('zoomGestureEnded', function() {\n\t\t\t\tpinchControlsHidden = false;\n\t\t\t\tif(pinchControlsHidden && !_controlsVisible) {\n\t\t\t\t\tui.showControls();\n\t\t\t\t}\n\t\t\t});\n\n\t\t};\n\n\n\n\tvar _uiElements = [\n\t\t{ \n\t\t\tname: 'caption', \n\t\t\toption: 'captionEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_captionContainer = el; \n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'share-modal', \n\t\t\toption: 'shareEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_shareModal = el;\n\t\t\t},\n\t\t\tonTap: function() {\n\t\t\t\t_toggleShareModal();\n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'button--share', \n\t\t\toption: 'shareEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_shareButton = el;\n\t\t\t},\n\t\t\tonTap: function() {\n\t\t\t\t_toggleShareModal();\n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'button--zoom', \n\t\t\toption: 'zoomEl',\n\t\t\tonTap: pswp.toggleDesktopZoom\n\t\t},\n\t\t{ \n\t\t\tname: 'counter', \n\t\t\toption: 'counterEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_indexIndicator = el;\n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'button--close', \n\t\t\toption: 'closeEl',\n\t\t\tonTap: pswp.close\n\t\t},\n\t\t{ \n\t\t\tname: 'button--arrow--left', \n\t\t\toption: 'arrowEl',\n\t\t\tonTap: pswp.prev\n\t\t},\n\t\t{ \n\t\t\tname: 'button--arrow--right', \n\t\t\toption: 'arrowEl',\n\t\t\tonTap: pswp.next\n\t\t},\n\t\t{ \n\t\t\tname: 'button--fs', \n\t\t\toption: 'fullscreenEl',\n\t\t\tonTap: function() { \n\t\t\t\tif(_fullscrenAPI.isFullscreen()) {\n\t\t\t\t\t_fullscrenAPI.exit();\n\t\t\t\t} else {\n\t\t\t\t\t_fullscrenAPI.enter();\n\t\t\t\t}\n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'preloader', \n\t\t\toption: 'preloaderEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_loadingIndicator = el;\n\t\t\t} \n\t\t}\n\n\t];\n\n\tvar _setupUIElements = function() {\n\t\tvar item,\n\t\t\tclassAttr,\n\t\t\tuiElement;\n\n\t\tvar loopThroughChildElements = function(sChildren) {\n\t\t\tif(!sChildren) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar l = sChildren.length;\n\t\t\tfor(var i = 0; i < l; i++) {\n\t\t\t\titem = sChildren[i];\n\t\t\t\tclassAttr = item.className;\n\n\t\t\t\tfor(var a = 0; a < _uiElements.length; a++) {\n\t\t\t\t\tuiElement = _uiElements[a];\n\n\t\t\t\t\tif(classAttr.indexOf('pswp__' + uiElement.name) > -1 ) {\n\n\t\t\t\t\t\tif( _options[uiElement.option] ) { // if element is not disabled from options\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tframework.removeClass(item, 'pswp__element--disabled');\n\t\t\t\t\t\t\tif(uiElement.onInit) {\n\t\t\t\t\t\t\t\tuiElement.onInit(item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t//item.style.display = 'block';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tframework.addClass(item, 'pswp__element--disabled');\n\t\t\t\t\t\t\t//item.style.display = 'none';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tloopThroughChildElements(_controls.children);\n\n\t\tvar topBar = framework.getChildByClass(_controls, 'pswp__top-bar');\n\t\tif(topBar) {\n\t\t\tloopThroughChildElements( topBar.children );\n\t\t}\n\t};\n\n\n\t\n\n\tui.init = function() {\n\n\t\t// extend options\n\t\tframework.extend(pswp.options, _defaultUIOptions, true);\n\n\t\t// create local link for fast access\n\t\t_options = pswp.options;\n\n\t\t// find pswp__ui element\n\t\t_controls = framework.getChildByClass(pswp.scrollWrap, 'pswp__ui');\n\n\t\t// create local link\n\t\t_listen = pswp.listen;\n\n\n\t\t_setupHidingControlsDuringGestures();\n\n\t\t// update controls when slides change\n\t\t_listen('beforeChange', ui.update);\n\n\t\t// toggle zoom on double-tap\n\t\t_listen('doubleTap', function(point) {\n\t\t\tvar initialZoomLevel = pswp.currItem.initialZoomLevel;\n\t\t\tif(pswp.getZoomLevel() !== initialZoomLevel) {\n\t\t\t\tpswp.zoomTo(initialZoomLevel, point, 333);\n\t\t\t} else {\n\t\t\t\tpswp.zoomTo(_options.getDoubleTapZoom(false, pswp.currItem), point, 333);\n\t\t\t}\n\t\t});\n\n\t\t// Allow text selection in caption\n\t\t_listen('preventDragEvent', function(e, isDown, preventObj) {\n\t\t\tvar t = e.target || e.srcElement;\n\t\t\tif(\n\t\t\t\tt && \n\t\t\t\tt.getAttribute('class') && e.type.indexOf('mouse') > -1 && \n\t\t\t\t( t.getAttribute('class').indexOf('__caption') > 0 || (/(SMALL|STRONG|EM)/i).test(t.tagName) ) \n\t\t\t) {\n\t\t\t\tpreventObj.prevent = false;\n\t\t\t}\n\t\t});\n\n\t\t// bind events for UI\n\t\t_listen('bindEvents', function() {\n\t\t\tframework.bind(_controls, 'pswpTap click', _onControlsTap);\n\t\t\tframework.bind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);\n\n\t\t\tif(!pswp.likelyTouchDevice) {\n\t\t\t\tframework.bind(pswp.scrollWrap, 'mouseover', ui.onMouseOver);\n\t\t\t}\n\t\t});\n\n\t\t// unbind events for UI\n\t\t_listen('unbindEvents', function() {\n\t\t\tif(!_shareModalHidden) {\n\t\t\t\t_toggleShareModal();\n\t\t\t}\n\n\t\t\tif(_idleInterval) {\n\t\t\t\tclearInterval(_idleInterval);\n\t\t\t}\n\t\t\tframework.unbind(document, 'mouseout', _onMouseLeaveWindow);\n\t\t\tframework.unbind(document, 'mousemove', _onIdleMouseMove);\n\t\t\tframework.unbind(_controls, 'pswpTap click', _onControlsTap);\n\t\t\tframework.unbind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);\n\t\t\tframework.unbind(pswp.scrollWrap, 'mouseover', ui.onMouseOver);\n\n\t\t\tif(_fullscrenAPI) {\n\t\t\t\tframework.unbind(document, _fullscrenAPI.eventK, ui.updateFullscreen);\n\t\t\t\tif(_fullscrenAPI.isFullscreen()) {\n\t\t\t\t\t_options.hideAnimationDuration = 0;\n\t\t\t\t\t_fullscrenAPI.exit();\n\t\t\t\t}\n\t\t\t\t_fullscrenAPI = null;\n\t\t\t}\n\t\t});\n\n\n\t\t// clean up things when gallery is destroyed\n\t\t_listen('destroy', function() {\n\t\t\tif(_options.captionEl) {\n\t\t\t\tif(_fakeCaptionContainer) {\n\t\t\t\t\t_controls.removeChild(_fakeCaptionContainer);\n\t\t\t\t}\n\t\t\t\tframework.removeClass(_captionContainer, 'pswp__caption--empty');\n\t\t\t}\n\n\t\t\tif(_shareModal) {\n\t\t\t\t_shareModal.children[0].onclick = null;\n\t\t\t}\n\t\t\tframework.removeClass(_controls, 'pswp__ui--over-close');\n\t\t\tframework.addClass( _controls, 'pswp__ui--hidden');\n\t\t\tui.setIdle(false);\n\t\t});\n\t\t\n\n\t\tif(!_options.showAnimationDuration) {\n\t\t\tframework.removeClass( _controls, 'pswp__ui--hidden');\n\t\t}\n\t\t_listen('initialZoomIn', function() {\n\t\t\tif(_options.showAnimationDuration) {\n\t\t\t\tframework.removeClass( _controls, 'pswp__ui--hidden');\n\t\t\t}\n\t\t});\n\t\t_listen('initialZoomOut', function() {\n\t\t\tframework.addClass( _controls, 'pswp__ui--hidden');\n\t\t});\n\n\t\t_listen('parseVerticalMargin', _applyNavBarGaps);\n\t\t\n\t\t_setupUIElements();\n\n\t\tif(_options.shareEl && _shareButton && _shareModal) {\n\t\t\t_shareModalHidden = true;\n\t\t}\n\n\t\t_countNumItems();\n\n\t\t_setupIdle();\n\n\t\t_setupFullscreenAPI();\n\n\t\t_setupLoadingIndicator();\n\t};\n\n\tui.setIdle = function(isIdle) {\n\t\t_isIdle = isIdle;\n\t\t_togglePswpClass(_controls, 'ui--idle', isIdle);\n\t};\n\n\tui.update = function() {\n\t\t// Don't update UI if it's hidden\n\t\tif(_controlsVisible && pswp.currItem) {\n\t\t\t\n\t\t\tui.updateIndexIndicator();\n\n\t\t\tif(_options.captionEl) {\n\t\t\t\t_options.addCaptionHTMLFn(pswp.currItem, _captionContainer);\n\n\t\t\t\t_togglePswpClass(_captionContainer, 'caption--empty', !pswp.currItem.title);\n\t\t\t}\n\n\t\t\t_overlayUIUpdated = true;\n\n\t\t} else {\n\t\t\t_overlayUIUpdated = false;\n\t\t}\n\n\t\tif(!_shareModalHidden) {\n\t\t\t_toggleShareModal();\n\t\t}\n\n\t\t_countNumItems();\n\t};\n\n\tui.updateFullscreen = function(e) {\n\n\t\tif(e) {\n\t\t\t// some browsers change window scroll position during the fullscreen\n\t\t\t// so PhotoSwipe updates it just in case\n\t\t\tsetTimeout(function() {\n\t\t\t\tpswp.setScrollOffset( 0, framework.getScrollY() );\n\t\t\t}, 50);\n\t\t}\n\t\t\n\t\t// toogle pswp--fs class on root element\n\t\tframework[ (_fullscrenAPI.isFullscreen() ? 'add' : 'remove') + 'Class' ](pswp.template, 'pswp--fs');\n\t};\n\n\tui.updateIndexIndicator = function() {\n\t\tif(_options.counterEl) {\n\t\t\t_indexIndicator.innerHTML = (pswp.getCurrentIndex()+1) + \n\t\t\t\t\t\t\t\t\t\t_options.indexIndicatorSep + \n\t\t\t\t\t\t\t\t\t\t_options.getNumItemsFn();\n\t\t}\n\t};\n\t\n\tui.onGlobalTap = function(e) {\n\t\te = e || window.event;\n\t\tvar target = e.target || e.srcElement;\n\n\t\tif(_blockControlsTap) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(e.detail && e.detail.pointerType === 'mouse') {\n\n\t\t\t// close gallery if clicked outside of the image\n\t\t\tif(_hasCloseClass(target)) {\n\t\t\t\tpswp.close();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(framework.hasClass(target, 'pswp__img')) {\n\t\t\t\tif(pswp.getZoomLevel() === 1 && pswp.getZoomLevel() <= pswp.currItem.fitRatio) {\n\t\t\t\t\tif(_options.clickToCloseNonZoomable) {\n\t\t\t\t\t\tpswp.close();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tpswp.toggleDesktopZoom(e.detail.releasePoint);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t} else {\n\n\t\t\t// tap anywhere (except buttons) to toggle visibility of controls\n\t\t\tif(_options.tapToToggleControls) {\n\t\t\t\tif(_controlsVisible) {\n\t\t\t\t\tui.hideControls();\n\t\t\t\t} else {\n\t\t\t\t\tui.showControls();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// tap to close gallery\n\t\t\tif(_options.tapToClose && (framework.hasClass(target, 'pswp__img') || _hasCloseClass(target)) ) {\n\t\t\t\tpswp.close();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t}\n\t};\n\tui.onMouseOver = function(e) {\n\t\te = e || window.event;\n\t\tvar target = e.target || e.srcElement;\n\n\t\t// add class when mouse is over an element that should close the gallery\n\t\t_togglePswpClass(_controls, 'ui--over-close', _hasCloseClass(target));\n\t};\n\n\tui.hideControls = function() {\n\t\tframework.addClass(_controls,'pswp__ui--hidden');\n\t\t_controlsVisible = false;\n\t};\n\n\tui.showControls = function() {\n\t\t_controlsVisible = true;\n\t\tif(!_overlayUIUpdated) {\n\t\t\tui.update();\n\t\t}\n\t\tframework.removeClass(_controls,'pswp__ui--hidden');\n\t};\n\n\tui.supportsFullscreen = function() {\n\t\tvar d = document;\n\t\treturn !!(d.exitFullscreen || d.mozCancelFullScreen || d.webkitExitFullscreen || d.msExitFullscreen);\n\t};\n\n\tui.getFullscreenAPI = function() {\n\t\tvar dE = document.documentElement,\n\t\t\tapi,\n\t\t\ttF = 'fullscreenchange';\n\n\t\tif (dE.requestFullscreen) {\n\t\t\tapi = {\n\t\t\t\tenterK: 'requestFullscreen',\n\t\t\t\texitK: 'exitFullscreen',\n\t\t\t\telementK: 'fullscreenElement',\n\t\t\t\teventK: tF\n\t\t\t};\n\n\t\t} else if(dE.mozRequestFullScreen ) {\n\t\t\tapi = {\n\t\t\t\tenterK: 'mozRequestFullScreen',\n\t\t\t\texitK: 'mozCancelFullScreen',\n\t\t\t\telementK: 'mozFullScreenElement',\n\t\t\t\teventK: 'moz' + tF\n\t\t\t};\n\n\t\t\t\n\n\t\t} else if(dE.webkitRequestFullscreen) {\n\t\t\tapi = {\n\t\t\t\tenterK: 'webkitRequestFullscreen',\n\t\t\t\texitK: 'webkitExitFullscreen',\n\t\t\t\telementK: 'webkitFullscreenElement',\n\t\t\t\teventK: 'webkit' + tF\n\t\t\t};\n\n\t\t} else if(dE.msRequestFullscreen) {\n\t\t\tapi = {\n\t\t\t\tenterK: 'msRequestFullscreen',\n\t\t\t\texitK: 'msExitFullscreen',\n\t\t\t\telementK: 'msFullscreenElement',\n\t\t\t\teventK: 'MSFullscreenChange'\n\t\t\t};\n\t\t}\n\n\t\tif(api) {\n\t\t\tapi.enter = function() { \n\t\t\t\t// disable close-on-scroll in fullscreen\n\t\t\t\t_initalCloseOnScrollValue = _options.closeOnScroll; \n\t\t\t\t_options.closeOnScroll = false; \n\n\t\t\t\tif(this.enterK === 'webkitRequestFullscreen') {\n\t\t\t\t\tpswp.template[this.enterK]( Element.ALLOW_KEYBOARD_INPUT );\n\t\t\t\t} else {\n\t\t\t\t\treturn pswp.template[this.enterK](); \n\t\t\t\t}\n\t\t\t};\n\t\t\tapi.exit = function() { \n\t\t\t\t_options.closeOnScroll = _initalCloseOnScrollValue;\n\n\t\t\t\treturn document[this.exitK](); \n\n\t\t\t};\n\t\t\tapi.isFullscreen = function() { return document[this.elementK]; };\n\t\t}\n\n\t\treturn api;\n\t};\n\n\n\n};\nreturn PhotoSwipeUI_Default;\n\n\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/_photoswipe@4.1.3@photoswipe/dist/photoswipe-ui-default.js\n// module id = 11\n// module chunks = 0"],"sourceRoot":""}