{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///(webpack)/buildin/global.js","webpack:///./node_modules/lodash/debounce.js","webpack:///./node_modules/lodash/isSymbol.js","webpack:///./.tmp/app_col_core/js/components/reservationTimer.js","webpack:///./node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/lodash/now.js","webpack:///./node_modules/lodash/_freeGlobal.js","webpack:///./node_modules/lodash/toNumber.js","webpack:///./node_modules/lodash/_baseTrim.js","webpack:///./node_modules/lodash/_trimmedEndIndex.js","webpack:///./node_modules/lodash/_getRawTag.js","webpack:///./node_modules/lodash/_objectToString.js","webpack:///./node_modules/lodash/isObjectLike.js","webpack:///./.tmp/app_col_core/js/components/minicartSaleItemAlertBadge.js","webpack:///./.tmp/app_col_core/js/components/formValidation.js","webpack:///./.tmp/app_col_core/js/productDetail.js","webpack:///./cartridges/app_storefront_base/cartridge/client/default/js/product/base.js","webpack:///./.tmp/app_col_core/js/components/utils.js","webpack:///./cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js","webpack:///../node_modules/ssr-window/ssr-window.esm.js","webpack:///../node_modules/dom7/dom7.esm.js","webpack:///../src/shared/dom.js","webpack:///../src/shared/get-support.js","webpack:///../src/shared/get-device.js","webpack:///../src/shared/get-browser.js","webpack:///../src/shared/utils.js","webpack:///../src/core/transition/transitionEmit.js","webpack:///../src/core/events/onTouchStart.js","webpack:///../src/core/events/onTouchMove.js","webpack:///../src/core/events/onTouchEnd.js","webpack:///../src/core/events/onResize.js","webpack:///../src/core/events/onClick.js","webpack:///../src/core/events/onScroll.js","webpack:///../src/core/events/index.js","webpack:///../src/core/breakpoints/setBreakpoint.js","webpack:///../src/core/defaults.js","webpack:///../src/core/moduleExtendParams.js","webpack:///../src/core/core.js","webpack:///../src/core/events-emitter.js","webpack:///../src/core/update/index.js","webpack:///../src/core/update/updateSize.js","webpack:///../src/core/update/updateSlides.js","webpack:///../src/core/update/updateAutoHeight.js","webpack:///../src/core/update/updateSlidesOffset.js","webpack:///../src/core/update/updateSlidesProgress.js","webpack:///../src/core/update/updateProgress.js","webpack:///../src/core/update/updateSlidesClasses.js","webpack:///../src/core/update/updateActiveIndex.js","webpack:///../src/core/update/updateClickedSlide.js","webpack:///../src/core/translate/index.js","webpack:///../src/core/translate/getTranslate.js","webpack:///../src/core/translate/setTranslate.js","webpack:///../src/core/translate/minTranslate.js","webpack:///../src/core/translate/maxTranslate.js","webpack:///../src/core/translate/translateTo.js","webpack:///../src/core/transition/index.js","webpack:///../src/core/transition/setTransition.js","webpack:///../src/core/transition/transitionStart.js","webpack:///../src/core/transition/transitionEnd.js","webpack:///../src/core/slide/index.js","webpack:///../src/core/slide/slideTo.js","webpack:///../src/core/slide/slideToLoop.js","webpack:///../src/core/slide/slideNext.js","webpack:///../src/core/slide/slidePrev.js","webpack:///../src/core/slide/slideReset.js","webpack:///../src/core/slide/slideToClosest.js","webpack:///../src/core/slide/slideToClickedSlide.js","webpack:///../src/core/loop/index.js","webpack:///../src/core/loop/loopCreate.js","webpack:///../src/core/loop/loopFix.js","webpack:///../src/core/loop/loopDestroy.js","webpack:///../src/core/grab-cursor/index.js","webpack:///../src/core/grab-cursor/setGrabCursor.js","webpack:///../src/core/grab-cursor/unsetGrabCursor.js","webpack:///../src/core/breakpoints/index.js","webpack:///../src/core/breakpoints/getBreakpoint.js","webpack:///../src/core/check-overflow/index.js","webpack:///../src/core/classes/index.js","webpack:///../src/core/classes/addClasses.js","webpack:///../src/core/classes/removeClasses.js","webpack:///../src/core/images/index.js","webpack:///../src/core/images/loadImage.js","webpack:///../src/core/images/preloadImages.js","webpack:///../src/shared/create-element-if-not-defined.js","webpack:///../src/shared/classes-to-selector.js","webpack:///../src/modules/manipulation/methods/appendSlide.js","webpack:///../src/modules/manipulation/methods/prependSlide.js","webpack:///../src/modules/manipulation/methods/addSlide.js","webpack:///../src/modules/manipulation/methods/removeSlide.js","webpack:///../src/modules/manipulation/methods/removeAllSlides.js","webpack:///../src/shared/effect-init.js","webpack:///../src/shared/effect-target.js","webpack:///../src/shared/effect-virtual-transition-end.js","webpack:///../src/shared/create-shadow.js","webpack:///../src/core/modules/resize/resize.js","webpack:///../src/core/modules/observer/observer.js","webpack:///../src/swiper.js","webpack:///../src/modules/virtual/virtual.js","webpack:///../src/modules/keyboard/keyboard.js","webpack:///../src/modules/mousewheel/mousewheel.js","webpack:///../src/modules/navigation/navigation.js","webpack:///../src/modules/pagination/pagination.js","webpack:///../src/modules/scrollbar/scrollbar.js","webpack:///../src/modules/parallax/parallax.js","webpack:///../src/modules/zoom/zoom.js","webpack:///../src/modules/lazy/lazy.js","webpack:///../src/modules/controller/controller.js","webpack:///../src/modules/a11y/a11y.js","webpack:///../src/modules/history/history.js","webpack:///../src/modules/hash-navigation/hash-navigation.js","webpack:///../src/modules/autoplay/autoplay.js","webpack:///../src/modules/thumbs/thumbs.js","webpack:///../src/modules/free-mode/free-mode.js","webpack:///../src/modules/grid/grid.js","webpack:///../src/modules/manipulation/manipulation.js","webpack:///../src/modules/effect-fade/effect-fade.js","webpack:///../src/modules/effect-cube/effect-cube.js","webpack:///../src/modules/effect-flip/effect-flip.js","webpack:///../src/modules/effect-coverflow/effect-coverflow.js","webpack:///../src/modules/effect-creative/effect-creative.js","webpack:///../src/modules/effect-cards/effect-cards.js","webpack:///./.tmp/app_col_core/js/product/onModelDescription.js","webpack:///./.tmp/app_col_core/js/aem/tabbedContainer.js","webpack:///./node_modules/underscore/modules/index-default.js","webpack:///./.tmp/app_col_core/js/product/base.js","webpack:///./.tmp/app_col_core/js/components/processInclude.js","webpack:///./.tmp/app_col_core/js/product/imageGallery.js","webpack:///./.tmp/app_col_core/js/product/loyalty.js","webpack:///./.tmp/app_col_core/js/product/badge.js","webpack:///./.tmp/app_col_core/js/product/overview.js","webpack:///./.tmp/app_col_core/js/sizefit/sizefit.js","webpack:///./.tmp/app_col_core/js/aem/overflowSlider.js","webpack:///./.tmp/app_col_core/js/components/breakpoints.js","webpack:///./node_modules/underscore/modules/index.js","webpack:///./.tmp/app_col_core/js/product/detail.js","webpack:///./node_modules/lodash/isObject.js","webpack:///./node_modules/lodash/_root.js","webpack:///./.tmp/app_col_core/js/notifyMe/notifyMe.js","webpack:///./node_modules/lodash/_Symbol.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","g","this","Function","e","window","isObject","require","now","toNumber","nativeMax","Math","max","nativeMin","min","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","args","thisArg","undefined","apply","leadingEdge","setTimeout","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","arguments","clearTimeout","cancel","flush","baseGetTag","isObjectLike","reservationTimerIdSelector","getExpireTime","$","data","destroyTimer","$timerBanner","reservationInterval","clearInterval","resources","reservation","reservationSecondsRemaining","length","trigger","getRemainingSeconds","expireTime","Date","getTime","secondsRemaining","parseInt","popBanners","messages","remainingSeconds","msgKeys","keys","msgKey","msg","startTime","html","title","message","additionalContent","alert","content","placement","theme","id","containerId","timeToLive","createTimeString","mins","floor","secs","updateReservationTimer","text","toggleClass","startTimer","initialTimeStr","timeRemainingMessage","setInterval","autoClose","init","find","not","remove","getDestroyTimer","updateReservationData","response","extend","getRawTag","objectToString","symToStringTag","root","freeGlobal","global","baseTrim","isSymbol","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","other","valueOf","isBinary","test","slice","trimmedEndIndex","reTrimStart","string","replace","reWhitespace","index","charAt","objectProto","nativeObjectToString","toString","isOwn","tag","unmasked","toggleAlertBadge","$icon","hasAlertWrapper","parent","hasClass","clientData","priceDropModalEnabled","sessionStorage","getItem","hasSaleItemInCart","digitalData","cart","item","some","isSaleItem","wrap","unwrap","formElement","payload","removeClass","fields","forEach","feedbackElement","children","Array","isArray","join","siblings","addClass","error","$formElement","prop","closest","attachment","processInclude","jQuery","document","on","accordionHeader","preventDefault","reviewAnchorOffset","offset","animate","scrollTop","top","focusHelper","getPidValue","$el","getQuantitySelector","quantitySelected","quantitySelectedModal","quantitySelectedPDP","val","getQuantitySelected","handleVariantResponse","$productContainer","isVaraint","isChoiceOfBonusProducts","parents","product","variationAttributes","attrs","msgs","attrsWithSwatches","attr","indexOf","values","attrValue","$attrValue","$swatchButton","selected","assistiveSelectedText","empty","url","removeAttr","selectable","processSwatchValues","$attr","resetUrl","processNonSwatchValues","updateAttrs","productType","readyToOrder","imgs","carousel","carouselId","append","alt","appendTo","first","detach","createCarousel","images","large","replaceWith","price","promotionsHtml","availabilityValue","availabilityMessages","availability","info_selectforstock","updateAvailability","attributes","attributeGroup","ID","attribute","label","getAttributesHtml","attributeSelect","selectedValueUrl","container","ajax","method","success","optionsHtml","updateOptions","quantities","map","quantity","updateQuantities","spinner","stop","parseHtml","$html","parseHTML","body","footer","chooseBonusProducts","bonusUrl","start","bonusChoiceRuleBased","showProductsUrlRuleBased","showProductsUrlListBased","htmlString","maxBonusItems","uuid","pliUUID","addToCartUrl","pageSize","labels","selectprods","dataType","parsedHtml","renderedTemplate","enterDialogMessage","closeButtonText","modal","getOptions","$elOption","urlValue","selectedValueId","optionId","toArray","JSON","stringify","miniCartReportingUrl","methods","editBonusProducts","focusChooseBonusProductModal","focus","onClosingChooseBonusProductModal","trapChooseBonusProductModalFocus","focusParams","event","containerSelector","firstElementSelector","lastElementSelector","setTabNextFocus","colorAttribute","selectAttribute","currentTarget","addToCart","pid","pidsObj","setPids","each","push","qty","childProducts","form","messageType","newBonusDiscountLineItem","handlePostCartAdd","reportingURL","selectBonusProduct","$choiceOfBonusProduct","maxPids","submittedQty","totalQty","optionID","valueId","selectedBonusProductHtml","removeBonusProduct","$selected","count","enableBonusProductSelection","available","showMoreBonusProducts","addBonusProductsToCart","$readyToOrderBonusProducts","queryString","pidsObject","bonusProducts","qtyOption","option","productId","errorMessage","msgSuccess","location","reload","keyValueArray","str","x","k","v","kvp","split","output","queryStringToObject","search","startIndex","endIndex","substring","pair","nameVal","decodeURIComponent","parse","objectToQueryString","obj","urlString","path","hash","qsIndex","hashIndex","param","removeQueryParam","queryparam","URL","searchParams","delete","loadScript","src","callback","script","createElement","type","getElementsByTagName","appendChild","onload","loadJsAfterWindowLoad","readyState","addEventListener","heapify","list","ndx","heapSize","largest","left","right","cscUtils","appendParamToURL","encodeURIComponent","getParamsFromURL","arr","searchHash","postHash","arrHash","output2","updateURLParam","paramVal","newAdditionalURL","tempArray","baseURL","additionalURL","temp","arrayIntersection","a1","a2","inArray","createModalMarkup","defaults","showCloseBtn","enableLayeredDrawers","modalSizeClass","centeredClass","customClasses","modalId","buttons","settings","dataAttributes","header","idAttribute","footerBtns","btn","removeQueryParamFromCurrentUrl","href","history","replaceState","createBackdrop","customClass","removeBackdrop","selector","setUrlKeyValue","qs","setUrlData","decodeQueryParam","elementInViewport","el","offsetToTop","offsetTop","offsetLeft","width","offsetWidth","height","offsetHeight","offsetParent","pageXOffset","pageYOffset","innerHeight","innerWidth","compatMode","documentElement","clientHeight","scrollLeft","clientWidth","insertAtInputCursor","formInput","input","selectionStart","end","selectionEnd","stringToTitleCase","word","toUpperCase","toLowerCase","getTimeAndHours","stageMessage","date","hours","getHours","minutes","getMinutes","ampm","findNHighest","listToUse","arrayLength","firstListItem","heapifyMax","pop","deepEqual","obj1","obj2","reduce","isEqual","keyCode","firstFocusableEl","lastFocusableEl","is","nextToLastElementSelector","linkElements","shiftKey","constructor","target","ssrDocument","removeEventListener","activeElement","blur","nodeName","querySelector","querySelectorAll","getElementById","createEvent","initEvent","childNodes","style","setAttribute","createElementNS","importNode","host","hostname","origin","pathname","protocol","getDocument","doc","ssrWindow","navigator","userAgent","pushState","go","back","CustomEvent","getComputedStyle","getPropertyValue","Image","screen","matchMedia","requestAnimationFrame","cancelAnimationFrame","getWindow","win","Dom7","items","proto","__proto__","set","makeReactive","super","arrayFlat","res","arrayFilter","filter","context","trim","toCreate","tempParent","innerHTML","a","nodeType","uniqueArray","fn","support","deviceCached","browser","Methods","classes","classNames","classList","add","className","contains","toggle","getAttribute","attrName","removeAttribute","transform","transition","duration","transitionDuration","eventType","targetSelector","listener","capture","handleLiveEvent","eventData","dom7EventData","unshift","handleEvent","j","events","dom7LiveListeners","proxyListener","dom7Listeners","off","handlers","handler","dom7proxy","splice","evt","detail","bubbles","cancelable","dataIndex","dispatchEvent","transitionEnd","dom","fireCallBack","outerWidth","includeMargins","styles","parseFloat","outerHeight","box","getBoundingClientRect","clientTop","clientLeft","scrollY","scrollX","css","props","textContent","compareWith","matches","webkitMatchesSelector","msMatchesSelector","child","previousSibling","eq","returnIndex","newChild","els","tempDiv","firstChild","prepend","insertBefore","next","nextElementSibling","nextAll","nextEls","prev","previousElementSibling","prevAll","prevEls","parentNode","foundElements","found","removeChild","nextTick","delay","getTranslate","matrix","curTransform","transformMatrix","axis","curStyle","currentStyle","WebKitCSSMatrix","webkitTransform","MozTransform","OTransform","MsTransform","msTransform","m41","m42","node","to","noExtend","nextSource","HTMLElement","keysArray","nextIndex","len","nextKey","desc","getOwnPropertyDescriptor","__swiper__","setCSSProperty","varName","varValue","setProperty","animateCSSModeScroll","side","swiper","targetPosition","startPosition","translate","params","speed","wrapperEl","scrollSnapType","cssModeFrameID","dir","isOutOfBound","current","progress","easeProgress","cos","PI","currentPosition","scrollTo","overflow","getSupport","smoothScroll","touch","DocumentTouch","passiveListener","supportsPassive","opts","gestures","getDevice","overrides","platform","ua","device","ios","android","screenWidth","screenHeight","match","ipad","ipod","iphone","windows","macos","os","getBrowser","isSafari","isWebView","transitionEmit","step","runCallbacks","direction","activeIndex","previousIndex","emit","onTouchStart","touchEventsData","touches","enabled","animating","preventInteractionOnTransition","cssMode","loop","loopFix","originalEvent","$targetEl","touchEventsTarget","isTouchEvent","which","button","isTouched","isMoved","noSwipingClass","shadowRoot","noSwipingSelector","isTargetShadow","noSwiping","base","__closestFrom","assignedSlot","getRootNode","allowClick","swipeHandler","currentX","targetTouches","pageX","currentY","pageY","startX","startY","edgeSwipeDetection","iOSEdgeSwipeDetection","edgeSwipeThreshold","iOSEdgeSwipeThreshold","assign","allowTouchCallbacks","isScrolling","startMoving","touchStartTime","updateSize","swipeDirection","threshold","allowThresholdMove","focusableElements","shouldPreventDefault","allowTouchMove","touchStartPreventDefault","touchStartForcePreventDefault","isContentEditable","onTouchMove","rtl","rtlTranslate","targetTouch","changedTouches","preventedByNestedSwiper","touchReleaseOnEdges","isVertical","maxTranslate","minTranslate","diffX","diffY","sqrt","touchAngle","isHorizontal","atan2","abs","touchMoveStopPropagation","nested","stopPropagation","startTranslate","setTransition","$wrapperEl","allowMomentumBounce","grabCursor","allowSlideNext","allowSlidePrev","setGrabCursor","diff","touchRatio","currentTranslate","disableParentSwiper","resistanceRatio","resistance","followFinger","freeMode","watchSlidesProgress","updateActiveIndex","updateSlidesClasses","updateProgress","setTranslate","onTouchEnd","slidesGrid","currentPos","touchEndTime","timeDiff","updateClickedSlide","lastClickTime","destroyed","stopIndex","groupSize","slidesSizesGrid","slidesPerGroupSkip","slidesPerGroup","increment","ratio","longSwipesMs","longSwipes","slideTo","longSwipesRatio","shortSwipes","navigation","nextEl","prevEl","onResize","breakpoints","setBreakpoint","snapGrid","updateSlides","slidesPerView","isEnd","isBeginning","centeredSlides","slides","autoplay","running","paused","run","watchOverflow","checkOverflow","onClick","preventClicks","preventClicksPropagation","stopImmediatePropagation","onScroll","previousTranslate","translatesDiff","methodName","writable","dummyEventAttached","dummyEventListener","touchEvents","domMethod","swiperMethod","passiveListeners","passive","move","updateOnWindowResize","isGridEnabled","grid","rows","initialSlide","resizeObserver","createElements","autoHeight","setWrapperSize","virtualTranslate","effect","breakpointsBase","spaceBetween","slidesPerGroupAuto","centeredSlidesBounds","slidesOffsetBefore","slidesOffsetAfter","normalizeSlideIndex","centerInsufficientSlides","roundLengths","simulateTouch","uniqueNavElements","slideToClickedSlide","preloadImages","updateOnImagesReady","loopAdditionalSlides","loopedSlides","loopFillGroupWithBlank","loopPreventsSlide","containerModifierClass","slideClass","slideBlankClass","slideActiveClass","slideDuplicateActiveClass","slideVisibleClass","slideDuplicateClass","slideNextClass","slideDuplicateNextClass","slidePrevClass","slideDuplicatePrevClass","wrapperClass","runCallbacksOnInit","_emitClasses","moduleExtendParams","allModulesParams","moduleParamName","moduleParams","auto","prototypes","eventsEmitter","priority","self","eventsListeners","once","onceHandler","__emitterProxy","onAny","eventsAnyListeners","offAny","eventHandler","update","Number","isNaN","size","getDirectionLabel","marginRight","getDirectionPropertyValue","swiperSize","wrongRTL","isVirtual","virtual","previousSlidesLength","slidesLength","offsetBefore","offsetAfter","previousSnapGridLength","previousSlidesGridLength","slidePosition","prevSlideSize","virtualSize","marginLeft","marginBottom","marginTop","slideSize","gridEnabled","initSlides","shouldResetSlideSize","slide","updateSlide","slideStyles","currentTransform","currentWebKitTransform","paddingLeft","paddingRight","boxSizing","swiperSlideSize","updateWrapperSize","newSlidesGrid","slidesGridItem","_","slideIndex","allSlidesSize","slideSizeValue","maxSnap","snap","allSlidesOffset","snapIndex","addToSnapGrid","addToSlidesGrid","updateSlidesOffset","updateAutoHeight","activeSlides","newHeight","getSlideByIndex","visibleSlides","ceil","swiperSlideOffset","updateSlidesProgress","offsetCenter","visibleSlidesIndexes","slideOffset","slideProgress","slideBefore","slideAfter","multiplier","wasBeginning","wasEnd","activeSlide","realIndex","nextSlide","prevSlide","emitSlidesClasses","newActiveIndex","previousRealIndex","previousSnapIndex","skip","initialized","slideFound","clickedSlide","clickedIndex","byController","y","translateTo","internal","translateBounds","newTranslate","isH","onTranslateToWrapperTransitionEnd","transitionStart","initial","Error","indexAsNumber","isFinite","normalizedTranslate","normalizedGrid","normalizedGridNext","_immediateVirtual","_swiperImmediateVirtual","onSlideToWrapperTransitionEnd","slideToLoop","newIndex","slideNext","perGroup","slidesPerViewDynamic","_clientLeft","slidePrev","normalize","prevSnapIndex","normalizedSnapGrid","prevSnap","prevIndex","slideReset","slideToClosest","currentSnap","slideToIndex","loopCreate","blankSlidesNum","blankNode","prependSlides","appendSlides","cloneNode","loopDestroy","moving","isLocked","cursor","unsetGrabCursor","attachEvents","detachEvents","breakpoint","getBreakpoint","currentBreakpoint","breakpointParams","originalParams","wasMultiRow","isMultiRow","wasEnabled","emitContainerClasses","fill","directionChanged","needsReLoop","changeDirection","isEnabled","disable","enable","containerEl","currentHeight","points","point","minRatio","substr","sort","b","wasLocked","lastSlideIndex","lastSlideRightEdge","addClasses","suffixes","entries","prefix","resultClasses","autoheight","centered","removeClasses","loadImage","imageEl","srcset","sizes","checkForComplete","image","onReady","complete","onerror","imagesLoaded","imagesToLoad","currentSrc","extendedDefaults","Swiper","swipers","newParams","__modules__","mod","extendParams","swiperParams","passedParams","eventName","velocity","desktop","touchEventsTouch","touchEventsDesktop","clickTimeout","velocities","installModule","extendDefaults","newDefaults","use","setProgress","cls","getSlideClasses","slideEl","updates","view","exact","spv","breakLoop","translateValue","newDirection","needUpdate","currentDirection","mount","mounted","getWrapperSelector","wrapper","destroy","deleteInstance","cleanStyles","createElementIfNotDefined","checkProps","element","classesToSelector","appendSlide","observer","prependSlide","addSlide","activeIndexBuffer","baseLength","slidesBuffer","currentSlide","removeSlide","slidesIndexes","indexToRemove","removeAllSlides","effectInit","overwriteParams","perspective","overwriteParamsResult","_s","effectTarget","effectParams","$slideEl","transformEl","effectVirtualTransitionEnd","allSlides","eventTriggered","triggerEvents","createShadow","shadowClass","$shadowContainer","$shadowEl","prototypeGroup","protoMethod","resizeHandler","orientationChangeHandler","ResizeObserver","newWidth","contentBoxSize","contentRect","inlineSize","blockSize","observe","unobserve","observers","attach","MutationObserver","WebkitMutationObserver","mutations","observerUpdate","childList","characterData","observeParents","observeSlideChildren","containerParents","disconnect","cssModeTimeout","renderSlide","cache","force","addSlidesBefore","addSlidesAfter","previousFrom","from","previousTo","previousSlidesGrid","previousOffset","offsetProp","slidesAfter","slidesBefore","onRendered","lazy","load","renderExternal","slidesToRender","renderExternalUpdate","prependIndexes","appendIndexes","numberOfNewSlides","newCache","cachedIndex","$cachedEl","cachedElIndex","handle","kc","charCode","pageUpDown","keyboard","isPageUp","isPageDown","isArrowLeft","isArrowRight","isArrowUp","isArrowDown","altKey","ctrlKey","metaKey","onlyInViewport","inView","swiperWidth","swiperHeight","windowWidth","windowHeight","swiperOffset","swiperCoord","returnValue","timeout","mousewheel","releaseOnEdges","invert","forceToAxis","sensitivity","eventsTarget","thresholdDelta","thresholdTime","lastEventBeforeSnap","lastScrollTime","recentWheelEvents","handleMouseEnter","mouseEntered","handleMouseLeave","animateSlider","newEvent","delta","raw","rtlFactor","sX","sY","pX","pY","wheelDelta","wheelDeltaY","wheelDeltaX","HORIZONTAL_AXIS","deltaY","deltaX","deltaMode","spinX","spinY","pixelX","pixelY","positions","sign","ignoreWheelEvents","position","sticky","shift","prevEvent","firstEvent","snapToThreshold","autoplayDisableOnInteraction","getEl","toggleEl","disabled","disabledClass","tagName","lockClass","$nextEl","$prevEl","onPrevClick","onNextClick","hideOnClick","hiddenClass","targetEl","pagination","clickable","isHidden","bulletSize","pfx","bulletElement","renderBullet","renderProgressbar","renderFraction","renderCustom","progressbarOpposite","dynamicBullets","dynamicMainBullets","formatFractionCurrent","number","formatFractionTotal","bulletClass","bulletActiveClass","modifierClass","currentClass","totalClass","progressbarFillClass","progressbarOppositeClass","clickableClass","horizontalClass","verticalClass","bullets","dynamicBulletIndex","isPaginationDisabled","setSideBullets","$bulletEl","total","paginationType","firstIndex","lastIndex","midIndex","suffix","bullet","$bullet","bulletIndex","$firstDisplayedBullet","$lastDisplayedBullet","dynamicBulletsLength","bulletsOffset","progressbarDirection","scale","scaleX","scaleY","render","paginationHTML","numberOfBullets","dragStartPos","dragSize","trackSize","divider","dragTimeout","scrollbar","$dragEl","newSize","newPos","hide","opacity","display","getPointerPosition","clientX","clientY","setDragPosition","positionRatio","onDragStart","onDragMove","onDragEnd","snapOnRelease","activeListener","eventMethod","$swiperEl","dragClass","dragEl","draggable","parallax","setTransform","currentOpacity","currentScale","_swiper","parallaxEl","$parallaxEl","parallaxDuration","zoom","maxRatio","containerClass","zoomedSlideClass","gesturesEnabled","fakeGestureTouched","fakeGestureMoved","isScaling","gesture","slideWidth","slideHeight","$imageEl","$imageWrapEl","minX","minY","maxX","maxY","touchesStart","touchesCurrent","prevPositionX","prevPositionY","prevTime","getDistanceBetweenTouches","x1","y1","x2","y2","onGestureStart","scaleStart","onGestureChange","scaleMove","onGestureEnd","scaledWidth","scaledHeight","onTransitionEnd","zoomIn","touchX","touchY","translateX","translateY","imageWidth","imageHeight","translateMinX","translateMinY","translateMaxX","translateMaxY","touchAction","zoomOut","zoomToggle","getListeners","activeListenerWithCapture","getSlideSelector","toggleGestures","slideSelector","enableGestures","disableGestures","momentumDurationX","momentumDurationY","momentumDistanceX","newPositionX","momentumDistanceY","newPositionY","momentumDuration","in","out","checkInView","loadPrevNext","loadPrevNextAmount","loadOnTransitionStart","scrollingElement","elementClass","loadingClass","loadedClass","preloaderClass","scrollHandlerAttached","initialImageLoaded","loadInSlide","loadInDuplicate","$images","background","$pictureEl","sourceEl","$source","slideOriginalIndex","slideExist","amount","maxIndex","minIndex","checkInViewOnLoad","$scrollElement","isWindow","scrollElementWidth","scrollElementHeight","LinearSpline","i1","i3","binarySearch","guess","array","interpolate","removeSpline","controller","control","spline","inverse","by","_t","controlledTranslate","controlled","setControlledTranslate","setControlledTransition","a11y","notificationClass","prevSlideMessage","nextSlideMessage","firstSlideMessage","lastSlideMessage","paginationBulletMessage","slideLabelMessage","containerMessage","containerRoleDescriptionMessage","itemRoleDescriptionMessage","slideRole","liveRegion","notify","notification","makeElFocusable","makeElNotFocusable","addElRole","role","addElRoleDescription","description","addElLabel","disableEl","enableEl","onEnterOrSpaceKey","click","updateNavigation","hasPagination","initNavEl","wrapperId","controls","$containerEl","repeat","round","random","live","bulletEl","paths","slugify","getPathValues","urlOverride","pathArray","part","setHistory","includes","currentState","state","scrollToSlide","setHistoryPopState","hashNavigation","watchState","onHashChange","newHash","setHash","$activeSlideEl","autoplayResult","reverseDirection","stopOnLastSlide","pause","waitForTransition","onVisibilityChange","visibilityState","onMouseEnter","disableOnInteraction","onMouseLeave","pauseOnMouseEnter","thumbs","multipleActiveThumbs","autoScrollOffset","slideThumbActiveClass","thumbsContainerClass","swiperCreated","onThumbClick","thumbsSwiper","currentIndex","thumbsParams","SwiperClass","thumbsSwiperParams","useOffset","newThumbsIndex","currentThumbsIndex","prevThumbsIndex","nextThumbsIndex","thumbsToActivate","thumbActiveClass","momentum","momentumRatio","momentumBounce","momentumBounceRatio","momentumVelocityRatio","minimumVelocity","lastMoveEvent","velocityEvent","distance","momentumDistance","newPosition","afterBouncePosition","needsLoopFix","doBounce","bounceAmount","moveDistance","currentSlideSize","slidesNumberEvenToRows","slidesPerRow","numFullColumns","newSlideOrderIndex","column","row","groupIndex","slideIndexInGroup","columnsInGroup","order","fadeEffect","crossFade","tx","ty","slideOpacity","cubeEffect","slideShadows","shadow","shadowOffset","shadowScale","$cubeShadowEl","wrapperRotate","slideAngle","tz","shadowBefore","shadowAfter","shadowAngle","sin","scale1","scale2","zFactor","flipEffect","limitRotation","rotateY","rotateX","zIndex","coverflowEffect","rotate","stretch","depth","modifier","center","offsetMultiplier","translateZ","slideTransform","$shadowBeforeEl","$shadowAfterEl","creativeEffect","limitProgress","shadowPerProgress","progressMultiplier","custom","getTranslateValue","translateString","rotateString","scaleString","opacityString","shadowOpacity","cardsEffect","tX","tY","tZ","tXAdd","isSwipeToNext","isSwipeToPrev","subProgress","prevY","utils","$mainPDPGallery","$modelDescription","getOnModelData","onModelValue","modelKey","modelObject","onModelObj","modelValue","variantUPC","modelDescription","imageModelData","modelDataValue","modelImg","triggerOnModelDescription","imageclick","debounce","reinitializeCarousels","$clickedItem","targetContentSelector","slick","$this","$hybridTabbedContainer","isHighRes","isLowRes","$thisItem","$clickedTab","$contentContainer","$targetContent","$ofs","slideToItem","show","mixin","allExports","onModel","Badge","Overview","minicartSaleItemAlertBadge","oosData","$productObject","topLevelAttribute","$swatchSpan","$swatchAnchor","swatchOutOfStockText","enableNotifyMe","variantData","color","bisnflag","isNotifyMeEnabled","displayValue","preventScroll","masterSelectable","pdpUrl","getSkuValues","skuArray","attributeID","sku","attributeValue","getSelectedSwatchValue","variantID","swatchArrays","swatchKeys","markOOSColorVariants","colorVariantArrays","colorVariantKeys","colorVarKey","updateOOSColorVariants","masterID","String","productCache","variantMatrix","inventory","sizeVariantArrays","sizeVariantKeys","dimVariantArrays","dimension","dimVariantKeys","selectedSize","selectedDim","oosVariants","variant","productObject","topLevelArray","allAttributes","selectedCount","attrOutOfStockText","attributeId","masterId","hasSizeType","hasColor","hasSize","hasDimension","selectedAttributes","selectedSizeType","validSizes","validColors","skuColorArray","skuSizeArray","selectedColor","validDimensions","hideShowValidSwatches","groupVisible","hideColorPriceGroups","setVariantNotifyMeStatus","variantMaster","colorSwatchID","colorSwatchVariantArray","variantSize","variantNotifyMe","createSwiperAssets","assetData","assetType","$swiperSlide","$imageGallery","$wrapper","isThumbnail","modelId","createSketchfabAsset","$asset","$swiperContent","videoID","videoType","productVideoThumbnail","productVideoThumbnailAltText","createVideoAsset","createImagesAndVideo","$imageGalleries","retinaEnabled","hiresImgUrlParams","pdpImgUrlParams","pdpProductImgAppend","badgeData","pdpTechBadgeData","isQuickView","enableStylitics","stylitics","$swiperWrapper","swiperSlideStyle","imageAltIdx","idx","imageData","badgeHTML","displayBadge","techBadgeHTML","displayTechBadge","swiperSlideClass","$swiperImg","$zoomControls","$styliticsLink","videoUrl","productVideoAltText","posterUrl","onModelAttribute","modelData","jumplinkCta","retinaUrl","onColorVariantHover","altText","productThumbnailAltText","product_VideoData","productVideoData","videoData","selectedAttributeID","isVariant","$omnibusPrice","enableServerSideGallery","primaryImage","variantUrl","updatedAttr","linkedSizesHtml","lowestPrice30Days","promotions","promotion","isExclusive","callOutMessageDisplayPages","displayPage","calloutMsg","details","getPromotionCalloutHtml","highlightClass","messageHighlight","calloutOpenAccount","getExclusivePromotionCalloutHtml","exclusivePromotion","instockBool","instock","velocityValue","velocityMessages","velocityMessage","sales","class","cssClass","outerHTML","colorValue","sizeValue","dimensionValue","getUserSelectedAttributes","galleryURL","$$productGalleryContainer","$productGallery","$productGalleryThumb","preQuickViewModalDigitalData","dtmLayer","page","pageInfo","pageURL","user","attributeType","$existingOldChemistryListItem","oldChemistryText","$prop65ListItemElement","oldChemistryListItemHTMLString","after","updateOldChemistryMessaging","UUID","pageStart","moreURL","isEverythingSelected","$addToCartButton","$swatchAttributes","swatchGroupSelectors","allAttributesSelected","popupAlignment","$popup","viewportWidth","elementCenter","popupHalfWidth","showOutOfStockPopup","$sizeSwatch","thisSwatch","one","disabledAddToCartHandler","$dimElement","$sizeElement","$sizeSwatchSelected","onClickAddToCartButtonDisabled","updateSwatchAttributeLabel","$swatch","selectedValue","initExclusiveEvents","qvPid","setItem","removeItem","$swatchClicked","$selectedAttrUrl","selectedAttrUrl","$url","$dimensionSwatches","$selectedAttr","appendDimensionParams","$swatchEntered","currentLabelText","sizeSwatch","quickViewSwatchFunctionality","searchPID","isNumeric","quantityTotal","isReservable","reservableProduct","hasError","hideMinicartTimeout","dtmEvent","action","_satellite","track","Event","restoreDTM","forceOOSNotifyMe","$notifymeVariant","hideForm","notifyme","overviewInit","include","$mainGallery","$thumbnailGallery","swiperMain","swiperThumb","player","initVideoPlayer","$videoSlide","playerHost","videoId","playerId","tagId","firstScriptTag","videoPlayerObserver","videoPlayers","subtree","pauseVideo","initGalleryEvents","$imageClicked","$selectedColorSwatch","basePid","modalHTML","$zoomModal","imageIndexToZoom","$modalBody","zoomViewerHeight","modalBodyPadding","zoomIndex","$zoomViewer","$bigImg","$elem","hiResImage","imgX","imgY","viewerWidth","viewerHeight","difWidth","difHeight","viewerOffset","$activeThumb","initZoom","setImageUrl","galleryConfig","galleryElements","config","hasThumbnails","isQuickview","gallerySelector","thumbnailSelector","galleryContainerSelector","$galleryContainer","$gallery","$thumbnail","getGalleryElements","$main","swiperGalleryMain","swiperConfigMain","swiperGalleryThumb","initSwiperGallery","highlightMultiplierReward","rewardsData","rewardsHtml","gridBadge","badgeType","gridBadgeValue","gridBadgeDisplay","hasSaleSwatchSelected","hideDynamicBadges","isStaticType","svg","svgClass","svgWidth","svgHeight","svgID","closeModal","enableScroll","buildModal","launchModal","disableScroll","tabbedContainer","showUnitToggle","selectCategory","$element","elementIdParts","categorySuffix","dataset","subcat","genderToShow","gendershow","sectionDiv","buttonText","gender","$categorySelected","$divSelected","$activeCategory","$activeSection","menuText","genderCategory","collapse","toggleCategorySizeFit","innerText","toggleMeasurements","useCentimeters","$toggleTable","$columnHeaders","nthIndex","$toggleCell","convertedValue","unit","toFixed","unitConversion","clearTableClasses","$tableElement","applyTableElementStyle","createScrollButtons","$activeContent","tableHeaderHeight","$rightScrollButton","$leftScrollButton","scrollButtonPosition","$container","$table","tableOverflow","initSizeFit","$sizeFitModal","fitAsset","$unitToggles","$activeTable","$currentScrollButton","$tdElement","containsTdElement","elementIndex","has","iterator","rowElement","$rowElement","columnIndex","childElement","$childElement","getSizeFitGuideContent","$modalContentWrapper","successHandler","overflowSlider","parentElement","slideByAmount","slideToX","dragStart","dragging","dragEnd","toggleArrows","listenForArrowClicks","setHeight","clamp","windowResizeTimeoutId","collection","sliderSelector","sliderClass","arrowLeftSelector","arrowLeftClass","arrowRightSelector","arrowRightClass","percentToSlide","newXPos","endX","startXPos","containerSize","sliderSize","always","$item","itemLeft","$slider","currentSliderXPos","sliderMargin","arrowSize","showArrows","itemRight","ofsWidth","ofs","mouseX","sliderX","isDragging","mouseDownXPos","slideAmount","instanceSettings","sliderHeight","$sliderContainer","expectedHeight","attrOptions","elem","imgLoadedTimeoutID","clickedTab","itemClass","arrowBtns","arrowLeftLabel","arrowClass","arrowRightLabel","alignArrowsToImgs","firstImg","imgHeight","$activeItem","activeItemClass","itemSelector","isCurrentBreakpointAbbreviation","breakpointAbbreviation","$breakpointIndicator","isCurrentBreakpoint","abbreviation","getCurrentBreakpoint","currentBP","$bpIndicator","ArrayProto","ObjProto","SymbolProto","nativeIsArray","nativeKeys","nativeCreate","_isNaN","_isFinite","Ctor","_wrapped","VERSION","optimizeCb","argCount","accumulator","baseIteratee","identity","isFunction","matcher","iteratee","Infinity","cb","restArguments","rest","baseCreate","shallowProperty","_has","deepGet","MAX_ARRAY_INDEX","pow","getLength","isArrayLike","_keys","results","currentKey","createReduce","reducer","memo","reduceRight","predicate","findIndex","findKey","reject","negate","every","fromIndex","guard","invoke","contextPath","pluck","where","findWhere","computed","lastComputed","shuffle","sample","clone","last","rand","sortBy","criteria","group","behavior","partition","groupBy","indexBy","countBy","reStrSymbol","isString","pass","compact","Boolean","_flatten","shallow","strict","isArguments","flatten","without","otherArrays","difference","uniq","isSorted","isBoolean","seen","union","arrays","intersection","argsLength","unzip","zip","createPredicateIndexFinder","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","lastIndexOf","range","chunk","executeBound","sourceFunc","boundFunc","callingContext","bound","callArgs","concat","partial","boundArgs","placeholder","bindAll","memoize","hasher","address","defer","throttle","previous","later","throttled","_now","remaining","immediate","callNow","compose","times","before","hasEnumBug","propertyIsEnumerable","nonEnumerableProps","collectNonEnumProps","nonEnumIdx","allKeys","mapObject","pairs","functions","names","createAssigner","keysFunc","source","extendOwn","keyInObj","pick","omit","tap","interceptor","isMatch","aStack","bStack","areArrays","aCtor","bCtor","deepEq","isEmpty","isElement","tagTester","isNumber","isDate","isRegExp","isError","isMap","isWeakMap","isSet","isWeakSet","nodelist","isNull","isUndefined","constant","noop","propertyOf","accum","Int8Array","escapeMap","unescapeMap","createEscaper","escaper","testRegexp","RegExp","replaceRegexp","escape","unescape","fallback","idCounter","uniqueId","templateSettings","evaluate","noMatch","escapes","escapeRegExp","escapeChar","template","oldSettings","variable","argument","chain","instance","_chain","chainResult","toJSON","ImageGallery","loyalty","sizefitJs","pollCountMax","initialPageLoad","refreshKlarnaPlacements","displayedPrice","klarnaPriceValue","Klarna","OnsiteMessaging","refresh","scrollToAccordionSection","sectionSelector","$productDetailsContainer","$productAccordianDrawer","headerHeight","initGallery","hideSizeFitModal","createSizeFitModal","modalConfig","modalMarkup","$modal","launchSizeGuide","sizeGuideUrl","unitType","ssp","sizefitSwitch","toggleHTML","setSelectedInventoryStatus","$attributeLabelValue","$auxSwatch","outOfStockText","$targetNode","$dimensionSwatchSelected","$colorValue","colorSelected","queryScOnLoad","mutationsList","$bvReviewRatings","scOnLoad","$swatchSelected","customValueUrl","initProcess","internalProcessValue","processCopy","process","processValue","env","processParam","stickyAddToCart","$stickyButton","stickyButtonOffsetTop","$discountPercentage","$pranaRating","updateAttributesAndDetails","attributesHtml","shortDescription","longDescription","$inStorePickupContainer","availableForInStorePickup","showSpinner","updateAttribute","updateAddToCart","disableAddToCart","$availabilityMsgContainer","dismissible","isMaster","allAvailable","allReady","onScrollToDetails","initLoyalty","onClickReviewStars","queryParamProductReviews","bvOpen","launchOmnibusReviewModal","modalTitle","modalContent","launchSizeGuideModal","onSelectAttribute","attrType","attributeLabelValue","onWriteReviewButtonPoll","pollCallback","bvOpenWriteReview","$button","freeSelf","formValidation","showValidationFeedback","clearValidationFeedback","checkValidInput","inputElem","setCustomValidity","checkValidity","validationMessage","submitNotifyMeForm","isValid","errors","validationResult","validationResponse","validateNotifyMeForm","registerNotifyMeForm","elements","variantPID","serialize","handleNotifyMeSuccess","createNotifyMeForm","$formContainer","lazyLoadUrl","responseHTML"],"mappings":"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","file":"productDetail.js","sourcesContent":[" \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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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 = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 288);\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","let dangerZone = 60; // change to a danger theme at this time.\nlet messageBufferTime = 5; // time to account for page loading when time passes.\nconst reservationTimerId = 'reservationTimer';\nconst reservationTimerIdSelector = `#${reservationTimerId}`;\n\nconst getExpireTime = () => {\n return $(reservationTimerIdSelector).data('expireTime') || 0;\n};\n\nconst calculateNewExpireTime = () => {\n return new Date().getTime() + parseInt(window.resources.reservation.reservationSecondsRemaining * 1000, 10);\n};\n\nconst destroyTimer = () => {\n const $timerBanner = $(reservationTimerIdSelector);\n const reservationInterval = $timerBanner.data('reservationInterval');\n\n clearInterval(reservationInterval);\n\n $timerBanner.data('reservationInterval', null);\n $timerBanner.data('expireTime', null);\n\n if (window.resources && window.resources.reservation && window.resources.reservation.reservationSecondsRemaining) {\n delete window.resources.reservation.reservationSecondsRemaining;\n }\n if ($timerBanner && $timerBanner.length) {\n $timerBanner.trigger('close');\n }\n};\n\nconst getRemainingSeconds = (expireTime = getExpireTime()) => {\n let now = new Date().getTime();\n let secondsRemaining = parseInt((expireTime - now) / 1000, 10);\n\n return secondsRemaining;\n};\n\nconst popBanners = () => {\n if (window.resources && window.resources.reservation && window.resources.reservation.messages) {\n const remainingSeconds = getRemainingSeconds();\n // check each message for a matching time.\n let msgKeys = Object.keys(window.resources.reservation.messages);\n for (let i = 0; i < msgKeys.length; i++) {\n let msgKey = msgKeys[i];\n let msg = window.resources.reservation.messages[msgKey];\n\n let startTime = typeof msg.startTime !== 'undefined' ? msg.startTime : remainingSeconds; // display it immediately if startTime is undefined.\n let endTime = startTime - messageBufferTime;\n if ((remainingSeconds <= startTime && remainingSeconds > endTime) || typeof msg.startTime === 'undefined') {\n // show the banner:\n let html = `

${msg.title}

\n

${msg.message}

\n ${msg.additionalContent || ''}`;\n $.alert({\n content: html,\n placement: 'banner',\n theme: msg.theme,\n id: msgKey,\n containerId: 'reservationBannerContainer',\n timeToLive: 10000\n });\n // we've used the message, so remove it from the list\n delete window.resources.reservation.messages[msgKey];\n }\n }\n }\n};\n\nconst createTimeString = (remainingSeconds) => {\n let mins = Math.floor(remainingSeconds / 60);\n let secs = remainingSeconds % 60;\n if (secs < 10) {\n secs = '0' + secs; // convert to a string so we can have two digits. 9 => '09'\n }\n return `${mins}:${secs}`;\n};\n\nconst updateReservationTimer = () => {\n const remainingSeconds = getRemainingSeconds();\n\n if (remainingSeconds >= 0) {\n $('.reservation__time').text(createTimeString(remainingSeconds));\n\n if (remainingSeconds <= dangerZone) {\n // change the theme from 'info' to 'danger'\n $(`${reservationTimerIdSelector}.alert--info`).toggleClass('alert--info alert--danger');\n } else {\n $(`${reservationTimerIdSelector}.alert--danger`).toggleClass('alert--info alert--danger');\n }\n\n popBanners();\n } else {\n destroyTimer();\n }\n};\n\nconst startTimer = () => {\n const $timerBanner = $(reservationTimerIdSelector);\n const expireTime = calculateNewExpireTime();\n\n if (!$timerBanner || !$timerBanner.length) { // $timerBanner might be undefined, empty jquery object (truthy), or a valid jquery object (length 1)\n const remainingSeconds = getRemainingSeconds(expireTime);\n\n if (remainingSeconds >= 0) { // when remainingSeconds === 0, we still want to display '0:00'\n let initialTimeStr = createTimeString(remainingSeconds);\n let timeRemainingMessage = window.resources.reservation.timeRemainingMessage;\n const reservationInterval = setInterval(updateReservationTimer, 1000);\n\n $.alert({\n content: `
${timeRemainingMessage} ${initialTimeStr}
`,\n placement: 'banner',\n theme: window.resources.reservation.reservationSecondsRemaining <= dangerZone ? 'danger' : 'info',\n id: reservationTimerId,\n containerId: 'reservationBannerContainer',\n autoClose: false\n }).data('reservationInterval', reservationInterval).data('expireTime', expireTime);\n }\n } else {\n $timerBanner.data('expireTime', expireTime);\n }\n};\n\nconst init = () => {\n if (window.resources && window.resources.reservation && window.resources.reservation.reservationSecondsRemaining) {\n startTimer();\n }\n // remove any existing banners.\n $('#reservationBannerContainer').find('.alert').not(reservationTimerIdSelector).remove();\n popBanners();\n};\n\nconst updateReservationData = (response) => {\n if (response && response.reservation) {\n if (window.resources) {\n if (window.resources.reservation) {\n window.resources.reservation.messages = $.extend({}, window.resources.reservation.messages, response.reservation.messages);\n window.resources.reservation.reservationSecondsRemaining = response.reservation.reservationSecondsRemaining;\n $(reservationTimerIdSelector).data('remainingSeconds', parseInt(response.reservation.reservationSecondsRemaining, 10));\n } else {\n window.resources.reservation = response.reservation;\n }\n } else {\n window.resources = {\n reservation: response.reservation\n };\n }\n init();\n }\n};\n\nconst getDestroyTimer = () => {\n return destroyTimer;\n};\n\nmodule.exports = {\n init,\n getDestroyTimer,\n updateReservationData\n};\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","'use strict';\n\n/**\n * Adds or removes the alert-badge red dot on the minicart icon based on if\n * the Price Drop Modal is enabled and the user has a value for the\n * priceDropUserSegment in sessionStorage.\n */\nfunction toggleAlertBadge() {\n const $icon = $('.minicart-icon .svgicon');\n const hasAlertWrapper = $icon.parent().hasClass('alert-badge');\n\n if (window.clientData && window.clientData.priceDropModalEnabled) {\n const customerGroup = sessionStorage.getItem('priceDropUserSegment');\n\n if (customerGroup) {\n const hasSaleItemInCart = !!(window.digitalData && window.digitalData.cart && window.digitalData.cart.item) && window.digitalData.cart.item.some(item => item.isSaleItem === 'Yes');\n\n if (hasSaleItemInCart && !hasAlertWrapper) {\n $icon.wrap('
');\n } else if (!hasSaleItemInCart && hasAlertWrapper) {\n $icon.unwrap('.alert-badge');\n }\n } else if (hasAlertWrapper) {\n $icon.unwrap('.alert-badge');\n }\n } else if (hasAlertWrapper) {\n $icon.unwrap('.alert-badge');\n }\n}\n\nmodule.exports = {\n toggleAlertBadge\n};\n","'use strict';\n\n/**\n * Remove all validation. Should be called every time before revalidating form\n * @param {element} form - Form to be cleared\n * @returns {void}\n */\nfunction clearFormErrors(form) {\n $(form).find('.form-control.is-invalid').removeClass('is-invalid');\n}\n\nmodule.exports = function (formElement, payload) {\n // clear form validation first\n clearFormErrors(formElement);\n\n if (typeof payload === 'object' && payload.fields) {\n Object.keys(payload.fields).forEach(function (key) {\n if (payload.fields[key]) {\n var feedbackElement = $(formElement).find('[name=\"' + key + '\"]')\n .parent()\n .children('.invalid-feedback');\n\n if (feedbackElement.length > 0) {\n if (Array.isArray(payload[key])) {\n feedbackElement.html(payload.fields[key].join('
'));\n } else {\n feedbackElement.html(payload.fields[key]);\n }\n feedbackElement.siblings('.form-control').addClass('is-invalid');\n }\n }\n });\n }\n if (payload && payload.error) {\n // Modified to leverage alerts component\n const $formElement = $(formElement);\n const $form = $formElement.prop('tagName') === 'FORM'\n ? $formElement\n : $formElement.closest('form');\n\n $form.alert({\n content: payload.error.join('
'),\n theme: 'danger',\n attachment: 'prepend',\n autoClose: false\n });\n }\n};\n","'use strict';\n\nvar processInclude = require('./components/processInclude');\n\njQuery(function () {\n processInclude(require('./notifyMe/notifyMe'));\n processInclude(require('./product/detail'));\n\n // hacky solution to making BV in-drawer review links open accordion drawers\n $(document).on('mousedown', 'a[data-content-type=\"review\"], .bv-rating, a.bv-rating-stars-container, a.bv-rating-label', function (e) {\n var accordionHeader = $('.product-accordion-reviews__header');\n if (accordionHeader.hasClass('collapsed')) {\n e.preventDefault();\n accordionHeader.trigger('click');\n var reviewAnchorOffset = $('#product-accordion-reviews').offset();\n $('body').animate({\n scrollTop: reviewAnchorOffset.top\n });\n }\n });\n});\n","'use strict';\nvar focusHelper = require('../components/focus');\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n var pid;\n\n if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el).closest('.product-detail').find('.product-id').text();\n } else {\n pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n }\n\n return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n var quantitySelected;\n if ($el && $('.set-items').length) {\n quantitySelected = $($el).closest('.product-detail').find('.quantity-select');\n } else if ($el && $('.product-bundle').length) {\n var quantitySelectedModal = $($el).closest('.modal-footer').find('.quantity-select');\n var quantitySelectedPDP = $($el).closest('.bundle-footer').find('.quantity-select');\n if (quantitySelectedModal.val() === undefined) {\n quantitySelected = quantitySelectedPDP;\n } else {\n quantitySelected = quantitySelectedModal;\n }\n } else {\n quantitySelected = $('.quantity-select');\n }\n return quantitySelected;\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs) {\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' +\n attrValue.value + '\"]');\n var $swatchButton = $attrValue.parent();\n\n if (attrValue.selected) {\n $attrValue.addClass('selected');\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n } else {\n $attrValue.removeClass('selected');\n $attrValue.siblings('.selected-assistive-text').empty();\n }\n\n if (attrValue.url) {\n $swatchButton.attr('data-url', attrValue.url);\n } else {\n $swatchButton.removeAttr('data-url');\n }\n\n // Disable if not selectable\n $attrValue.removeClass('selectable unselectable');\n\n $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\n });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n var $attr = '[data-attr=\"' + attr.id + '\"]';\n var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n $defaultOption.attr('value', attr.resetUrl);\n\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer\n .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\n $attrValue.attr('value', attrValue.url)\n .removeAttr('disabled');\n\n if (!attrValue.selectable) {\n $attrValue.attr('disabled', true);\n }\n });\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs) {\n // Currently, the only attribute type that has image swatches is Color.\n var attrsWithSwatches = ['color'];\n\n attrs.forEach(function (attr) {\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\n processSwatchValues(attr, $productContainer, msgs);\n } else {\n processNonSwatchValues(attr, $productContainer);\n }\n });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n * attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n var availabilityValue = '';\n var availabilityMessages = response.product.availability.messages;\n if (!response.product.readyToOrder) {\n availabilityValue = '
  • ' + response.resources.info_selectforstock + '
  • ';\n } else {\n availabilityMessages.forEach(function (message) {\n availabilityValue += '
  • ' + message + '
  • ';\n });\n }\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n if (!attributes) {\n return '';\n }\n\n var html = '';\n\n attributes.forEach(function (attributeGroup) {\n if (attributeGroup.ID === 'mainAttributes') {\n attributeGroup.attributes.forEach(function (attribute) {\n html += '
    ' + attribute.label + ': '\n + attribute.value + '
    ';\n });\n }\n });\n\n return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n\t// Update options\n $productContainer.find('.product-options').empty().html(optionsHtml);\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, $productContainer) {\n var carousel = $productContainer.find('.carousel');\n $(carousel).carousel('dispose');\n var carouselId = $(carousel).attr('id');\n $(carousel).empty().append('
      ' + $(carousel).data('prev') + '' + $(carousel).data('next') + '');\n for (var i = 0; i < imgs.length; i++) {\n $('
      \"'
      ').appendTo($(carousel).find('.carousel-inner'));\n $('
    1. ').appendTo($(carousel).find('.carousel-indicators'));\n }\n $($(carousel).find('.carousel-item')).first().addClass('active');\n $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\n if (imgs.length === 1) {\n $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\n }\n $(carousel).carousel();\n $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n var isChoiceOfBonusProducts =\n $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n var isVaraint;\n if (response.product.variationAttributes) {\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n isVaraint = response.product.productType === 'variant';\n if (isChoiceOfBonusProducts && isVaraint) {\n $productContainer.parent('.bonus-product-item')\n .data('pid', response.product.id);\n\n $productContainer.parent('.bonus-product-item')\n .data('ready-to-order', response.product.readyToOrder);\n }\n }\n\n // Update primary images\n var primaryImageUrls = response.product.images.large;\n createCarousel(primaryImageUrls, $productContainer);\n\n // Update pricing\n if (!isChoiceOfBonusProducts) {\n var $priceSelector = $('.prices .price', $productContainer).length\n ? $('.prices .price', $productContainer)\n : $('.prices .price');\n $priceSelector.replaceWith(response.product.price.html);\n }\n\n // Update promotions\n $productContainer.find('.promotions').empty().html(response.product.promotionsHtml);\n\n updateAvailability(response, $productContainer);\n\n if (isChoiceOfBonusProducts) {\n var $selectButton = $productContainer.find('.select-bonus-product');\n $selectButton.trigger('bonusproduct:updateSelectButton', {\n product: response.product, $productContainer: $productContainer\n });\n } else {\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n product: response.product, $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n }\n\n // Update attributes\n $productContainer.find('.main-attributes').empty()\n .html(getAttributesHtml(response.product.attributes));\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n * etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n if ($productContainer.parent('.bonus-product-item').length <= 0) {\n var optionsHtml = quantities.map(function (quantity) {\n var selected = quantity.selected ? ' selected ' : '';\n return '';\n }).join('');\n getQuantitySelector($productContainer).empty().html(optionsHtml);\n }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction attributeSelect(selectedValueUrl, $productContainer) {\n if (selectedValueUrl) {\n $('body').trigger('product:beforeAttributeSelect',\n { url: selectedValueUrl, container: $productContainer });\n\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\n handleVariantResponse(data, $productContainer);\n updateOptions(data.product.optionsHtml, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n $('body').trigger('product:afterAttributeSelect',\n { data: data, container: $productContainer });\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $('
      ').append($.parseHTML(html));\n\n var body = $html.find('.choice-of-bonus-product');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n $('.modal-body').spinner().start();\n\n if ($('#chooseBonusProductModal').length !== 0) {\n $('#chooseBonusProductModal').remove();\n }\n var bonusUrl;\n if (data.bonusChoiceRuleBased) {\n bonusUrl = data.showProductsUrlRuleBased;\n } else {\n bonusUrl = data.showProductsUrlListBased;\n }\n\n var htmlString = ''\n + '
      '\n + ''\n + '
      '\n + ''\n + '
      '\n + '
      '\n + ' ' + data.labels.selectprods + ''\n + ' '\n + '
      '\n + '
      '\n + '
      '\n + '
      '\n + '
      '\n + '
      ';\n $('body').append(htmlString);\n $('.modal-body').spinner().start();\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'json',\n success: function (response) {\n var parsedHtml = parseHtml(response.renderedTemplate);\n $('#chooseBonusProductModal .modal-body').empty();\n $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\n $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n $('#chooseBonusProductModal').modal('show');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n $('.minicart').trigger('count:update', response);\n var messageType = response.error ? 'alert-danger' : 'alert-success';\n // show add to cart toast\n if (response.newBonusDiscountLineItem\n && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n chooseBonusProducts(response.newBonusDiscountLineItem);\n } else {\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append(\n '
      '\n );\n }\n\n $('.add-to-cart-messages').append(\n '
      '\n + response.message\n + '
      '\n );\n\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 5000);\n }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n var childProducts = [];\n $('.bundle-item').each(function () {\n childProducts.push({\n pid: $(this).find('.product-id').text(),\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n });\n });\n\n return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n .data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n}\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n if (url) {\n $.ajax({\n url: url,\n method: 'GET',\n success: function () {\n // reporting urls hit on the server\n },\n error: function () {\n // no reporting urls hit on the server\n }\n });\n }\n}\n\nmodule.exports = {\n attributeSelect: attributeSelect,\n methods: {\n editBonusProducts: function (data) {\n chooseBonusProducts(data);\n }\n },\n\n focusChooseBonusProductModal: function () {\n $('body').on('shown.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'true');\n $('#chooseBonusProductModal .close').focus();\n });\n },\n\n onClosingChooseBonusProductModal: function () {\n $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'false');\n });\n },\n\n trapChooseBonusProductModalFocus: function () {\n $('body').on('keydown', '#chooseBonusProductModal', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '#chooseBonusProductModal',\n firstElementSelector: '.close',\n lastElementSelector: '.add-bonus-products'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n\n colorAttribute: function () {\n $(document).on('click', '[data-attr=\"color\"] button', function (e) {\n e.preventDefault();\n\n if ($(this).attr('disabled')) {\n return;\n }\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n\n attributeSelect($(this).attr('data-url'), $productContainer);\n });\n },\n\n selectAttribute: function () {\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n attributeSelect(e.currentTarget.value, $productContainer);\n });\n },\n\n availability: function () {\n $(document).on('change', '.quantity-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n }\n\n if ($('.bundle-items', $productContainer).length === 0) {\n attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n $productContainer);\n }\n });\n },\n\n addToCart: function () {\n $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n var addToCartUrl;\n var pid;\n var pidsObj;\n var setPids;\n\n $('body').trigger('product:beforeAddToCart', this);\n\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n setPids = [];\n\n $('.product-detail').each(function () {\n if (!$(this).hasClass('product-set-detail')) {\n setPids.push({\n pid: $(this).find('.product-id').text(),\n qty: $(this).find('.quantity-select').val(),\n options: getOptions($(this))\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: getQuantitySelected($(this))\n };\n\n if (!$('.bundle-item').length) {\n form.options = getOptions($productContainer);\n }\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\n handlePostCartAdd(data);\n $('body').trigger('product:afterAddToCart', data);\n $.spinner().stop();\n miniCartReportingUrl(data.reportingURL);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n });\n },\n selectBonusProduct: function () {\n $(document).on('click', '.select-bonus-product', function () {\n var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\n var pid = $(this).data('pid');\n var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\n var submittedQty = parseInt($choiceOfBonusProduct.find('.bonus-quantity-select').val(), 10);\n var totalQty = 0;\n $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\n totalQty += $(this).data('qty');\n });\n totalQty += submittedQty;\n var optionID = $choiceOfBonusProduct.find('.product-option').data('option-id');\n var valueId = $choiceOfBonusProduct.find('.options-select option:selected').data('valueId');\n if (totalQty <= maxPids) {\n var selectedBonusProductHtml = ''\n + '
      '\n + '
      '\n + $choiceOfBonusProduct.find('.product-name').html()\n + '
      '\n + '
      '\n + '
      '\n ;\n $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n $('.pre-cart-products').html(totalQty);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n } else {\n $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n }\n });\n },\n removeBonusProduct: function () {\n $(document).on('click', '.selected-pid', function () {\n $(this).remove();\n var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\n var count = 0;\n if ($selected.length) {\n $selected.each(function () {\n count += parseInt($(this).data('qty'), 10);\n });\n }\n\n $('.pre-cart-products').html(count);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n });\n },\n enableBonusProductSelection: function () {\n $('body').on('bonusproduct:updateSelectButton', function (e, response) {\n $('button.select-bonus-product', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n var pid = response.product.id;\n $('button.select-bonus-product', response.$productContainer).data('pid', pid);\n });\n },\n showMoreBonusProducts: function () {\n $(document).on('click', '.show-more-bonus-products', function () {\n var url = $(this).data('url');\n $('.modal-content').spinner().start();\n $.ajax({\n url: url,\n method: 'GET',\n success: function (html) {\n var parsedHtml = parseHtml(html);\n $('.modal-body').append(parsedHtml.body);\n $('.show-more-bonus-products:first').remove();\n $('.modal-content').spinner().stop();\n },\n error: function () {\n $('.modal-content').spinner().stop();\n }\n });\n });\n },\n addBonusProductsToCart: function () {\n $(document).on('click', '.add-bonus-products', function () {\n var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\n var queryString = '?pids=';\n var url = $('.choose-bonus-product-dialog').data('addtocarturl');\n var pidsObject = {\n bonusProducts: []\n };\n\n $.each($readyToOrderBonusProducts, function () {\n var qtyOption =\n parseInt($(this)\n .data('qty'), 10);\n\n var option = null;\n if (qtyOption > 0) {\n if ($(this).data('optionid') && $(this).data('option-selected-value')) {\n option = {};\n option.optionId = $(this).data('optionid');\n option.productId = $(this).data('pid');\n option.selectedValueId = $(this).data('option-selected-value');\n }\n pidsObject.bonusProducts.push({\n pid: $(this).data('pid'),\n qty: qtyOption,\n options: [option]\n });\n pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\n }\n });\n queryString += JSON.stringify(pidsObject);\n queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\n queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\n $.spinner().start();\n $.ajax({\n url: url + queryString,\n method: 'POST',\n success: function (data) {\n $.spinner().stop();\n if (data.error) {\n $('#chooseBonusProductModal').modal('hide');\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
      ');\n }\n $('.add-to-cart-messages').append(\n '
      '\n + data.errorMessage + '
      '\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 3000);\n } else {\n $('.configure-bonus-product-attributes').html(data);\n $('.bonus-products-step2').removeClass('hidden-xl-down');\n $('#chooseBonusProductModal').modal('hide');\n\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
      ');\n }\n $('.minicart-quantity').html(data.totalQty);\n $('.add-to-cart-messages').append(\n '
      '\n + data.msgSuccess + '
      '\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n if ($('.cart-page').length) {\n location.reload();\n }\n }, 1500);\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n\n getPidValue: getPidValue,\n getQuantitySelected: getQuantitySelected,\n miniCartReportingUrl: miniCartReportingUrl\n};\n","'use strict';\n\n// TODO: https://columbia.atlassian.net/browse/GSD-16533 Update URL functions to use the JS URL API\n/**\n * Append a parameter to a url\n * @param {string} url - a url\n * @param {string} name - key\n * @param {string} value - value\n * @return {string} url with param appended\n */\nfunction appendParamToURL(url, name, value) {\n var c = '?';\n if (url.indexOf(c) !== -1) {\n c = '&';\n }\n return url + c + name + '=' + encodeURIComponent(value);\n}\n\n/**\n * Helper function for getParamsFromURL. Split a url string into key/value pairs.\n * @param {string} str - url parameter string\n * @return {Object} object with params split into key/value pairs\n */\nfunction keyValueArray(str) {\n var kvp = str.split('&');\n var x;\n var k;\n var v;\n var output = {};\n\n for (var i = kvp.length - 1; i >= 0; i--) {\n if (kvp[i].length) { // No empty strings...\n x = kvp[i].split('=');\n k = x[0];\n v = '';\n if (x.length > 1) {\n v = x[1];\n }\n output[k] = v;\n }\n }\n\n return output;\n}\n\n/**\n * Split a url string into key/value pairs.\n * @param {string} url - url parameter string\n * @return {Object} object with params split into key/value pairs\n */\nfunction getParamsFromURL(url) {\n var arr = url.split('?');\n var search = '';\n var searchHash = '';\n var postHash = false;\n\n if (arr.length > 1) {\n var arrHash = arr[1].split('#');\n search = arrHash[0];\n\n if (arrHash.length > 1) {\n postHash = true;\n searchHash = arrHash[1];\n }\n }\n\n var output = {};\n if (search.length) {\n output = keyValueArray(search);\n }\n if (postHash) {\n if (searchHash.length) {\n var output2 = keyValueArray(searchHash);\n Object.keys(output2).forEach(function (prop) {\n output[prop] = output2[prop]; // Merge them...\n });\n }\n }\n\n return output;\n}\n\n/**\n * Update an existing url param\n * https://stackoverflow.com/questions/1090948/change-url-parameters\n * @param {string} url - Url to be updated\n * @param {string} param - param to be updated\n * @param {string} paramVal - new parameter value\n * @returns {string} - updated url\n */\nfunction updateURLParam(url, param, paramVal) {\n var newAdditionalURL = '';\n var tempArray = url.split('?');\n var baseURL = tempArray[0];\n var additionalURL = tempArray[1];\n var temp = '';\n if (additionalURL) {\n tempArray = additionalURL.split('&');\n for (var i = 0; i < tempArray.length; i++) {\n if (tempArray[i].split('=')[0] !== param) {\n newAdditionalURL += temp + tempArray[i];\n temp = '&';\n }\n }\n }\n\n var rowsText = temp + '' + param + '=' + paramVal;\n return baseURL + '?' + newAdditionalURL + rowsText;\n}\n\n/**\n * Turn the URL query string into a JSON object to make it easier to add/update/delete key/value pairs.\n * @param {string} url the URL string from which to get the querystring. Null or empty string to use the location.href.\n * @returns {obejct} the query string as an object.\n */\nfunction queryStringToObject(url) {\n var search;\n if (!url) {\n // get the query string from window.location.search\n search = location.search.substring(1); // exclude the leading ?\n } else {\n // find the query string in the given url\n var startIndex = url.indexOf('?') + 1;\n var endIndex = url.indexOf('#');\n endIndex = endIndex >= startIndex ? endIndex : url.length;\n // examples:\n // 'key=val#hash', '/?key=val#hash' => 'key=val'\n // '?key#hash' => 'key'\n search = url.substring(startIndex, endIndex);\n if (startIndex === 0 && search.indexOf('=') === -1) {\n // this string doesn't look like a query string (no '?' and no '=')\n // examples: 'key#hash', '/#hash'\n search = '';\n }\n }\n\n var result = {};\n if (search) {\n var pairs = search.split('&');\n pairs.forEach(function (pair) {\n var nameVal = pair.split('=');\n result[nameVal[0]] = decodeURIComponent(nameVal[1] || '');\n });\n }\n\n return JSON.parse(JSON.stringify(result));\n}\n\n/**\n * Convert an object into a serialized string; the opposite of queryStringToObject().\n * @param {Object} obj The object to be serialized into a string\n * @param {string} urlString An optional url into which to insert the querystring. Any existing query string will be replaced.\n * @returns {string} The resulting query or URL string.\n */\nfunction objectToQueryString(obj, urlString) {\n var url = urlString || '';\n var path = '';\n var hash = '';\n if (url) {\n var qsIndex = url.indexOf('?');\n var hashIndex = url.indexOf('#');\n var index;\n if (hashIndex > -1) {\n index = hashIndex;\n hash = url.substring(hashIndex);\n }\n if (qsIndex > -1) {\n index = qsIndex;\n }\n path = url.substring(0, index); // if index is undefined, path is the entire string.\n }\n return path + '?' + $.param(obj) + hash;\n}\n\n/**\n * Update a URL with a key/value pair. This will insert or update a pair.\n * @param {string} url The url to be updated.\n * @param {string} name The key name to use in the query string.\n * @param {string} val The value of the key to be set.\n * @returns {string} The updated URL.\n */\nfunction setUrlKeyValue(url, name, val) {\n var qs = queryStringToObject(url);\n qs[name] = encodeURIComponent(val);\n return objectToQueryString(qs, url);\n}\n\n/**\n * Update a URL with multiple key/value pairs. This will insert new or update existing keys.\n * @param {string} url The url to be updated.\n * @param {Object} obj an object of name/value pairs to be inserted/updated in the url query string.\n * @returns {string} The updated URL.\n */\nfunction setUrlData(url, obj) {\n var qs = queryStringToObject(url);\n var mergedQs = $.extend({}, qs, obj);\n return objectToQueryString(mergedQs, url);\n}\n\n/**\n * DecodeURIComponent cannot be used directly to parse query parameters from a URL. It needs a bit of preparation.\n * reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent\n * @param {string} val The query param value to be decoded.\n * @returns {string} The decoded query param value.\n */\nfunction decodeQueryParam(val) {\n return decodeURIComponent(val.replace(/\\+/g, ' '));\n}\n\n/**\n * Remove the queryparam from the url\n * @param {string} queryparam queryparam to be removed\n * @param {string} urlString url to be manipulated\n * @returns {URL} new url without provided queryparam\n */\nfunction removeQueryParam(queryparam, urlString) {\n var url = new URL(urlString);\n url.searchParams.delete(queryparam);\n return url;\n}\n\n/**\n * Remove the queryparam from the url, and replace the state\n * @param {string} queryparam queryparam to be removed\n */\nfunction removeQueryParamFromCurrentUrl(queryparam) {\n var url = removeQueryParam(queryparam, window.location.href);\n history.replaceState(null, '', url);\n}\n\n/**\n * Returns an array with values that exist in both arrays\n * @param {array} a1 - Array\n * @param {array} a2 - Array\n * @return {array} - Values that appear in both arrays\n */\nfunction arrayIntersection(a1, a2) {\n var intersect = $.map(a1,\n function (v) {\n return $.inArray(v, a2) < 0 ? null : v;\n }\n );\n return intersect;\n}\n\n/**\n * Creates and returns the markup required to display a modal.\n * The calling script should then use the bootstrap $.modal() method to display the modal.\n * Example 1:\n * var modalMarkup = createModalMarkup('

      Hello World

      ', {title: 'Greeting'});\n * var $modal = $(modalMarkup).modal();\n * Example 2:\n * var $modal = $(createModalMarkup('')); // create empty modal\n * $modal.find('.modal-body').html(data); // inject content into the returned markup\n * $modal.modal();\n * @param {string} content The content to put in the modal. Pass empty string to just get the modal markup.\n * @param {Object} options Additional settings.\n * @return {string} The completed markup.\n */\nfunction createModalMarkup(content = '', options = {}) {\n /* Bootstrap Modal documentation: https://getbootstrap.com/docs/4.0/components/modal/ */\n const defaults = {\n title: '',\n showCloseBtn: true,\n enableLayeredDrawers: false,\n modalSizeClass: 'modal-lg', // possible values: modal-sm, modal-md (or empty string), modal-lg, modal-fluid\n centeredClass: 'modal-dialog-centered', // pass empty string to top-align the modal\n customClasses: '', // additional classes to be added to the modal\n modalId: '', // Custom id for the modal\n buttons: [\n // example markup (this will also dismiss the modal on click):\n // ''\n ]\n };\n const settings = $.extend({}, defaults, options);\n\n // additional uncommon bootstrap options go into data attributes\n const dataAttributes = [];\n ['backdrop', 'keyboard', 'focus', 'show'].forEach(param => {\n if (settings[param] !== undefined) {\n dataAttributes.push(`data-${param}=\"${settings[param]}\"`);\n }\n });\n\n let header = '
      ';\n if (settings.title) {\n header += `
      ${settings.title}
      `;\n }\n if (settings.showCloseBtn) {\n header += '';\n }\n header += '
      ';\n\n let idAttribute = '';\n if (settings.modalId) {\n idAttribute = `id=\"${settings.modalId}\"`;\n }\n\n let footer = '';\n let footerBtns = '';\n for (let btn of settings.buttons) {\n footerBtns += btn;\n }\n if (footerBtns) {\n footer = `
      ${footerBtns}
      `;\n }\n\n // tabindex=\"-1\" is necessary to allow the modal to close when ESC key is pressed.\n // https://stackoverflow.com/questions/12630156/how-do-you-enable-the-escape-key-close-functionality-in-a-twitter-bootstrap-moda\n const html = `
      \n
      \n
      \n ${header}\n
      \n ${content}\n
      \n ${footer}\n
      \n
      \n
      `;\n\n return html;\n}\n/**\n * Creates a backdrop element and appends it to the body tag.\n * @param {string} customClass An optional class to apply to the backdrop.\n */\nfunction createBackdrop(customClass) {\n var cls = customClass || '';\n var html = '
      ';\n $('body').append(html);\n}\n\n/**\n * Removes from the page the backdrop with the passed in class, or all backdrops if nothing is passed.\n * @param {string} customClass An optional class for selecting a backdrop to be removed. All will be removed if this is null.\n */\nfunction removeBackdrop(customClass) {\n var selector = '.backdrop' + (customClass ? '.' + customClass : '');\n $('body').find(selector).remove();\n}\n\n/**\n * display element in viewport\n * @param {string} el element in viewport\n * @param {string} offsetToTop off set top position\n * @return {boolean} element view port\n */\nfunction elementInViewport(el, offsetToTop) {\n var top = el.offsetTop;\n var left = el.offsetLeft;\n var width = el.offsetWidth;\n var height = el.offsetHeight;\n\n while (el.offsetParent) {\n el = el.offsetParent; // eslint-disable-line no-param-reassign\n top += el.offsetTop;\n left += el.offsetLeft;\n }\n\n if (typeof offsetToTop !== 'undefined') {\n top -= offsetToTop;\n }\n\n if (window.pageXOffset !== null) {\n return (\n top < (window.pageYOffset + window.innerHeight) &&\n left < (window.pageXOffset + window.innerWidth) &&\n (top + height) > window.pageYOffset &&\n (left + width) > window.pageXOffset\n );\n }\n\n if (document.compatMode === 'CSS1Compat') {\n return (\n top < (window.document.documentElement.scrollTop + window.document.documentElement.clientHeight) &&\n left < (window.document.documentElement.scrollLeft + window.document.documentElement.clientWidth) &&\n (top + height) > window.document.documentElement.scrollTop &&\n (left + width) > window.document.documentElement.scrollLeft\n );\n }\n\n return false;\n}\n\n/**\n * append script to body tag\n * @param {string} src url of the script to append\n * @param {function} callback optional callback to fire after load\n */\nfunction loadScript(src, callback) {\n var script = document.createElement('script');\n script.type = 'text/javascript';\n script.src = src;\n document.getElementsByTagName('body')[0].appendChild(script);\n\n if (callback) {\n script.onload = callback;\n }\n}\n\n/**\n * load script to DOM if document ready state is complete or load after window load\n * @param {string} src url of the script to append\n * @param {function} callback optional callback to fire after load\n */\nfunction loadJsAfterWindowLoad(src, callback) {\n if (document.readyState === 'complete') {\n loadScript(src, callback);\n } else {\n window.addEventListener('load', function () {\n loadScript(src, callback);\n });\n }\n}\n\n/**\n * Inserts pasted text at cursor location in input or textarea elements.\n * If a range of text is selected in the input, that range will be replaced by the new text\n * If no text in the input is selected, the string will be inserted at the end\n * @param {selector} formInput - DOM element for the target form input\n * @param {string} str - string to insert into the form\n */\nfunction insertAtInputCursor(formInput, str) {\n var input = formInput;\n var start = input.selectionStart;\n var end = input.selectionEnd;\n\n // Inserts str between selection start and end positions\n input.value = input.value.substring(0, start) + str + input.value.substring(end);\n // Update cursor position\n input.selectionStart = start + str.length;\n input.selectionEnd = input.selectionStart;\n}\n\n/**\n * Returns validity of date\n * @param {string} stageMessage The name of the stage we're going to.\n * @returns {string} Returns true if the day is within the month. Returns false if it is an invalid date.\n */\nfunction getTimeAndHours(stageMessage) {\n var date = new Date();\n var hours = date.getHours();\n var minutes = date.getMinutes();\n var ampm = hours >= 12 ? 'PM' : 'AM';\n hours %= 12;\n hours = hours || 12; // the hour '0' should be '12'\n minutes = minutes < 10 ? '0' + minutes : minutes;\n var strTime = hours + ':' + minutes + ' ' + ampm;\n return stageMessage + ' ' + strTime;\n}\n// intentionally export loadJsAfterWindowLoad onto global scope\nglobal.cscUtils = global.cscUtils || {};\nglobal.cscUtils.loadJsAfterWindowLoad = loadJsAfterWindowLoad;\n\n/**\n * Converts a string to Title Case.\n * @example\n * 'fRiEnDsHiP is MAGIC' -> 'Friendship Is Magic'\n * 'don't uppercase contractions' -> 'Don't Uppercase Contractions'\n * 'hyphenated-strings work too' -> 'Hyphenated-Strings Work Too'\n * @param {string} str The string to be title cased.\n * @returns {string} The original string in title case.\n */\nfunction stringToTitleCase(str) {\n return str.replace(/[^\\s/-]+/g, function (word) {\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n}\n\n/** Function to heapify a subtree rooted with node ndx\n * @param {Array} list - The array to heapify\n * @param {number} ndx - The index of the root of the subtree to heapify\n * @param {number} heapSize - The size of the heap\n * @param {string} key - The object key to find the highest numbers for\n */\nfunction heapify(list, ndx, heapSize, key) {\n let largest = ndx;\n // eslint-disable-next-line no-mixed-operators\n const left = 2 * ndx + 1;\n // eslint-disable-next-line no-mixed-operators\n const right = 2 * ndx + 2;\n\n // Check if left child is larger than root\n if (left < heapSize && list[left][key] > list[largest][key]) {\n largest = left;\n }\n\n // Check if right child is larger than root\n if (right < heapSize && list[right][key] > list[largest][key]) {\n largest = right;\n }\n\n // If largest is not root\n if (largest !== ndx) {\n // Swap array[i] and array[largest]\n // eslint-disable-next-line no-param-reassign\n [list[ndx], list[largest]] = [list[largest], list[ndx]];\n // Recursively heapify the affected sub-tree\n heapify(list, largest, heapSize, key);\n }\n}\n\n/** Function to heapify the array into max heap\n * @param {Array} list - The array to heapify\n * @param {string} key - The object key to find the highest numbers for\n */\nfunction heapifyMax(list, key) {\n const arrayLength = list.length;\n\n // Build max heap\n for (let ndx = Math.floor(arrayLength / 2) - 1; ndx >= 0; ndx--) {\n heapify(list, ndx, arrayLength, key);\n }\n\n for (let ndx = arrayLength - 1; ndx > 0; ndx--) {\n let firstListItem = list[0];\n // eslint-disable-next-line no-param-reassign\n list[0] = list[ndx];\n // eslint-disable-next-line no-param-reassign\n list[ndx] = firstListItem;\n\n heapify(list, 0, ndx, key);\n }\n}\n\n/** Function to find the n highest numbers in an array\n * @param {Array} list - The array to find the n highest numbers in\n * @param {number} n - The number of highest numbers to find\n * @param {string} key - The object key to find the highest numbers for\n * @returns {Array} The n highest numbers\n */\nfunction findNHighest(list, n, key) {\n if (list.length < n) {\n // eslint-disable-next-line no-param-reassign\n n = list.length;\n }\n\n const listToUse = JSON.parse(JSON.stringify(list)); // Deep copy the list\n const result = [];\n\n // Build max heap\n heapifyMax(listToUse, key);\n\n for (let i = 0; i < n; i++) {\n // Extract max element from the max heap\n result.push(listToUse.pop());\n }\n\n return result;\n}\n\n/** Function to compare two objects for deep equality\n * @param {Object} obj1 - The first object to compare\n * @param {Object} obj2 - The second object to compare\n * @returns {boolean} Whether the two objects are deep equal\n */\nfunction deepEqual(obj1, obj2) {\n return (obj1 && obj2 && typeof obj1 === 'object' && typeof obj2 === 'object') ?\n (Object.keys(obj1).length === Object.keys(obj2).length) &&\n Object.keys(obj1).reduce(function (isEqual, key) {\n return isEqual && deepEqual(obj1[key], obj2[key]);\n }, true) : (obj1 === obj2);\n}\n\nmodule.exports = {\n appendParamToURL: appendParamToURL,\n keyValueArray: keyValueArray,\n getParamsFromURL: getParamsFromURL,\n updateURLParam: updateURLParam,\n arrayIntersection: arrayIntersection,\n createModalMarkup: createModalMarkup,\n queryStringToObject: queryStringToObject,\n objectToQueryString: objectToQueryString,\n removeQueryParam: removeQueryParam,\n removeQueryParamFromCurrentUrl: removeQueryParamFromCurrentUrl,\n createBackdrop: createBackdrop,\n removeBackdrop: removeBackdrop,\n setUrlKeyValue: setUrlKeyValue,\n setUrlData: setUrlData,\n decodeQueryParam: decodeQueryParam,\n elementInViewport: elementInViewport,\n loadJsAfterWindowLoad: loadJsAfterWindowLoad,\n insertAtInputCursor: insertAtInputCursor,\n stringToTitleCase,\n getTimeAndHours: getTimeAndHours,\n findNHighest: findNHighest,\n deepEqual: deepEqual\n};\n","'use strict';\n\nmodule.exports = {\n setTabNextFocus: function (focusParams) {\n var KEYCODE_TAB = 9;\n var isTabPressed = (focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB);\n\n if (!isTabPressed) {\n return;\n }\n\n var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\n var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\n\n if ($(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled')) {\n lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\n if ($('.product-quickview.product-set').length > 0) {\n var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\n lastFocusableEl = linkElements[linkElements.length - 1];\n }\n }\n\n if (focusParams.event.shiftKey) /* shift + tab */ {\n if ($(':focus').is(firstFocusableEl)) {\n lastFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n } else /* tab */ {\n if ($(':focus').is(lastFocusableEl)) { // eslint-disable-line\n firstFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n }\n }\n};\n","/**\n * SSR Window 4.0.0\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: August 25, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n return (obj !== null &&\n typeof obj === 'object' &&\n 'constructor' in obj &&\n obj.constructor === Object);\n}\nfunction extend(target = {}, src = {}) {\n Object.keys(src).forEach((key) => {\n if (typeof target[key] === 'undefined')\n target[key] = src[key];\n else if (isObject(src[key]) &&\n isObject(target[key]) &&\n Object.keys(src[key]).length > 0) {\n extend(target[key], src[key]);\n }\n });\n}\n\nconst ssrDocument = {\n body: {},\n addEventListener() { },\n removeEventListener() { },\n activeElement: {\n blur() { },\n nodeName: '',\n },\n querySelector() {\n return null;\n },\n querySelectorAll() {\n return [];\n },\n getElementById() {\n return null;\n },\n createEvent() {\n return {\n initEvent() { },\n };\n },\n createElement() {\n return {\n children: [],\n childNodes: [],\n style: {},\n setAttribute() { },\n getElementsByTagName() {\n return [];\n },\n };\n },\n createElementNS() {\n return {};\n },\n importNode() {\n return null;\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n};\nfunction getDocument() {\n const doc = typeof document !== 'undefined' ? document : {};\n extend(doc, ssrDocument);\n return doc;\n}\n\nconst ssrWindow = {\n document: ssrDocument,\n navigator: {\n userAgent: '',\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n history: {\n replaceState() { },\n pushState() { },\n go() { },\n back() { },\n },\n CustomEvent: function CustomEvent() {\n return this;\n },\n addEventListener() { },\n removeEventListener() { },\n getComputedStyle() {\n return {\n getPropertyValue() {\n return '';\n },\n };\n },\n Image() { },\n Date() { },\n screen: {},\n setTimeout() { },\n clearTimeout() { },\n matchMedia() {\n return {};\n },\n requestAnimationFrame(callback) {\n if (typeof setTimeout === 'undefined') {\n callback();\n return null;\n }\n return setTimeout(callback, 0);\n },\n cancelAnimationFrame(id) {\n if (typeof setTimeout === 'undefined') {\n return;\n }\n clearTimeout(id);\n },\n};\nfunction getWindow() {\n const win = typeof window !== 'undefined' ? window : {};\n extend(win, ssrWindow);\n return win;\n}\n\nexport { extend, getDocument, getWindow, ssrDocument, ssrWindow };\n","/**\n * Dom7 4.0.0\n * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n * https://framework7.io/docs/dom7.html\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: August 25, 2021\n */\nimport { getWindow, getDocument } from 'ssr-window';\n\n/* eslint-disable no-proto */\nfunction makeReactive(obj) {\n const proto = obj.__proto__;\n Object.defineProperty(obj, '__proto__', {\n get() {\n return proto;\n },\n\n set(value) {\n proto.__proto__ = value;\n }\n\n });\n}\n\nclass Dom7 extends Array {\n constructor(items) {\n super(...(items || []));\n makeReactive(this);\n }\n\n}\n\nfunction arrayFlat(arr = []) {\n const res = [];\n arr.forEach(el => {\n if (Array.isArray(el)) {\n res.push(...arrayFlat(el));\n } else {\n res.push(el);\n }\n });\n return res;\n}\nfunction arrayFilter(arr, callback) {\n return Array.prototype.filter.call(arr, callback);\n}\nfunction arrayUnique(arr) {\n const uniqueArray = [];\n\n for (let i = 0; i < arr.length; i += 1) {\n if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);\n }\n\n return uniqueArray;\n}\nfunction toCamelCase(string) {\n return string.toLowerCase().replace(/-(.)/g, (match, group) => group.toUpperCase());\n}\n\n// eslint-disable-next-line\n\nfunction qsa(selector, context) {\n if (typeof selector !== 'string') {\n return [selector];\n }\n\n const a = [];\n const res = context.querySelectorAll(selector);\n\n for (let i = 0; i < res.length; i += 1) {\n a.push(res[i]);\n }\n\n return a;\n}\n\nfunction $(selector, context) {\n const window = getWindow();\n const document = getDocument();\n let arr = [];\n\n if (!context && selector instanceof Dom7) {\n return selector;\n }\n\n if (!selector) {\n return new Dom7(arr);\n }\n\n if (typeof selector === 'string') {\n const html = selector.trim();\n\n if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n let toCreate = 'div';\n if (html.indexOf(' c.split(' ')));\n this.forEach(el => {\n el.classList.add(...classNames);\n });\n return this;\n}\n\nfunction removeClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n this.forEach(el => {\n el.classList.remove(...classNames);\n });\n return this;\n}\n\nfunction toggleClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n this.forEach(el => {\n classNames.forEach(className => {\n el.classList.toggle(className);\n });\n });\n}\n\nfunction hasClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n return arrayFilter(this, el => {\n return classNames.filter(className => el.classList.contains(className)).length > 0;\n }).length > 0;\n}\n\nfunction attr(attrs, value) {\n if (arguments.length === 1 && typeof attrs === 'string') {\n // Get attr\n if (this[0]) return this[0].getAttribute(attrs);\n return undefined;\n } // Set attrs\n\n\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i].setAttribute(attrs, value);\n } else {\n // Object\n for (const attrName in attrs) {\n this[i][attrName] = attrs[attrName];\n this[i].setAttribute(attrName, attrs[attrName]);\n }\n }\n }\n\n return this;\n}\n\nfunction removeAttr(attr) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].removeAttribute(attr);\n }\n\n return this;\n}\n\nfunction prop(props, value) {\n if (arguments.length === 1 && typeof props === 'string') {\n // Get prop\n if (this[0]) return this[0][props];\n } else {\n // Set props\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i][props] = value;\n } else {\n // Object\n for (const propName in props) {\n this[i][propName] = props[propName];\n }\n }\n }\n\n return this;\n }\n\n return this;\n}\n\nfunction data(key, value) {\n let el;\n\n if (typeof value === 'undefined') {\n el = this[0];\n if (!el) return undefined; // Get value\n\n if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {\n return el.dom7ElementDataStorage[key];\n }\n\n const dataKey = el.getAttribute(`data-${key}`);\n\n if (dataKey) {\n return dataKey;\n }\n\n return undefined;\n } // Set value\n\n\n for (let i = 0; i < this.length; i += 1) {\n el = this[i];\n if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n el.dom7ElementDataStorage[key] = value;\n }\n\n return this;\n}\n\nfunction removeData(key) {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n el.dom7ElementDataStorage[key] = null;\n delete el.dom7ElementDataStorage[key];\n }\n }\n}\n\nfunction dataset() {\n const el = this[0];\n if (!el) return undefined;\n const dataset = {}; // eslint-disable-line\n\n if (el.dataset) {\n for (const dataKey in el.dataset) {\n dataset[dataKey] = el.dataset[dataKey];\n }\n } else {\n for (let i = 0; i < el.attributes.length; i += 1) {\n const attr = el.attributes[i];\n\n if (attr.name.indexOf('data-') >= 0) {\n dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;\n }\n }\n }\n\n for (const key in dataset) {\n if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;\n }\n\n return dataset;\n}\n\nfunction val(value) {\n if (typeof value === 'undefined') {\n // get value\n const el = this[0];\n if (!el) return undefined;\n\n if (el.multiple && el.nodeName.toLowerCase() === 'select') {\n const values = [];\n\n for (let i = 0; i < el.selectedOptions.length; i += 1) {\n values.push(el.selectedOptions[i].value);\n }\n\n return values;\n }\n\n return el.value;\n } // set value\n\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {\n for (let j = 0; j < el.options.length; j += 1) {\n el.options[j].selected = value.indexOf(el.options[j].value) >= 0;\n }\n } else {\n el.value = value;\n }\n }\n\n return this;\n}\n\nfunction value(value) {\n return this.val(value);\n}\n\nfunction transform(transform) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transform = transform;\n }\n\n return this;\n}\n\nfunction transition(duration) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration;\n }\n\n return this;\n}\n\nfunction on(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n\n if (!capture) capture = false;\n\n function handleLiveEvent(e) {\n const target = e.target;\n if (!target) return;\n const eventData = e.target.dom7EventData || [];\n\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n\n if ($(target).is(targetSelector)) listener.apply(target, eventData);else {\n const parents = $(target).parents(); // eslint-disable-line\n\n for (let k = 0; k < parents.length; k += 1) {\n if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData);\n }\n }\n }\n\n function handleEvent(e) {\n const eventData = e && e.target ? e.target.dom7EventData || [] : [];\n\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n\n listener.apply(this, eventData);\n }\n\n const events = eventType.split(' ');\n let j;\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (!targetSelector) {\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7Listeners) el.dom7Listeners = {};\n if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];\n el.dom7Listeners[event].push({\n listener,\n proxyListener: handleEvent\n });\n el.addEventListener(event, handleEvent, capture);\n }\n } else {\n // Live events\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7LiveListeners) el.dom7LiveListeners = {};\n if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = [];\n el.dom7LiveListeners[event].push({\n listener,\n proxyListener: handleLiveEvent\n });\n el.addEventListener(event, handleLiveEvent, capture);\n }\n }\n }\n\n return this;\n}\n\nfunction off(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n\n if (!capture) capture = false;\n const events = eventType.split(' ');\n\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n let handlers;\n\n if (!targetSelector && el.dom7Listeners) {\n handlers = el.dom7Listeners[event];\n } else if (targetSelector && el.dom7LiveListeners) {\n handlers = el.dom7LiveListeners[event];\n }\n\n if (handlers && handlers.length) {\n for (let k = handlers.length - 1; k >= 0; k -= 1) {\n const handler = handlers[k];\n\n if (listener && handler.listener === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (!listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n }\n }\n }\n }\n }\n\n return this;\n}\n\nfunction once(...args) {\n const dom = this;\n let [eventName, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventName, listener, capture] = args;\n targetSelector = undefined;\n }\n\n function onceHandler(...eventArgs) {\n listener.apply(this, eventArgs);\n dom.off(eventName, targetSelector, onceHandler, capture);\n\n if (onceHandler.dom7proxy) {\n delete onceHandler.dom7proxy;\n }\n }\n\n onceHandler.dom7proxy = listener;\n return dom.on(eventName, targetSelector, onceHandler, capture);\n}\n\nfunction trigger(...args) {\n const window = getWindow();\n const events = args[0].split(' ');\n const eventData = args[1];\n\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n\n if (window.CustomEvent) {\n const evt = new window.CustomEvent(event, {\n detail: eventData,\n bubbles: true,\n cancelable: true\n });\n el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0);\n el.dispatchEvent(evt);\n el.dom7EventData = [];\n delete el.dom7EventData;\n }\n }\n }\n\n return this;\n}\n\nfunction transitionEnd(callback) {\n const dom = this;\n\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('transitionend', fireCallBack);\n }\n\n if (callback) {\n dom.on('transitionend', fireCallBack);\n }\n\n return this;\n}\n\nfunction animationEnd(callback) {\n const dom = this;\n\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('animationend', fireCallBack);\n }\n\n if (callback) {\n dom.on('animationend', fireCallBack);\n }\n\n return this;\n}\n\nfunction width() {\n const window = getWindow();\n\n if (this[0] === window) {\n return window.innerWidth;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('width'));\n }\n\n return null;\n}\n\nfunction outerWidth(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));\n }\n\n return this[0].offsetWidth;\n }\n\n return null;\n}\n\nfunction height() {\n const window = getWindow();\n\n if (this[0] === window) {\n return window.innerHeight;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('height'));\n }\n\n return null;\n}\n\nfunction outerHeight(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));\n }\n\n return this[0].offsetHeight;\n }\n\n return null;\n}\n\nfunction offset() {\n if (this.length > 0) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n const box = el.getBoundingClientRect();\n const body = document.body;\n const clientTop = el.clientTop || body.clientTop || 0;\n const clientLeft = el.clientLeft || body.clientLeft || 0;\n const scrollTop = el === window ? window.scrollY : el.scrollTop;\n const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n return {\n top: box.top + scrollTop - clientTop,\n left: box.left + scrollLeft - clientLeft\n };\n }\n\n return null;\n}\n\nfunction hide() {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.display = 'none';\n }\n\n return this;\n}\n\nfunction show() {\n const window = getWindow();\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.style.display === 'none') {\n el.style.display = '';\n }\n\n if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') {\n // Still not visible\n el.style.display = 'block';\n }\n }\n\n return this;\n}\n\nfunction styles() {\n const window = getWindow();\n if (this[0]) return window.getComputedStyle(this[0], null);\n return {};\n}\n\nfunction css(props, value) {\n const window = getWindow();\n let i;\n\n if (arguments.length === 1) {\n if (typeof props === 'string') {\n // .css('width')\n if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);\n } else {\n // .css({ width: '100px' })\n for (i = 0; i < this.length; i += 1) {\n for (const prop in props) {\n this[i].style[prop] = props[prop];\n }\n }\n\n return this;\n }\n }\n\n if (arguments.length === 2 && typeof props === 'string') {\n // .css('width', '100px')\n for (i = 0; i < this.length; i += 1) {\n this[i].style[props] = value;\n }\n\n return this;\n }\n\n return this;\n}\n\nfunction each(callback) {\n if (!callback) return this;\n this.forEach((el, index) => {\n callback.apply(el, [el, index]);\n });\n return this;\n}\n\nfunction filter(callback) {\n const result = arrayFilter(this, callback);\n return $(result);\n}\n\nfunction html(html) {\n if (typeof html === 'undefined') {\n return this[0] ? this[0].innerHTML : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].innerHTML = html;\n }\n\n return this;\n}\n\nfunction text(text) {\n if (typeof text === 'undefined') {\n return this[0] ? this[0].textContent.trim() : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].textContent = text;\n }\n\n return this;\n}\n\nfunction is(selector) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n let compareWith;\n let i;\n if (!el || typeof selector === 'undefined') return false;\n\n if (typeof selector === 'string') {\n if (el.matches) return el.matches(selector);\n if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n compareWith = $(selector);\n\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n\n return false;\n }\n\n if (selector === document) {\n return el === document;\n }\n\n if (selector === window) {\n return el === window;\n }\n\n if (selector.nodeType || selector instanceof Dom7) {\n compareWith = selector.nodeType ? [selector] : selector;\n\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n\n return false;\n }\n\n return false;\n}\n\nfunction index() {\n let child = this[0];\n let i;\n\n if (child) {\n i = 0; // eslint-disable-next-line\n\n while ((child = child.previousSibling) !== null) {\n if (child.nodeType === 1) i += 1;\n }\n\n return i;\n }\n\n return undefined;\n}\n\nfunction eq(index) {\n if (typeof index === 'undefined') return this;\n const length = this.length;\n\n if (index > length - 1) {\n return $([]);\n }\n\n if (index < 0) {\n const returnIndex = length + index;\n if (returnIndex < 0) return $([]);\n return $([this[returnIndex]]);\n }\n\n return $([this[index]]);\n}\n\nfunction append(...els) {\n let newChild;\n const document = getDocument();\n\n for (let k = 0; k < els.length; k += 1) {\n newChild = els[k];\n\n for (let i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n\n while (tempDiv.firstChild) {\n this[i].appendChild(tempDiv.firstChild);\n }\n } else if (newChild instanceof Dom7) {\n for (let j = 0; j < newChild.length; j += 1) {\n this[i].appendChild(newChild[j]);\n }\n } else {\n this[i].appendChild(newChild);\n }\n }\n }\n\n return this;\n}\n\nfunction appendTo(parent) {\n $(parent).append(this);\n return this;\n}\n\nfunction prepend(newChild) {\n const document = getDocument();\n let i;\n let j;\n\n for (i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n\n for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n }\n } else if (newChild instanceof Dom7) {\n for (j = 0; j < newChild.length; j += 1) {\n this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n }\n } else {\n this[i].insertBefore(newChild, this[i].childNodes[0]);\n }\n }\n\n return this;\n}\n\nfunction prependTo(parent) {\n $(parent).prepend(this);\n return this;\n}\n\nfunction insertBefore(selector) {\n const before = $(selector);\n\n for (let i = 0; i < this.length; i += 1) {\n if (before.length === 1) {\n before[0].parentNode.insertBefore(this[i], before[0]);\n } else if (before.length > 1) {\n for (let j = 0; j < before.length; j += 1) {\n before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n }\n }\n }\n}\n\nfunction insertAfter(selector) {\n const after = $(selector);\n\n for (let i = 0; i < this.length; i += 1) {\n if (after.length === 1) {\n after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n } else if (after.length > 1) {\n for (let j = 0; j < after.length; j += 1) {\n after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);\n }\n }\n }\n}\n\nfunction next(selector) {\n if (this.length > 0) {\n if (selector) {\n if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n return $([this[0].nextElementSibling]);\n }\n\n return $([]);\n }\n\n if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);\n return $([]);\n }\n\n return $([]);\n}\n\nfunction nextAll(selector) {\n const nextEls = [];\n let el = this[0];\n if (!el) return $([]);\n\n while (el.nextElementSibling) {\n const next = el.nextElementSibling; // eslint-disable-line\n\n if (selector) {\n if ($(next).is(selector)) nextEls.push(next);\n } else nextEls.push(next);\n\n el = next;\n }\n\n return $(nextEls);\n}\n\nfunction prev(selector) {\n if (this.length > 0) {\n const el = this[0];\n\n if (selector) {\n if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n return $([el.previousElementSibling]);\n }\n\n return $([]);\n }\n\n if (el.previousElementSibling) return $([el.previousElementSibling]);\n return $([]);\n }\n\n return $([]);\n}\n\nfunction prevAll(selector) {\n const prevEls = [];\n let el = this[0];\n if (!el) return $([]);\n\n while (el.previousElementSibling) {\n const prev = el.previousElementSibling; // eslint-disable-line\n\n if (selector) {\n if ($(prev).is(selector)) prevEls.push(prev);\n } else prevEls.push(prev);\n\n el = prev;\n }\n\n return $(prevEls);\n}\n\nfunction siblings(selector) {\n return this.nextAll(selector).add(this.prevAll(selector));\n}\n\nfunction parent(selector) {\n const parents = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode !== null) {\n if (selector) {\n if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);\n } else {\n parents.push(this[i].parentNode);\n }\n }\n }\n\n return $(parents);\n}\n\nfunction parents(selector) {\n const parents = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n let parent = this[i].parentNode; // eslint-disable-line\n\n while (parent) {\n if (selector) {\n if ($(parent).is(selector)) parents.push(parent);\n } else {\n parents.push(parent);\n }\n\n parent = parent.parentNode;\n }\n }\n\n return $(parents);\n}\n\nfunction closest(selector) {\n let closest = this; // eslint-disable-line\n\n if (typeof selector === 'undefined') {\n return $([]);\n }\n\n if (!closest.is(selector)) {\n closest = closest.parents(selector).eq(0);\n }\n\n return closest;\n}\n\nfunction find(selector) {\n const foundElements = [];\n\n for (let i = 0; i < this.length; i += 1) {\n const found = this[i].querySelectorAll(selector);\n\n for (let j = 0; j < found.length; j += 1) {\n foundElements.push(found[j]);\n }\n }\n\n return $(foundElements);\n}\n\nfunction children(selector) {\n const children = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n const childNodes = this[i].children;\n\n for (let j = 0; j < childNodes.length; j += 1) {\n if (!selector || $(childNodes[j]).is(selector)) {\n children.push(childNodes[j]);\n }\n }\n }\n\n return $(children);\n}\n\nfunction remove() {\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n }\n\n return this;\n}\n\nfunction detach() {\n return this.remove();\n}\n\nfunction add(...els) {\n const dom = this;\n let i;\n let j;\n\n for (i = 0; i < els.length; i += 1) {\n const toAdd = $(els[i]);\n\n for (j = 0; j < toAdd.length; j += 1) {\n dom.push(toAdd[j]);\n }\n }\n\n return dom;\n}\n\nfunction empty() {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.nodeType === 1) {\n for (let j = 0; j < el.childNodes.length; j += 1) {\n if (el.childNodes[j].parentNode) {\n el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n }\n }\n\n el.textContent = '';\n }\n }\n\n return this;\n}\n\n// eslint-disable-next-line\n\nfunction scrollTo(...args) {\n const window = getWindow();\n let [left, top, duration, easing, callback] = args;\n\n if (args.length === 4 && typeof easing === 'function') {\n callback = easing;\n [left, top, duration, callback, easing] = args;\n }\n\n if (typeof easing === 'undefined') easing = 'swing';\n return this.each(function animate() {\n const el = this;\n let currentTop;\n let currentLeft;\n let maxTop;\n let maxLeft;\n let newTop;\n let newLeft;\n let scrollTop; // eslint-disable-line\n\n let scrollLeft; // eslint-disable-line\n\n let animateTop = top > 0 || top === 0;\n let animateLeft = left > 0 || left === 0;\n\n if (typeof easing === 'undefined') {\n easing = 'swing';\n }\n\n if (animateTop) {\n currentTop = el.scrollTop;\n\n if (!duration) {\n el.scrollTop = top;\n }\n }\n\n if (animateLeft) {\n currentLeft = el.scrollLeft;\n\n if (!duration) {\n el.scrollLeft = left;\n }\n }\n\n if (!duration) return;\n\n if (animateTop) {\n maxTop = el.scrollHeight - el.offsetHeight;\n newTop = Math.max(Math.min(top, maxTop), 0);\n }\n\n if (animateLeft) {\n maxLeft = el.scrollWidth - el.offsetWidth;\n newLeft = Math.max(Math.min(left, maxLeft), 0);\n }\n\n let startTime = null;\n if (animateTop && newTop === currentTop) animateTop = false;\n if (animateLeft && newLeft === currentLeft) animateLeft = false;\n\n function render(time = new Date().getTime()) {\n if (startTime === null) {\n startTime = time;\n }\n\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;\n let done;\n if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop);\n if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);\n\n if (animateTop && newTop > currentTop && scrollTop >= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n\n if (animateTop && newTop < currentTop && scrollTop <= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n\n if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n\n if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n\n if (done) {\n if (callback) callback();\n return;\n }\n\n if (animateTop) el.scrollTop = scrollTop;\n if (animateLeft) el.scrollLeft = scrollLeft;\n window.requestAnimationFrame(render);\n }\n\n window.requestAnimationFrame(render);\n });\n} // scrollTop(top, duration, easing, callback) {\n\n\nfunction scrollTop(...args) {\n let [top, duration, easing, callback] = args;\n\n if (args.length === 3 && typeof easing === 'function') {\n [top, duration, callback, easing] = args;\n }\n\n const dom = this;\n\n if (typeof top === 'undefined') {\n if (dom.length > 0) return dom[0].scrollTop;\n return null;\n }\n\n return dom.scrollTo(undefined, top, duration, easing, callback);\n}\n\nfunction scrollLeft(...args) {\n let [left, duration, easing, callback] = args;\n\n if (args.length === 3 && typeof easing === 'function') {\n [left, duration, callback, easing] = args;\n }\n\n const dom = this;\n\n if (typeof left === 'undefined') {\n if (dom.length > 0) return dom[0].scrollLeft;\n return null;\n }\n\n return dom.scrollTo(left, undefined, duration, easing, callback);\n}\n\n// eslint-disable-next-line\n\nfunction animate(initialProps, initialParams) {\n const window = getWindow();\n const els = this;\n const a = {\n props: Object.assign({}, initialProps),\n params: Object.assign({\n duration: 300,\n easing: 'swing' // or 'linear'\n\n /* Callbacks\n begin(elements)\n complete(elements)\n progress(elements, complete, remaining, start, tweenValue)\n */\n\n }, initialParams),\n elements: els,\n animating: false,\n que: [],\n\n easingProgress(easing, progress) {\n if (easing === 'swing') {\n return 0.5 - Math.cos(progress * Math.PI) / 2;\n }\n\n if (typeof easing === 'function') {\n return easing(progress);\n }\n\n return progress;\n },\n\n stop() {\n if (a.frameId) {\n window.cancelAnimationFrame(a.frameId);\n }\n\n a.animating = false;\n a.elements.each(el => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n a.que = [];\n },\n\n done(complete) {\n a.animating = false;\n a.elements.each(el => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n if (complete) complete(els);\n\n if (a.que.length > 0) {\n const que = a.que.shift();\n a.animate(que[0], que[1]);\n }\n },\n\n animate(props, params) {\n if (a.animating) {\n a.que.push([props, params]);\n return a;\n }\n\n const elements = []; // Define & Cache Initials & Units\n\n a.elements.each((el, index) => {\n let initialFullValue;\n let initialValue;\n let unit;\n let finalValue;\n let finalFullValue;\n if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;\n elements[index] = {\n container: el\n };\n Object.keys(props).forEach(prop => {\n initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');\n initialValue = parseFloat(initialFullValue);\n unit = initialFullValue.replace(initialValue, '');\n finalValue = parseFloat(props[prop]);\n finalFullValue = props[prop] + unit;\n elements[index][prop] = {\n initialFullValue,\n initialValue,\n unit,\n finalValue,\n finalFullValue,\n currentValue: initialValue\n };\n });\n });\n let startTime = null;\n let time;\n let elementsDone = 0;\n let propsDone = 0;\n let done;\n let began = false;\n a.animating = true;\n\n function render() {\n time = new Date().getTime();\n let progress;\n let easeProgress; // let el;\n\n if (!began) {\n began = true;\n if (params.begin) params.begin(els);\n }\n\n if (startTime === null) {\n startTime = time;\n }\n\n if (params.progress) {\n // eslint-disable-next-line\n params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime);\n }\n\n elements.forEach(element => {\n const el = element;\n if (done || el.done) return;\n Object.keys(props).forEach(prop => {\n if (done || el.done) return;\n progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);\n easeProgress = a.easingProgress(params.easing, progress);\n const {\n initialValue,\n finalValue,\n unit\n } = el[prop];\n el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue);\n const currentValue = el[prop].currentValue;\n\n if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) {\n el.container.style[prop] = finalValue + unit;\n propsDone += 1;\n\n if (propsDone === Object.keys(props).length) {\n el.done = true;\n elementsDone += 1;\n }\n\n if (elementsDone === elements.length) {\n done = true;\n }\n }\n\n if (done) {\n a.done(params.complete);\n return;\n }\n\n el.container.style[prop] = currentValue + unit;\n });\n });\n if (done) return; // Then call\n\n a.frameId = window.requestAnimationFrame(render);\n }\n\n a.frameId = window.requestAnimationFrame(render);\n return a;\n }\n\n };\n\n if (a.elements.length === 0) {\n return els;\n }\n\n let animateInstance;\n\n for (let i = 0; i < a.elements.length; i += 1) {\n if (a.elements[i].dom7AnimateInstance) {\n animateInstance = a.elements[i].dom7AnimateInstance;\n } else a.elements[i].dom7AnimateInstance = a;\n }\n\n if (!animateInstance) {\n animateInstance = a;\n }\n\n if (initialProps === 'stop') {\n animateInstance.stop();\n } else {\n animateInstance.animate(a.props, a.params);\n }\n\n return els;\n}\n\nfunction stop() {\n const els = this;\n\n for (let i = 0; i < els.length; i += 1) {\n if (els[i].dom7AnimateInstance) {\n els[i].dom7AnimateInstance.stop();\n }\n }\n}\n\nconst noTrigger = 'resize scroll'.split(' ');\n\nfunction shortcut(name) {\n function eventHandler(...args) {\n if (typeof args[0] === 'undefined') {\n for (let i = 0; i < this.length; i += 1) {\n if (noTrigger.indexOf(name) < 0) {\n if (name in this[i]) this[i][name]();else {\n $(this[i]).trigger(name);\n }\n }\n }\n\n return this;\n }\n\n return this.on(name, ...args);\n }\n\n return eventHandler;\n}\n\nconst click = shortcut('click');\nconst blur = shortcut('blur');\nconst focus = shortcut('focus');\nconst focusin = shortcut('focusin');\nconst focusout = shortcut('focusout');\nconst keyup = shortcut('keyup');\nconst keydown = shortcut('keydown');\nconst keypress = shortcut('keypress');\nconst submit = shortcut('submit');\nconst change = shortcut('change');\nconst mousedown = shortcut('mousedown');\nconst mousemove = shortcut('mousemove');\nconst mouseup = shortcut('mouseup');\nconst mouseenter = shortcut('mouseenter');\nconst mouseleave = shortcut('mouseleave');\nconst mouseout = shortcut('mouseout');\nconst mouseover = shortcut('mouseover');\nconst touchstart = shortcut('touchstart');\nconst touchend = shortcut('touchend');\nconst touchmove = shortcut('touchmove');\nconst resize = shortcut('resize');\nconst scroll = shortcut('scroll');\n\nexport default $;\nexport { $, add, addClass, animate, animationEnd, append, appendTo, attr, blur, change, children, click, closest, css, data, dataset, detach, each, empty, eq, filter, find, focus, focusin, focusout, hasClass, height, hide, html, index, insertAfter, insertBefore, is, keydown, keypress, keyup, mousedown, mouseenter, mouseleave, mousemove, mouseout, mouseover, mouseup, next, nextAll, off, offset, on, once, outerHeight, outerWidth, parent, parents, prepend, prependTo, prev, prevAll, prop, remove, removeAttr, removeClass, removeData, resize, scroll, scrollLeft, scrollTo, scrollTop, show, siblings, stop, styles, submit, text, toggleClass, touchend, touchmove, touchstart, transform, transition, transitionEnd, trigger, val, value, width };\n","import {\n $,\n addClass,\n removeClass,\n hasClass,\n toggleClass,\n attr,\n removeAttr,\n transform,\n transition,\n on,\n off,\n trigger,\n transitionEnd,\n outerWidth,\n outerHeight,\n styles,\n offset,\n css,\n each,\n html,\n text,\n is,\n index,\n eq,\n append,\n prepend,\n next,\n nextAll,\n prev,\n prevAll,\n parent,\n parents,\n closest,\n find,\n children,\n filter,\n remove,\n} from 'dom7';\n\nconst Methods = {\n addClass,\n removeClass,\n hasClass,\n toggleClass,\n attr,\n removeAttr,\n transform,\n transition,\n on,\n off,\n trigger,\n transitionEnd,\n outerWidth,\n outerHeight,\n styles,\n offset,\n css,\n each,\n html,\n text,\n is,\n index,\n eq,\n append,\n prepend,\n next,\n nextAll,\n prev,\n prevAll,\n parent,\n parents,\n closest,\n find,\n children,\n filter,\n remove,\n};\n\nObject.keys(Methods).forEach((methodName) => {\n Object.defineProperty($.fn, methodName, { value: Methods[methodName], writable: true });\n});\n\nexport default $;\n","import { getWindow, getDocument } from 'ssr-window';\n\nlet support;\n\nfunction calcSupport() {\n const window = getWindow();\n const document = getDocument();\n\n return {\n smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style,\n\n touch: !!(\n 'ontouchstart' in window ||\n (window.DocumentTouch && document instanceof window.DocumentTouch)\n ),\n\n passiveListener: (function checkPassiveListener() {\n let supportsPassive = false;\n try {\n const opts = Object.defineProperty({}, 'passive', {\n // eslint-disable-next-line\n get() {\n supportsPassive = true;\n },\n });\n window.addEventListener('testPassiveListener', null, opts);\n } catch (e) {\n // No support\n }\n return supportsPassive;\n })(),\n\n gestures: (function checkGestures() {\n return 'ongesturestart' in window;\n })(),\n };\n}\n\nfunction getSupport() {\n if (!support) {\n support = calcSupport();\n }\n return support;\n}\n\nexport { getSupport };\n","import { getWindow } from 'ssr-window';\nimport { getSupport } from './get-support.js';\n\nlet deviceCached;\n\nfunction calcDevice({ userAgent } = {}) {\n const support = getSupport();\n const window = getWindow();\n const platform = window.navigator.platform;\n const ua = userAgent || window.navigator.userAgent;\n\n const device = {\n ios: false,\n android: false,\n };\n\n const screenWidth = window.screen.width;\n const screenHeight = window.screen.height;\n\n const android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n let ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n const ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n const iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n const windows = platform === 'Win32';\n let macos = platform === 'MacIntel';\n\n // iPadOs 13 fix\n const iPadScreens = [\n '1024x1366',\n '1366x1024',\n '834x1194',\n '1194x834',\n '834x1112',\n '1112x834',\n '768x1024',\n '1024x768',\n '820x1180',\n '1180x820',\n '810x1080',\n '1080x810',\n ];\n if (\n !ipad &&\n macos &&\n support.touch &&\n iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0\n ) {\n ipad = ua.match(/(Version)\\/([\\d.]+)/);\n if (!ipad) ipad = [0, 1, '13_0_0'];\n macos = false;\n }\n\n // Android\n if (android && !windows) {\n device.os = 'android';\n device.android = true;\n }\n if (ipad || iphone || ipod) {\n device.os = 'ios';\n device.ios = true;\n }\n\n // Export object\n return device;\n}\n\nfunction getDevice(overrides = {}) {\n if (!deviceCached) {\n deviceCached = calcDevice(overrides);\n }\n return deviceCached;\n}\n\nexport { getDevice };\n","import { getWindow } from 'ssr-window';\n\nlet browser;\n\nfunction calcBrowser() {\n const window = getWindow();\n function isSafari() {\n const ua = window.navigator.userAgent.toLowerCase();\n return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;\n }\n return {\n isSafari: isSafari(),\n isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent),\n };\n}\n\nfunction getBrowser() {\n if (!browser) {\n browser = calcBrowser();\n }\n return browser;\n}\n\nexport { getBrowser };\n","import { getWindow } from 'ssr-window';\n\nfunction deleteProps(obj) {\n const object = obj;\n Object.keys(object).forEach((key) => {\n try {\n object[key] = null;\n } catch (e) {\n // no getter for object\n }\n try {\n delete object[key];\n } catch (e) {\n // something got wrong\n }\n });\n}\nfunction nextTick(callback, delay = 0) {\n return setTimeout(callback, delay);\n}\nfunction now() {\n return Date.now();\n}\nfunction getComputedStyle(el) {\n const window = getWindow();\n let style;\n if (window.getComputedStyle) {\n style = window.getComputedStyle(el, null);\n }\n if (!style && el.currentStyle) {\n style = el.currentStyle;\n }\n if (!style) {\n style = el.style;\n }\n\n return style;\n}\nfunction getTranslate(el, axis = 'x') {\n const window = getWindow();\n let matrix;\n let curTransform;\n let transformMatrix;\n\n const curStyle = getComputedStyle(el, null);\n\n if (window.WebKitCSSMatrix) {\n curTransform = curStyle.transform || curStyle.webkitTransform;\n if (curTransform.split(',').length > 6) {\n curTransform = curTransform\n .split(', ')\n .map((a) => a.replace(',', '.'))\n .join(', ');\n }\n // Some old versions of Webkit choke when 'none' is passed; pass\n // empty string instead in this case\n transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n } else {\n transformMatrix =\n curStyle.MozTransform ||\n curStyle.OTransform ||\n curStyle.MsTransform ||\n curStyle.msTransform ||\n curStyle.transform ||\n curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n matrix = transformMatrix.toString().split(',');\n }\n\n if (axis === 'x') {\n // Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;\n // Crazy IE10 Matrix\n else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);\n // Normal Browsers\n else curTransform = parseFloat(matrix[4]);\n }\n if (axis === 'y') {\n // Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;\n // Crazy IE10 Matrix\n else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);\n // Normal Browsers\n else curTransform = parseFloat(matrix[5]);\n }\n return curTransform || 0;\n}\nfunction isObject(o) {\n return (\n typeof o === 'object' &&\n o !== null &&\n o.constructor &&\n Object.prototype.toString.call(o).slice(8, -1) === 'Object'\n );\n}\nfunction isNode(node) {\n // eslint-disable-next-line\n if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {\n return node instanceof HTMLElement;\n }\n return node && (node.nodeType === 1 || node.nodeType === 11);\n}\nfunction extend(...args) {\n const to = Object(args[0]);\n const noExtend = ['__proto__', 'constructor', 'prototype'];\n for (let i = 1; i < args.length; i += 1) {\n const nextSource = args[i];\n if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {\n const keysArray = Object.keys(Object(nextSource)).filter((key) => noExtend.indexOf(key) < 0);\n for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n const nextKey = keysArray[nextIndex];\n const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n if (desc !== undefined && desc.enumerable) {\n if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n if (nextSource[nextKey].__swiper__) {\n to[nextKey] = nextSource[nextKey];\n } else {\n extend(to[nextKey], nextSource[nextKey]);\n }\n } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n to[nextKey] = {};\n if (nextSource[nextKey].__swiper__) {\n to[nextKey] = nextSource[nextKey];\n } else {\n extend(to[nextKey], nextSource[nextKey]);\n }\n } else {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n }\n return to;\n}\n\nfunction setCSSProperty(el, varName, varValue) {\n el.style.setProperty(varName, varValue);\n}\n\nfunction animateCSSModeScroll({ swiper, targetPosition, side }) {\n const window = getWindow();\n const startPosition = -swiper.translate;\n let startTime = null;\n let time;\n const duration = swiper.params.speed;\n\n swiper.wrapperEl.style.scrollSnapType = 'none';\n window.cancelAnimationFrame(swiper.cssModeFrameID);\n\n const dir = targetPosition > startPosition ? 'next' : 'prev';\n\n const isOutOfBound = (current, target) => {\n return (dir === 'next' && current >= target) || (dir === 'prev' && current <= target);\n };\n\n const animate = () => {\n time = new Date().getTime();\n if (startTime === null) {\n startTime = time;\n }\n\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);\n\n if (isOutOfBound(currentPosition, targetPosition)) {\n currentPosition = targetPosition;\n }\n swiper.wrapperEl.scrollTo({\n [side]: currentPosition,\n });\n if (isOutOfBound(currentPosition, targetPosition)) {\n swiper.wrapperEl.style.overflow = 'hidden';\n swiper.wrapperEl.style.scrollSnapType = '';\n setTimeout(() => {\n swiper.wrapperEl.style.overflow = '';\n swiper.wrapperEl.scrollTo({\n [side]: currentPosition,\n });\n });\n window.cancelAnimationFrame(swiper.cssModeFrameID);\n return;\n }\n swiper.cssModeFrameID = window.requestAnimationFrame(animate);\n };\n animate();\n}\n\nexport {\n animateCSSModeScroll,\n deleteProps,\n nextTick,\n now,\n getTranslate,\n isObject,\n extend,\n getComputedStyle,\n setCSSProperty,\n};\n","export default function transitionEmit({ swiper, runCallbacks, direction, step }) {\n const { activeIndex, previousIndex } = swiper;\n let dir = direction;\n if (!dir) {\n if (activeIndex > previousIndex) dir = 'next';\n else if (activeIndex < previousIndex) dir = 'prev';\n else dir = 'reset';\n }\n\n swiper.emit(`transition${step}`);\n\n if (runCallbacks && activeIndex !== previousIndex) {\n if (dir === 'reset') {\n swiper.emit(`slideResetTransition${step}`);\n return;\n }\n swiper.emit(`slideChangeTransition${step}`);\n if (dir === 'next') {\n swiper.emit(`slideNextTransition${step}`);\n } else {\n swiper.emit(`slidePrevTransition${step}`);\n }\n }\n}\n","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\n\n// Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\nfunction closestElement(selector, base = this) {\n function __closestFrom(el) {\n if (!el || el === getDocument() || el === getWindow()) return null;\n if (el.assignedSlot) el = el.assignedSlot;\n const found = el.closest(selector);\n return found || __closestFrom(el.getRootNode().host);\n }\n return __closestFrom(base);\n}\n\nexport default function onTouchStart(event) {\n const swiper = this;\n const document = getDocument();\n const window = getWindow();\n\n const data = swiper.touchEventsData;\n const { params, touches, enabled } = swiper;\n if (!enabled) return;\n\n if (swiper.animating && params.preventInteractionOnTransition) {\n return;\n }\n if (!swiper.animating && params.cssMode && params.loop) {\n swiper.loopFix();\n }\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n let $targetEl = $(e.target);\n\n if (params.touchEventsTarget === 'wrapper') {\n if (!$targetEl.closest(swiper.wrapperEl).length) return;\n }\n data.isTouchEvent = e.type === 'touchstart';\n if (!data.isTouchEvent && 'which' in e && e.which === 3) return;\n if (!data.isTouchEvent && 'button' in e && e.button > 0) return;\n if (data.isTouched && data.isMoved) return;\n\n // change target el for shadow root component\n const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';\n if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) {\n $targetEl = $(event.path[0]);\n }\n\n const noSwipingSelector = params.noSwipingSelector\n ? params.noSwipingSelector\n : `.${params.noSwipingClass}`;\n const isTargetShadow = !!(e.target && e.target.shadowRoot);\n\n // use closestElement for shadow root element to get the actual closest for nested shadow root element\n if (\n params.noSwiping &&\n (isTargetShadow\n ? closestElement(noSwipingSelector, e.target)\n : $targetEl.closest(noSwipingSelector)[0])\n ) {\n swiper.allowClick = true;\n return;\n }\n\n if (params.swipeHandler) {\n if (!$targetEl.closest(params.swipeHandler)[0]) return;\n }\n\n touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n const startX = touches.currentX;\n const startY = touches.currentY;\n\n // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore\n\n const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n if (\n edgeSwipeDetection &&\n (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)\n ) {\n if (edgeSwipeDetection === 'prevent') {\n event.preventDefault();\n } else {\n return;\n }\n }\n\n Object.assign(data, {\n isTouched: true,\n isMoved: false,\n allowTouchCallbacks: true,\n isScrolling: undefined,\n startMoving: undefined,\n });\n\n touches.startX = startX;\n touches.startY = startY;\n data.touchStartTime = now();\n swiper.allowClick = true;\n swiper.updateSize();\n swiper.swipeDirection = undefined;\n if (params.threshold > 0) data.allowThresholdMove = false;\n if (e.type !== 'touchstart') {\n let preventDefault = true;\n if ($targetEl.is(data.focusableElements)) preventDefault = false;\n if (\n document.activeElement &&\n $(document.activeElement).is(data.focusableElements) &&\n document.activeElement !== $targetEl[0]\n ) {\n document.activeElement.blur();\n }\n\n const shouldPreventDefault =\n preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n if (\n (params.touchStartForcePreventDefault || shouldPreventDefault) &&\n !$targetEl[0].isContentEditable\n ) {\n e.preventDefault();\n }\n }\n swiper.emit('touchStart', e);\n}\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\n\nexport default function onTouchMove(event) {\n const document = getDocument();\n const swiper = this;\n const data = swiper.touchEventsData;\n const { params, touches, rtlTranslate: rtl, enabled } = swiper;\n if (!enabled) return;\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n if (!data.isTouched) {\n if (data.startMoving && data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n return;\n }\n if (data.isTouchEvent && e.type !== 'touchmove') return;\n const targetTouch =\n e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);\n const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;\n const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;\n if (e.preventedByNestedSwiper) {\n touches.startX = pageX;\n touches.startY = pageY;\n return;\n }\n if (!swiper.allowTouchMove) {\n // isMoved = true;\n swiper.allowClick = false;\n if (data.isTouched) {\n Object.assign(touches, {\n startX: pageX,\n startY: pageY,\n currentX: pageX,\n currentY: pageY,\n });\n data.touchStartTime = now();\n }\n return;\n }\n if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n if (swiper.isVertical()) {\n // Vertical\n if (\n (pageY < touches.startY && swiper.translate <= swiper.maxTranslate()) ||\n (pageY > touches.startY && swiper.translate >= swiper.minTranslate())\n ) {\n data.isTouched = false;\n data.isMoved = false;\n return;\n }\n } else if (\n (pageX < touches.startX && swiper.translate <= swiper.maxTranslate()) ||\n (pageX > touches.startX && swiper.translate >= swiper.minTranslate())\n ) {\n return;\n }\n }\n if (data.isTouchEvent && document.activeElement) {\n if (e.target === document.activeElement && $(e.target).is(data.focusableElements)) {\n data.isMoved = true;\n swiper.allowClick = false;\n return;\n }\n }\n if (data.allowTouchCallbacks) {\n swiper.emit('touchMove', e);\n }\n if (e.targetTouches && e.targetTouches.length > 1) return;\n\n touches.currentX = pageX;\n touches.currentY = pageY;\n\n const diffX = touches.currentX - touches.startX;\n const diffY = touches.currentY - touches.startY;\n if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold)\n return;\n\n if (typeof data.isScrolling === 'undefined') {\n let touchAngle;\n if (\n (swiper.isHorizontal() && touches.currentY === touches.startY) ||\n (swiper.isVertical() && touches.currentX === touches.startX)\n ) {\n data.isScrolling = false;\n } else {\n // eslint-disable-next-line\n if (diffX * diffX + diffY * diffY >= 25) {\n touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;\n data.isScrolling = swiper.isHorizontal()\n ? touchAngle > params.touchAngle\n : 90 - touchAngle > params.touchAngle;\n }\n }\n }\n if (data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n if (typeof data.startMoving === 'undefined') {\n if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n data.startMoving = true;\n }\n }\n if (data.isScrolling) {\n data.isTouched = false;\n return;\n }\n if (!data.startMoving) {\n return;\n }\n swiper.allowClick = false;\n if (!params.cssMode && e.cancelable) {\n e.preventDefault();\n }\n if (params.touchMoveStopPropagation && !params.nested) {\n e.stopPropagation();\n }\n\n if (!data.isMoved) {\n if (params.loop && !params.cssMode) {\n swiper.loopFix();\n }\n data.startTranslate = swiper.getTranslate();\n swiper.setTransition(0);\n if (swiper.animating) {\n swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\n }\n data.allowMomentumBounce = false;\n // Grab Cursor\n if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n swiper.setGrabCursor(true);\n }\n swiper.emit('sliderFirstMove', e);\n }\n swiper.emit('sliderMove', e);\n data.isMoved = true;\n\n let diff = swiper.isHorizontal() ? diffX : diffY;\n touches.diff = diff;\n\n diff *= params.touchRatio;\n if (rtl) diff = -diff;\n\n swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n data.currentTranslate = diff + data.startTranslate;\n\n let disableParentSwiper = true;\n let resistanceRatio = params.resistanceRatio;\n if (params.touchReleaseOnEdges) {\n resistanceRatio = 0;\n }\n if (diff > 0 && data.currentTranslate > swiper.minTranslate()) {\n disableParentSwiper = false;\n if (params.resistance)\n data.currentTranslate =\n swiper.minTranslate() -\n 1 +\n (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n disableParentSwiper = false;\n if (params.resistance)\n data.currentTranslate =\n swiper.maxTranslate() +\n 1 -\n (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n }\n\n if (disableParentSwiper) {\n e.preventedByNestedSwiper = true;\n }\n\n // Directions locks\n if (\n !swiper.allowSlideNext &&\n swiper.swipeDirection === 'next' &&\n data.currentTranslate < data.startTranslate\n ) {\n data.currentTranslate = data.startTranslate;\n }\n if (\n !swiper.allowSlidePrev &&\n swiper.swipeDirection === 'prev' &&\n data.currentTranslate > data.startTranslate\n ) {\n data.currentTranslate = data.startTranslate;\n }\n if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {\n data.currentTranslate = data.startTranslate;\n }\n\n // Threshold\n if (params.threshold > 0) {\n if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n if (!data.allowThresholdMove) {\n data.allowThresholdMove = true;\n touches.startX = touches.currentX;\n touches.startY = touches.currentY;\n data.currentTranslate = data.startTranslate;\n touches.diff = swiper.isHorizontal()\n ? touches.currentX - touches.startX\n : touches.currentY - touches.startY;\n return;\n }\n } else {\n data.currentTranslate = data.startTranslate;\n return;\n }\n }\n\n if (!params.followFinger || params.cssMode) return;\n\n // Update active index in free mode\n if (\n (params.freeMode && params.freeMode.enabled && swiper.freeMode) ||\n params.watchSlidesProgress\n ) {\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) {\n swiper.freeMode.onTouchMove();\n }\n // Update progress\n swiper.updateProgress(data.currentTranslate);\n // Update translate\n swiper.setTranslate(data.currentTranslate);\n}\n","import { now, nextTick } from '../../shared/utils.js';\n\nexport default function onTouchEnd(event) {\n const swiper = this;\n const data = swiper.touchEventsData;\n\n const { params, touches, rtlTranslate: rtl, slidesGrid, enabled } = swiper;\n if (!enabled) return;\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n if (data.allowTouchCallbacks) {\n swiper.emit('touchEnd', e);\n }\n data.allowTouchCallbacks = false;\n if (!data.isTouched) {\n if (data.isMoved && params.grabCursor) {\n swiper.setGrabCursor(false);\n }\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n // Return Grab Cursor\n if (\n params.grabCursor &&\n data.isMoved &&\n data.isTouched &&\n (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)\n ) {\n swiper.setGrabCursor(false);\n }\n\n // Time diff\n const touchEndTime = now();\n const timeDiff = touchEndTime - data.touchStartTime;\n\n // Tap, doubleTap, Click\n if (swiper.allowClick) {\n swiper.updateClickedSlide(e);\n swiper.emit('tap click', e);\n if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n swiper.emit('doubleTap doubleClick', e);\n }\n }\n\n data.lastClickTime = now();\n nextTick(() => {\n if (!swiper.destroyed) swiper.allowClick = true;\n });\n\n if (\n !data.isTouched ||\n !data.isMoved ||\n !swiper.swipeDirection ||\n touches.diff === 0 ||\n data.currentTranslate === data.startTranslate\n ) {\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n\n let currentPos;\n if (params.followFinger) {\n currentPos = rtl ? swiper.translate : -swiper.translate;\n } else {\n currentPos = -data.currentTranslate;\n }\n\n if (params.cssMode) {\n return;\n }\n\n if (swiper.params.freeMode && params.freeMode.enabled) {\n swiper.freeMode.onTouchEnd({ currentPos });\n return;\n }\n\n // Find current slide\n let stopIndex = 0;\n let groupSize = swiper.slidesSizesGrid[0];\n for (\n let i = 0;\n i < slidesGrid.length;\n i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup\n ) {\n const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n if (typeof slidesGrid[i + increment] !== 'undefined') {\n if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {\n stopIndex = i;\n groupSize = slidesGrid[i + increment] - slidesGrid[i];\n }\n } else if (currentPos >= slidesGrid[i]) {\n stopIndex = i;\n groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n }\n }\n\n // Find current slide size\n const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n\n if (timeDiff > params.longSwipesMs) {\n // Long touches\n if (!params.longSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (swiper.swipeDirection === 'next') {\n if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + increment);\n else swiper.slideTo(stopIndex);\n }\n if (swiper.swipeDirection === 'prev') {\n if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);\n else swiper.slideTo(stopIndex);\n }\n } else {\n // Short swipes\n if (!params.shortSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n const isNavButtonTarget =\n swiper.navigation &&\n (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n if (!isNavButtonTarget) {\n if (swiper.swipeDirection === 'next') {\n swiper.slideTo(stopIndex + increment);\n }\n if (swiper.swipeDirection === 'prev') {\n swiper.slideTo(stopIndex);\n }\n } else if (e.target === swiper.navigation.nextEl) {\n swiper.slideTo(stopIndex + increment);\n } else {\n swiper.slideTo(stopIndex);\n }\n }\n}\n","export default function onResize() {\n const swiper = this;\n\n const { params, el } = swiper;\n\n if (el && el.offsetWidth === 0) return;\n\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Save locks\n const { allowSlideNext, allowSlidePrev, snapGrid } = swiper;\n\n // Disable locks on resize\n swiper.allowSlideNext = true;\n swiper.allowSlidePrev = true;\n\n swiper.updateSize();\n swiper.updateSlides();\n\n swiper.updateSlidesClasses();\n if (\n (params.slidesPerView === 'auto' || params.slidesPerView > 1) &&\n swiper.isEnd &&\n !swiper.isBeginning &&\n !swiper.params.centeredSlides\n ) {\n swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n\n if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n swiper.autoplay.run();\n }\n // Return locks after resize\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n\n if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n}\n","export default function onClick(e) {\n const swiper = this;\n if (!swiper.enabled) return;\n if (!swiper.allowClick) {\n if (swiper.params.preventClicks) e.preventDefault();\n if (swiper.params.preventClicksPropagation && swiper.animating) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n }\n}\n","export default function onScroll() {\n const swiper = this;\n const { wrapperEl, rtlTranslate, enabled } = swiper;\n if (!enabled) return;\n swiper.previousTranslate = swiper.translate;\n if (swiper.isHorizontal()) {\n swiper.translate = -wrapperEl.scrollLeft;\n } else {\n swiper.translate = -wrapperEl.scrollTop;\n }\n // eslint-disable-next-line\n if (swiper.translate === -0) swiper.translate = 0;\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n let newProgress;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;\n }\n if (newProgress !== swiper.progress) {\n swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);\n }\n\n swiper.emit('setTranslate', swiper.translate, false);\n}\n","import { getDocument } from 'ssr-window';\n\nimport onTouchStart from './onTouchStart.js';\nimport onTouchMove from './onTouchMove.js';\nimport onTouchEnd from './onTouchEnd.js';\nimport onResize from './onResize.js';\nimport onClick from './onClick.js';\nimport onScroll from './onScroll.js';\n\nlet dummyEventAttached = false;\nfunction dummyEventListener() {}\n\nconst events = (swiper, method) => {\n const document = getDocument();\n const { params, touchEvents, el, wrapperEl, device, support } = swiper;\n const capture = !!params.nested;\n const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n const swiperMethod = method;\n\n // Touch Events\n if (!support.touch) {\n el[domMethod](touchEvents.start, swiper.onTouchStart, false);\n document[domMethod](touchEvents.move, swiper.onTouchMove, capture);\n document[domMethod](touchEvents.end, swiper.onTouchEnd, false);\n } else {\n const passiveListener =\n touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener);\n el[domMethod](\n touchEvents.move,\n swiper.onTouchMove,\n support.passiveListener ? { passive: false, capture } : capture,\n );\n el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener);\n if (touchEvents.cancel) {\n el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener);\n }\n }\n // Prevent Links Clicks\n if (params.preventClicks || params.preventClicksPropagation) {\n el[domMethod]('click', swiper.onClick, true);\n }\n if (params.cssMode) {\n wrapperEl[domMethod]('scroll', swiper.onScroll);\n }\n\n // Resize handler\n if (params.updateOnWindowResize) {\n swiper[swiperMethod](\n device.ios || device.android\n ? 'resize orientationchange observerUpdate'\n : 'resize observerUpdate',\n onResize,\n true,\n );\n } else {\n swiper[swiperMethod]('observerUpdate', onResize, true);\n }\n};\n\nfunction attachEvents() {\n const swiper = this;\n const document = getDocument();\n const { params, support } = swiper;\n\n swiper.onTouchStart = onTouchStart.bind(swiper);\n swiper.onTouchMove = onTouchMove.bind(swiper);\n swiper.onTouchEnd = onTouchEnd.bind(swiper);\n\n if (params.cssMode) {\n swiper.onScroll = onScroll.bind(swiper);\n }\n\n swiper.onClick = onClick.bind(swiper);\n\n if (support.touch && !dummyEventAttached) {\n document.addEventListener('touchstart', dummyEventListener);\n dummyEventAttached = true;\n }\n\n events(swiper, 'on');\n}\n\nfunction detachEvents() {\n const swiper = this;\n events(swiper, 'off');\n}\n\nexport default {\n attachEvents,\n detachEvents,\n};\n","import { extend } from '../../shared/utils.js';\n\nconst isGridEnabled = (swiper, params) => {\n return swiper.grid && params.grid && params.grid.rows > 1;\n};\n\nexport default function setBreakpoint() {\n const swiper = this;\n const { activeIndex, initialized, loopedSlides = 0, params, $el } = swiper;\n const breakpoints = params.breakpoints;\n if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) return;\n\n // Get breakpoint for window width and update parameters\n const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);\n\n if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n\n const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n const breakpointParams = breakpointOnlyParams || swiper.originalParams;\n const wasMultiRow = isGridEnabled(swiper, params);\n const isMultiRow = isGridEnabled(swiper, breakpointParams);\n\n const wasEnabled = params.enabled;\n\n if (wasMultiRow && !isMultiRow) {\n $el.removeClass(\n `${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`,\n );\n swiper.emitContainerClasses();\n } else if (!wasMultiRow && isMultiRow) {\n $el.addClass(`${params.containerModifierClass}grid`);\n if (\n (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column') ||\n (!breakpointParams.grid.fill && params.grid.fill === 'column')\n ) {\n $el.addClass(`${params.containerModifierClass}grid-column`);\n }\n swiper.emitContainerClasses();\n }\n\n const directionChanged =\n breakpointParams.direction && breakpointParams.direction !== params.direction;\n const needsReLoop =\n params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n\n if (directionChanged && initialized) {\n swiper.changeDirection();\n }\n extend(swiper.params, breakpointParams);\n\n const isEnabled = swiper.params.enabled;\n\n Object.assign(swiper, {\n allowTouchMove: swiper.params.allowTouchMove,\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n });\n\n if (wasEnabled && !isEnabled) {\n swiper.disable();\n } else if (!wasEnabled && isEnabled) {\n swiper.enable();\n }\n\n swiper.currentBreakpoint = breakpoint;\n\n swiper.emit('_beforeBreakpoint', breakpointParams);\n\n if (needsReLoop && initialized) {\n swiper.loopDestroy();\n swiper.loopCreate();\n swiper.updateSlides();\n swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false);\n }\n\n swiper.emit('breakpoint', breakpointParams);\n}\n","export default {\n init: true,\n direction: 'horizontal',\n touchEventsTarget: 'wrapper',\n initialSlide: 0,\n speed: 300,\n cssMode: false,\n updateOnWindowResize: true,\n resizeObserver: true,\n nested: false,\n createElements: false,\n enabled: true,\n focusableElements: 'input, select, option, textarea, button, video, label',\n\n // Overrides\n width: null,\n height: null,\n\n //\n preventInteractionOnTransition: false,\n\n // ssr\n userAgent: null,\n url: null,\n\n // To support iOS's swipe-to-go-back gesture (when being used in-app).\n edgeSwipeDetection: false,\n edgeSwipeThreshold: 20,\n\n // Autoheight\n autoHeight: false,\n\n // Set wrapper width\n setWrapperSize: false,\n\n // Virtual Translate\n virtualTranslate: false,\n\n // Effects\n effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n // Breakpoints\n breakpoints: undefined,\n breakpointsBase: 'window',\n\n // Slides grid\n spaceBetween: 0,\n slidesPerView: 1,\n slidesPerGroup: 1,\n slidesPerGroupSkip: 0,\n slidesPerGroupAuto: false,\n centeredSlides: false,\n centeredSlidesBounds: false,\n slidesOffsetBefore: 0, // in px\n slidesOffsetAfter: 0, // in px\n normalizeSlideIndex: true,\n centerInsufficientSlides: false,\n\n // Disable swiper and hide navigation when container not overflow\n watchOverflow: true,\n\n // Round length\n roundLengths: false,\n\n // Touches\n touchRatio: 1,\n touchAngle: 45,\n simulateTouch: true,\n shortSwipes: true,\n longSwipes: true,\n longSwipesRatio: 0.5,\n longSwipesMs: 300,\n followFinger: true,\n allowTouchMove: true,\n threshold: 0,\n touchMoveStopPropagation: false,\n touchStartPreventDefault: true,\n touchStartForcePreventDefault: false,\n touchReleaseOnEdges: false,\n\n // Unique Navigation Elements\n uniqueNavElements: true,\n\n // Resistance\n resistance: true,\n resistanceRatio: 0.85,\n\n // Progress\n watchSlidesProgress: false,\n\n // Cursor\n grabCursor: false,\n\n // Clicks\n preventClicks: true,\n preventClicksPropagation: true,\n slideToClickedSlide: false,\n\n // Images\n preloadImages: true,\n updateOnImagesReady: true,\n\n // loop\n loop: false,\n loopAdditionalSlides: 0,\n loopedSlides: null,\n loopFillGroupWithBlank: false,\n loopPreventsSlide: true,\n\n // Swiping/no swiping\n allowSlidePrev: true,\n allowSlideNext: true,\n swipeHandler: null, // '.swipe-handler',\n noSwiping: true,\n noSwipingClass: 'swiper-no-swiping',\n noSwipingSelector: null,\n\n // Passive Listeners\n passiveListeners: true,\n\n // NS\n containerModifierClass: 'swiper-', // NEW\n slideClass: 'swiper-slide',\n slideBlankClass: 'swiper-slide-invisible-blank',\n slideActiveClass: 'swiper-slide-active',\n slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n slideVisibleClass: 'swiper-slide-visible',\n slideDuplicateClass: 'swiper-slide-duplicate',\n slideNextClass: 'swiper-slide-next',\n slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n slidePrevClass: 'swiper-slide-prev',\n slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n wrapperClass: 'swiper-wrapper',\n\n // Callbacks\n runCallbacksOnInit: true,\n\n // Internals\n _emitClasses: false,\n};\n","import { extend } from '../shared/utils.js';\n\nexport default function moduleExtendParams(params, allModulesParams) {\n return function extendParams(obj = {}) {\n const moduleParamName = Object.keys(obj)[0];\n const moduleParams = obj[moduleParamName];\n if (typeof moduleParams !== 'object' || moduleParams === null) {\n extend(allModulesParams, obj);\n return;\n }\n if (\n ['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 &&\n params[moduleParamName] === true\n ) {\n params[moduleParamName] = { auto: true };\n }\n if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n extend(allModulesParams, obj);\n return;\n }\n if (params[moduleParamName] === true) {\n params[moduleParamName] = { enabled: true };\n }\n if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n params[moduleParamName].enabled = true;\n }\n if (!params[moduleParamName]) params[moduleParamName] = { enabled: false };\n extend(allModulesParams, obj);\n };\n}\n","/* eslint no-param-reassign: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport $ from '../shared/dom.js';\nimport { extend, now, deleteProps } from '../shared/utils.js';\nimport { getSupport } from '../shared/get-support.js';\nimport { getDevice } from '../shared/get-device.js';\nimport { getBrowser } from '../shared/get-browser.js';\n\nimport Resize from './modules/resize/resize.js';\nimport Observer from './modules/observer/observer.js';\n\nimport eventsEmitter from './events-emitter.js';\n\nimport update from './update/index.js';\nimport translate from './translate/index.js';\nimport transition from './transition/index.js';\nimport slide from './slide/index.js';\nimport loop from './loop/index.js';\nimport grabCursor from './grab-cursor/index.js';\nimport events from './events/index.js';\nimport breakpoints from './breakpoints/index.js';\nimport classes from './classes/index.js';\nimport images from './images/index.js';\nimport checkOverflow from './check-overflow/index.js';\n\nimport defaults from './defaults.js';\nimport moduleExtendParams from './moduleExtendParams.js';\n\nconst prototypes = {\n eventsEmitter,\n update,\n translate,\n transition,\n slide,\n loop,\n grabCursor,\n events,\n breakpoints,\n checkOverflow,\n classes,\n images,\n};\n\nconst extendedDefaults = {};\n\nclass Swiper {\n constructor(...args) {\n let el;\n let params;\n if (\n args.length === 1 &&\n args[0].constructor &&\n Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object'\n ) {\n params = args[0];\n } else {\n [el, params] = args;\n }\n if (!params) params = {};\n\n params = extend({}, params);\n if (el && !params.el) params.el = el;\n\n if (params.el && $(params.el).length > 1) {\n const swipers = [];\n $(params.el).each((containerEl) => {\n const newParams = extend({}, params, { el: containerEl });\n swipers.push(new Swiper(newParams));\n });\n return swipers;\n }\n\n // Swiper Instance\n const swiper = this;\n swiper.__swiper__ = true;\n swiper.support = getSupport();\n swiper.device = getDevice({ userAgent: params.userAgent });\n swiper.browser = getBrowser();\n\n swiper.eventsListeners = {};\n swiper.eventsAnyListeners = [];\n swiper.modules = [...swiper.__modules__];\n if (params.modules && Array.isArray(params.modules)) {\n swiper.modules.push(...params.modules);\n }\n\n const allModulesParams = {};\n\n swiper.modules.forEach((mod) => {\n mod({\n swiper,\n extendParams: moduleExtendParams(params, allModulesParams),\n on: swiper.on.bind(swiper),\n once: swiper.once.bind(swiper),\n off: swiper.off.bind(swiper),\n emit: swiper.emit.bind(swiper),\n });\n });\n\n // Extend defaults with modules params\n const swiperParams = extend({}, defaults, allModulesParams);\n\n // Extend defaults with passed params\n swiper.params = extend({}, swiperParams, extendedDefaults, params);\n swiper.originalParams = extend({}, swiper.params);\n swiper.passedParams = extend({}, params);\n\n // add event listeners\n if (swiper.params && swiper.params.on) {\n Object.keys(swiper.params.on).forEach((eventName) => {\n swiper.on(eventName, swiper.params.on[eventName]);\n });\n }\n if (swiper.params && swiper.params.onAny) {\n swiper.onAny(swiper.params.onAny);\n }\n\n // Save Dom lib\n swiper.$ = $;\n\n // Extend Swiper\n Object.assign(swiper, {\n enabled: swiper.params.enabled,\n el,\n\n // Classes\n classNames: [],\n\n // Slides\n slides: $(),\n slidesGrid: [],\n snapGrid: [],\n slidesSizesGrid: [],\n\n // isDirection\n isHorizontal() {\n return swiper.params.direction === 'horizontal';\n },\n isVertical() {\n return swiper.params.direction === 'vertical';\n },\n\n // Indexes\n activeIndex: 0,\n realIndex: 0,\n\n //\n isBeginning: true,\n isEnd: false,\n\n // Props\n translate: 0,\n previousTranslate: 0,\n progress: 0,\n velocity: 0,\n animating: false,\n\n // Locks\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n\n // Touch Events\n touchEvents: (function touchEvents() {\n const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];\n const desktop = ['pointerdown', 'pointermove', 'pointerup'];\n\n swiper.touchEventsTouch = {\n start: touch[0],\n move: touch[1],\n end: touch[2],\n cancel: touch[3],\n };\n swiper.touchEventsDesktop = {\n start: desktop[0],\n move: desktop[1],\n end: desktop[2],\n };\n return swiper.support.touch || !swiper.params.simulateTouch\n ? swiper.touchEventsTouch\n : swiper.touchEventsDesktop;\n })(),\n touchEventsData: {\n isTouched: undefined,\n isMoved: undefined,\n allowTouchCallbacks: undefined,\n touchStartTime: undefined,\n isScrolling: undefined,\n currentTranslate: undefined,\n startTranslate: undefined,\n allowThresholdMove: undefined,\n // Form elements to match\n focusableElements: swiper.params.focusableElements,\n // Last click time\n lastClickTime: now(),\n clickTimeout: undefined,\n // Velocities\n velocities: [],\n allowMomentumBounce: undefined,\n isTouchEvent: undefined,\n startMoving: undefined,\n },\n\n // Clicks\n allowClick: true,\n\n // Touches\n allowTouchMove: swiper.params.allowTouchMove,\n\n touches: {\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n diff: 0,\n },\n\n // Images\n imagesToLoad: [],\n imagesLoaded: 0,\n });\n\n swiper.emit('_swiper');\n\n // Init\n if (swiper.params.init) {\n swiper.init();\n }\n\n // Return app instance\n return swiper;\n }\n\n enable() {\n const swiper = this;\n if (swiper.enabled) return;\n swiper.enabled = true;\n if (swiper.params.grabCursor) {\n swiper.setGrabCursor();\n }\n swiper.emit('enable');\n }\n\n disable() {\n const swiper = this;\n if (!swiper.enabled) return;\n swiper.enabled = false;\n if (swiper.params.grabCursor) {\n swiper.unsetGrabCursor();\n }\n swiper.emit('disable');\n }\n\n setProgress(progress, speed) {\n const swiper = this;\n progress = Math.min(Math.max(progress, 0), 1);\n const min = swiper.minTranslate();\n const max = swiper.maxTranslate();\n const current = (max - min) * progress + min;\n swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n\n emitContainerClasses() {\n const swiper = this;\n if (!swiper.params._emitClasses || !swiper.el) return;\n const cls = swiper.el.className.split(' ').filter((className) => {\n return (\n className.indexOf('swiper') === 0 ||\n className.indexOf(swiper.params.containerModifierClass) === 0\n );\n });\n swiper.emit('_containerClasses', cls.join(' '));\n }\n\n getSlideClasses(slideEl) {\n const swiper = this;\n\n return slideEl.className\n .split(' ')\n .filter((className) => {\n return (\n className.indexOf('swiper-slide') === 0 ||\n className.indexOf(swiper.params.slideClass) === 0\n );\n })\n .join(' ');\n }\n\n emitSlidesClasses() {\n const swiper = this;\n if (!swiper.params._emitClasses || !swiper.el) return;\n const updates = [];\n swiper.slides.each((slideEl) => {\n const classNames = swiper.getSlideClasses(slideEl);\n updates.push({ slideEl, classNames });\n swiper.emit('_slideClass', slideEl, classNames);\n });\n swiper.emit('_slideClasses', updates);\n }\n\n slidesPerViewDynamic(view = 'current', exact = false) {\n const swiper = this;\n const { params, slides, slidesGrid, slidesSizesGrid, size: swiperSize, activeIndex } = swiper;\n let spv = 1;\n if (params.centeredSlides) {\n let slideSize = slides[activeIndex].swiperSlideSize;\n let breakLoop;\n for (let i = activeIndex + 1; i < slides.length; i += 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) breakLoop = true;\n }\n }\n for (let i = activeIndex - 1; i >= 0; i -= 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) breakLoop = true;\n }\n }\n } else {\n // eslint-disable-next-line\n if (view === 'current') {\n for (let i = activeIndex + 1; i < slides.length; i += 1) {\n const slideInView = exact\n ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize\n : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;\n if (slideInView) {\n spv += 1;\n }\n }\n } else {\n // previous\n for (let i = activeIndex - 1; i >= 0; i -= 1) {\n const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;\n if (slideInView) {\n spv += 1;\n }\n }\n }\n }\n return spv;\n }\n\n update() {\n const swiper = this;\n if (!swiper || swiper.destroyed) return;\n const { snapGrid, params } = swiper;\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n swiper.updateSize();\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n\n function setTranslate() {\n const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n const newTranslate = Math.min(\n Math.max(translateValue, swiper.maxTranslate()),\n swiper.minTranslate(),\n );\n swiper.setTranslate(newTranslate);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n let translated;\n if (swiper.params.freeMode && swiper.params.freeMode.enabled) {\n setTranslate();\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n } else {\n if (\n (swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) &&\n swiper.isEnd &&\n !swiper.params.centeredSlides\n ) {\n translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n if (!translated) {\n setTranslate();\n }\n }\n if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n swiper.emit('update');\n }\n\n changeDirection(newDirection, needUpdate = true) {\n const swiper = this;\n const currentDirection = swiper.params.direction;\n if (!newDirection) {\n // eslint-disable-next-line\n newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n }\n if (\n newDirection === currentDirection ||\n (newDirection !== 'horizontal' && newDirection !== 'vertical')\n ) {\n return swiper;\n }\n\n swiper.$el\n .removeClass(`${swiper.params.containerModifierClass}${currentDirection}`)\n .addClass(`${swiper.params.containerModifierClass}${newDirection}`);\n swiper.emitContainerClasses();\n\n swiper.params.direction = newDirection;\n\n swiper.slides.each((slideEl) => {\n if (newDirection === 'vertical') {\n slideEl.style.width = '';\n } else {\n slideEl.style.height = '';\n }\n });\n\n swiper.emit('changeDirection');\n if (needUpdate) swiper.update();\n\n return swiper;\n }\n\n mount(el) {\n const swiper = this;\n if (swiper.mounted) return true;\n\n // Find el\n const $el = $(el || swiper.params.el);\n el = $el[0];\n\n if (!el) {\n return false;\n }\n\n el.swiper = swiper;\n\n const getWrapperSelector = () => {\n return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n };\n\n const getWrapper = () => {\n if (el && el.shadowRoot && el.shadowRoot.querySelector) {\n const res = $(el.shadowRoot.querySelector(getWrapperSelector()));\n // Children needs to return slot items\n res.children = (options) => $el.children(options);\n return res;\n }\n return $el.children(getWrapperSelector());\n };\n // Find Wrapper\n let $wrapperEl = getWrapper();\n if ($wrapperEl.length === 0 && swiper.params.createElements) {\n const document = getDocument();\n const wrapper = document.createElement('div');\n $wrapperEl = $(wrapper);\n wrapper.className = swiper.params.wrapperClass;\n $el.append(wrapper);\n $el.children(`.${swiper.params.slideClass}`).each((slideEl) => {\n $wrapperEl.append(slideEl);\n });\n }\n\n Object.assign(swiper, {\n $el,\n el,\n $wrapperEl,\n wrapperEl: $wrapperEl[0],\n mounted: true,\n\n // RTL\n rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl',\n rtlTranslate:\n swiper.params.direction === 'horizontal' &&\n (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n wrongRTL: $wrapperEl.css('display') === '-webkit-box',\n });\n\n return true;\n }\n\n init(el) {\n const swiper = this;\n if (swiper.initialized) return swiper;\n\n const mounted = swiper.mount(el);\n if (mounted === false) return swiper;\n\n swiper.emit('beforeInit');\n\n // Set breakpoint\n if (swiper.params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Add Classes\n swiper.addClasses();\n\n // Create loop\n if (swiper.params.loop) {\n swiper.loopCreate();\n }\n\n // Update size\n swiper.updateSize();\n\n // Update slides\n swiper.updateSlides();\n\n if (swiper.params.watchOverflow) {\n swiper.checkOverflow();\n }\n\n // Set Grab Cursor\n if (swiper.params.grabCursor && swiper.enabled) {\n swiper.setGrabCursor();\n }\n\n if (swiper.params.preloadImages) {\n swiper.preloadImages();\n }\n\n // Slide To Initial Slide\n if (swiper.params.loop) {\n swiper.slideTo(\n swiper.params.initialSlide + swiper.loopedSlides,\n 0,\n swiper.params.runCallbacksOnInit,\n false,\n true,\n );\n } else {\n swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n }\n\n // Attach events\n swiper.attachEvents();\n\n // Init Flag\n swiper.initialized = true;\n\n // Emit\n swiper.emit('init');\n swiper.emit('afterInit');\n\n return swiper;\n }\n\n destroy(deleteInstance = true, cleanStyles = true) {\n const swiper = this;\n const { params, $el, $wrapperEl, slides } = swiper;\n\n if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n return null;\n }\n\n swiper.emit('beforeDestroy');\n\n // Init Flag\n swiper.initialized = false;\n\n // Detach events\n swiper.detachEvents();\n\n // Destroy loop\n if (params.loop) {\n swiper.loopDestroy();\n }\n\n // Cleanup styles\n if (cleanStyles) {\n swiper.removeClasses();\n $el.removeAttr('style');\n $wrapperEl.removeAttr('style');\n if (slides && slides.length) {\n slides\n .removeClass(\n [\n params.slideVisibleClass,\n params.slideActiveClass,\n params.slideNextClass,\n params.slidePrevClass,\n ].join(' '),\n )\n .removeAttr('style')\n .removeAttr('data-swiper-slide-index');\n }\n }\n\n swiper.emit('destroy');\n\n // Detach emitter events\n Object.keys(swiper.eventsListeners).forEach((eventName) => {\n swiper.off(eventName);\n });\n\n if (deleteInstance !== false) {\n swiper.$el[0].swiper = null;\n deleteProps(swiper);\n }\n swiper.destroyed = true;\n\n return null;\n }\n\n static extendDefaults(newDefaults) {\n extend(extendedDefaults, newDefaults);\n }\n\n static get extendedDefaults() {\n return extendedDefaults;\n }\n\n static get defaults() {\n return defaults;\n }\n\n static installModule(mod) {\n if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n const modules = Swiper.prototype.__modules__;\n\n if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n modules.push(mod);\n }\n }\n\n static use(module) {\n if (Array.isArray(module)) {\n module.forEach((m) => Swiper.installModule(m));\n return Swiper;\n }\n Swiper.installModule(module);\n return Swiper;\n }\n}\n\nObject.keys(prototypes).forEach((prototypeGroup) => {\n Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => {\n Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n });\n});\n\nSwiper.use([Resize, Observer]);\n\nexport default Swiper;\n","/* eslint-disable no-underscore-dangle */\n\nexport default {\n on(events, handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n const method = priority ? 'unshift' : 'push';\n events.split(' ').forEach((event) => {\n if (!self.eventsListeners[event]) self.eventsListeners[event] = [];\n self.eventsListeners[event][method](handler);\n });\n return self;\n },\n\n once(events, handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n function onceHandler(...args) {\n self.off(events, onceHandler);\n if (onceHandler.__emitterProxy) {\n delete onceHandler.__emitterProxy;\n }\n handler.apply(self, args);\n }\n onceHandler.__emitterProxy = handler;\n return self.on(events, onceHandler, priority);\n },\n\n onAny(handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n const method = priority ? 'unshift' : 'push';\n if (self.eventsAnyListeners.indexOf(handler) < 0) {\n self.eventsAnyListeners[method](handler);\n }\n return self;\n },\n\n offAny(handler) {\n const self = this;\n if (!self.eventsAnyListeners) return self;\n const index = self.eventsAnyListeners.indexOf(handler);\n if (index >= 0) {\n self.eventsAnyListeners.splice(index, 1);\n }\n return self;\n },\n\n off(events, handler) {\n const self = this;\n if (!self.eventsListeners) return self;\n events.split(' ').forEach((event) => {\n if (typeof handler === 'undefined') {\n self.eventsListeners[event] = [];\n } else if (self.eventsListeners[event]) {\n self.eventsListeners[event].forEach((eventHandler, index) => {\n if (\n eventHandler === handler ||\n (eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler)\n ) {\n self.eventsListeners[event].splice(index, 1);\n }\n });\n }\n });\n return self;\n },\n\n emit(...args) {\n const self = this;\n if (!self.eventsListeners) return self;\n let events;\n let data;\n let context;\n if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n events = args[0];\n data = args.slice(1, args.length);\n context = self;\n } else {\n events = args[0].events;\n data = args[0].data;\n context = args[0].context || self;\n }\n data.unshift(context);\n const eventsArray = Array.isArray(events) ? events : events.split(' ');\n\n eventsArray.forEach((event) => {\n if (self.eventsAnyListeners && self.eventsAnyListeners.length) {\n self.eventsAnyListeners.forEach((eventHandler) => {\n eventHandler.apply(context, [event, ...data]);\n });\n }\n if (self.eventsListeners && self.eventsListeners[event]) {\n self.eventsListeners[event].forEach((eventHandler) => {\n eventHandler.apply(context, data);\n });\n }\n });\n return self;\n },\n};\n","import updateSize from './updateSize.js';\nimport updateSlides from './updateSlides.js';\nimport updateAutoHeight from './updateAutoHeight.js';\nimport updateSlidesOffset from './updateSlidesOffset.js';\nimport updateSlidesProgress from './updateSlidesProgress.js';\nimport updateProgress from './updateProgress.js';\nimport updateSlidesClasses from './updateSlidesClasses.js';\nimport updateActiveIndex from './updateActiveIndex.js';\nimport updateClickedSlide from './updateClickedSlide.js';\n\nexport default {\n updateSize,\n updateSlides,\n updateAutoHeight,\n updateSlidesOffset,\n updateSlidesProgress,\n updateProgress,\n updateSlidesClasses,\n updateActiveIndex,\n updateClickedSlide,\n};\n","export default function updateSize() {\n const swiper = this;\n let width;\n let height;\n const $el = swiper.$el;\n if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {\n width = swiper.params.width;\n } else {\n width = $el[0].clientWidth;\n }\n if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n height = swiper.params.height;\n } else {\n height = $el[0].clientHeight;\n }\n if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {\n return;\n }\n\n // Subtract paddings\n width =\n width -\n parseInt($el.css('padding-left') || 0, 10) -\n parseInt($el.css('padding-right') || 0, 10);\n height =\n height -\n parseInt($el.css('padding-top') || 0, 10) -\n parseInt($el.css('padding-bottom') || 0, 10);\n\n if (Number.isNaN(width)) width = 0;\n if (Number.isNaN(height)) height = 0;\n\n Object.assign(swiper, {\n width,\n height,\n size: swiper.isHorizontal() ? width : height,\n });\n}\n","import { setCSSProperty } from '../../shared/utils.js';\n\nexport default function updateSlides() {\n const swiper = this;\n function getDirectionLabel(property) {\n if (swiper.isHorizontal()) {\n return property;\n }\n // prettier-ignore\n return {\n 'width': 'height',\n 'margin-top': 'margin-left',\n 'margin-bottom ': 'margin-right',\n 'margin-left': 'margin-top',\n 'margin-right': 'margin-bottom',\n 'padding-left': 'padding-top',\n 'padding-right': 'padding-bottom',\n 'marginRight': 'marginBottom',\n }[property];\n }\n function getDirectionPropertyValue(node, label) {\n return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);\n }\n\n const params = swiper.params;\n\n const { $wrapperEl, size: swiperSize, rtlTranslate: rtl, wrongRTL } = swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n const slides = $wrapperEl.children(`.${swiper.params.slideClass}`);\n const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n let snapGrid = [];\n const slidesGrid = [];\n const slidesSizesGrid = [];\n\n let offsetBefore = params.slidesOffsetBefore;\n if (typeof offsetBefore === 'function') {\n offsetBefore = params.slidesOffsetBefore.call(swiper);\n }\n\n let offsetAfter = params.slidesOffsetAfter;\n if (typeof offsetAfter === 'function') {\n offsetAfter = params.slidesOffsetAfter.call(swiper);\n }\n\n const previousSnapGridLength = swiper.snapGrid.length;\n const previousSlidesGridLength = swiper.slidesGrid.length;\n\n let spaceBetween = params.spaceBetween;\n let slidePosition = -offsetBefore;\n let prevSlideSize = 0;\n let index = 0;\n if (typeof swiperSize === 'undefined') {\n return;\n }\n if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;\n }\n\n swiper.virtualSize = -spaceBetween;\n\n // reset margins\n if (rtl) slides.css({ marginLeft: '', marginBottom: '', marginTop: '' });\n else slides.css({ marginRight: '', marginBottom: '', marginTop: '' });\n\n // reset cssMode offsets\n if (params.centeredSlides && params.cssMode) {\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', '');\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', '');\n }\n\n const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n if (gridEnabled) {\n swiper.grid.initSlides(slidesLength);\n }\n\n // Calc slides\n let slideSize;\n\n const shouldResetSlideSize =\n params.slidesPerView === 'auto' &&\n params.breakpoints &&\n Object.keys(params.breakpoints).filter((key) => {\n return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n }).length > 0;\n\n for (let i = 0; i < slidesLength; i += 1) {\n slideSize = 0;\n const slide = slides.eq(i);\n if (gridEnabled) {\n swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel);\n }\n if (slide.css('display') === 'none') continue; // eslint-disable-line\n\n if (params.slidesPerView === 'auto') {\n if (shouldResetSlideSize) {\n slides[i].style[getDirectionLabel('width')] = ``;\n }\n const slideStyles = getComputedStyle(slide[0]);\n const currentTransform = slide[0].style.transform;\n const currentWebKitTransform = slide[0].style.webkitTransform;\n if (currentTransform) {\n slide[0].style.transform = 'none';\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = 'none';\n }\n if (params.roundLengths) {\n slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true);\n } else {\n // eslint-disable-next-line\n const width = getDirectionPropertyValue(slideStyles, 'width');\n const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');\n const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');\n const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');\n const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');\n const boxSizing = slideStyles.getPropertyValue('box-sizing');\n if (boxSizing && boxSizing === 'border-box') {\n slideSize = width + marginLeft + marginRight;\n } else {\n const { clientWidth, offsetWidth } = slide[0];\n slideSize =\n width +\n paddingLeft +\n paddingRight +\n marginLeft +\n marginRight +\n (offsetWidth - clientWidth);\n }\n }\n if (currentTransform) {\n slide[0].style.transform = currentTransform;\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = currentWebKitTransform;\n }\n if (params.roundLengths) slideSize = Math.floor(slideSize);\n } else {\n slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;\n if (params.roundLengths) slideSize = Math.floor(slideSize);\n\n if (slides[i]) {\n slides[i].style[getDirectionLabel('width')] = `${slideSize}px`;\n }\n }\n if (slides[i]) {\n slides[i].swiperSlideSize = slideSize;\n }\n slidesSizesGrid.push(slideSize);\n\n if (params.centeredSlides) {\n slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n if (prevSlideSize === 0 && i !== 0)\n slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n slidesGrid.push(slidePosition);\n } else {\n if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n if (\n (index - Math.min(swiper.params.slidesPerGroupSkip, index)) %\n swiper.params.slidesPerGroup ===\n 0\n )\n snapGrid.push(slidePosition);\n slidesGrid.push(slidePosition);\n slidePosition = slidePosition + slideSize + spaceBetween;\n }\n\n swiper.virtualSize += slideSize + spaceBetween;\n\n prevSlideSize = slideSize;\n\n index += 1;\n }\n swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n\n if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n $wrapperEl.css({ width: `${swiper.virtualSize + params.spaceBetween}px` });\n }\n if (params.setWrapperSize) {\n $wrapperEl.css({\n [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px`,\n });\n }\n\n if (gridEnabled) {\n swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel);\n }\n\n // Remove last grid elements depending on width\n if (!params.centeredSlides) {\n const newSlidesGrid = [];\n for (let i = 0; i < snapGrid.length; i += 1) {\n let slidesGridItem = snapGrid[i];\n if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n if (snapGrid[i] <= swiper.virtualSize - swiperSize) {\n newSlidesGrid.push(slidesGridItem);\n }\n }\n snapGrid = newSlidesGrid;\n\n if (\n Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) >\n 1\n ) {\n snapGrid.push(swiper.virtualSize - swiperSize);\n }\n }\n if (snapGrid.length === 0) snapGrid = [0];\n\n if (params.spaceBetween !== 0) {\n const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');\n slides\n .filter((_, slideIndex) => {\n if (!params.cssMode) return true;\n if (slideIndex === slides.length - 1) {\n return false;\n }\n return true;\n })\n .css({ [key]: `${spaceBetween}px` });\n }\n\n if (params.centeredSlides && params.centeredSlidesBounds) {\n let allSlidesSize = 0;\n slidesSizesGrid.forEach((slideSizeValue) => {\n allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n });\n allSlidesSize -= params.spaceBetween;\n const maxSnap = allSlidesSize - swiperSize;\n snapGrid = snapGrid.map((snap) => {\n if (snap < 0) return -offsetBefore;\n if (snap > maxSnap) return maxSnap + offsetAfter;\n return snap;\n });\n }\n\n if (params.centerInsufficientSlides) {\n let allSlidesSize = 0;\n slidesSizesGrid.forEach((slideSizeValue) => {\n allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n });\n allSlidesSize -= params.spaceBetween;\n if (allSlidesSize < swiperSize) {\n const allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n snapGrid.forEach((snap, snapIndex) => {\n snapGrid[snapIndex] = snap - allSlidesOffset;\n });\n slidesGrid.forEach((snap, snapIndex) => {\n slidesGrid[snapIndex] = snap + allSlidesOffset;\n });\n }\n }\n\n Object.assign(swiper, {\n slides,\n snapGrid,\n slidesGrid,\n slidesSizesGrid,\n });\n\n if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n setCSSProperty(\n swiper.wrapperEl,\n '--swiper-centered-offset-after',\n `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`,\n );\n const addToSnapGrid = -swiper.snapGrid[0];\n const addToSlidesGrid = -swiper.slidesGrid[0];\n swiper.snapGrid = swiper.snapGrid.map((v) => v + addToSnapGrid);\n swiper.slidesGrid = swiper.slidesGrid.map((v) => v + addToSlidesGrid);\n }\n\n if (slidesLength !== previousSlidesLength) {\n swiper.emit('slidesLengthChange');\n }\n if (snapGrid.length !== previousSnapGridLength) {\n if (swiper.params.watchOverflow) swiper.checkOverflow();\n swiper.emit('snapGridLengthChange');\n }\n if (slidesGrid.length !== previousSlidesGridLength) {\n swiper.emit('slidesGridLengthChange');\n }\n\n if (params.watchSlidesProgress) {\n swiper.updateSlidesOffset();\n }\n}\n","export default function updateAutoHeight(speed) {\n const swiper = this;\n const activeSlides = [];\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n let newHeight = 0;\n let i;\n if (typeof speed === 'number') {\n swiper.setTransition(speed);\n } else if (speed === true) {\n swiper.setTransition(swiper.params.speed);\n }\n\n const getSlideByIndex = (index) => {\n if (isVirtual) {\n return swiper.slides.filter(\n (el) => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index,\n )[0];\n }\n return swiper.slides.eq(index)[0];\n };\n // Find slides currently in view\n if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n if (swiper.params.centeredSlides) {\n swiper.visibleSlides.each((slide) => {\n activeSlides.push(slide);\n });\n } else {\n for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n const index = swiper.activeIndex + i;\n if (index > swiper.slides.length && !isVirtual) break;\n activeSlides.push(getSlideByIndex(index));\n }\n }\n } else {\n activeSlides.push(getSlideByIndex(swiper.activeIndex));\n }\n\n // Find new height from highest slide in view\n for (i = 0; i < activeSlides.length; i += 1) {\n if (typeof activeSlides[i] !== 'undefined') {\n const height = activeSlides[i].offsetHeight;\n newHeight = height > newHeight ? height : newHeight;\n }\n }\n\n // Update Height\n if (newHeight) swiper.$wrapperEl.css('height', `${newHeight}px`);\n}\n","export default function updateSlidesOffset() {\n const swiper = this;\n const slides = swiper.slides;\n for (let i = 0; i < slides.length; i += 1) {\n slides[i].swiperSlideOffset = swiper.isHorizontal()\n ? slides[i].offsetLeft\n : slides[i].offsetTop;\n }\n}\n","import $ from '../../shared/dom.js';\n\nexport default function updateSlidesProgress(translate = (this && this.translate) || 0) {\n const swiper = this;\n const params = swiper.params;\n\n const { slides, rtlTranslate: rtl } = swiper;\n\n if (slides.length === 0) return;\n if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n\n let offsetCenter = -translate;\n if (rtl) offsetCenter = translate;\n\n // Visible Slides\n slides.removeClass(params.slideVisibleClass);\n\n swiper.visibleSlidesIndexes = [];\n swiper.visibleSlides = [];\n\n for (let i = 0; i < slides.length; i += 1) {\n const slide = slides[i];\n let slideOffset = slide.swiperSlideOffset;\n if (params.cssMode && params.centeredSlides) {\n slideOffset -= slides[0].swiperSlideOffset;\n }\n\n const slideProgress =\n (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) /\n (slide.swiperSlideSize + params.spaceBetween);\n const slideBefore = -(offsetCenter - slideOffset);\n const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n const isVisible =\n (slideBefore >= 0 && slideBefore < swiper.size - 1) ||\n (slideAfter > 1 && slideAfter <= swiper.size) ||\n (slideBefore <= 0 && slideAfter >= swiper.size);\n if (isVisible) {\n swiper.visibleSlides.push(slide);\n swiper.visibleSlidesIndexes.push(i);\n slides.eq(i).addClass(params.slideVisibleClass);\n }\n slide.progress = rtl ? -slideProgress : slideProgress;\n }\n swiper.visibleSlides = $(swiper.visibleSlides);\n}\n","export default function updateProgress(translate) {\n const swiper = this;\n if (typeof translate === 'undefined') {\n const multiplier = swiper.rtlTranslate ? -1 : 1;\n // eslint-disable-next-line\n translate = (swiper && swiper.translate && swiper.translate * multiplier) || 0;\n }\n const params = swiper.params;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n let { progress, isBeginning, isEnd } = swiper;\n const wasBeginning = isBeginning;\n const wasEnd = isEnd;\n if (translatesDiff === 0) {\n progress = 0;\n isBeginning = true;\n isEnd = true;\n } else {\n progress = (translate - swiper.minTranslate()) / translatesDiff;\n isBeginning = progress <= 0;\n isEnd = progress >= 1;\n }\n Object.assign(swiper, {\n progress,\n isBeginning,\n isEnd,\n });\n\n if (params.watchSlidesProgress || (params.centeredSlides && params.autoHeight))\n swiper.updateSlidesProgress(translate);\n\n if (isBeginning && !wasBeginning) {\n swiper.emit('reachBeginning toEdge');\n }\n if (isEnd && !wasEnd) {\n swiper.emit('reachEnd toEdge');\n }\n if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {\n swiper.emit('fromEdge');\n }\n\n swiper.emit('progress', progress);\n}\n","export default function updateSlidesClasses() {\n const swiper = this;\n\n const { slides, params, $wrapperEl, activeIndex, realIndex } = swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n\n slides.removeClass(\n `${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`,\n );\n\n let activeSlide;\n if (isVirtual) {\n activeSlide = swiper.$wrapperEl.find(\n `.${params.slideClass}[data-swiper-slide-index=\"${activeIndex}\"]`,\n );\n } else {\n activeSlide = slides.eq(activeIndex);\n }\n\n // Active classes\n activeSlide.addClass(params.slideActiveClass);\n\n if (params.loop) {\n // Duplicate to all looped slides\n if (activeSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${realIndex}\"]`,\n )\n .addClass(params.slideDuplicateActiveClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${realIndex}\"]`,\n )\n .addClass(params.slideDuplicateActiveClass);\n }\n }\n // Next Slide\n let nextSlide = activeSlide\n .nextAll(`.${params.slideClass}`)\n .eq(0)\n .addClass(params.slideNextClass);\n if (params.loop && nextSlide.length === 0) {\n nextSlide = slides.eq(0);\n nextSlide.addClass(params.slideNextClass);\n }\n // Prev Slide\n let prevSlide = activeSlide\n .prevAll(`.${params.slideClass}`)\n .eq(0)\n .addClass(params.slidePrevClass);\n if (params.loop && prevSlide.length === 0) {\n prevSlide = slides.eq(-1);\n prevSlide.addClass(params.slidePrevClass);\n }\n if (params.loop) {\n // Duplicate to all looped slides\n if (nextSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${\n params.slideDuplicateClass\n })[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicateNextClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${\n params.slideDuplicateClass\n }[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicateNextClass);\n }\n if (prevSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${\n params.slideDuplicateClass\n })[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicatePrevClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${\n params.slideDuplicateClass\n }[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicatePrevClass);\n }\n }\n swiper.emitSlidesClasses();\n}\n","export default function updateActiveIndex(newActiveIndex) {\n const swiper = this;\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n const {\n slidesGrid,\n snapGrid,\n params,\n activeIndex: previousIndex,\n realIndex: previousRealIndex,\n snapIndex: previousSnapIndex,\n } = swiper;\n let activeIndex = newActiveIndex;\n let snapIndex;\n if (typeof activeIndex === 'undefined') {\n for (let i = 0; i < slidesGrid.length; i += 1) {\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (\n translate >= slidesGrid[i] &&\n translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2\n ) {\n activeIndex = i;\n } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n activeIndex = i + 1;\n }\n } else if (translate >= slidesGrid[i]) {\n activeIndex = i;\n }\n }\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;\n }\n }\n if (snapGrid.indexOf(translate) >= 0) {\n snapIndex = snapGrid.indexOf(translate);\n } else {\n const skip = Math.min(params.slidesPerGroupSkip, activeIndex);\n snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);\n }\n if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n if (activeIndex === previousIndex) {\n if (snapIndex !== previousSnapIndex) {\n swiper.snapIndex = snapIndex;\n swiper.emit('snapIndexChange');\n }\n return;\n }\n\n // Get real index\n const realIndex = parseInt(\n swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex,\n 10,\n );\n\n Object.assign(swiper, {\n snapIndex,\n realIndex,\n previousIndex,\n activeIndex,\n });\n swiper.emit('activeIndexChange');\n swiper.emit('snapIndexChange');\n if (previousRealIndex !== realIndex) {\n swiper.emit('realIndexChange');\n }\n if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n swiper.emit('slideChange');\n }\n}\n","import $ from '../../shared/dom.js';\n\nexport default function updateClickedSlide(e) {\n const swiper = this;\n const params = swiper.params;\n const slide = $(e.target).closest(`.${params.slideClass}`)[0];\n let slideFound = false;\n let slideIndex;\n\n if (slide) {\n for (let i = 0; i < swiper.slides.length; i += 1) {\n if (swiper.slides[i] === slide) {\n slideFound = true;\n slideIndex = i;\n break;\n }\n }\n }\n\n if (slide && slideFound) {\n swiper.clickedSlide = slide;\n if (swiper.virtual && swiper.params.virtual.enabled) {\n swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);\n } else {\n swiper.clickedIndex = slideIndex;\n }\n } else {\n swiper.clickedSlide = undefined;\n swiper.clickedIndex = undefined;\n return;\n }\n if (\n params.slideToClickedSlide &&\n swiper.clickedIndex !== undefined &&\n swiper.clickedIndex !== swiper.activeIndex\n ) {\n swiper.slideToClickedSlide();\n }\n}\n","import getTranslate from './getTranslate.js';\nimport setTranslate from './setTranslate.js';\nimport minTranslate from './minTranslate.js';\nimport maxTranslate from './maxTranslate.js';\nimport translateTo from './translateTo.js';\n\nexport default {\n getTranslate,\n setTranslate,\n minTranslate,\n maxTranslate,\n translateTo,\n};\n","import { getTranslate } from '../../shared/utils.js';\n\nexport default function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') {\n const swiper = this;\n\n const { params, rtlTranslate: rtl, translate, $wrapperEl } = swiper;\n\n if (params.virtualTranslate) {\n return rtl ? -translate : translate;\n }\n if (params.cssMode) {\n return translate;\n }\n\n let currentTranslate = getTranslate($wrapperEl[0], axis);\n if (rtl) currentTranslate = -currentTranslate;\n\n return currentTranslate || 0;\n}\n","export default function setTranslate(translate, byController) {\n const swiper = this;\n const { rtlTranslate: rtl, params, $wrapperEl, wrapperEl, progress } = swiper;\n let x = 0;\n let y = 0;\n const z = 0;\n\n if (swiper.isHorizontal()) {\n x = rtl ? -translate : translate;\n } else {\n y = translate;\n }\n\n if (params.roundLengths) {\n x = Math.floor(x);\n y = Math.floor(y);\n }\n\n if (params.cssMode) {\n wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n } else if (!params.virtualTranslate) {\n $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`);\n }\n swiper.previousTranslate = swiper.translate;\n swiper.translate = swiper.isHorizontal() ? x : y;\n\n // Check if we need to update progress\n let newProgress;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (translate - swiper.minTranslate()) / translatesDiff;\n }\n if (newProgress !== progress) {\n swiper.updateProgress(translate);\n }\n\n swiper.emit('setTranslate', swiper.translate, byController);\n}\n","export default function minTranslate() {\n return -this.snapGrid[0];\n}\n","export default function maxTranslate() {\n return -this.snapGrid[this.snapGrid.length - 1];\n}\n","import { animateCSSModeScroll } from '../../shared/utils.js';\n\nexport default function translateTo(\n translate = 0,\n speed = this.params.speed,\n runCallbacks = true,\n translateBounds = true,\n internal,\n) {\n const swiper = this;\n\n const { params, wrapperEl } = swiper;\n\n if (swiper.animating && params.preventInteractionOnTransition) {\n return false;\n }\n\n const minTranslate = swiper.minTranslate();\n const maxTranslate = swiper.maxTranslate();\n let newTranslate;\n if (translateBounds && translate > minTranslate) newTranslate = minTranslate;\n else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;\n else newTranslate = translate;\n\n // Update progress\n swiper.updateProgress(newTranslate);\n\n if (params.cssMode) {\n const isH = swiper.isHorizontal();\n if (speed === 0) {\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;\n } else {\n if (!swiper.support.smoothScroll) {\n animateCSSModeScroll({ swiper, targetPosition: -newTranslate, side: isH ? 'left' : 'top' });\n return true;\n }\n wrapperEl.scrollTo({\n [isH ? 'left' : 'top']: -newTranslate,\n behavior: 'smooth',\n });\n }\n return true;\n }\n\n if (speed === 0) {\n swiper.setTransition(0);\n swiper.setTranslate(newTranslate);\n if (runCallbacks) {\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.emit('transitionEnd');\n }\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(newTranslate);\n if (runCallbacks) {\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.emit('transitionStart');\n }\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onTranslateToWrapperTransitionEnd) {\n swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) return;\n if (e.target !== this) return;\n swiper.$wrapperEl[0].removeEventListener(\n 'transitionend',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].removeEventListener(\n 'webkitTransitionEnd',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.onTranslateToWrapperTransitionEnd = null;\n delete swiper.onTranslateToWrapperTransitionEnd;\n if (runCallbacks) {\n swiper.emit('transitionEnd');\n }\n };\n }\n swiper.$wrapperEl[0].addEventListener(\n 'transitionend',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].addEventListener(\n 'webkitTransitionEnd',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n }\n }\n\n return true;\n}\n","import setTransition from './setTransition.js';\nimport transitionStart from './transitionStart.js';\nimport transitionEnd from './transitionEnd.js';\n\nexport default {\n setTransition,\n transitionStart,\n transitionEnd,\n};\n","export default function setTransition(duration, byController) {\n const swiper = this;\n\n if (!swiper.params.cssMode) {\n swiper.$wrapperEl.transition(duration);\n }\n\n swiper.emit('setTransition', duration, byController);\n}\n","import transitionEmit from './transitionEmit.js';\n\nexport default function transitionStart(runCallbacks = true, direction) {\n const swiper = this;\n const { params } = swiper;\n if (params.cssMode) return;\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n\n transitionEmit({ swiper, runCallbacks, direction, step: 'Start' });\n}\n","import transitionEmit from './transitionEmit.js';\n\nexport default function transitionEnd(runCallbacks = true, direction) {\n const swiper = this;\n const { params } = swiper;\n swiper.animating = false;\n if (params.cssMode) return;\n swiper.setTransition(0);\n\n transitionEmit({ swiper, runCallbacks, direction, step: 'End' });\n}\n","import slideTo from './slideTo.js';\nimport slideToLoop from './slideToLoop.js';\nimport slideNext from './slideNext.js';\nimport slidePrev from './slidePrev.js';\nimport slideReset from './slideReset.js';\nimport slideToClosest from './slideToClosest.js';\nimport slideToClickedSlide from './slideToClickedSlide.js';\n\nexport default {\n slideTo,\n slideToLoop,\n slideNext,\n slidePrev,\n slideReset,\n slideToClosest,\n slideToClickedSlide,\n};\n","import { animateCSSModeScroll } from '../../shared/utils.js';\n\nexport default function slideTo(\n index = 0,\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n initial,\n) {\n if (typeof index !== 'number' && typeof index !== 'string') {\n throw new Error(\n `The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`,\n );\n }\n\n if (typeof index === 'string') {\n /**\n * The `index` argument converted from `string` to `number`.\n * @type {number}\n */\n const indexAsNumber = parseInt(index, 10);\n\n /**\n * Determines whether the `index` argument is a valid `number`\n * after being converted from the `string` type.\n * @type {boolean}\n */\n const isValidNumber = isFinite(indexAsNumber);\n\n if (!isValidNumber) {\n throw new Error(\n `The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`,\n );\n }\n\n // Knowing that the converted `index` is a valid number,\n // we can update the original argument's value.\n index = indexAsNumber;\n }\n\n const swiper = this;\n let slideIndex = index;\n if (slideIndex < 0) slideIndex = 0;\n\n const {\n params,\n snapGrid,\n slidesGrid,\n previousIndex,\n activeIndex,\n rtlTranslate: rtl,\n wrapperEl,\n enabled,\n } = swiper;\n\n if (\n (swiper.animating && params.preventInteractionOnTransition) ||\n (!enabled && !internal && !initial)\n ) {\n return false;\n }\n\n const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);\n let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);\n if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n\n if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {\n swiper.emit('beforeSlideChangeStart');\n }\n\n const translate = -snapGrid[snapIndex];\n\n // Update progress\n swiper.updateProgress(translate);\n\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n for (let i = 0; i < slidesGrid.length; i += 1) {\n const normalizedTranslate = -Math.floor(translate * 100);\n const normalizedGrid = Math.floor(slidesGrid[i] * 100);\n const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (\n normalizedTranslate >= normalizedGrid &&\n normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2\n ) {\n slideIndex = i;\n } else if (\n normalizedTranslate >= normalizedGrid &&\n normalizedTranslate < normalizedGridNext\n ) {\n slideIndex = i + 1;\n }\n } else if (normalizedTranslate >= normalizedGrid) {\n slideIndex = i;\n }\n }\n }\n // Directions locks\n if (swiper.initialized && slideIndex !== activeIndex) {\n if (\n !swiper.allowSlideNext &&\n translate < swiper.translate &&\n translate < swiper.minTranslate()\n ) {\n return false;\n }\n if (\n !swiper.allowSlidePrev &&\n translate > swiper.translate &&\n translate > swiper.maxTranslate()\n ) {\n if ((activeIndex || 0) !== slideIndex) return false;\n }\n }\n\n let direction;\n if (slideIndex > activeIndex) direction = 'next';\n else if (slideIndex < activeIndex) direction = 'prev';\n else direction = 'reset';\n\n // Update Index\n if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {\n swiper.updateActiveIndex(slideIndex);\n // Update Height\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n swiper.updateSlidesClasses();\n if (params.effect !== 'slide') {\n swiper.setTranslate(translate);\n }\n if (direction !== 'reset') {\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n }\n return false;\n }\n if (params.cssMode) {\n const isH = swiper.isHorizontal();\n const t = rtl ? translate : -translate;\n if (speed === 0) {\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n if (isVirtual) {\n swiper.wrapperEl.style.scrollSnapType = 'none';\n swiper._immediateVirtual = true;\n }\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n if (isVirtual) {\n requestAnimationFrame(() => {\n swiper.wrapperEl.style.scrollSnapType = '';\n swiper._swiperImmediateVirtual = false;\n });\n }\n } else {\n if (!swiper.support.smoothScroll) {\n animateCSSModeScroll({ swiper, targetPosition: t, side: isH ? 'left' : 'top' });\n return true;\n }\n wrapperEl.scrollTo({\n [isH ? 'left' : 'top']: t,\n behavior: 'smooth',\n });\n }\n return true;\n }\n\n if (speed === 0) {\n swiper.setTransition(0);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onSlideToWrapperTransitionEnd) {\n swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) return;\n if (e.target !== this) return;\n swiper.$wrapperEl[0].removeEventListener(\n 'transitionend',\n swiper.onSlideToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].removeEventListener(\n 'webkitTransitionEnd',\n swiper.onSlideToWrapperTransitionEnd,\n );\n swiper.onSlideToWrapperTransitionEnd = null;\n delete swiper.onSlideToWrapperTransitionEnd;\n swiper.transitionEnd(runCallbacks, direction);\n };\n }\n swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n swiper.$wrapperEl[0].addEventListener(\n 'webkitTransitionEnd',\n swiper.onSlideToWrapperTransitionEnd,\n );\n }\n }\n\n return true;\n}\n","export default function slideToLoop(\n index = 0,\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n) {\n const swiper = this;\n let newIndex = index;\n if (swiper.params.loop) {\n newIndex += swiper.loopedSlides;\n }\n\n return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideNext(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n const { animating, enabled, params } = swiper;\n if (!enabled) return swiper;\n let perGroup = params.slidesPerGroup;\n if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);\n }\n const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;\n if (params.loop) {\n if (animating && params.loopPreventsSlide) return false;\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n }\n return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slidePrev(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n const { params, animating, snapGrid, slidesGrid, rtlTranslate, enabled } = swiper;\n if (!enabled) return swiper;\n\n if (params.loop) {\n if (animating && params.loopPreventsSlide) return false;\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n }\n const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n\n function normalize(val) {\n if (val < 0) return -Math.floor(Math.abs(val));\n return Math.floor(val);\n }\n const normalizedTranslate = normalize(translate);\n const normalizedSnapGrid = snapGrid.map((val) => normalize(val));\n\n let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n if (typeof prevSnap === 'undefined' && params.cssMode) {\n let prevSnapIndex;\n snapGrid.forEach((snap, snapIndex) => {\n if (normalizedTranslate >= snap) {\n // prevSnap = snap;\n prevSnapIndex = snapIndex;\n }\n });\n if (typeof prevSnapIndex !== 'undefined') {\n prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];\n }\n }\n let prevIndex = 0;\n if (typeof prevSnap !== 'undefined') {\n prevIndex = slidesGrid.indexOf(prevSnap);\n if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;\n if (\n params.slidesPerView === 'auto' &&\n params.slidesPerGroup === 1 &&\n params.slidesPerGroupAuto\n ) {\n prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n prevIndex = Math.max(prevIndex, 0);\n }\n }\n return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideReset(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideToClosest(\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n threshold = 0.5,\n) {\n const swiper = this;\n let index = swiper.activeIndex;\n const skip = Math.min(swiper.params.slidesPerGroupSkip, index);\n const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);\n\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\n if (translate >= swiper.snapGrid[snapIndex]) {\n // The current translate is on or after the current snap index, so the choice\n // is between the current index and the one after it.\n const currentSnap = swiper.snapGrid[snapIndex];\n const nextSnap = swiper.snapGrid[snapIndex + 1];\n if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {\n index += swiper.params.slidesPerGroup;\n }\n } else {\n // The current translate is before the current snap index, so the choice\n // is between the current index and the one before it.\n const prevSnap = swiper.snapGrid[snapIndex - 1];\n const currentSnap = swiper.snapGrid[snapIndex];\n if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {\n index -= swiper.params.slidesPerGroup;\n }\n }\n index = Math.max(index, 0);\n index = Math.min(index, swiper.slidesGrid.length - 1);\n\n return swiper.slideTo(index, speed, runCallbacks, internal);\n}\n","import $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function slideToClickedSlide() {\n const swiper = this;\n const { params, $wrapperEl } = swiper;\n\n const slidesPerView =\n params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n let slideToIndex = swiper.clickedIndex;\n let realIndex;\n if (params.loop) {\n if (swiper.animating) return;\n realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n if (params.centeredSlides) {\n if (\n slideToIndex < swiper.loopedSlides - slidesPerView / 2 ||\n slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2\n ) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children(\n `.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`,\n )\n .eq(0)\n .index();\n\n nextTick(() => {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children(\n `.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`,\n )\n .eq(0)\n .index();\n\n nextTick(() => {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else {\n swiper.slideTo(slideToIndex);\n }\n}\n","import loopCreate from './loopCreate.js';\nimport loopFix from './loopFix.js';\nimport loopDestroy from './loopDestroy.js';\n\nexport default {\n loopCreate,\n loopFix,\n loopDestroy,\n};\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function loopCreate() {\n const swiper = this;\n const document = getDocument();\n const { params, $wrapperEl } = swiper;\n // Remove duplicated slides\n $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove();\n\n let slides = $wrapperEl.children(`.${params.slideClass}`);\n\n if (params.loopFillGroupWithBlank) {\n const blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);\n if (blankSlidesNum !== params.slidesPerGroup) {\n for (let i = 0; i < blankSlidesNum; i += 1) {\n const blankNode = $(document.createElement('div')).addClass(\n `${params.slideClass} ${params.slideBlankClass}`,\n );\n $wrapperEl.append(blankNode);\n }\n slides = $wrapperEl.children(`.${params.slideClass}`);\n }\n }\n\n if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length;\n\n swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));\n swiper.loopedSlides += params.loopAdditionalSlides;\n if (swiper.loopedSlides > slides.length) {\n swiper.loopedSlides = slides.length;\n }\n\n const prependSlides = [];\n const appendSlides = [];\n slides.each((el, index) => {\n const slide = $(el);\n if (index < swiper.loopedSlides) {\n appendSlides.push(el);\n }\n if (index < slides.length && index >= slides.length - swiper.loopedSlides) {\n prependSlides.push(el);\n }\n slide.attr('data-swiper-slide-index', index);\n });\n for (let i = 0; i < appendSlides.length; i += 1) {\n $wrapperEl.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n for (let i = prependSlides.length - 1; i >= 0; i -= 1) {\n $wrapperEl.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n}\n","export default function loopFix() {\n const swiper = this;\n\n swiper.emit('beforeLoopFix');\n\n const {\n activeIndex,\n slides,\n loopedSlides,\n allowSlidePrev,\n allowSlideNext,\n snapGrid,\n rtlTranslate: rtl,\n } = swiper;\n let newIndex;\n swiper.allowSlidePrev = true;\n swiper.allowSlideNext = true;\n\n const snapTranslate = -snapGrid[activeIndex];\n const diff = snapTranslate - swiper.getTranslate();\n\n // Fix For Negative Oversliding\n if (activeIndex < loopedSlides) {\n newIndex = slides.length - loopedSlides * 3 + activeIndex;\n newIndex += loopedSlides;\n const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n } else if (activeIndex >= slides.length - loopedSlides) {\n // Fix For Positive Oversliding\n newIndex = -slides.length + activeIndex + loopedSlides;\n newIndex += loopedSlides;\n const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n }\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n\n swiper.emit('loopFix');\n}\n","export default function loopDestroy() {\n const swiper = this;\n const { $wrapperEl, params, slides } = swiper;\n $wrapperEl\n .children(\n `.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`,\n )\n .remove();\n slides.removeAttr('data-swiper-slide-index');\n}\n","import setGrabCursor from './setGrabCursor.js';\nimport unsetGrabCursor from './unsetGrabCursor.js';\n\nexport default {\n setGrabCursor,\n unsetGrabCursor,\n};\n","export default function setGrabCursor(moving) {\n const swiper = this;\n if (\n swiper.support.touch ||\n !swiper.params.simulateTouch ||\n (swiper.params.watchOverflow && swiper.isLocked) ||\n swiper.params.cssMode\n )\n return;\n const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n el.style.cursor = 'move';\n el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n el.style.cursor = moving ? 'grabbing' : 'grab';\n}\n","export default function unsetGrabCursor() {\n const swiper = this;\n if (\n swiper.support.touch ||\n (swiper.params.watchOverflow && swiper.isLocked) ||\n swiper.params.cssMode\n ) {\n return;\n }\n swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n}\n","import setBreakpoint from './setBreakpoint.js';\nimport getBreakpoint from './getBreakpoint.js';\n\nexport default { setBreakpoint, getBreakpoint };\n","import { getWindow } from 'ssr-window';\n\nexport default function getBreakpoint(breakpoints, base = 'window', containerEl) {\n if (!breakpoints || (base === 'container' && !containerEl)) return undefined;\n let breakpoint = false;\n\n const window = getWindow();\n const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n\n const points = Object.keys(breakpoints).map((point) => {\n if (typeof point === 'string' && point.indexOf('@') === 0) {\n const minRatio = parseFloat(point.substr(1));\n const value = currentHeight * minRatio;\n return { value, point };\n }\n return { value: point, point };\n });\n\n points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));\n for (let i = 0; i < points.length; i += 1) {\n const { point, value } = points[i];\n if (base === 'window') {\n if (window.matchMedia(`(min-width: ${value}px)`).matches) {\n breakpoint = point;\n }\n } else if (value <= containerEl.clientWidth) {\n breakpoint = point;\n }\n }\n return breakpoint || 'max';\n}\n","function checkOverflow() {\n const swiper = this;\n const { isLocked: wasLocked, params } = swiper;\n const { slidesOffsetBefore } = params;\n\n if (slidesOffsetBefore) {\n const lastSlideIndex = swiper.slides.length - 1;\n const lastSlideRightEdge =\n swiper.slidesGrid[lastSlideIndex] +\n swiper.slidesSizesGrid[lastSlideIndex] +\n slidesOffsetBefore * 2;\n swiper.isLocked = swiper.size > lastSlideRightEdge;\n } else {\n swiper.isLocked = swiper.snapGrid.length === 1;\n }\n if (params.allowSlideNext === true) {\n swiper.allowSlideNext = !swiper.isLocked;\n }\n if (params.allowSlidePrev === true) {\n swiper.allowSlidePrev = !swiper.isLocked;\n }\n\n if (wasLocked && wasLocked !== swiper.isLocked) {\n swiper.isEnd = false;\n }\n if (wasLocked !== swiper.isLocked) {\n swiper.emit(swiper.isLocked ? 'lock' : 'unlock');\n }\n}\n\nexport default { checkOverflow };\n","import addClasses from './addClasses.js';\nimport removeClasses from './removeClasses.js';\n\nexport default { addClasses, removeClasses };\n","function prepareClasses(entries, prefix) {\n const resultClasses = [];\n entries.forEach((item) => {\n if (typeof item === 'object') {\n Object.keys(item).forEach((classNames) => {\n if (item[classNames]) {\n resultClasses.push(prefix + classNames);\n }\n });\n } else if (typeof item === 'string') {\n resultClasses.push(prefix + item);\n }\n });\n return resultClasses;\n}\n\nexport default function addClasses() {\n const swiper = this;\n const { classNames, params, rtl, $el, device, support } = swiper;\n // prettier-ignore\n const suffixes = prepareClasses([\n 'initialized',\n params.direction,\n { 'pointer-events': !support.touch },\n { 'free-mode': swiper.params.freeMode && params.freeMode.enabled },\n { 'autoheight': params.autoHeight },\n { 'rtl': rtl },\n { 'grid': params.grid && params.grid.rows > 1 },\n { 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column' },\n { 'android': device.android },\n { 'ios': device.ios },\n { 'css-mode': params.cssMode },\n { 'centered': params.cssMode && params.centeredSlides },\n ], params.containerModifierClass);\n classNames.push(...suffixes);\n $el.addClass([...classNames].join(' '));\n swiper.emitContainerClasses();\n}\n","export default function removeClasses() {\n const swiper = this;\n const { $el, classNames } = swiper;\n\n $el.removeClass(classNames.join(' '));\n swiper.emitContainerClasses();\n}\n","import loadImage from './loadImage.js';\nimport preloadImages from './preloadImages.js';\n\nexport default {\n loadImage,\n preloadImages,\n};\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) {\n const window = getWindow();\n let image;\n function onReady() {\n if (callback) callback();\n }\n const isPicture = $(imageEl).parent('picture')[0];\n\n if (!isPicture && (!imageEl.complete || !checkForComplete)) {\n if (src) {\n image = new window.Image();\n image.onload = onReady;\n image.onerror = onReady;\n if (sizes) {\n image.sizes = sizes;\n }\n if (srcset) {\n image.srcset = srcset;\n }\n if (src) {\n image.src = src;\n }\n } else {\n onReady();\n }\n } else {\n // image already loaded...\n onReady();\n }\n}\n","export default function preloadImages() {\n const swiper = this;\n swiper.imagesToLoad = swiper.$el.find('img');\n function onReady() {\n if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return;\n if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1;\n if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n if (swiper.params.updateOnImagesReady) swiper.update();\n swiper.emit('imagesReady');\n }\n }\n for (let i = 0; i < swiper.imagesToLoad.length; i += 1) {\n const imageEl = swiper.imagesToLoad[i];\n swiper.loadImage(\n imageEl,\n imageEl.currentSrc || imageEl.getAttribute('src'),\n imageEl.srcset || imageEl.getAttribute('srcset'),\n imageEl.sizes || imageEl.getAttribute('sizes'),\n true,\n onReady,\n );\n }\n}\n","import { getDocument } from 'ssr-window';\n\nexport default function createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n const document = getDocument();\n if (swiper.params.createElements) {\n Object.keys(checkProps).forEach((key) => {\n if (!params[key] && params.auto === true) {\n let element = swiper.$el.children(`.${checkProps[key]}`)[0];\n if (!element) {\n element = document.createElement('div');\n element.className = checkProps[key];\n swiper.$el.append(element);\n }\n params[key] = element;\n originalParams[key] = element;\n }\n });\n }\n return params;\n}\n","export default function classesToSelector(classes = '') {\n return `.${classes\n .trim()\n .replace(/([\\.:!\\/])/g, '\\\\$1') // eslint-disable-line\n .replace(/ /g, '.')}`;\n}\n","export default function appendSlide(slides) {\n const swiper = this;\n const { $wrapperEl, params } = swiper;\n if (params.loop) {\n swiper.loopDestroy();\n }\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.append(slides[i]);\n }\n } else {\n $wrapperEl.append(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n}\n","export default function prependSlide(slides) {\n const swiper = this;\n const { params, $wrapperEl, activeIndex } = swiper;\n\n if (params.loop) {\n swiper.loopDestroy();\n }\n let newActiveIndex = activeIndex + 1;\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.prepend(slides[i]);\n }\n newActiveIndex = activeIndex + slides.length;\n } else {\n $wrapperEl.prepend(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n swiper.slideTo(newActiveIndex, 0, false);\n}\n","export default function addSlide(index, slides) {\n const swiper = this;\n const { $wrapperEl, params, activeIndex } = swiper;\n let activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n }\n const baseLength = swiper.slides.length;\n if (index <= 0) {\n swiper.prependSlide(slides);\n return;\n }\n if (index >= baseLength) {\n swiper.appendSlide(slides);\n return;\n }\n let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;\n\n const slidesBuffer = [];\n for (let i = baseLength - 1; i >= index; i -= 1) {\n const currentSlide = swiper.slides.eq(i);\n currentSlide.remove();\n slidesBuffer.unshift(currentSlide);\n }\n\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.append(slides[i]);\n }\n newActiveIndex =\n activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;\n } else {\n $wrapperEl.append(slides);\n }\n\n for (let i = 0; i < slidesBuffer.length; i += 1) {\n $wrapperEl.append(slidesBuffer[i]);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n}\n","export default function removeSlide(slidesIndexes) {\n const swiper = this;\n const { params, $wrapperEl, activeIndex } = swiper;\n\n let activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n }\n let newActiveIndex = activeIndexBuffer;\n let indexToRemove;\n\n if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n for (let i = 0; i < slidesIndexes.length; i += 1) {\n indexToRemove = slidesIndexes[i];\n if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n }\n newActiveIndex = Math.max(newActiveIndex, 0);\n } else {\n indexToRemove = slidesIndexes;\n if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n newActiveIndex = Math.max(newActiveIndex, 0);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n\n if (!params.observer) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n}\n","export default function removeAllSlides() {\n const swiper = this;\n\n const slidesIndexes = [];\n for (let i = 0; i < swiper.slides.length; i += 1) {\n slidesIndexes.push(i);\n }\n swiper.removeSlide(slidesIndexes);\n}\n","export default function effectInit(params) {\n const { effect, swiper, on, setTranslate, setTransition, overwriteParams, perspective } = params;\n\n on('beforeInit', () => {\n if (swiper.params.effect !== effect) return;\n swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`);\n if (perspective && perspective()) {\n swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);\n }\n\n const overwriteParamsResult = overwriteParams ? overwriteParams() : {};\n\n Object.assign(swiper.params, overwriteParamsResult);\n Object.assign(swiper.originalParams, overwriteParamsResult);\n });\n on('setTranslate', () => {\n if (swiper.params.effect !== effect) return;\n setTranslate();\n });\n on('setTransition', (_s, duration) => {\n if (swiper.params.effect !== effect) return;\n setTransition(duration);\n });\n}\n","export default function effectTarget(effectParams, $slideEl) {\n if (effectParams.transformEl) {\n return $slideEl.find(effectParams.transformEl).css({\n 'backface-visibility': 'hidden',\n '-webkit-backface-visibility': 'hidden',\n });\n }\n return $slideEl;\n}\n","export default function effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides }) {\n const { slides, activeIndex, $wrapperEl } = swiper;\n if (swiper.params.virtualTranslate && duration !== 0) {\n let eventTriggered = false;\n let $transitionEndTarget;\n if (allSlides) {\n $transitionEndTarget = transformEl ? slides.find(transformEl) : slides;\n } else {\n $transitionEndTarget = transformEl\n ? slides.eq(activeIndex).find(transformEl)\n : slides.eq(activeIndex);\n }\n $transitionEndTarget.transitionEnd(() => {\n if (eventTriggered) return;\n if (!swiper || swiper.destroyed) return;\n eventTriggered = true;\n swiper.animating = false;\n const triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n for (let i = 0; i < triggerEvents.length; i += 1) {\n $wrapperEl.trigger(triggerEvents[i]);\n }\n });\n }\n}\n","import $ from './dom.js';\n\nexport default function createShadow(params, $slideEl, side) {\n const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}`;\n const $shadowContainer = params.transformEl ? $slideEl.find(params.transformEl) : $slideEl;\n let $shadowEl = $shadowContainer.children(`.${shadowClass}`);\n\n if (!$shadowEl.length) {\n $shadowEl = $(`
      `);\n $shadowContainer.append($shadowEl);\n }\n return $shadowEl;\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function Resize({ swiper, on, emit }) {\n const window = getWindow();\n let observer = null;\n\n const resizeHandler = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n emit('beforeResize');\n emit('resize');\n };\n\n const createObserver = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n observer = new ResizeObserver((entries) => {\n const { width, height } = swiper;\n let newWidth = width;\n let newHeight = height;\n entries.forEach(({ contentBoxSize, contentRect, target }) => {\n if (target && target !== swiper.el) return;\n newWidth = contentRect\n ? contentRect.width\n : (contentBoxSize[0] || contentBoxSize).inlineSize;\n newHeight = contentRect\n ? contentRect.height\n : (contentBoxSize[0] || contentBoxSize).blockSize;\n });\n if (newWidth !== width || newHeight !== height) {\n resizeHandler();\n }\n });\n observer.observe(swiper.el);\n };\n\n const removeObserver = () => {\n if (observer && observer.unobserve && swiper.el) {\n observer.unobserve(swiper.el);\n observer = null;\n }\n };\n\n const orientationChangeHandler = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n emit('orientationchange');\n };\n\n on('init', () => {\n if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {\n createObserver();\n return;\n }\n window.addEventListener('resize', resizeHandler);\n window.addEventListener('orientationchange', orientationChangeHandler);\n });\n\n on('destroy', () => {\n removeObserver();\n window.removeEventListener('resize', resizeHandler);\n window.removeEventListener('orientationchange', orientationChangeHandler);\n });\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function Observer({ swiper, extendParams, on, emit }) {\n const observers = [];\n const window = getWindow();\n const attach = (target, options = {}) => {\n const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n const observer = new ObserverFunc((mutations) => {\n // The observerUpdate event should only be triggered\n // once despite the number of mutations. Additional\n // triggers are redundant and are very costly\n if (mutations.length === 1) {\n emit('observerUpdate', mutations[0]);\n return;\n }\n const observerUpdate = function observerUpdate() {\n emit('observerUpdate', mutations[0]);\n };\n\n if (window.requestAnimationFrame) {\n window.requestAnimationFrame(observerUpdate);\n } else {\n window.setTimeout(observerUpdate, 0);\n }\n });\n\n observer.observe(target, {\n attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n childList: typeof options.childList === 'undefined' ? true : options.childList,\n characterData: typeof options.characterData === 'undefined' ? true : options.characterData,\n });\n\n observers.push(observer);\n };\n const init = () => {\n if (!swiper.params.observer) return;\n if (swiper.params.observeParents) {\n const containerParents = swiper.$el.parents();\n for (let i = 0; i < containerParents.length; i += 1) {\n attach(containerParents[i]);\n }\n }\n // Observe container\n attach(swiper.$el[0], {\n childList: swiper.params.observeSlideChildren,\n });\n\n // Observe wrapper\n attach(swiper.$wrapperEl[0], { attributes: false });\n };\n const destroy = () => {\n observers.forEach((observer) => {\n observer.disconnect();\n });\n observers.splice(0, observers.length);\n };\n\n extendParams({\n observer: false,\n observeParents: false,\n observeSlideChildren: false,\n });\n on('init', init);\n on('destroy', destroy);\n}\n","// Swiper Class\nimport Swiper from './core/core.js';\n\n//IMPORT_MODULES\n\nconst modules = [\n //INSTALL_MODULES\n];\n\nSwiper.use(modules);\n\n//EXPORT\n","import $ from '../../shared/dom.js';\nimport { setCSSProperty } from '../../shared/utils.js';\n\nexport default function Virtual({ swiper, extendParams, on }) {\n extendParams({\n virtual: {\n enabled: false,\n slides: [],\n cache: true,\n renderSlide: null,\n renderExternal: null,\n renderExternalUpdate: true,\n addSlidesBefore: 0,\n addSlidesAfter: 0,\n },\n });\n\n let cssModeTimeout;\n\n swiper.virtual = {\n cache: {},\n from: undefined,\n to: undefined,\n slides: [],\n offset: 0,\n slidesGrid: [],\n };\n\n function renderSlide(slide, index) {\n const params = swiper.params.virtual;\n if (params.cache && swiper.virtual.cache[index]) {\n return swiper.virtual.cache[index];\n }\n const $slideEl = params.renderSlide\n ? $(params.renderSlide.call(swiper, slide, index))\n : $(\n `
      ${slide}
      `,\n );\n if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index);\n if (params.cache) swiper.virtual.cache[index] = $slideEl;\n return $slideEl;\n }\n\n function update(force) {\n const { slidesPerView, slidesPerGroup, centeredSlides } = swiper.params;\n const { addSlidesBefore, addSlidesAfter } = swiper.params.virtual;\n const {\n from: previousFrom,\n to: previousTo,\n slides,\n slidesGrid: previousSlidesGrid,\n offset: previousOffset,\n } = swiper.virtual;\n if (!swiper.params.cssMode) {\n swiper.updateActiveIndex();\n }\n\n const activeIndex = swiper.activeIndex || 0;\n\n let offsetProp;\n if (swiper.rtlTranslate) offsetProp = 'right';\n else offsetProp = swiper.isHorizontal() ? 'left' : 'top';\n\n let slidesAfter;\n let slidesBefore;\n if (centeredSlides) {\n slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;\n slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;\n } else {\n slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;\n slidesBefore = slidesPerGroup + addSlidesBefore;\n }\n const from = Math.max((activeIndex || 0) - slidesBefore, 0);\n const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);\n const offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n\n Object.assign(swiper.virtual, {\n from,\n to,\n offset,\n slidesGrid: swiper.slidesGrid,\n });\n\n function onRendered() {\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n if (swiper.lazy && swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n }\n\n if (previousFrom === from && previousTo === to && !force) {\n if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n swiper.slides.css(offsetProp, `${offset}px`);\n }\n swiper.updateProgress();\n return;\n }\n if (swiper.params.virtual.renderExternal) {\n swiper.params.virtual.renderExternal.call(swiper, {\n offset,\n from,\n to,\n slides: (function getSlides() {\n const slidesToRender = [];\n for (let i = from; i <= to; i += 1) {\n slidesToRender.push(slides[i]);\n }\n return slidesToRender;\n })(),\n });\n if (swiper.params.virtual.renderExternalUpdate) {\n onRendered();\n }\n return;\n }\n const prependIndexes = [];\n const appendIndexes = [];\n if (force) {\n swiper.$wrapperEl.find(`.${swiper.params.slideClass}`).remove();\n } else {\n for (let i = previousFrom; i <= previousTo; i += 1) {\n if (i < from || i > to) {\n swiper.$wrapperEl\n .find(`.${swiper.params.slideClass}[data-swiper-slide-index=\"${i}\"]`)\n .remove();\n }\n }\n }\n for (let i = 0; i < slides.length; i += 1) {\n if (i >= from && i <= to) {\n if (typeof previousTo === 'undefined' || force) {\n appendIndexes.push(i);\n } else {\n if (i > previousTo) appendIndexes.push(i);\n if (i < previousFrom) prependIndexes.push(i);\n }\n }\n }\n appendIndexes.forEach((index) => {\n swiper.$wrapperEl.append(renderSlide(slides[index], index));\n });\n prependIndexes\n .sort((a, b) => b - a)\n .forEach((index) => {\n swiper.$wrapperEl.prepend(renderSlide(slides[index], index));\n });\n swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, `${offset}px`);\n onRendered();\n }\n\n function appendSlide(slides) {\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) swiper.virtual.slides.push(slides[i]);\n }\n } else {\n swiper.virtual.slides.push(slides);\n }\n update(true);\n }\n function prependSlide(slides) {\n const activeIndex = swiper.activeIndex;\n let newActiveIndex = activeIndex + 1;\n let numberOfNewSlides = 1;\n\n if (Array.isArray(slides)) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) swiper.virtual.slides.unshift(slides[i]);\n }\n newActiveIndex = activeIndex + slides.length;\n numberOfNewSlides = slides.length;\n } else {\n swiper.virtual.slides.unshift(slides);\n }\n if (swiper.params.virtual.cache) {\n const cache = swiper.virtual.cache;\n const newCache = {};\n Object.keys(cache).forEach((cachedIndex) => {\n const $cachedEl = cache[cachedIndex];\n const cachedElIndex = $cachedEl.attr('data-swiper-slide-index');\n if (cachedElIndex) {\n $cachedEl.attr(\n 'data-swiper-slide-index',\n parseInt(cachedElIndex, 10) + numberOfNewSlides,\n );\n }\n newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl;\n });\n swiper.virtual.cache = newCache;\n }\n update(true);\n swiper.slideTo(newActiveIndex, 0);\n }\n function removeSlide(slidesIndexes) {\n if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;\n let activeIndex = swiper.activeIndex;\n if (Array.isArray(slidesIndexes)) {\n for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) {\n swiper.virtual.slides.splice(slidesIndexes[i], 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes[i]];\n }\n if (slidesIndexes[i] < activeIndex) activeIndex -= 1;\n activeIndex = Math.max(activeIndex, 0);\n }\n } else {\n swiper.virtual.slides.splice(slidesIndexes, 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes];\n }\n if (slidesIndexes < activeIndex) activeIndex -= 1;\n activeIndex = Math.max(activeIndex, 0);\n }\n update(true);\n swiper.slideTo(activeIndex, 0);\n }\n function removeAllSlides() {\n swiper.virtual.slides = [];\n if (swiper.params.virtual.cache) {\n swiper.virtual.cache = {};\n }\n update(true);\n swiper.slideTo(0, 0);\n }\n\n on('beforeInit', () => {\n if (!swiper.params.virtual.enabled) return;\n swiper.virtual.slides = swiper.params.virtual.slides;\n swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);\n\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n\n if (!swiper.params.initialSlide) {\n update();\n }\n });\n on('setTranslate', () => {\n if (!swiper.params.virtual.enabled) return;\n if (swiper.params.cssMode && !swiper._immediateVirtual) {\n clearTimeout(cssModeTimeout);\n cssModeTimeout = setTimeout(() => {\n update();\n }, 100);\n } else {\n update();\n }\n });\n on('init update resize', () => {\n if (!swiper.params.virtual.enabled) return;\n if (swiper.params.cssMode) {\n setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`);\n }\n });\n\n Object.assign(swiper.virtual, {\n appendSlide,\n prependSlide,\n removeSlide,\n removeAllSlides,\n update,\n });\n}\n","/* eslint-disable consistent-return */\nimport { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function Keyboard({ swiper, extendParams, on, emit }) {\n const document = getDocument();\n const window = getWindow();\n swiper.keyboard = {\n enabled: false,\n };\n extendParams({\n keyboard: {\n enabled: false,\n onlyInViewport: true,\n pageUpDown: true,\n },\n });\n\n function handle(event) {\n if (!swiper.enabled) return;\n\n const { rtlTranslate: rtl } = swiper;\n let e = event;\n if (e.originalEvent) e = e.originalEvent; // jquery fix\n const kc = e.keyCode || e.charCode;\n const pageUpDown = swiper.params.keyboard.pageUpDown;\n const isPageUp = pageUpDown && kc === 33;\n const isPageDown = pageUpDown && kc === 34;\n const isArrowLeft = kc === 37;\n const isArrowRight = kc === 39;\n const isArrowUp = kc === 38;\n const isArrowDown = kc === 40;\n // Directions locks\n if (\n !swiper.allowSlideNext &&\n ((swiper.isHorizontal() && isArrowRight) ||\n (swiper.isVertical() && isArrowDown) ||\n isPageDown)\n ) {\n return false;\n }\n if (\n !swiper.allowSlidePrev &&\n ((swiper.isHorizontal() && isArrowLeft) || (swiper.isVertical() && isArrowUp) || isPageUp)\n ) {\n return false;\n }\n if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n return undefined;\n }\n if (\n document.activeElement &&\n document.activeElement.nodeName &&\n (document.activeElement.nodeName.toLowerCase() === 'input' ||\n document.activeElement.nodeName.toLowerCase() === 'textarea')\n ) {\n return undefined;\n }\n if (\n swiper.params.keyboard.onlyInViewport &&\n (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)\n ) {\n let inView = false;\n // Check that swiper should be inside of visible area of window\n if (\n swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 &&\n swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0\n ) {\n return undefined;\n }\n\n const $el = swiper.$el;\n const swiperWidth = $el[0].clientWidth;\n const swiperHeight = $el[0].clientHeight;\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const swiperOffset = swiper.$el.offset();\n if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n const swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiperWidth, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiperHeight],\n [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight],\n ];\n for (let i = 0; i < swiperCoord.length; i += 1) {\n const point = swiperCoord[i];\n if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {\n if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n inView = true;\n }\n }\n if (!inView) return undefined;\n }\n if (swiper.isHorizontal()) {\n if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n }\n if (((isPageDown || isArrowRight) && !rtl) || ((isPageUp || isArrowLeft) && rtl))\n swiper.slideNext();\n if (((isPageUp || isArrowLeft) && !rtl) || ((isPageDown || isArrowRight) && rtl))\n swiper.slidePrev();\n } else {\n if (isPageUp || isPageDown || isArrowUp || isArrowDown) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n }\n if (isPageDown || isArrowDown) swiper.slideNext();\n if (isPageUp || isArrowUp) swiper.slidePrev();\n }\n emit('keyPress', kc);\n return undefined;\n }\n function enable() {\n if (swiper.keyboard.enabled) return;\n $(document).on('keydown', handle);\n swiper.keyboard.enabled = true;\n }\n function disable() {\n if (!swiper.keyboard.enabled) return;\n $(document).off('keydown', handle);\n swiper.keyboard.enabled = false;\n }\n\n on('init', () => {\n if (swiper.params.keyboard.enabled) {\n enable();\n }\n });\n on('destroy', () => {\n if (swiper.keyboard.enabled) {\n disable();\n }\n });\n\n Object.assign(swiper.keyboard, {\n enable,\n disable,\n });\n}\n","/* eslint-disable consistent-return */\nimport { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now, nextTick } from '../../shared/utils.js';\n\nexport default function Mousewheel({ swiper, extendParams, on, emit }) {\n const window = getWindow();\n\n extendParams({\n mousewheel: {\n enabled: false,\n releaseOnEdges: false,\n invert: false,\n forceToAxis: false,\n sensitivity: 1,\n eventsTarget: 'container',\n thresholdDelta: null,\n thresholdTime: null,\n },\n });\n\n swiper.mousewheel = {\n enabled: false,\n };\n\n let timeout;\n let lastScrollTime = now();\n let lastEventBeforeSnap;\n const recentWheelEvents = [];\n\n function normalize(e) {\n // Reasonable defaults\n const PIXEL_STEP = 10;\n const LINE_HEIGHT = 40;\n const PAGE_HEIGHT = 800;\n\n let sX = 0;\n let sY = 0; // spinX, spinY\n let pX = 0;\n let pY = 0; // pixelX, pixelY\n\n // Legacy\n if ('detail' in e) {\n sY = e.detail;\n }\n if ('wheelDelta' in e) {\n sY = -e.wheelDelta / 120;\n }\n if ('wheelDeltaY' in e) {\n sY = -e.wheelDeltaY / 120;\n }\n if ('wheelDeltaX' in e) {\n sX = -e.wheelDeltaX / 120;\n }\n\n // side scrolling on FF with DOMMouseScroll\n if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n sX = sY;\n sY = 0;\n }\n\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n\n if ('deltaY' in e) {\n pY = e.deltaY;\n }\n if ('deltaX' in e) {\n pX = e.deltaX;\n }\n\n if (e.shiftKey && !pX) {\n // if user scrolls with shift he wants horizontal scroll\n pX = pY;\n pY = 0;\n }\n\n if ((pX || pY) && e.deltaMode) {\n if (e.deltaMode === 1) {\n // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n } else {\n // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n }\n\n // Fall-back if spin cannot be determined\n if (pX && !sX) {\n sX = pX < 1 ? -1 : 1;\n }\n if (pY && !sY) {\n sY = pY < 1 ? -1 : 1;\n }\n\n return {\n spinX: sX,\n spinY: sY,\n pixelX: pX,\n pixelY: pY,\n };\n }\n function handleMouseEnter() {\n if (!swiper.enabled) return;\n swiper.mouseEntered = true;\n }\n function handleMouseLeave() {\n if (!swiper.enabled) return;\n swiper.mouseEntered = false;\n }\n function animateSlider(newEvent) {\n if (\n swiper.params.mousewheel.thresholdDelta &&\n newEvent.delta < swiper.params.mousewheel.thresholdDelta\n ) {\n // Prevent if delta of wheel scroll delta is below configured threshold\n return false;\n }\n\n if (\n swiper.params.mousewheel.thresholdTime &&\n now() - lastScrollTime < swiper.params.mousewheel.thresholdTime\n ) {\n // Prevent if time between scrolls is below configured threshold\n return false;\n }\n\n // If the movement is NOT big enough and\n // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):\n // Don't go any further (avoid insignificant scroll movement).\n if (newEvent.delta >= 6 && now() - lastScrollTime < 60) {\n // Return false as a default\n return true;\n }\n // If user is scrolling towards the end:\n // If the slider hasn't hit the latest slide or\n // if the slider is a loop and\n // if the slider isn't moving right now:\n // Go to next slide and\n // emit a scroll event.\n // Else (the user is scrolling towards the beginning) and\n // if the slider hasn't hit the first slide or\n // if the slider is a loop and\n // if the slider isn't moving right now:\n // Go to prev slide and\n // emit a scroll event.\n if (newEvent.direction < 0) {\n if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n swiper.slideNext();\n emit('scroll', newEvent.raw);\n }\n } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n swiper.slidePrev();\n emit('scroll', newEvent.raw);\n }\n // If you got here is because an animation has been triggered so store the current time\n lastScrollTime = new window.Date().getTime();\n // Return false as a default\n return false;\n }\n function releaseScroll(newEvent) {\n const params = swiper.params.mousewheel;\n if (newEvent.direction < 0) {\n if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {\n // Return true to animate scroll on edges\n return true;\n }\n } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {\n // Return true to animate scroll on edges\n return true;\n }\n return false;\n }\n function handle(event) {\n let e = event;\n let disableParentSwiper = true;\n if (!swiper.enabled) return;\n const params = swiper.params.mousewheel;\n\n if (swiper.params.cssMode) {\n e.preventDefault();\n }\n\n let target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarget !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarget);\n }\n if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges)\n return true;\n\n if (e.originalEvent) e = e.originalEvent; // jquery fix\n let delta = 0;\n const rtlFactor = swiper.rtlTranslate ? -1 : 1;\n\n const data = normalize(e);\n\n if (params.forceToAxis) {\n if (swiper.isHorizontal()) {\n if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;\n else return true;\n } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;\n else return true;\n } else {\n delta =\n Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n }\n\n if (delta === 0) return true;\n\n if (params.invert) delta = -delta;\n\n // Get the scroll positions\n let positions = swiper.getTranslate() + delta * params.sensitivity;\n\n if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();\n if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate();\n\n // When loop is true:\n // the disableParentSwiper will be true.\n // When loop is false:\n // if the scroll positions is not on edge,\n // then the disableParentSwiper will be true.\n // if the scroll on edge positions,\n // then the disableParentSwiper will be false.\n disableParentSwiper = swiper.params.loop\n ? true\n : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());\n\n if (disableParentSwiper && swiper.params.nested) e.stopPropagation();\n\n if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {\n // Register the new event in a variable which stores the relevant data\n const newEvent = {\n time: now(),\n delta: Math.abs(delta),\n direction: Math.sign(delta),\n raw: event,\n };\n\n // Keep the most recent events\n if (recentWheelEvents.length >= 2) {\n recentWheelEvents.shift(); // only store the last N events\n }\n const prevEvent = recentWheelEvents.length\n ? recentWheelEvents[recentWheelEvents.length - 1]\n : undefined;\n recentWheelEvents.push(newEvent);\n\n // If there is at least one previous recorded event:\n // If direction has changed or\n // if the scroll is quicker than the previous one:\n // Animate the slider.\n // Else (this is the first time the wheel is moved):\n // Animate the slider.\n if (prevEvent) {\n if (\n newEvent.direction !== prevEvent.direction ||\n newEvent.delta > prevEvent.delta ||\n newEvent.time > prevEvent.time + 150\n ) {\n animateSlider(newEvent);\n }\n } else {\n animateSlider(newEvent);\n }\n\n // If it's time to release the scroll:\n // Return now so you don't hit the preventDefault.\n if (releaseScroll(newEvent)) {\n return true;\n }\n } else {\n // Freemode or scrollContainer:\n\n // If we recently snapped after a momentum scroll, then ignore wheel events\n // to give time for the deceleration to finish. Stop ignoring after 500 msecs\n // or if it's a new scroll (larger delta or inverse sign as last event before\n // an end-of-momentum snap).\n const newEvent = {\n time: now(),\n delta: Math.abs(delta),\n direction: Math.sign(delta),\n };\n const ignoreWheelEvents =\n lastEventBeforeSnap &&\n newEvent.time < lastEventBeforeSnap.time + 500 &&\n newEvent.delta <= lastEventBeforeSnap.delta &&\n newEvent.direction === lastEventBeforeSnap.direction;\n if (!ignoreWheelEvents) {\n lastEventBeforeSnap = undefined;\n\n if (swiper.params.loop) {\n swiper.loopFix();\n }\n let position = swiper.getTranslate() + delta * params.sensitivity;\n const wasBeginning = swiper.isBeginning;\n const wasEnd = swiper.isEnd;\n\n if (position >= swiper.minTranslate()) position = swiper.minTranslate();\n if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();\n\n swiper.setTransition(0);\n swiper.setTranslate(position);\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {\n swiper.updateSlidesClasses();\n }\n\n if (swiper.params.freeMode.sticky) {\n // When wheel scrolling starts with sticky (aka snap) enabled, then detect\n // the end of a momentum scroll by storing recent (N=15?) wheel events.\n // 1. do all N events have decreasing or same (absolute value) delta?\n // 2. did all N events arrive in the last M (M=500?) msecs?\n // 3. does the earliest event have an (absolute value) delta that's\n // at least P (P=1?) larger than the most recent event's delta?\n // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?\n // If 1-4 are \"yes\" then we're near the end of a momentum scroll deceleration.\n // Snap immediately and ignore remaining wheel events in this scroll.\n // See comment above for \"remaining wheel events in this scroll\" determination.\n // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.\n clearTimeout(timeout);\n timeout = undefined;\n if (recentWheelEvents.length >= 15) {\n recentWheelEvents.shift(); // only store the last N events\n }\n const prevEvent = recentWheelEvents.length\n ? recentWheelEvents[recentWheelEvents.length - 1]\n : undefined;\n const firstEvent = recentWheelEvents[0];\n recentWheelEvents.push(newEvent);\n if (\n prevEvent &&\n (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)\n ) {\n // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.\n recentWheelEvents.splice(0);\n } else if (\n recentWheelEvents.length >= 15 &&\n newEvent.time - firstEvent.time < 500 &&\n firstEvent.delta - newEvent.delta >= 1 &&\n newEvent.delta <= 6\n ) {\n // We're at the end of the deceleration of a momentum scroll, so there's no need\n // to wait for more events. Snap ASAP on the next tick.\n // Also, because there's some remaining momentum we'll bias the snap in the\n // direction of the ongoing scroll because it's better UX for the scroll to snap\n // in the same direction as the scroll instead of reversing to snap. Therefore,\n // if it's already scrolled more than 20% in the current direction, keep going.\n const snapToThreshold = delta > 0 ? 0.8 : 0.2;\n lastEventBeforeSnap = newEvent;\n recentWheelEvents.splice(0);\n timeout = nextTick(() => {\n swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n }, 0); // no delay; move on next tick\n }\n if (!timeout) {\n // if we get here, then we haven't detected the end of a momentum scroll, so\n // we'll consider a scroll \"complete\" when there haven't been any wheel events\n // for 500ms.\n timeout = nextTick(() => {\n const snapToThreshold = 0.5;\n lastEventBeforeSnap = newEvent;\n recentWheelEvents.splice(0);\n swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n }, 500);\n }\n }\n\n // Emit event\n if (!ignoreWheelEvents) emit('scroll', e);\n\n // Stop autoplay\n if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction)\n swiper.autoplay.stop();\n // Return page scroll on edge positions\n if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true;\n }\n }\n\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n return false;\n }\n\n function events(method) {\n let target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarget !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarget);\n }\n target[method]('mouseenter', handleMouseEnter);\n target[method]('mouseleave', handleMouseLeave);\n target[method]('wheel', handle);\n }\n\n function enable() {\n if (swiper.params.cssMode) {\n swiper.wrapperEl.removeEventListener('wheel', handle);\n return true;\n }\n if (swiper.mousewheel.enabled) return false;\n events('on');\n swiper.mousewheel.enabled = true;\n return true;\n }\n function disable() {\n if (swiper.params.cssMode) {\n swiper.wrapperEl.addEventListener(event, handle);\n return true;\n }\n if (!swiper.mousewheel.enabled) return false;\n events('off');\n swiper.mousewheel.enabled = false;\n return true;\n }\n\n on('init', () => {\n if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {\n disable();\n }\n if (swiper.params.mousewheel.enabled) enable();\n });\n on('destroy', () => {\n if (swiper.params.cssMode) {\n enable();\n }\n if (swiper.mousewheel.enabled) disable();\n });\n\n Object.assign(swiper.mousewheel, {\n enable,\n disable,\n });\n}\n","import createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\nimport $ from '../../shared/dom.js';\n\nexport default function Navigation({ swiper, extendParams, on, emit }) {\n extendParams({\n navigation: {\n nextEl: null,\n prevEl: null,\n\n hideOnClick: false,\n disabledClass: 'swiper-button-disabled',\n hiddenClass: 'swiper-button-hidden',\n lockClass: 'swiper-button-lock',\n },\n });\n\n swiper.navigation = {\n nextEl: null,\n $nextEl: null,\n prevEl: null,\n $prevEl: null,\n };\n\n function getEl(el) {\n let $el;\n if (el) {\n $el = $(el);\n if (\n swiper.params.uniqueNavElements &&\n typeof el === 'string' &&\n $el.length > 1 &&\n swiper.$el.find(el).length === 1\n ) {\n $el = swiper.$el.find(el);\n }\n }\n return $el;\n }\n\n function toggleEl($el, disabled) {\n const params = swiper.params.navigation;\n if ($el && $el.length > 0) {\n $el[disabled ? 'addClass' : 'removeClass'](params.disabledClass);\n if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled;\n if (swiper.params.watchOverflow && swiper.enabled) {\n $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n }\n }\n function update() {\n // Update Navigation Buttons\n if (swiper.params.loop) return;\n const { $nextEl, $prevEl } = swiper.navigation;\n\n toggleEl($prevEl, swiper.isBeginning);\n toggleEl($nextEl, swiper.isEnd);\n }\n function onPrevClick(e) {\n e.preventDefault();\n if (swiper.isBeginning && !swiper.params.loop) return;\n swiper.slidePrev();\n }\n function onNextClick(e) {\n e.preventDefault();\n if (swiper.isEnd && !swiper.params.loop) return;\n swiper.slideNext();\n }\n function init() {\n const params = swiper.params.navigation;\n\n swiper.params.navigation = createElementIfNotDefined(\n swiper,\n swiper.originalParams.navigation,\n swiper.params.navigation,\n {\n nextEl: 'swiper-button-next',\n prevEl: 'swiper-button-prev',\n },\n );\n if (!(params.nextEl || params.prevEl)) return;\n\n const $nextEl = getEl(params.nextEl);\n const $prevEl = getEl(params.prevEl);\n\n if ($nextEl && $nextEl.length > 0) {\n $nextEl.on('click', onNextClick);\n }\n if ($prevEl && $prevEl.length > 0) {\n $prevEl.on('click', onPrevClick);\n }\n\n Object.assign(swiper.navigation, {\n $nextEl,\n nextEl: $nextEl && $nextEl[0],\n $prevEl,\n prevEl: $prevEl && $prevEl[0],\n });\n\n if (!swiper.enabled) {\n if ($nextEl) $nextEl.addClass(params.lockClass);\n if ($prevEl) $prevEl.addClass(params.lockClass);\n }\n }\n function destroy() {\n const { $nextEl, $prevEl } = swiper.navigation;\n if ($nextEl && $nextEl.length) {\n $nextEl.off('click', onNextClick);\n $nextEl.removeClass(swiper.params.navigation.disabledClass);\n }\n if ($prevEl && $prevEl.length) {\n $prevEl.off('click', onPrevClick);\n $prevEl.removeClass(swiper.params.navigation.disabledClass);\n }\n }\n\n on('init', () => {\n init();\n update();\n });\n on('toEdge fromEdge lock unlock', () => {\n update();\n });\n on('destroy', () => {\n destroy();\n });\n on('enable disable', () => {\n const { $nextEl, $prevEl } = swiper.navigation;\n if ($nextEl) {\n $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n }\n if ($prevEl) {\n $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n }\n });\n on('click', (_s, e) => {\n const { $nextEl, $prevEl } = swiper.navigation;\n const targetEl = e.target;\n if (\n swiper.params.navigation.hideOnClick &&\n !$(targetEl).is($prevEl) &&\n !$(targetEl).is($nextEl)\n ) {\n if (\n swiper.pagination &&\n swiper.params.pagination &&\n swiper.params.pagination.clickable &&\n (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))\n )\n return;\n let isHidden;\n if ($nextEl) {\n isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);\n } else if ($prevEl) {\n isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);\n }\n if (isHidden === true) {\n emit('navigationShow');\n } else {\n emit('navigationHide');\n }\n if ($nextEl) {\n $nextEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n if ($prevEl) {\n $prevEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n }\n });\n\n Object.assign(swiper.navigation, {\n update,\n init,\n destroy,\n });\n}\n","import $ from '../../shared/dom.js';\nimport classesToSelector from '../../shared/classes-to-selector.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\n\nexport default function Pagination({ swiper, extendParams, on, emit }) {\n const pfx = 'swiper-pagination';\n extendParams({\n pagination: {\n el: null,\n bulletElement: 'span',\n clickable: false,\n hideOnClick: false,\n renderBullet: null,\n renderProgressbar: null,\n renderFraction: null,\n renderCustom: null,\n progressbarOpposite: false,\n type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n dynamicBullets: false,\n dynamicMainBullets: 1,\n formatFractionCurrent: (number) => number,\n formatFractionTotal: (number) => number,\n bulletClass: `${pfx}-bullet`,\n bulletActiveClass: `${pfx}-bullet-active`,\n modifierClass: `${pfx}-`,\n currentClass: `${pfx}-current`,\n totalClass: `${pfx}-total`,\n hiddenClass: `${pfx}-hidden`,\n progressbarFillClass: `${pfx}-progressbar-fill`,\n progressbarOppositeClass: `${pfx}-progressbar-opposite`,\n clickableClass: `${pfx}-clickable`,\n lockClass: `${pfx}-lock`,\n horizontalClass: `${pfx}-horizontal`,\n verticalClass: `${pfx}-vertical`,\n },\n });\n\n swiper.pagination = {\n el: null,\n $el: null,\n bullets: [],\n };\n\n let bulletSize;\n let dynamicBulletIndex = 0;\n\n function isPaginationDisabled() {\n return (\n !swiper.params.pagination.el ||\n !swiper.pagination.el ||\n !swiper.pagination.$el ||\n swiper.pagination.$el.length === 0\n );\n }\n\n function setSideBullets($bulletEl, position) {\n const { bulletActiveClass } = swiper.params.pagination;\n $bulletEl[position]()\n .addClass(`${bulletActiveClass}-${position}`)\n [position]()\n .addClass(`${bulletActiveClass}-${position}-${position}`);\n }\n\n function update() {\n // Render || Update Pagination bullets/items\n const rtl = swiper.rtl;\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const slidesLength =\n swiper.virtual && swiper.params.virtual.enabled\n ? swiper.virtual.slides.length\n : swiper.slides.length;\n const $el = swiper.pagination.$el;\n // Current/Total\n let current;\n const total = swiper.params.loop\n ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup)\n : swiper.snapGrid.length;\n if (swiper.params.loop) {\n current = Math.ceil(\n (swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup,\n );\n if (current > slidesLength - 1 - swiper.loopedSlides * 2) {\n current -= slidesLength - swiper.loopedSlides * 2;\n }\n if (current > total - 1) current -= total;\n if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current;\n } else if (typeof swiper.snapIndex !== 'undefined') {\n current = swiper.snapIndex;\n } else {\n current = swiper.activeIndex || 0;\n }\n // Types\n if (\n params.type === 'bullets' &&\n swiper.pagination.bullets &&\n swiper.pagination.bullets.length > 0\n ) {\n const bullets = swiper.pagination.bullets;\n let firstIndex;\n let lastIndex;\n let midIndex;\n if (params.dynamicBullets) {\n bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n $el.css(\n swiper.isHorizontal() ? 'width' : 'height',\n `${bulletSize * (params.dynamicMainBullets + 4)}px`,\n );\n if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {\n dynamicBulletIndex += current - swiper.previousIndex;\n if (dynamicBulletIndex > params.dynamicMainBullets - 1) {\n dynamicBulletIndex = params.dynamicMainBullets - 1;\n } else if (dynamicBulletIndex < 0) {\n dynamicBulletIndex = 0;\n }\n }\n firstIndex = current - dynamicBulletIndex;\n lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n midIndex = (lastIndex + firstIndex) / 2;\n }\n bullets.removeClass(\n ['', '-next', '-next-next', '-prev', '-prev-prev', '-main']\n .map((suffix) => `${params.bulletActiveClass}${suffix}`)\n .join(' '),\n );\n if ($el.length > 1) {\n bullets.each((bullet) => {\n const $bullet = $(bullet);\n const bulletIndex = $bullet.index();\n if (bulletIndex === current) {\n $bullet.addClass(params.bulletActiveClass);\n }\n if (params.dynamicBullets) {\n if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n $bullet.addClass(`${params.bulletActiveClass}-main`);\n }\n if (bulletIndex === firstIndex) {\n setSideBullets($bullet, 'prev');\n }\n if (bulletIndex === lastIndex) {\n setSideBullets($bullet, 'next');\n }\n }\n });\n } else {\n const $bullet = bullets.eq(current);\n const bulletIndex = $bullet.index();\n $bullet.addClass(params.bulletActiveClass);\n if (params.dynamicBullets) {\n const $firstDisplayedBullet = bullets.eq(firstIndex);\n const $lastDisplayedBullet = bullets.eq(lastIndex);\n for (let i = firstIndex; i <= lastIndex; i += 1) {\n bullets.eq(i).addClass(`${params.bulletActiveClass}-main`);\n }\n if (swiper.params.loop) {\n if (bulletIndex >= bullets.length - params.dynamicMainBullets) {\n for (let i = params.dynamicMainBullets; i >= 0; i -= 1) {\n bullets.eq(bullets.length - i).addClass(`${params.bulletActiveClass}-main`);\n }\n bullets\n .eq(bullets.length - params.dynamicMainBullets - 1)\n .addClass(`${params.bulletActiveClass}-prev`);\n } else {\n setSideBullets($firstDisplayedBullet, 'prev');\n setSideBullets($lastDisplayedBullet, 'next');\n }\n } else {\n setSideBullets($firstDisplayedBullet, 'prev');\n setSideBullets($lastDisplayedBullet, 'next');\n }\n }\n }\n if (params.dynamicBullets) {\n const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n const bulletsOffset =\n (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;\n const offsetProp = rtl ? 'right' : 'left';\n bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`);\n }\n }\n if (params.type === 'fraction') {\n $el\n .find(classesToSelector(params.currentClass))\n .text(params.formatFractionCurrent(current + 1));\n $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total));\n }\n if (params.type === 'progressbar') {\n let progressbarDirection;\n if (params.progressbarOpposite) {\n progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n } else {\n progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n }\n const scale = (current + 1) / total;\n let scaleX = 1;\n let scaleY = 1;\n if (progressbarDirection === 'horizontal') {\n scaleX = scale;\n } else {\n scaleY = scale;\n }\n $el\n .find(classesToSelector(params.progressbarFillClass))\n .transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`)\n .transition(swiper.params.speed);\n }\n if (params.type === 'custom' && params.renderCustom) {\n $el.html(params.renderCustom(swiper, current + 1, total));\n emit('paginationRender', $el[0]);\n } else {\n emit('paginationUpdate', $el[0]);\n }\n if (swiper.params.watchOverflow && swiper.enabled) {\n $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n }\n function render() {\n // Render Container\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const slidesLength =\n swiper.virtual && swiper.params.virtual.enabled\n ? swiper.virtual.slides.length\n : swiper.slides.length;\n\n const $el = swiper.pagination.$el;\n let paginationHTML = '';\n if (params.type === 'bullets') {\n let numberOfBullets = swiper.params.loop\n ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup)\n : swiper.snapGrid.length;\n if (\n swiper.params.freeMode &&\n swiper.params.freeMode.enabled &&\n !swiper.params.loop &&\n numberOfBullets > slidesLength\n ) {\n numberOfBullets = slidesLength;\n }\n for (let i = 0; i < numberOfBullets; i += 1) {\n if (params.renderBullet) {\n paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n } else {\n paginationHTML += `<${params.bulletElement} class=\"${params.bulletClass}\">`;\n }\n }\n $el.html(paginationHTML);\n\n swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass));\n }\n if (params.type === 'fraction') {\n if (params.renderFraction) {\n paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n } else {\n paginationHTML =\n `` +\n ' / ' +\n ``;\n }\n $el.html(paginationHTML);\n }\n if (params.type === 'progressbar') {\n if (params.renderProgressbar) {\n paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n } else {\n paginationHTML = ``;\n }\n $el.html(paginationHTML);\n }\n if (params.type !== 'custom') {\n emit('paginationRender', swiper.pagination.$el[0]);\n }\n }\n function init() {\n swiper.params.pagination = createElementIfNotDefined(\n swiper,\n swiper.originalParams.pagination,\n swiper.params.pagination,\n { el: 'swiper-pagination' },\n );\n const params = swiper.params.pagination;\n if (!params.el) return;\n\n let $el = $(params.el);\n if ($el.length === 0) return;\n\n if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) {\n $el = swiper.$el.find(params.el);\n // check if it belongs to another nested Swiper\n if ($el.length > 1) {\n $el = $el.filter((el) => {\n if ($(el).parents('.swiper')[0] !== swiper.el) return false;\n return true;\n });\n }\n }\n\n if (params.type === 'bullets' && params.clickable) {\n $el.addClass(params.clickableClass);\n }\n\n $el.addClass(params.modifierClass + params.type);\n $el.addClass(params.modifierClass + swiper.params.direction);\n\n if (params.type === 'bullets' && params.dynamicBullets) {\n $el.addClass(`${params.modifierClass}${params.type}-dynamic`);\n dynamicBulletIndex = 0;\n if (params.dynamicMainBullets < 1) {\n params.dynamicMainBullets = 1;\n }\n }\n if (params.type === 'progressbar' && params.progressbarOpposite) {\n $el.addClass(params.progressbarOppositeClass);\n }\n\n if (params.clickable) {\n $el.on('click', classesToSelector(params.bulletClass), function onClick(e) {\n e.preventDefault();\n let index = $(this).index() * swiper.params.slidesPerGroup;\n if (swiper.params.loop) index += swiper.loopedSlides;\n swiper.slideTo(index);\n });\n }\n\n Object.assign(swiper.pagination, {\n $el,\n el: $el[0],\n });\n\n if (!swiper.enabled) {\n $el.addClass(params.lockClass);\n }\n }\n function destroy() {\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const $el = swiper.pagination.$el;\n\n $el.removeClass(params.hiddenClass);\n $el.removeClass(params.modifierClass + params.type);\n $el.removeClass(params.modifierClass + swiper.params.direction);\n if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass)\n swiper.pagination.bullets.removeClass(params.bulletActiveClass);\n if (params.clickable) {\n $el.off('click', classesToSelector(params.bulletClass));\n }\n }\n\n on('init', () => {\n init();\n render();\n update();\n });\n on('activeIndexChange', () => {\n if (swiper.params.loop) {\n update();\n } else if (typeof swiper.snapIndex === 'undefined') {\n update();\n }\n });\n on('snapIndexChange', () => {\n if (!swiper.params.loop) {\n update();\n }\n });\n on('slidesLengthChange', () => {\n if (swiper.params.loop) {\n render();\n update();\n }\n });\n on('snapGridLengthChange', () => {\n if (!swiper.params.loop) {\n render();\n update();\n }\n });\n on('destroy', () => {\n destroy();\n });\n on('enable disable', () => {\n const { $el } = swiper.pagination;\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass);\n }\n });\n on('lock unlock', () => {\n update();\n });\n on('click', (_s, e) => {\n const targetEl = e.target;\n const { $el } = swiper.pagination;\n if (\n swiper.params.pagination.el &&\n swiper.params.pagination.hideOnClick &&\n $el.length > 0 &&\n !$(targetEl).hasClass(swiper.params.pagination.bulletClass)\n ) {\n if (\n swiper.navigation &&\n ((swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl) ||\n (swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl))\n )\n return;\n const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass);\n if (isHidden === true) {\n emit('paginationShow');\n } else {\n emit('paginationHide');\n }\n $el.toggleClass(swiper.params.pagination.hiddenClass);\n }\n });\n\n Object.assign(swiper.pagination, {\n render,\n update,\n init,\n destroy,\n });\n}\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\n\nexport default function Scrollbar({ swiper, extendParams, on, emit }) {\n const document = getDocument();\n\n let isTouched = false;\n let timeout = null;\n let dragTimeout = null;\n let dragStartPos;\n let dragSize;\n let trackSize;\n let divider;\n\n extendParams({\n scrollbar: {\n el: null,\n dragSize: 'auto',\n hide: false,\n draggable: false,\n snapOnRelease: true,\n lockClass: 'swiper-scrollbar-lock',\n dragClass: 'swiper-scrollbar-drag',\n },\n });\n\n swiper.scrollbar = {\n el: null,\n dragEl: null,\n $el: null,\n $dragEl: null,\n };\n\n function setTranslate() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n const { scrollbar, rtlTranslate: rtl, progress } = swiper;\n const { $dragEl, $el } = scrollbar;\n const params = swiper.params.scrollbar;\n\n let newSize = dragSize;\n let newPos = (trackSize - dragSize) * progress;\n if (rtl) {\n newPos = -newPos;\n if (newPos > 0) {\n newSize = dragSize - newPos;\n newPos = 0;\n } else if (-newPos + dragSize > trackSize) {\n newSize = trackSize + newPos;\n }\n } else if (newPos < 0) {\n newSize = dragSize + newPos;\n newPos = 0;\n } else if (newPos + dragSize > trackSize) {\n newSize = trackSize - newPos;\n }\n if (swiper.isHorizontal()) {\n $dragEl.transform(`translate3d(${newPos}px, 0, 0)`);\n $dragEl[0].style.width = `${newSize}px`;\n } else {\n $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`);\n $dragEl[0].style.height = `${newSize}px`;\n }\n if (params.hide) {\n clearTimeout(timeout);\n $el[0].style.opacity = 1;\n timeout = setTimeout(() => {\n $el[0].style.opacity = 0;\n $el.transition(400);\n }, 1000);\n }\n }\n function setTransition(duration) {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n swiper.scrollbar.$dragEl.transition(duration);\n }\n function updateSize() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n\n const { scrollbar } = swiper;\n const { $dragEl, $el } = scrollbar;\n\n $dragEl[0].style.width = '';\n $dragEl[0].style.height = '';\n trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;\n\n divider =\n swiper.size /\n (swiper.virtualSize +\n swiper.params.slidesOffsetBefore -\n (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));\n if (swiper.params.scrollbar.dragSize === 'auto') {\n dragSize = trackSize * divider;\n } else {\n dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n }\n\n if (swiper.isHorizontal()) {\n $dragEl[0].style.width = `${dragSize}px`;\n } else {\n $dragEl[0].style.height = `${dragSize}px`;\n }\n\n if (divider >= 1) {\n $el[0].style.display = 'none';\n } else {\n $el[0].style.display = '';\n }\n if (swiper.params.scrollbar.hide) {\n $el[0].style.opacity = 0;\n }\n\n if (swiper.params.watchOverflow && swiper.enabled) {\n scrollbar.$el[swiper.isLocked ? 'addClass' : 'removeClass'](\n swiper.params.scrollbar.lockClass,\n );\n }\n }\n function getPointerPosition(e) {\n if (swiper.isHorizontal()) {\n return e.type === 'touchstart' || e.type === 'touchmove'\n ? e.targetTouches[0].clientX\n : e.clientX;\n }\n return e.type === 'touchstart' || e.type === 'touchmove'\n ? e.targetTouches[0].clientY\n : e.clientY;\n }\n function setDragPosition(e) {\n const { scrollbar, rtlTranslate: rtl } = swiper;\n const { $el } = scrollbar;\n\n let positionRatio;\n positionRatio =\n (getPointerPosition(e) -\n $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] -\n (dragStartPos !== null ? dragStartPos : dragSize / 2)) /\n (trackSize - dragSize);\n positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n if (rtl) {\n positionRatio = 1 - positionRatio;\n }\n\n const position =\n swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;\n\n swiper.updateProgress(position);\n swiper.setTranslate(position);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n function onDragStart(e) {\n const params = swiper.params.scrollbar;\n const { scrollbar, $wrapperEl } = swiper;\n const { $el, $dragEl } = scrollbar;\n isTouched = true;\n dragStartPos =\n e.target === $dragEl[0] || e.target === $dragEl\n ? getPointerPosition(e) -\n e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top']\n : null;\n e.preventDefault();\n e.stopPropagation();\n\n $wrapperEl.transition(100);\n $dragEl.transition(100);\n setDragPosition(e);\n\n clearTimeout(dragTimeout);\n\n $el.transition(0);\n if (params.hide) {\n $el.css('opacity', 1);\n }\n if (swiper.params.cssMode) {\n swiper.$wrapperEl.css('scroll-snap-type', 'none');\n }\n emit('scrollbarDragStart', e);\n }\n function onDragMove(e) {\n const { scrollbar, $wrapperEl } = swiper;\n const { $el, $dragEl } = scrollbar;\n\n if (!isTouched) return;\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n setDragPosition(e);\n $wrapperEl.transition(0);\n $el.transition(0);\n $dragEl.transition(0);\n emit('scrollbarDragMove', e);\n }\n function onDragEnd(e) {\n const params = swiper.params.scrollbar;\n const { scrollbar, $wrapperEl } = swiper;\n const { $el } = scrollbar;\n\n if (!isTouched) return;\n isTouched = false;\n if (swiper.params.cssMode) {\n swiper.$wrapperEl.css('scroll-snap-type', '');\n $wrapperEl.transition('');\n }\n if (params.hide) {\n clearTimeout(dragTimeout);\n dragTimeout = nextTick(() => {\n $el.css('opacity', 0);\n $el.transition(400);\n }, 1000);\n }\n emit('scrollbarDragEnd', e);\n if (params.snapOnRelease) {\n swiper.slideToClosest();\n }\n }\n\n function events(method) {\n const { scrollbar, touchEventsTouch, touchEventsDesktop, params, support } = swiper;\n const $el = scrollbar.$el;\n const target = $el[0];\n const activeListener =\n support.passiveListener && params.passiveListeners\n ? { passive: false, capture: false }\n : false;\n const passiveListener =\n support.passiveListener && params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n if (!target) return;\n const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n if (!support.touch) {\n target[eventMethod](touchEventsDesktop.start, onDragStart, activeListener);\n document[eventMethod](touchEventsDesktop.move, onDragMove, activeListener);\n document[eventMethod](touchEventsDesktop.end, onDragEnd, passiveListener);\n } else {\n target[eventMethod](touchEventsTouch.start, onDragStart, activeListener);\n target[eventMethod](touchEventsTouch.move, onDragMove, activeListener);\n target[eventMethod](touchEventsTouch.end, onDragEnd, passiveListener);\n }\n }\n\n function enableDraggable() {\n if (!swiper.params.scrollbar.el) return;\n events('on');\n }\n function disableDraggable() {\n if (!swiper.params.scrollbar.el) return;\n events('off');\n }\n function init() {\n const { scrollbar, $el: $swiperEl } = swiper;\n swiper.params.scrollbar = createElementIfNotDefined(\n swiper,\n swiper.originalParams.scrollbar,\n swiper.params.scrollbar,\n { el: 'swiper-scrollbar' },\n );\n const params = swiper.params.scrollbar;\n if (!params.el) return;\n\n let $el = $(params.el);\n if (\n swiper.params.uniqueNavElements &&\n typeof params.el === 'string' &&\n $el.length > 1 &&\n $swiperEl.find(params.el).length === 1\n ) {\n $el = $swiperEl.find(params.el);\n }\n\n let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`);\n if ($dragEl.length === 0) {\n $dragEl = $(`
      `);\n $el.append($dragEl);\n }\n\n Object.assign(scrollbar, {\n $el,\n el: $el[0],\n $dragEl,\n dragEl: $dragEl[0],\n });\n\n if (params.draggable) {\n enableDraggable();\n }\n\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n }\n }\n function destroy() {\n disableDraggable();\n }\n\n on('init', () => {\n init();\n updateSize();\n setTranslate();\n });\n on('update resize observerUpdate lock unlock', () => {\n updateSize();\n });\n on('setTranslate', () => {\n setTranslate();\n });\n on('setTransition', (_s, duration) => {\n setTransition(duration);\n });\n on('enable disable', () => {\n const { $el } = swiper.scrollbar;\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n }\n });\n on('destroy', () => {\n destroy();\n });\n\n Object.assign(swiper.scrollbar, {\n updateSize,\n setTranslate,\n init,\n destroy,\n });\n}\n","import $ from '../../shared/dom.js';\n\nexport default function Parallax({ swiper, extendParams, on }) {\n extendParams({\n parallax: {\n enabled: false,\n },\n });\n\n const setTransform = (el, progress) => {\n const { rtl } = swiper;\n\n const $el = $(el);\n const rtlFactor = rtl ? -1 : 1;\n\n const p = $el.attr('data-swiper-parallax') || '0';\n let x = $el.attr('data-swiper-parallax-x');\n let y = $el.attr('data-swiper-parallax-y');\n const scale = $el.attr('data-swiper-parallax-scale');\n const opacity = $el.attr('data-swiper-parallax-opacity');\n\n if (x || y) {\n x = x || '0';\n y = y || '0';\n } else if (swiper.isHorizontal()) {\n x = p;\n y = '0';\n } else {\n y = p;\n x = '0';\n }\n\n if (x.indexOf('%') >= 0) {\n x = `${parseInt(x, 10) * progress * rtlFactor}%`;\n } else {\n x = `${x * progress * rtlFactor}px`;\n }\n if (y.indexOf('%') >= 0) {\n y = `${parseInt(y, 10) * progress}%`;\n } else {\n y = `${y * progress}px`;\n }\n\n if (typeof opacity !== 'undefined' && opacity !== null) {\n const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));\n $el[0].style.opacity = currentOpacity;\n }\n if (typeof scale === 'undefined' || scale === null) {\n $el.transform(`translate3d(${x}, ${y}, 0px)`);\n } else {\n const currentScale = scale - (scale - 1) * (1 - Math.abs(progress));\n $el.transform(`translate3d(${x}, ${y}, 0px) scale(${currentScale})`);\n }\n };\n\n const setTranslate = () => {\n const { $el, slides, progress, snapGrid } = swiper;\n $el\n .children(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((el) => {\n setTransform(el, progress);\n });\n slides.each((slideEl, slideIndex) => {\n let slideProgress = slideEl.progress;\n if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);\n }\n slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n $(slideEl)\n .find(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((el) => {\n setTransform(el, slideProgress);\n });\n });\n };\n\n const setTransition = (duration = swiper.params.speed) => {\n const { $el } = swiper;\n $el\n .find(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((parallaxEl) => {\n const $parallaxEl = $(parallaxEl);\n let parallaxDuration =\n parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;\n if (duration === 0) parallaxDuration = 0;\n $parallaxEl.transition(parallaxDuration);\n });\n };\n\n on('beforeInit', () => {\n if (!swiper.params.parallax.enabled) return;\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n });\n on('init', () => {\n if (!swiper.params.parallax.enabled) return;\n setTranslate();\n });\n on('setTranslate', () => {\n if (!swiper.params.parallax.enabled) return;\n setTranslate();\n });\n on('setTransition', (_swiper, duration) => {\n if (!swiper.params.parallax.enabled) return;\n setTransition(duration);\n });\n}\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { getTranslate } from '../../shared/utils.js';\n\nexport default function Zoom({ swiper, extendParams, on, emit }) {\n const window = getWindow();\n extendParams({\n zoom: {\n enabled: false,\n maxRatio: 3,\n minRatio: 1,\n toggle: true,\n containerClass: 'swiper-zoom-container',\n zoomedSlideClass: 'swiper-slide-zoomed',\n },\n });\n\n swiper.zoom = {\n enabled: false,\n };\n\n let currentScale = 1;\n let isScaling = false;\n let gesturesEnabled;\n let fakeGestureTouched;\n let fakeGestureMoved;\n const gesture = {\n $slideEl: undefined,\n slideWidth: undefined,\n slideHeight: undefined,\n $imageEl: undefined,\n $imageWrapEl: undefined,\n maxRatio: 3,\n };\n const image = {\n isTouched: undefined,\n isMoved: undefined,\n currentX: undefined,\n currentY: undefined,\n minX: undefined,\n minY: undefined,\n maxX: undefined,\n maxY: undefined,\n width: undefined,\n height: undefined,\n startX: undefined,\n startY: undefined,\n touchesStart: {},\n touchesCurrent: {},\n };\n const velocity = {\n x: undefined,\n y: undefined,\n prevPositionX: undefined,\n prevPositionY: undefined,\n prevTime: undefined,\n };\n\n let scale = 1;\n Object.defineProperty(swiper.zoom, 'scale', {\n get() {\n return scale;\n },\n set(value) {\n if (scale !== value) {\n const imageEl = gesture.$imageEl ? gesture.$imageEl[0] : undefined;\n const slideEl = gesture.$slideEl ? gesture.$slideEl[0] : undefined;\n emit('zoomChange', value, imageEl, slideEl);\n }\n scale = value;\n },\n });\n\n function getDistanceBetweenTouches(e) {\n if (e.targetTouches.length < 2) return 1;\n const x1 = e.targetTouches[0].pageX;\n const y1 = e.targetTouches[0].pageY;\n const x2 = e.targetTouches[1].pageX;\n const y2 = e.targetTouches[1].pageY;\n const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n return distance;\n }\n\n // Events\n function onGestureStart(e) {\n const support = swiper.support;\n const params = swiper.params.zoom;\n fakeGestureTouched = false;\n fakeGestureMoved = false;\n if (!support.gestures) {\n if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {\n return;\n }\n fakeGestureTouched = true;\n gesture.scaleStart = getDistanceBetweenTouches(e);\n }\n if (!gesture.$slideEl || !gesture.$slideEl.length) {\n gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`);\n if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (gesture.$imageWrapEl.length === 0) {\n gesture.$imageEl = undefined;\n return;\n }\n }\n if (gesture.$imageEl) {\n gesture.$imageEl.transition(0);\n }\n isScaling = true;\n }\n function onGestureChange(e) {\n const support = swiper.support;\n const params = swiper.params.zoom;\n const zoom = swiper.zoom;\n if (!support.gestures) {\n if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {\n return;\n }\n fakeGestureMoved = true;\n gesture.scaleMove = getDistanceBetweenTouches(e);\n }\n\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) {\n if (e.type === 'gesturechange') onGestureStart(e);\n return;\n }\n if (support.gestures) {\n zoom.scale = e.scale * currentScale;\n } else {\n zoom.scale = (gesture.scaleMove / gesture.scaleStart) * currentScale;\n }\n if (zoom.scale > gesture.maxRatio) {\n zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5;\n }\n if (zoom.scale < params.minRatio) {\n zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5;\n }\n gesture.$imageEl.transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n }\n function onGestureEnd(e) {\n const device = swiper.device;\n const support = swiper.support;\n const params = swiper.params.zoom;\n const zoom = swiper.zoom;\n if (!support.gestures) {\n if (!fakeGestureTouched || !fakeGestureMoved) {\n return;\n }\n if (\n e.type !== 'touchend' ||\n (e.type === 'touchend' && e.changedTouches.length < 2 && !device.android)\n ) {\n return;\n }\n fakeGestureTouched = false;\n fakeGestureMoved = false;\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n gesture.$imageEl\n .transition(swiper.params.speed)\n .transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n currentScale = zoom.scale;\n isScaling = false;\n if (zoom.scale === 1) gesture.$slideEl = undefined;\n }\n function onTouchStart(e) {\n const device = swiper.device;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n if (image.isTouched) return;\n if (device.android && e.cancelable) e.preventDefault();\n image.isTouched = true;\n image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n }\n function onTouchMove(e) {\n const zoom = swiper.zoom;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n swiper.allowClick = false;\n if (!image.isTouched || !gesture.$slideEl) return;\n\n if (!image.isMoved) {\n image.width = gesture.$imageEl[0].offsetWidth;\n image.height = gesture.$imageEl[0].offsetHeight;\n image.startX = getTranslate(gesture.$imageWrapEl[0], 'x') || 0;\n image.startY = getTranslate(gesture.$imageWrapEl[0], 'y') || 0;\n gesture.slideWidth = gesture.$slideEl[0].offsetWidth;\n gesture.slideHeight = gesture.$slideEl[0].offsetHeight;\n gesture.$imageWrapEl.transition(0);\n }\n // Define if we need image drag\n const scaledWidth = image.width * zoom.scale;\n const scaledHeight = image.height * zoom.scale;\n\n if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return;\n\n image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n image.maxX = -image.minX;\n image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n image.maxY = -image.minY;\n\n image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n\n if (!image.isMoved && !isScaling) {\n if (\n swiper.isHorizontal() &&\n ((Math.floor(image.minX) === Math.floor(image.startX) &&\n image.touchesCurrent.x < image.touchesStart.x) ||\n (Math.floor(image.maxX) === Math.floor(image.startX) &&\n image.touchesCurrent.x > image.touchesStart.x))\n ) {\n image.isTouched = false;\n return;\n }\n if (\n !swiper.isHorizontal() &&\n ((Math.floor(image.minY) === Math.floor(image.startY) &&\n image.touchesCurrent.y < image.touchesStart.y) ||\n (Math.floor(image.maxY) === Math.floor(image.startY) &&\n image.touchesCurrent.y > image.touchesStart.y))\n ) {\n image.isTouched = false;\n return;\n }\n }\n if (e.cancelable) {\n e.preventDefault();\n }\n e.stopPropagation();\n\n image.isMoved = true;\n image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX;\n image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY;\n\n if (image.currentX < image.minX) {\n image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8;\n }\n if (image.currentX > image.maxX) {\n image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8;\n }\n\n if (image.currentY < image.minY) {\n image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8;\n }\n if (image.currentY > image.maxY) {\n image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8;\n }\n\n // Velocity\n if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;\n if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;\n if (!velocity.prevTime) velocity.prevTime = Date.now();\n velocity.x =\n (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n velocity.y =\n (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;\n if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;\n velocity.prevPositionX = image.touchesCurrent.x;\n velocity.prevPositionY = image.touchesCurrent.y;\n velocity.prevTime = Date.now();\n\n gesture.$imageWrapEl.transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n }\n function onTouchEnd() {\n const zoom = swiper.zoom;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n if (!image.isTouched || !image.isMoved) {\n image.isTouched = false;\n image.isMoved = false;\n return;\n }\n image.isTouched = false;\n image.isMoved = false;\n let momentumDurationX = 300;\n let momentumDurationY = 300;\n const momentumDistanceX = velocity.x * momentumDurationX;\n const newPositionX = image.currentX + momentumDistanceX;\n const momentumDistanceY = velocity.y * momentumDurationY;\n const newPositionY = image.currentY + momentumDistanceY;\n\n // Fix duration\n if (velocity.x !== 0)\n momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);\n if (velocity.y !== 0)\n momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);\n const momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n\n image.currentX = newPositionX;\n image.currentY = newPositionY;\n\n // Define if we need image drag\n const scaledWidth = image.width * zoom.scale;\n const scaledHeight = image.height * zoom.scale;\n image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n image.maxX = -image.minX;\n image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n image.maxY = -image.minY;\n image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n\n gesture.$imageWrapEl\n .transition(momentumDuration)\n .transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n }\n function onTransitionEnd() {\n const zoom = swiper.zoom;\n if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {\n if (gesture.$imageEl) {\n gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');\n }\n if (gesture.$imageWrapEl) {\n gesture.$imageWrapEl.transform('translate3d(0,0,0)');\n }\n\n zoom.scale = 1;\n currentScale = 1;\n\n gesture.$slideEl = undefined;\n gesture.$imageEl = undefined;\n gesture.$imageWrapEl = undefined;\n }\n }\n\n function zoomIn(e) {\n const zoom = swiper.zoom;\n const params = swiper.params.zoom;\n\n if (!gesture.$slideEl) {\n if (e && e.target) {\n gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`);\n }\n if (!gesture.$slideEl) {\n if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n } else {\n gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n }\n }\n\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n }\n if (\n !gesture.$imageEl ||\n gesture.$imageEl.length === 0 ||\n !gesture.$imageWrapEl ||\n gesture.$imageWrapEl.length === 0\n )\n return;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style.overflow = 'hidden';\n swiper.wrapperEl.style.touchAction = 'none';\n }\n\n gesture.$slideEl.addClass(`${params.zoomedSlideClass}`);\n\n let touchX;\n let touchY;\n let offsetX;\n let offsetY;\n let diffX;\n let diffY;\n let translateX;\n let translateY;\n let imageWidth;\n let imageHeight;\n let scaledWidth;\n let scaledHeight;\n let translateMinX;\n let translateMinY;\n let translateMaxX;\n let translateMaxY;\n let slideWidth;\n let slideHeight;\n\n if (typeof image.touchesStart.x === 'undefined' && e) {\n touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;\n touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;\n } else {\n touchX = image.touchesStart.x;\n touchY = image.touchesStart.y;\n }\n\n zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (e) {\n slideWidth = gesture.$slideEl[0].offsetWidth;\n slideHeight = gesture.$slideEl[0].offsetHeight;\n offsetX = gesture.$slideEl.offset().left + window.scrollX;\n offsetY = gesture.$slideEl.offset().top + window.scrollY;\n diffX = offsetX + slideWidth / 2 - touchX;\n diffY = offsetY + slideHeight / 2 - touchY;\n\n imageWidth = gesture.$imageEl[0].offsetWidth;\n imageHeight = gesture.$imageEl[0].offsetHeight;\n scaledWidth = imageWidth * zoom.scale;\n scaledHeight = imageHeight * zoom.scale;\n\n translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);\n translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);\n translateMaxX = -translateMinX;\n translateMaxY = -translateMinY;\n\n translateX = diffX * zoom.scale;\n translateY = diffY * zoom.scale;\n\n if (translateX < translateMinX) {\n translateX = translateMinX;\n }\n if (translateX > translateMaxX) {\n translateX = translateMaxX;\n }\n\n if (translateY < translateMinY) {\n translateY = translateMinY;\n }\n if (translateY > translateMaxY) {\n translateY = translateMaxY;\n }\n } else {\n translateX = 0;\n translateY = 0;\n }\n gesture.$imageWrapEl\n .transition(300)\n .transform(`translate3d(${translateX}px, ${translateY}px,0)`);\n gesture.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n }\n function zoomOut() {\n const zoom = swiper.zoom;\n const params = swiper.params.zoom;\n\n if (!gesture.$slideEl) {\n if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n } else {\n gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n }\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n }\n if (\n !gesture.$imageEl ||\n gesture.$imageEl.length === 0 ||\n !gesture.$imageWrapEl ||\n gesture.$imageWrapEl.length === 0\n )\n return;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style.overflow = '';\n swiper.wrapperEl.style.touchAction = '';\n }\n zoom.scale = 1;\n currentScale = 1;\n gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');\n gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');\n gesture.$slideEl.removeClass(`${params.zoomedSlideClass}`);\n gesture.$slideEl = undefined;\n }\n\n // Toggle Zoom\n function zoomToggle(e) {\n const zoom = swiper.zoom;\n\n if (zoom.scale && zoom.scale !== 1) {\n // Zoom Out\n zoomOut();\n } else {\n // Zoom In\n zoomIn(e);\n }\n }\n\n function getListeners() {\n const support = swiper.support;\n const passiveListener =\n swiper.touchEvents.start === 'touchstart' &&\n support.passiveListener &&\n swiper.params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n const activeListenerWithCapture = support.passiveListener\n ? { passive: false, capture: true }\n : true;\n return { passiveListener, activeListenerWithCapture };\n }\n\n function getSlideSelector() {\n return `.${swiper.params.slideClass}`;\n }\n\n function toggleGestures(method) {\n const { passiveListener } = getListeners();\n const slideSelector = getSlideSelector();\n swiper.$wrapperEl[method]('gesturestart', slideSelector, onGestureStart, passiveListener);\n swiper.$wrapperEl[method]('gesturechange', slideSelector, onGestureChange, passiveListener);\n swiper.$wrapperEl[method]('gestureend', slideSelector, onGestureEnd, passiveListener);\n }\n function enableGestures() {\n if (gesturesEnabled) return;\n gesturesEnabled = true;\n toggleGestures('on');\n }\n function disableGestures() {\n if (!gesturesEnabled) return;\n gesturesEnabled = false;\n toggleGestures('off');\n }\n\n // Attach/Detach Events\n function enable() {\n const zoom = swiper.zoom;\n if (zoom.enabled) return;\n zoom.enabled = true;\n const support = swiper.support;\n const { passiveListener, activeListenerWithCapture } = getListeners();\n const slideSelector = getSlideSelector();\n\n // Scale image\n if (support.gestures) {\n swiper.$wrapperEl.on(swiper.touchEvents.start, enableGestures, passiveListener);\n swiper.$wrapperEl.on(swiper.touchEvents.end, disableGestures, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.on(\n swiper.touchEvents.start,\n slideSelector,\n onGestureStart,\n passiveListener,\n );\n swiper.$wrapperEl.on(\n swiper.touchEvents.move,\n slideSelector,\n onGestureChange,\n activeListenerWithCapture,\n );\n swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n if (swiper.touchEvents.cancel) {\n swiper.$wrapperEl.on(\n swiper.touchEvents.cancel,\n slideSelector,\n onGestureEnd,\n passiveListener,\n );\n }\n }\n\n // Move image\n swiper.$wrapperEl.on(\n swiper.touchEvents.move,\n `.${swiper.params.zoom.containerClass}`,\n onTouchMove,\n activeListenerWithCapture,\n );\n }\n function disable() {\n const zoom = swiper.zoom;\n if (!zoom.enabled) return;\n const support = swiper.support;\n zoom.enabled = false;\n\n const { passiveListener, activeListenerWithCapture } = getListeners();\n const slideSelector = getSlideSelector();\n\n // Scale image\n if (support.gestures) {\n swiper.$wrapperEl.off(swiper.touchEvents.start, enableGestures, passiveListener);\n swiper.$wrapperEl.off(swiper.touchEvents.end, disableGestures, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.off(\n swiper.touchEvents.start,\n slideSelector,\n onGestureStart,\n passiveListener,\n );\n swiper.$wrapperEl.off(\n swiper.touchEvents.move,\n slideSelector,\n onGestureChange,\n activeListenerWithCapture,\n );\n swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n if (swiper.touchEvents.cancel) {\n swiper.$wrapperEl.off(\n swiper.touchEvents.cancel,\n slideSelector,\n onGestureEnd,\n passiveListener,\n );\n }\n }\n\n // Move image\n swiper.$wrapperEl.off(\n swiper.touchEvents.move,\n `.${swiper.params.zoom.containerClass}`,\n onTouchMove,\n activeListenerWithCapture,\n );\n }\n\n on('init', () => {\n if (swiper.params.zoom.enabled) {\n enable();\n }\n });\n on('destroy', () => {\n disable();\n });\n on('touchStart', (_s, e) => {\n if (!swiper.zoom.enabled) return;\n onTouchStart(e);\n });\n on('touchEnd', (_s, e) => {\n if (!swiper.zoom.enabled) return;\n onTouchEnd(e);\n });\n on('doubleTap', (_s, e) => {\n if (\n !swiper.animating &&\n swiper.params.zoom.enabled &&\n swiper.zoom.enabled &&\n swiper.params.zoom.toggle\n ) {\n zoomToggle(e);\n }\n });\n on('transitionEnd', () => {\n if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n onTransitionEnd();\n }\n });\n on('slideChange', () => {\n if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {\n onTransitionEnd();\n }\n });\n\n Object.assign(swiper.zoom, {\n enable,\n disable,\n in: zoomIn,\n out: zoomOut,\n toggle: zoomToggle,\n });\n}\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function Lazy({ swiper, extendParams, on, emit }) {\n extendParams({\n lazy: {\n checkInView: false,\n enabled: false,\n loadPrevNext: false,\n loadPrevNextAmount: 1,\n loadOnTransitionStart: false,\n scrollingElement: '',\n\n elementClass: 'swiper-lazy',\n loadingClass: 'swiper-lazy-loading',\n loadedClass: 'swiper-lazy-loaded',\n preloaderClass: 'swiper-lazy-preloader',\n },\n });\n\n swiper.lazy = {};\n\n let scrollHandlerAttached = false;\n let initialImageLoaded = false;\n\n function loadInSlide(index, loadInDuplicate = true) {\n const params = swiper.params.lazy;\n if (typeof index === 'undefined') return;\n if (swiper.slides.length === 0) return;\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n const $slideEl = isVirtual\n ? swiper.$wrapperEl.children(\n `.${swiper.params.slideClass}[data-swiper-slide-index=\"${index}\"]`,\n )\n : swiper.slides.eq(index);\n\n const $images = $slideEl.find(\n `.${params.elementClass}:not(.${params.loadedClass}):not(.${params.loadingClass})`,\n );\n if (\n $slideEl.hasClass(params.elementClass) &&\n !$slideEl.hasClass(params.loadedClass) &&\n !$slideEl.hasClass(params.loadingClass)\n ) {\n $images.push($slideEl[0]);\n }\n if ($images.length === 0) return;\n\n $images.each((imageEl) => {\n const $imageEl = $(imageEl);\n $imageEl.addClass(params.loadingClass);\n\n const background = $imageEl.attr('data-background');\n const src = $imageEl.attr('data-src');\n const srcset = $imageEl.attr('data-srcset');\n const sizes = $imageEl.attr('data-sizes');\n const $pictureEl = $imageEl.parent('picture');\n\n swiper.loadImage($imageEl[0], src || background, srcset, sizes, false, () => {\n if (\n typeof swiper === 'undefined' ||\n swiper === null ||\n !swiper ||\n (swiper && !swiper.params) ||\n swiper.destroyed\n )\n return;\n if (background) {\n $imageEl.css('background-image', `url(\"${background}\")`);\n $imageEl.removeAttr('data-background');\n } else {\n if (srcset) {\n $imageEl.attr('srcset', srcset);\n $imageEl.removeAttr('data-srcset');\n }\n if (sizes) {\n $imageEl.attr('sizes', sizes);\n $imageEl.removeAttr('data-sizes');\n }\n if ($pictureEl.length) {\n $pictureEl.children('source').each((sourceEl) => {\n const $source = $(sourceEl);\n\n if ($source.attr('data-srcset')) {\n $source.attr('srcset', $source.attr('data-srcset'));\n $source.removeAttr('data-srcset');\n }\n });\n }\n if (src) {\n $imageEl.attr('src', src);\n $imageEl.removeAttr('data-src');\n }\n }\n\n $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);\n $slideEl.find(`.${params.preloaderClass}`).remove();\n if (swiper.params.loop && loadInDuplicate) {\n const slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');\n if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {\n const originalSlide = swiper.$wrapperEl.children(\n `[data-swiper-slide-index=\"${slideOriginalIndex}\"]:not(.${swiper.params.slideDuplicateClass})`,\n );\n loadInSlide(originalSlide.index(), false);\n } else {\n const duplicatedSlide = swiper.$wrapperEl.children(\n `.${swiper.params.slideDuplicateClass}[data-swiper-slide-index=\"${slideOriginalIndex}\"]`,\n );\n loadInSlide(duplicatedSlide.index(), false);\n }\n }\n emit('lazyImageReady', $slideEl[0], $imageEl[0]);\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n });\n\n emit('lazyImageLoad', $slideEl[0], $imageEl[0]);\n });\n }\n\n function load() {\n const { $wrapperEl, params: swiperParams, slides, activeIndex } = swiper;\n const isVirtual = swiper.virtual && swiperParams.virtual.enabled;\n const params = swiperParams.lazy;\n\n let slidesPerView = swiperParams.slidesPerView;\n if (slidesPerView === 'auto') {\n slidesPerView = 0;\n }\n\n function slideExist(index) {\n if (isVirtual) {\n if (\n $wrapperEl.children(`.${swiperParams.slideClass}[data-swiper-slide-index=\"${index}\"]`)\n .length\n ) {\n return true;\n }\n } else if (slides[index]) return true;\n return false;\n }\n\n function slideIndex(slideEl) {\n if (isVirtual) {\n return $(slideEl).attr('data-swiper-slide-index');\n }\n return $(slideEl).index();\n }\n\n if (!initialImageLoaded) initialImageLoaded = true;\n if (swiper.params.watchSlidesProgress) {\n $wrapperEl.children(`.${swiperParams.slideVisibleClass}`).each((slideEl) => {\n const index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();\n loadInSlide(index);\n });\n } else if (slidesPerView > 1) {\n for (let i = activeIndex; i < activeIndex + slidesPerView; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n } else {\n loadInSlide(activeIndex);\n }\n if (params.loadPrevNext) {\n if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {\n const amount = params.loadPrevNextAmount;\n const spv = slidesPerView;\n const maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);\n const minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);\n // Next Slides\n for (let i = activeIndex + slidesPerView; i < maxIndex; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n // Prev Slides\n for (let i = minIndex; i < activeIndex; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n } else {\n const nextSlide = $wrapperEl.children(`.${swiperParams.slideNextClass}`);\n if (nextSlide.length > 0) loadInSlide(slideIndex(nextSlide));\n\n const prevSlide = $wrapperEl.children(`.${swiperParams.slidePrevClass}`);\n if (prevSlide.length > 0) loadInSlide(slideIndex(prevSlide));\n }\n }\n }\n function checkInViewOnLoad() {\n const window = getWindow();\n if (!swiper || swiper.destroyed) return;\n const $scrollElement = swiper.params.lazy.scrollingElement\n ? $(swiper.params.lazy.scrollingElement)\n : $(window);\n const isWindow = $scrollElement[0] === window;\n const scrollElementWidth = isWindow ? window.innerWidth : $scrollElement[0].offsetWidth;\n const scrollElementHeight = isWindow ? window.innerHeight : $scrollElement[0].offsetHeight;\n const swiperOffset = swiper.$el.offset();\n const { rtlTranslate: rtl } = swiper;\n\n let inView = false;\n\n if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n const swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiper.width, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiper.height],\n [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height],\n ];\n for (let i = 0; i < swiperCoord.length; i += 1) {\n const point = swiperCoord[i];\n if (\n point[0] >= 0 &&\n point[0] <= scrollElementWidth &&\n point[1] >= 0 &&\n point[1] <= scrollElementHeight\n ) {\n if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n inView = true;\n }\n }\n\n const passiveListener =\n swiper.touchEvents.start === 'touchstart' &&\n swiper.support.passiveListener &&\n swiper.params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n\n if (inView) {\n load();\n $scrollElement.off('scroll', checkInViewOnLoad, passiveListener);\n } else if (!scrollHandlerAttached) {\n scrollHandlerAttached = true;\n $scrollElement.on('scroll', checkInViewOnLoad, passiveListener);\n }\n }\n\n on('beforeInit', () => {\n if (swiper.params.lazy.enabled && swiper.params.preloadImages) {\n swiper.params.preloadImages = false;\n }\n });\n on('init', () => {\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('scroll', () => {\n if (\n swiper.params.freeMode &&\n swiper.params.freeMode.enabled &&\n !swiper.params.freeMode.sticky\n ) {\n load();\n }\n });\n on('scrollbarDragMove resize _freeModeNoMomentumRelease', () => {\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('transitionStart', () => {\n if (swiper.params.lazy.enabled) {\n if (\n swiper.params.lazy.loadOnTransitionStart ||\n (!swiper.params.lazy.loadOnTransitionStart && !initialImageLoaded)\n ) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n }\n });\n on('transitionEnd', () => {\n if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('slideChange', () => {\n const { lazy, cssMode, watchSlidesProgress, touchReleaseOnEdges, resistanceRatio } =\n swiper.params;\n if (\n lazy.enabled &&\n (cssMode || (watchSlidesProgress && (touchReleaseOnEdges || resistanceRatio === 0)))\n ) {\n load();\n }\n });\n\n Object.assign(swiper.lazy, {\n load,\n loadInSlide,\n });\n}\n","/* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function Controller({ swiper, extendParams, on }) {\n extendParams({\n controller: {\n control: undefined,\n inverse: false,\n by: 'slide', // or 'container'\n },\n });\n\n swiper.controller = {\n control: undefined,\n };\n\n function LinearSpline(x, y) {\n const binarySearch = (function search() {\n let maxIndex;\n let minIndex;\n let guess;\n return (array, val) => {\n minIndex = -1;\n maxIndex = array.length;\n while (maxIndex - minIndex > 1) {\n guess = (maxIndex + minIndex) >> 1;\n if (array[guess] <= val) {\n minIndex = guess;\n } else {\n maxIndex = guess;\n }\n }\n return maxIndex;\n };\n })();\n this.x = x;\n this.y = y;\n this.lastIndex = x.length - 1;\n // Given an x value (x2), return the expected y2 value:\n // (x1,y1) is the known point before given value,\n // (x3,y3) is the known point after given value.\n let i1;\n let i3;\n\n this.interpolate = function interpolate(x2) {\n if (!x2) return 0;\n\n // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n i3 = binarySearch(this.x, x2);\n i1 = i3 - 1;\n\n // We have our indexes i1 & i3, so we can calculate already:\n // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n return (\n ((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1]) + this.y[i1]\n );\n };\n return this;\n }\n // xxx: for now i will just save one spline function to to\n function getInterpolateFunction(c) {\n if (!swiper.controller.spline) {\n swiper.controller.spline = swiper.params.loop\n ? new LinearSpline(swiper.slidesGrid, c.slidesGrid)\n : new LinearSpline(swiper.snapGrid, c.snapGrid);\n }\n }\n function setTranslate(_t, byController) {\n const controlled = swiper.controller.control;\n let multiplier;\n let controlledTranslate;\n const Swiper = swiper.constructor;\n function setControlledTranslate(c) {\n // this will create an Interpolate function based on the snapGrids\n // x is the Grid of the scrolled scroller and y will be the controlled scroller\n // it makes sense to create this only once and recall it for the interpolation\n // the function does a lot of value caching for performance\n const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;\n if (swiper.params.controller.by === 'slide') {\n getInterpolateFunction(c);\n // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n // but it did not work out\n controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n }\n\n if (!controlledTranslate || swiper.params.controller.by === 'container') {\n multiplier =\n (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();\n }\n\n if (swiper.params.controller.inverse) {\n controlledTranslate = c.maxTranslate() - controlledTranslate;\n }\n c.updateProgress(controlledTranslate);\n c.setTranslate(controlledTranslate, swiper);\n c.updateActiveIndex();\n c.updateSlidesClasses();\n }\n if (Array.isArray(controlled)) {\n for (let i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTranslate(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTranslate(controlled);\n }\n }\n function setTransition(duration, byController) {\n const Swiper = swiper.constructor;\n const controlled = swiper.controller.control;\n let i;\n function setControlledTransition(c) {\n c.setTransition(duration, swiper);\n if (duration !== 0) {\n c.transitionStart();\n if (c.params.autoHeight) {\n nextTick(() => {\n c.updateAutoHeight();\n });\n }\n c.$wrapperEl.transitionEnd(() => {\n if (!controlled) return;\n if (c.params.loop && swiper.params.controller.by === 'slide') {\n c.loopFix();\n }\n c.transitionEnd();\n });\n }\n }\n if (Array.isArray(controlled)) {\n for (i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTransition(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTransition(controlled);\n }\n }\n\n function removeSpline() {\n if (!swiper.controller.control) return;\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n }\n on('beforeInit', () => {\n swiper.controller.control = swiper.params.controller.control;\n });\n on('update', () => {\n removeSpline();\n });\n on('resize', () => {\n removeSpline();\n });\n on('observerUpdate', () => {\n removeSpline();\n });\n on('setTranslate', (_s, translate, byController) => {\n if (!swiper.controller.control) return;\n swiper.controller.setTranslate(translate, byController);\n });\n on('setTransition', (_s, duration, byController) => {\n if (!swiper.controller.control) return;\n swiper.controller.setTransition(duration, byController);\n });\n\n Object.assign(swiper.controller, {\n setTranslate,\n setTransition,\n });\n}\n","import classesToSelector from '../../shared/classes-to-selector.js';\nimport $ from '../../shared/dom.js';\n\nexport default function A11y({ swiper, extendParams, on }) {\n extendParams({\n a11y: {\n enabled: true,\n notificationClass: 'swiper-notification',\n prevSlideMessage: 'Previous slide',\n nextSlideMessage: 'Next slide',\n firstSlideMessage: 'This is the first slide',\n lastSlideMessage: 'This is the last slide',\n paginationBulletMessage: 'Go to slide {{index}}',\n slideLabelMessage: '{{index}} / {{slidesLength}}',\n containerMessage: null,\n containerRoleDescriptionMessage: null,\n itemRoleDescriptionMessage: null,\n slideRole: 'group',\n },\n });\n\n let liveRegion = null;\n\n function notify(message) {\n const notification = liveRegion;\n if (notification.length === 0) return;\n notification.html('');\n notification.html(message);\n }\n\n function getRandomNumber(size = 16) {\n const randomChar = () => Math.round(16 * Math.random()).toString(16);\n return 'x'.repeat(size).replace(/x/g, randomChar);\n }\n function makeElFocusable($el) {\n $el.attr('tabIndex', '0');\n }\n function makeElNotFocusable($el) {\n $el.attr('tabIndex', '-1');\n }\n function addElRole($el, role) {\n $el.attr('role', role);\n }\n function addElRoleDescription($el, description) {\n $el.attr('aria-roledescription', description);\n }\n function addElControls($el, controls) {\n $el.attr('aria-controls', controls);\n }\n function addElLabel($el, label) {\n $el.attr('aria-label', label);\n }\n function addElId($el, id) {\n $el.attr('id', id);\n }\n function addElLive($el, live) {\n $el.attr('aria-live', live);\n }\n function disableEl($el) {\n $el.attr('aria-disabled', true);\n }\n function enableEl($el) {\n $el.attr('aria-disabled', false);\n }\n\n function onEnterOrSpaceKey(e) {\n if (e.keyCode !== 13 && e.keyCode !== 32) return;\n const params = swiper.params.a11y;\n const $targetEl = $(e.target);\n if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {\n if (!(swiper.isEnd && !swiper.params.loop)) {\n swiper.slideNext();\n }\n if (swiper.isEnd) {\n notify(params.lastSlideMessage);\n } else {\n notify(params.nextSlideMessage);\n }\n }\n if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {\n if (!(swiper.isBeginning && !swiper.params.loop)) {\n swiper.slidePrev();\n }\n if (swiper.isBeginning) {\n notify(params.firstSlideMessage);\n } else {\n notify(params.prevSlideMessage);\n }\n }\n\n if (\n swiper.pagination &&\n $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))\n ) {\n $targetEl[0].click();\n }\n }\n\n function updateNavigation() {\n if (swiper.params.loop || !swiper.navigation) return;\n const { $nextEl, $prevEl } = swiper.navigation;\n\n if ($prevEl && $prevEl.length > 0) {\n if (swiper.isBeginning) {\n disableEl($prevEl);\n makeElNotFocusable($prevEl);\n } else {\n enableEl($prevEl);\n makeElFocusable($prevEl);\n }\n }\n if ($nextEl && $nextEl.length > 0) {\n if (swiper.isEnd) {\n disableEl($nextEl);\n makeElNotFocusable($nextEl);\n } else {\n enableEl($nextEl);\n makeElFocusable($nextEl);\n }\n }\n }\n\n function hasPagination() {\n return (\n swiper.pagination &&\n swiper.params.pagination.clickable &&\n swiper.pagination.bullets &&\n swiper.pagination.bullets.length\n );\n }\n\n function updatePagination() {\n const params = swiper.params.a11y;\n if (hasPagination()) {\n swiper.pagination.bullets.each((bulletEl) => {\n const $bulletEl = $(bulletEl);\n makeElFocusable($bulletEl);\n if (!swiper.params.pagination.renderBullet) {\n addElRole($bulletEl, 'button');\n addElLabel(\n $bulletEl,\n params.paginationBulletMessage.replace(/\\{\\{index\\}\\}/, $bulletEl.index() + 1),\n );\n }\n });\n }\n }\n\n const initNavEl = ($el, wrapperId, message) => {\n makeElFocusable($el);\n if ($el[0].tagName !== 'BUTTON') {\n addElRole($el, 'button');\n $el.on('keydown', onEnterOrSpaceKey);\n }\n addElLabel($el, message);\n addElControls($el, wrapperId);\n };\n\n function init() {\n const params = swiper.params.a11y;\n\n swiper.$el.append(liveRegion);\n\n // Container\n const $containerEl = swiper.$el;\n if (params.containerRoleDescriptionMessage) {\n addElRoleDescription($containerEl, params.containerRoleDescriptionMessage);\n }\n if (params.containerMessage) {\n addElLabel($containerEl, params.containerMessage);\n }\n\n // Wrapper\n const $wrapperEl = swiper.$wrapperEl;\n const wrapperId = $wrapperEl.attr('id') || `swiper-wrapper-${getRandomNumber(16)}`;\n const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';\n addElId($wrapperEl, wrapperId);\n addElLive($wrapperEl, live);\n\n // Slide\n if (params.itemRoleDescriptionMessage) {\n addElRoleDescription($(swiper.slides), params.itemRoleDescriptionMessage);\n }\n addElRole($(swiper.slides), params.slideRole);\n\n const slidesLength = swiper.params.loop\n ? swiper.slides.filter((el) => !el.classList.contains(swiper.params.slideDuplicateClass))\n .length\n : swiper.slides.length;\n swiper.slides.each((slideEl, index) => {\n const $slideEl = $(slideEl);\n const slideIndex = swiper.params.loop\n ? parseInt($slideEl.attr('data-swiper-slide-index'), 10)\n : index;\n const ariaLabelMessage = params.slideLabelMessage\n .replace(/\\{\\{index\\}\\}/, slideIndex + 1)\n .replace(/\\{\\{slidesLength\\}\\}/, slidesLength);\n addElLabel($slideEl, ariaLabelMessage);\n });\n\n // Navigation\n let $nextEl;\n let $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n\n if ($nextEl && $nextEl.length) {\n initNavEl($nextEl, wrapperId, params.nextSlideMessage);\n }\n if ($prevEl && $prevEl.length) {\n initNavEl($prevEl, wrapperId, params.prevSlideMessage);\n }\n\n // Pagination\n if (hasPagination()) {\n swiper.pagination.$el.on(\n 'keydown',\n classesToSelector(swiper.params.pagination.bulletClass),\n onEnterOrSpaceKey,\n );\n }\n }\n function destroy() {\n if (liveRegion && liveRegion.length > 0) liveRegion.remove();\n\n let $nextEl;\n let $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n if ($nextEl) {\n $nextEl.off('keydown', onEnterOrSpaceKey);\n }\n if ($prevEl) {\n $prevEl.off('keydown', onEnterOrSpaceKey);\n }\n\n // Pagination\n if (hasPagination()) {\n swiper.pagination.$el.off(\n 'keydown',\n classesToSelector(swiper.params.pagination.bulletClass),\n onEnterOrSpaceKey,\n );\n }\n }\n\n on('beforeInit', () => {\n liveRegion = $(\n ``,\n );\n });\n\n on('afterInit', () => {\n if (!swiper.params.a11y.enabled) return;\n init();\n updateNavigation();\n });\n on('toEdge', () => {\n if (!swiper.params.a11y.enabled) return;\n updateNavigation();\n });\n on('fromEdge', () => {\n if (!swiper.params.a11y.enabled) return;\n updateNavigation();\n });\n on('paginationUpdate', () => {\n if (!swiper.params.a11y.enabled) return;\n updatePagination();\n });\n on('destroy', () => {\n if (!swiper.params.a11y.enabled) return;\n destroy();\n });\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function History({ swiper, extendParams, on }) {\n extendParams({\n history: {\n enabled: false,\n root: '',\n replaceState: false,\n key: 'slides',\n },\n });\n\n let initialized = false;\n let paths = {};\n\n const slugify = (text) => {\n return text\n .toString()\n .replace(/\\s+/g, '-')\n .replace(/[^\\w-]+/g, '')\n .replace(/--+/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n };\n\n const getPathValues = (urlOverride) => {\n const window = getWindow();\n let location;\n if (urlOverride) {\n location = new URL(urlOverride);\n } else {\n location = window.location;\n }\n const pathArray = location.pathname\n .slice(1)\n .split('/')\n .filter((part) => part !== '');\n const total = pathArray.length;\n const key = pathArray[total - 2];\n const value = pathArray[total - 1];\n return { key, value };\n };\n const setHistory = (key, index) => {\n const window = getWindow();\n if (!initialized || !swiper.params.history.enabled) return;\n let location;\n if (swiper.params.url) {\n location = new URL(swiper.params.url);\n } else {\n location = window.location;\n }\n const slide = swiper.slides.eq(index);\n let value = slugify(slide.attr('data-history'));\n if (swiper.params.history.root.length > 0) {\n let root = swiper.params.history.root;\n if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);\n value = `${root}/${key}/${value}`;\n } else if (!location.pathname.includes(key)) {\n value = `${key}/${value}`;\n }\n const currentState = window.history.state;\n if (currentState && currentState.value === value) {\n return;\n }\n if (swiper.params.history.replaceState) {\n window.history.replaceState({ value }, null, value);\n } else {\n window.history.pushState({ value }, null, value);\n }\n };\n\n const scrollToSlide = (speed, value, runCallbacks) => {\n if (value) {\n for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n const slide = swiper.slides.eq(i);\n const slideHistory = slugify(slide.attr('data-history'));\n if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n const index = slide.index();\n swiper.slideTo(index, speed, runCallbacks);\n }\n }\n } else {\n swiper.slideTo(0, speed, runCallbacks);\n }\n };\n\n const setHistoryPopState = () => {\n paths = getPathValues(swiper.params.url);\n scrollToSlide(swiper.params.speed, swiper.paths.value, false);\n };\n\n const init = () => {\n const window = getWindow();\n if (!swiper.params.history) return;\n if (!window.history || !window.history.pushState) {\n swiper.params.history.enabled = false;\n swiper.params.hashNavigation.enabled = true;\n return;\n }\n initialized = true;\n paths = getPathValues(swiper.params.url);\n if (!paths.key && !paths.value) return;\n scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);\n if (!swiper.params.history.replaceState) {\n window.addEventListener('popstate', setHistoryPopState);\n }\n };\n const destroy = () => {\n const window = getWindow();\n if (!swiper.params.history.replaceState) {\n window.removeEventListener('popstate', setHistoryPopState);\n }\n };\n\n on('init', () => {\n if (swiper.params.history.enabled) {\n init();\n }\n });\n on('destroy', () => {\n if (swiper.params.history.enabled) {\n destroy();\n }\n });\n on('transitionEnd _freeModeNoMomentumRelease', () => {\n if (initialized) {\n setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n });\n on('slideChange', () => {\n if (initialized && swiper.params.cssMode) {\n setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n });\n}\n","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function HashNavigation({ swiper, extendParams, emit, on }) {\n let initialized = false;\n const document = getDocument();\n const window = getWindow();\n extendParams({\n hashNavigation: {\n enabled: false,\n replaceState: false,\n watchState: false,\n },\n });\n const onHashChange = () => {\n emit('hashChange');\n const newHash = document.location.hash.replace('#', '');\n const activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');\n if (newHash !== activeSlideHash) {\n const newIndex = swiper.$wrapperEl\n .children(`.${swiper.params.slideClass}[data-hash=\"${newHash}\"]`)\n .index();\n if (typeof newIndex === 'undefined') return;\n swiper.slideTo(newIndex);\n }\n };\n const setHash = () => {\n if (!initialized || !swiper.params.hashNavigation.enabled) return;\n if (\n swiper.params.hashNavigation.replaceState &&\n window.history &&\n window.history.replaceState\n ) {\n window.history.replaceState(\n null,\n null,\n `#${swiper.slides.eq(swiper.activeIndex).attr('data-hash')}` || '',\n );\n emit('hashSet');\n } else {\n const slide = swiper.slides.eq(swiper.activeIndex);\n const hash = slide.attr('data-hash') || slide.attr('data-history');\n document.location.hash = hash || '';\n emit('hashSet');\n }\n };\n const init = () => {\n if (\n !swiper.params.hashNavigation.enabled ||\n (swiper.params.history && swiper.params.history.enabled)\n )\n return;\n initialized = true;\n const hash = document.location.hash.replace('#', '');\n if (hash) {\n const speed = 0;\n for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n const slide = swiper.slides.eq(i);\n const slideHash = slide.attr('data-hash') || slide.attr('data-history');\n if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n const index = slide.index();\n swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);\n }\n }\n }\n if (swiper.params.hashNavigation.watchState) {\n $(window).on('hashchange', onHashChange);\n }\n };\n const destroy = () => {\n if (swiper.params.hashNavigation.watchState) {\n $(window).off('hashchange', onHashChange);\n }\n };\n\n on('init', () => {\n if (swiper.params.hashNavigation.enabled) {\n init();\n }\n });\n on('destroy', () => {\n if (swiper.params.hashNavigation.enabled) {\n destroy();\n }\n });\n on('transitionEnd _freeModeNoMomentumRelease', () => {\n if (initialized) {\n setHash();\n }\n });\n on('slideChange', () => {\n if (initialized && swiper.params.cssMode) {\n setHash();\n }\n });\n}\n","/* eslint no-underscore-dangle: \"off\" */\n/* eslint no-use-before-define: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function Autoplay({ swiper, extendParams, on, emit }) {\n let timeout;\n\n swiper.autoplay = {\n running: false,\n paused: false,\n };\n\n extendParams({\n autoplay: {\n enabled: false,\n delay: 3000,\n waitForTransition: true,\n disableOnInteraction: true,\n stopOnLastSlide: false,\n reverseDirection: false,\n pauseOnMouseEnter: false,\n },\n });\n\n function run() {\n const $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n let delay = swiper.params.autoplay.delay;\n if ($activeSlideEl.attr('data-swiper-autoplay')) {\n delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n }\n clearTimeout(timeout);\n timeout = nextTick(() => {\n let autoplayResult;\n if (swiper.params.autoplay.reverseDirection) {\n if (swiper.params.loop) {\n swiper.loopFix();\n autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.isBeginning) {\n autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n autoplayResult = swiper.slideTo(\n swiper.slides.length - 1,\n swiper.params.speed,\n true,\n true,\n );\n emit('autoplay');\n } else {\n stop();\n }\n } else if (swiper.params.loop) {\n swiper.loopFix();\n autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.isEnd) {\n autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true);\n emit('autoplay');\n } else {\n stop();\n }\n if (swiper.params.cssMode && swiper.autoplay.running) run();\n else if (autoplayResult === false) {\n run();\n }\n }, delay);\n }\n function start() {\n if (typeof timeout !== 'undefined') return false;\n if (swiper.autoplay.running) return false;\n swiper.autoplay.running = true;\n emit('autoplayStart');\n run();\n return true;\n }\n function stop() {\n if (!swiper.autoplay.running) return false;\n if (typeof timeout === 'undefined') return false;\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n swiper.autoplay.running = false;\n emit('autoplayStop');\n return true;\n }\n function pause(speed) {\n if (!swiper.autoplay.running) return;\n if (swiper.autoplay.paused) return;\n if (timeout) clearTimeout(timeout);\n swiper.autoplay.paused = true;\n if (speed === 0 || !swiper.params.autoplay.waitForTransition) {\n swiper.autoplay.paused = false;\n run();\n } else {\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd);\n });\n }\n }\n function onVisibilityChange() {\n const document = getDocument();\n if (document.visibilityState === 'hidden' && swiper.autoplay.running) {\n pause();\n }\n if (document.visibilityState === 'visible' && swiper.autoplay.paused) {\n run();\n swiper.autoplay.paused = false;\n }\n }\n function onTransitionEnd(e) {\n if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return;\n if (e.target !== swiper.$wrapperEl[0]) return;\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n });\n swiper.autoplay.paused = false;\n if (!swiper.autoplay.running) {\n stop();\n } else {\n run();\n }\n }\n function onMouseEnter() {\n if (swiper.params.autoplay.disableOnInteraction) {\n stop();\n } else {\n pause();\n }\n\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n });\n }\n function onMouseLeave() {\n if (swiper.params.autoplay.disableOnInteraction) {\n return;\n }\n swiper.autoplay.paused = false;\n run();\n }\n function attachMouseEvents() {\n if (swiper.params.autoplay.pauseOnMouseEnter) {\n swiper.$el.on('mouseenter', onMouseEnter);\n swiper.$el.on('mouseleave', onMouseLeave);\n }\n }\n function detachMouseEvents() {\n swiper.$el.off('mouseenter', onMouseEnter);\n swiper.$el.off('mouseleave', onMouseLeave);\n }\n\n on('init', () => {\n if (swiper.params.autoplay.enabled) {\n start();\n const document = getDocument();\n document.addEventListener('visibilitychange', onVisibilityChange);\n attachMouseEvents();\n }\n });\n on('beforeTransitionStart', (_s, speed, internal) => {\n if (swiper.autoplay.running) {\n if (internal || !swiper.params.autoplay.disableOnInteraction) {\n swiper.autoplay.pause(speed);\n } else {\n stop();\n }\n }\n });\n on('sliderFirstMove', () => {\n if (swiper.autoplay.running) {\n if (swiper.params.autoplay.disableOnInteraction) {\n stop();\n } else {\n pause();\n }\n }\n });\n on('touchEnd', () => {\n if (\n swiper.params.cssMode &&\n swiper.autoplay.paused &&\n !swiper.params.autoplay.disableOnInteraction\n ) {\n run();\n }\n });\n on('destroy', () => {\n detachMouseEvents();\n if (swiper.autoplay.running) {\n stop();\n }\n const document = getDocument();\n document.removeEventListener('visibilitychange', onVisibilityChange);\n });\n\n Object.assign(swiper.autoplay, {\n pause,\n run,\n start,\n stop,\n });\n}\n","import { isObject } from '../../shared/utils.js';\nimport $ from '../../shared/dom.js';\n\nexport default function Thumb({ swiper, extendParams, on }) {\n extendParams({\n thumbs: {\n swiper: null,\n multipleActiveThumbs: true,\n autoScrollOffset: 0,\n slideThumbActiveClass: 'swiper-slide-thumb-active',\n thumbsContainerClass: 'swiper-thumbs',\n },\n });\n\n let initialized = false;\n let swiperCreated = false;\n\n swiper.thumbs = {\n swiper: null,\n };\n\n function onThumbClick() {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n const clickedIndex = thumbsSwiper.clickedIndex;\n const clickedSlide = thumbsSwiper.clickedSlide;\n if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass))\n return;\n if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;\n let slideToIndex;\n if (thumbsSwiper.params.loop) {\n slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n } else {\n slideToIndex = clickedIndex;\n }\n if (swiper.params.loop) {\n let currentIndex = swiper.activeIndex;\n if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n currentIndex = swiper.activeIndex;\n }\n const prevIndex = swiper.slides\n .eq(currentIndex)\n .prevAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`)\n .eq(0)\n .index();\n const nextIndex = swiper.slides\n .eq(currentIndex)\n .nextAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`)\n .eq(0)\n .index();\n if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;\n else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;\n else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;\n else slideToIndex = prevIndex;\n }\n swiper.slideTo(slideToIndex);\n }\n\n function init() {\n const { thumbs: thumbsParams } = swiper.params;\n if (initialized) return false;\n initialized = true;\n const SwiperClass = swiper.constructor;\n if (thumbsParams.swiper instanceof SwiperClass) {\n swiper.thumbs.swiper = thumbsParams.swiper;\n Object.assign(swiper.thumbs.swiper.originalParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n Object.assign(swiper.thumbs.swiper.params, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n } else if (isObject(thumbsParams.swiper)) {\n const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);\n Object.assign(thumbsSwiperParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);\n swiperCreated = true;\n }\n swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);\n swiper.thumbs.swiper.on('tap', onThumbClick);\n return true;\n }\n\n function update(initial) {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n\n const slidesPerView =\n thumbsSwiper.params.slidesPerView === 'auto'\n ? thumbsSwiper.slidesPerViewDynamic()\n : thumbsSwiper.params.slidesPerView;\n\n const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;\n const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;\n if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {\n let currentThumbsIndex = thumbsSwiper.activeIndex;\n let newThumbsIndex;\n let direction;\n if (thumbsSwiper.params.loop) {\n if (\n thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .hasClass(thumbsSwiper.params.slideDuplicateClass)\n ) {\n thumbsSwiper.loopFix();\n // eslint-disable-next-line\n thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;\n currentThumbsIndex = thumbsSwiper.activeIndex;\n }\n // Find actual thumbs index to slide to\n const prevThumbsIndex = thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .prevAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`)\n .eq(0)\n .index();\n const nextThumbsIndex = thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .nextAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`)\n .eq(0)\n .index();\n if (typeof prevThumbsIndex === 'undefined') {\n newThumbsIndex = nextThumbsIndex;\n } else if (typeof nextThumbsIndex === 'undefined') {\n newThumbsIndex = prevThumbsIndex;\n } else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) {\n newThumbsIndex =\n thumbsSwiper.params.slidesPerGroup > 1 ? nextThumbsIndex : currentThumbsIndex;\n } else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) {\n newThumbsIndex = nextThumbsIndex;\n } else {\n newThumbsIndex = prevThumbsIndex;\n }\n direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';\n } else {\n newThumbsIndex = swiper.realIndex;\n direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';\n }\n if (useOffset) {\n newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;\n }\n\n if (\n thumbsSwiper.visibleSlidesIndexes &&\n thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0\n ) {\n if (thumbsSwiper.params.centeredSlides) {\n if (newThumbsIndex > currentThumbsIndex) {\n newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;\n } else {\n newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;\n }\n } else if (\n newThumbsIndex > currentThumbsIndex &&\n thumbsSwiper.params.slidesPerGroup === 1\n ) {\n // newThumbsIndex = newThumbsIndex - slidesPerView + 1;\n }\n thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);\n }\n }\n\n // Activate thumbs\n let thumbsToActivate = 1;\n const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n\n if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n thumbsToActivate = swiper.params.slidesPerView;\n }\n\n if (!swiper.params.thumbs.multipleActiveThumbs) {\n thumbsToActivate = 1;\n }\n\n thumbsToActivate = Math.floor(thumbsToActivate);\n\n thumbsSwiper.slides.removeClass(thumbActiveClass);\n if (\n thumbsSwiper.params.loop ||\n (thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled)\n ) {\n for (let i = 0; i < thumbsToActivate; i += 1) {\n thumbsSwiper.$wrapperEl\n .children(`[data-swiper-slide-index=\"${swiper.realIndex + i}\"]`)\n .addClass(thumbActiveClass);\n }\n } else {\n for (let i = 0; i < thumbsToActivate; i += 1) {\n thumbsSwiper.slides.eq(swiper.realIndex + i).addClass(thumbActiveClass);\n }\n }\n }\n\n on('beforeInit', () => {\n const { thumbs } = swiper.params;\n if (!thumbs || !thumbs.swiper) return;\n init();\n update(true);\n });\n on('slideChange update resize observerUpdate', () => {\n if (!swiper.thumbs.swiper) return;\n update();\n });\n on('setTransition', (_s, duration) => {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n thumbsSwiper.setTransition(duration);\n });\n on('beforeDestroy', () => {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n if (swiperCreated && thumbsSwiper) {\n thumbsSwiper.destroy();\n }\n });\n\n Object.assign(swiper.thumbs, {\n init,\n update,\n });\n}\n","import { now } from '../../shared/utils.js';\n\nexport default function freeMode({ swiper, extendParams, emit, once }) {\n extendParams({\n freeMode: {\n enabled: false,\n momentum: true,\n momentumRatio: 1,\n momentumBounce: true,\n momentumBounceRatio: 1,\n momentumVelocityRatio: 1,\n sticky: false,\n minimumVelocity: 0.02,\n },\n });\n\n function onTouchMove() {\n const { touchEventsData: data, touches } = swiper;\n // Velocity\n if (data.velocities.length === 0) {\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n time: data.touchStartTime,\n });\n }\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n time: now(),\n });\n }\n\n function onTouchEnd({ currentPos }) {\n const { params, $wrapperEl, rtlTranslate: rtl, snapGrid, touchEventsData: data } = swiper;\n // Time diff\n const touchEndTime = now();\n const timeDiff = touchEndTime - data.touchStartTime;\n\n if (currentPos < -swiper.minTranslate()) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (currentPos > -swiper.maxTranslate()) {\n if (swiper.slides.length < snapGrid.length) {\n swiper.slideTo(snapGrid.length - 1);\n } else {\n swiper.slideTo(swiper.slides.length - 1);\n }\n return;\n }\n\n if (params.freeMode.momentum) {\n if (data.velocities.length > 1) {\n const lastMoveEvent = data.velocities.pop();\n const velocityEvent = data.velocities.pop();\n\n const distance = lastMoveEvent.position - velocityEvent.position;\n const time = lastMoveEvent.time - velocityEvent.time;\n swiper.velocity = distance / time;\n swiper.velocity /= 2;\n if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {\n swiper.velocity = 0;\n }\n // this implies that the user stopped moving a finger then released.\n // There would be no events with distance zero, so the last event is stale.\n if (time > 150 || now() - lastMoveEvent.time > 300) {\n swiper.velocity = 0;\n }\n } else {\n swiper.velocity = 0;\n }\n swiper.velocity *= params.freeMode.momentumVelocityRatio;\n\n data.velocities.length = 0;\n let momentumDuration = 1000 * params.freeMode.momentumRatio;\n const momentumDistance = swiper.velocity * momentumDuration;\n\n let newPosition = swiper.translate + momentumDistance;\n if (rtl) newPosition = -newPosition;\n\n let doBounce = false;\n let afterBouncePosition;\n const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;\n let needsLoopFix;\n if (newPosition < swiper.maxTranslate()) {\n if (params.freeMode.momentumBounce) {\n if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n newPosition = swiper.maxTranslate() - bounceAmount;\n }\n afterBouncePosition = swiper.maxTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.maxTranslate();\n }\n if (params.loop && params.centeredSlides) needsLoopFix = true;\n } else if (newPosition > swiper.minTranslate()) {\n if (params.freeMode.momentumBounce) {\n if (newPosition - swiper.minTranslate() > bounceAmount) {\n newPosition = swiper.minTranslate() + bounceAmount;\n }\n afterBouncePosition = swiper.minTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.minTranslate();\n }\n if (params.loop && params.centeredSlides) needsLoopFix = true;\n } else if (params.freeMode.sticky) {\n let nextSlide;\n for (let j = 0; j < snapGrid.length; j += 1) {\n if (snapGrid[j] > -newPosition) {\n nextSlide = j;\n break;\n }\n }\n\n if (\n Math.abs(snapGrid[nextSlide] - newPosition) <\n Math.abs(snapGrid[nextSlide - 1] - newPosition) ||\n swiper.swipeDirection === 'next'\n ) {\n newPosition = snapGrid[nextSlide];\n } else {\n newPosition = snapGrid[nextSlide - 1];\n }\n newPosition = -newPosition;\n }\n if (needsLoopFix) {\n once('transitionEnd', () => {\n swiper.loopFix();\n });\n }\n // Fix duration\n if (swiper.velocity !== 0) {\n if (rtl) {\n momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n } else {\n momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n }\n if (params.freeMode.sticky) {\n // If freeMode.sticky is active and the user ends a swipe with a slow-velocity\n // event, then durations can be 20+ seconds to slide one (or zero!) slides.\n // It's easy to see this when simulating touch with mouse events. To fix this,\n // limit single-slide swipes to the default slide duration. This also has the\n // nice side effect of matching slide speed if the user stopped moving before\n // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.\n // For faster swipes, also apply limits (albeit higher ones).\n const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);\n const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];\n if (moveDistance < currentSlideSize) {\n momentumDuration = params.speed;\n } else if (moveDistance < 2 * currentSlideSize) {\n momentumDuration = params.speed * 1.5;\n } else {\n momentumDuration = params.speed * 2.5;\n }\n }\n } else if (params.freeMode.sticky) {\n swiper.slideToClosest();\n return;\n }\n\n if (params.freeMode.momentumBounce && doBounce) {\n swiper.updateProgress(afterBouncePosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n swiper.animating = true;\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;\n emit('momentumBounce');\n swiper.setTransition(params.speed);\n setTimeout(() => {\n swiper.setTranslate(afterBouncePosition);\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed) return;\n swiper.transitionEnd();\n });\n }, 0);\n });\n } else if (swiper.velocity) {\n emit('_freeModeNoMomentumRelease');\n swiper.updateProgress(newPosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n if (!swiper.animating) {\n swiper.animating = true;\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed) return;\n swiper.transitionEnd();\n });\n }\n } else {\n swiper.updateProgress(newPosition);\n }\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n } else if (params.freeMode.sticky) {\n swiper.slideToClosest();\n return;\n } else if (params.freeMode) {\n emit('_freeModeNoMomentumRelease');\n }\n\n if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n }\n\n Object.assign(swiper, {\n freeMode: {\n onTouchMove,\n onTouchEnd,\n },\n });\n}\n","export default function Grid({ swiper, extendParams }) {\n extendParams({\n grid: {\n rows: 1,\n fill: 'column',\n },\n });\n\n let slidesNumberEvenToRows;\n let slidesPerRow;\n let numFullColumns;\n\n const initSlides = (slidesLength) => {\n const { slidesPerView } = swiper.params;\n const { rows, fill } = swiper.params.grid;\n slidesPerRow = slidesNumberEvenToRows / rows;\n numFullColumns = Math.floor(slidesLength / rows);\n if (Math.floor(slidesLength / rows) === slidesLength / rows) {\n slidesNumberEvenToRows = slidesLength;\n } else {\n slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;\n }\n if (slidesPerView !== 'auto' && fill === 'row') {\n slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows);\n }\n };\n\n const updateSlide = (i, slide, slidesLength, getDirectionLabel) => {\n const { slidesPerGroup, spaceBetween } = swiper.params;\n const { rows, fill } = swiper.params.grid;\n // Set slides order\n let newSlideOrderIndex;\n let column;\n let row;\n if (fill === 'row' && slidesPerGroup > 1) {\n const groupIndex = Math.floor(i / (slidesPerGroup * rows));\n const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;\n const columnsInGroup =\n groupIndex === 0\n ? slidesPerGroup\n : Math.min(\n Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows),\n slidesPerGroup,\n );\n row = Math.floor(slideIndexInGroup / columnsInGroup);\n column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;\n\n newSlideOrderIndex = column + (row * slidesNumberEvenToRows) / rows;\n slide.css({\n '-webkit-order': newSlideOrderIndex,\n order: newSlideOrderIndex,\n });\n } else if (fill === 'column') {\n column = Math.floor(i / rows);\n row = i - column * rows;\n if (column > numFullColumns || (column === numFullColumns && row === rows - 1)) {\n row += 1;\n if (row >= rows) {\n row = 0;\n column += 1;\n }\n }\n } else {\n row = Math.floor(i / slidesPerRow);\n column = i - row * slidesPerRow;\n }\n slide.css(\n getDirectionLabel('margin-top'),\n row !== 0 ? spaceBetween && `${spaceBetween}px` : '',\n );\n };\n\n const updateWrapperSize = (slideSize, snapGrid, getDirectionLabel) => {\n const { spaceBetween, centeredSlides, roundLengths } = swiper.params;\n const { rows } = swiper.params.grid;\n swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;\n swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;\n swiper.$wrapperEl.css({\n [getDirectionLabel('width')]: `${swiper.virtualSize + spaceBetween}px`,\n });\n if (centeredSlides) {\n snapGrid.splice(0, snapGrid.length);\n const newSlidesGrid = [];\n for (let i = 0; i < snapGrid.length; i += 1) {\n let slidesGridItem = snapGrid[i];\n if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);\n }\n snapGrid.push(...newSlidesGrid);\n }\n };\n\n swiper.grid = {\n initSlides,\n updateSlide,\n updateWrapperSize,\n };\n}\n","import appendSlide from './methods/appendSlide.js';\nimport prependSlide from './methods/prependSlide.js';\nimport addSlide from './methods/addSlide.js';\nimport removeSlide from './methods/removeSlide.js';\nimport removeAllSlides from './methods/removeAllSlides.js';\n\nexport default function Manipulation({ swiper }) {\n Object.assign(swiper, {\n appendSlide: appendSlide.bind(swiper),\n prependSlide: prependSlide.bind(swiper),\n addSlide: addSlide.bind(swiper),\n removeSlide: removeSlide.bind(swiper),\n removeAllSlides: removeAllSlides.bind(swiper),\n });\n}\n","import effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectFade({ swiper, extendParams, on }) {\n extendParams({\n fadeEffect: {\n crossFade: false,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides } = swiper;\n const params = swiper.params.fadeEffect;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = swiper.slides.eq(i);\n const offset = $slideEl[0].swiperSlideOffset;\n let tx = -offset;\n if (!swiper.params.virtualTranslate) tx -= swiper.translate;\n let ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n }\n const slideOpacity = swiper.params.fadeEffect.crossFade\n ? Math.max(1 - Math.abs($slideEl[0].progress), 0)\n : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);\n\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl\n .css({\n opacity: slideOpacity,\n })\n .transform(`translate3d(${tx}px, ${ty}px, 0px)`);\n }\n };\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.fadeEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration);\n effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides: true });\n };\n\n effectInit({\n effect: 'fade',\n swiper,\n on,\n setTranslate,\n setTransition,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import $ from '../../shared/dom.js';\nimport effectInit from '../../shared/effect-init.js';\n\nexport default function EffectCube({ swiper, extendParams, on }) {\n extendParams({\n cubeEffect: {\n slideShadows: true,\n shadow: true,\n shadowOffset: 20,\n shadowScale: 0.94,\n },\n });\n\n const setTranslate = () => {\n const {\n $el,\n $wrapperEl,\n slides,\n width: swiperWidth,\n height: swiperHeight,\n rtlTranslate: rtl,\n size: swiperSize,\n browser,\n } = swiper;\n const params = swiper.params.cubeEffect;\n const isHorizontal = swiper.isHorizontal();\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n let wrapperRotate = 0;\n let $cubeShadowEl;\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('
      ');\n $wrapperEl.append($cubeShadowEl);\n }\n $cubeShadowEl.css({ height: `${swiperWidth}px` });\n } else {\n $cubeShadowEl = $el.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('
      ');\n $el.append($cubeShadowEl);\n }\n }\n }\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n let slideIndex = i;\n if (isVirtual) {\n slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);\n }\n let slideAngle = slideIndex * 90;\n let round = Math.floor(slideAngle / 360);\n if (rtl) {\n slideAngle = -slideAngle;\n round = Math.floor(-slideAngle / 360);\n }\n const progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n let tx = 0;\n let ty = 0;\n let tz = 0;\n if (slideIndex % 4 === 0) {\n tx = -round * 4 * swiperSize;\n tz = 0;\n } else if ((slideIndex - 1) % 4 === 0) {\n tx = 0;\n tz = -round * 4 * swiperSize;\n } else if ((slideIndex - 2) % 4 === 0) {\n tx = swiperSize + round * 4 * swiperSize;\n tz = swiperSize;\n } else if ((slideIndex - 3) % 4 === 0) {\n tx = -swiperSize;\n tz = 3 * swiperSize + swiperSize * 4 * round;\n }\n if (rtl) {\n tx = -tx;\n }\n\n if (!isHorizontal) {\n ty = tx;\n tx = 0;\n }\n\n const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${\n isHorizontal ? slideAngle : 0\n }deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;\n if (progress <= 1 && progress > -1) {\n wrapperRotate = slideIndex * 90 + progress * 90;\n if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;\n }\n $slideEl.transform(transform);\n if (params.slideShadows) {\n // Set shadows\n let shadowBefore = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let shadowAfter = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = $(\n `
      `,\n );\n $slideEl.append(shadowBefore);\n }\n if (shadowAfter.length === 0) {\n shadowAfter = $(\n `
      `,\n );\n $slideEl.append(shadowAfter);\n }\n if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n }\n }\n $wrapperEl.css({\n '-webkit-transform-origin': `50% 50% -${swiperSize / 2}px`,\n 'transform-origin': `50% 50% -${swiperSize / 2}px`,\n });\n\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl.transform(\n `translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${\n -swiperWidth / 2\n }px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`,\n );\n } else {\n const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;\n const multiplier =\n 1.5 -\n (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2 +\n Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2);\n const scale1 = params.shadowScale;\n const scale2 = params.shadowScale / multiplier;\n const offset = params.shadowOffset;\n $cubeShadowEl.transform(\n `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${\n -swiperHeight / 2 / scale2\n }px) rotateX(-90deg)`,\n );\n }\n }\n const zFactor = browser.isSafari || browser.isWebView ? -swiperSize / 2 : 0;\n $wrapperEl.transform(\n `translate3d(0px,0,${zFactor}px) rotateX(${\n swiper.isHorizontal() ? 0 : wrapperRotate\n }deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`,\n );\n };\n const setTransition = (duration) => {\n const { $el, slides } = swiper;\n slides\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n $el.find('.swiper-cube-shadow').transition(duration);\n }\n };\n\n effectInit({\n effect: 'cube',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n resistanceRatio: 0,\n spaceBetween: 0,\n centeredSlides: false,\n virtualTranslate: true,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectFlip({ swiper, extendParams, on }) {\n extendParams({\n flipEffect: {\n slideShadows: true,\n limitRotation: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides, rtlTranslate: rtl } = swiper;\n const params = swiper.params.flipEffect;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n let progress = $slideEl[0].progress;\n if (swiper.params.flipEffect.limitRotation) {\n progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n }\n const offset = $slideEl[0].swiperSlideOffset;\n const rotate = -180 * progress;\n let rotateY = rotate;\n let rotateX = 0;\n let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n let ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n rotateX = -rotateY;\n rotateY = 0;\n } else if (rtl) {\n rotateY = -rotateY;\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n\n if (params.slideShadows) {\n // Set shadows\n let shadowBefore = swiper.isHorizontal()\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let shadowAfter = swiper.isHorizontal()\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = createShadow(params, $slideEl, swiper.isHorizontal() ? 'left' : 'top');\n }\n if (shadowAfter.length === 0) {\n shadowAfter = createShadow(params, $slideEl, swiper.isHorizontal() ? 'right' : 'bottom');\n }\n if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n }\n const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform);\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.flipEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n effectVirtualTransitionEnd({ swiper, duration, transformEl });\n };\n\n effectInit({\n effect: 'flip',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\n\nexport default function EffectCoverflow({ swiper, extendParams, on }) {\n extendParams({\n coverflowEffect: {\n rotate: 50,\n stretch: 0,\n depth: 100,\n scale: 1,\n modifier: 1,\n slideShadows: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { width: swiperWidth, height: swiperHeight, slides, slidesSizesGrid } = swiper;\n const params = swiper.params.coverflowEffect;\n const isHorizontal = swiper.isHorizontal();\n const transform = swiper.translate;\n const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;\n const rotate = isHorizontal ? params.rotate : -params.rotate;\n const translate = params.depth;\n // Each slide offset from center\n for (let i = 0, length = slides.length; i < length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideSize = slidesSizesGrid[i];\n const slideOffset = $slideEl[0].swiperSlideOffset;\n const offsetMultiplier =\n ((center - slideOffset - slideSize / 2) / slideSize) * params.modifier;\n\n let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;\n // var rotateZ = 0\n let translateZ = -translate * Math.abs(offsetMultiplier);\n\n let stretch = params.stretch;\n // Allow percentage to make a relative stretch for responsive sliders\n if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {\n stretch = (parseFloat(params.stretch) / 100) * slideSize;\n }\n let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;\n let translateX = isHorizontal ? stretch * offsetMultiplier : 0;\n\n let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);\n\n // Fix for ultra small values\n if (Math.abs(translateX) < 0.001) translateX = 0;\n if (Math.abs(translateY) < 0.001) translateY = 0;\n if (Math.abs(translateZ) < 0.001) translateZ = 0;\n if (Math.abs(rotateY) < 0.001) rotateY = 0;\n if (Math.abs(rotateX) < 0.001) rotateX = 0;\n if (Math.abs(scale) < 0.001) scale = 0;\n\n const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(slideTransform);\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n\n if (params.slideShadows) {\n // Set shadows\n let $shadowBeforeEl = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let $shadowAfterEl = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if ($shadowBeforeEl.length === 0) {\n $shadowBeforeEl = createShadow(params, $slideEl, isHorizontal ? 'left' : 'top');\n }\n if ($shadowAfterEl.length === 0) {\n $shadowAfterEl = createShadow(params, $slideEl, isHorizontal ? 'right' : 'bottom');\n }\n if ($shadowBeforeEl.length)\n $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;\n if ($shadowAfterEl.length)\n $shadowAfterEl[0].style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;\n }\n }\n };\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.coverflowEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n };\n\n effectInit({\n effect: 'coverflow',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectCreative({ swiper, extendParams, on }) {\n extendParams({\n creativeEffect: {\n transformEl: null,\n limitProgress: 1,\n shadowPerProgress: false,\n progressMultiplier: 1,\n perspective: true,\n prev: {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n opacity: 1,\n scale: 1,\n },\n next: {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n opacity: 1,\n scale: 1,\n },\n },\n });\n\n const getTranslateValue = (value) => {\n if (typeof value === 'string') return value;\n return `${value}px`;\n };\n\n const setTranslate = () => {\n const { slides } = swiper;\n const params = swiper.params.creativeEffect;\n const { progressMultiplier: multiplier } = params;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideProgress = $slideEl[0].progress;\n const progress = Math.min(\n Math.max($slideEl[0].progress, -params.limitProgress),\n params.limitProgress,\n );\n const offset = $slideEl[0].swiperSlideOffset;\n const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];\n const r = [0, 0, 0];\n let custom = false;\n if (!swiper.isHorizontal()) {\n t[1] = t[0];\n t[0] = 0;\n }\n let data = {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n scale: 1,\n opacity: 1,\n };\n if (progress < 0) {\n data = params.next;\n custom = true;\n } else if (progress > 0) {\n data = params.prev;\n custom = true;\n }\n // set translate\n t.forEach((value, index) => {\n t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(\n progress * multiplier,\n )}))`;\n });\n // set rotates\n r.forEach((value, index) => {\n r[index] = data.rotate[index] * Math.abs(progress * multiplier);\n });\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n\n const translateString = t.join(', ');\n const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`;\n const scaleString =\n progress < 0\n ? `scale(${1 + (1 - data.scale) * progress * multiplier})`\n : `scale(${1 - (1 - data.scale) * progress * multiplier})`;\n const opacityString =\n progress < 0\n ? 1 + (1 - data.opacity) * progress * multiplier\n : 1 - (1 - data.opacity) * progress * multiplier;\n const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`;\n\n // Set shadows\n if ((custom && data.shadow) || !custom) {\n let $shadowEl = $slideEl.children('.swiper-slide-shadow');\n if ($shadowEl.length === 0 && data.shadow) {\n $shadowEl = createShadow(params, $slideEl);\n }\n if ($shadowEl.length) {\n const shadowOpacity = params.shadowPerProgress\n ? progress * (1 / params.limitProgress)\n : progress;\n $shadowEl[0].style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);\n }\n }\n\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform).css({ opacity: opacityString });\n if (data.origin) {\n $targetEl.css('transform-origin', data.origin);\n }\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.creativeEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n\n effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides: true });\n };\n\n effectInit({\n effect: 'creative',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => swiper.params.creativeEffect.perspective,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectCards({ swiper, extendParams, on }) {\n extendParams({\n cardsEffect: {\n slideShadows: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides, activeIndex } = swiper;\n const params = swiper.params.cardsEffect;\n const { startTranslate, isTouched } = swiper.touchEventsData;\n const currentTranslate = swiper.translate;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideProgress = $slideEl[0].progress;\n const progress = Math.min(Math.max(slideProgress, -4), 4);\n let offset = $slideEl[0].swiperSlideOffset;\n if (swiper.params.centeredSlides && !swiper.params.cssMode) {\n swiper.$wrapperEl.transform(`translateX(${swiper.minTranslate()}px)`);\n }\n if (swiper.params.centeredSlides && swiper.params.cssMode) {\n offset -= slides[0].swiperSlideOffset;\n }\n let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n let tY = 0;\n const tZ = -100 * Math.abs(progress);\n let scale = 1;\n let rotate = -2 * progress;\n\n let tXAdd = 8 - Math.abs(progress) * 0.75;\n\n const isSwipeToNext =\n (i === activeIndex || i === activeIndex - 1) &&\n progress > 0 &&\n progress < 1 &&\n (isTouched || swiper.params.cssMode) &&\n currentTranslate < startTranslate;\n const isSwipeToPrev =\n (i === activeIndex || i === activeIndex + 1) &&\n progress < 0 &&\n progress > -1 &&\n (isTouched || swiper.params.cssMode) &&\n currentTranslate > startTranslate;\n if (isSwipeToNext || isSwipeToPrev) {\n const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;\n rotate += -28 * progress * subProgress;\n scale += -0.5 * subProgress;\n tXAdd += 96 * subProgress;\n tY = `${-25 * subProgress * Math.abs(progress)}%`;\n }\n\n if (progress < 0) {\n // next\n tX = `calc(${tX}px + (${tXAdd * Math.abs(progress)}%))`;\n } else if (progress > 0) {\n // prev\n tX = `calc(${tX}px + (-${tXAdd * Math.abs(progress)}%))`;\n } else {\n tX = `${tX}px`;\n }\n if (!swiper.isHorizontal()) {\n const prevY = tY;\n tY = tX;\n tX = prevY;\n }\n\n const scaleString =\n progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;\n const transform = `\n translate3d(${tX}, ${tY}, ${tZ}px)\n rotateZ(${rotate}deg)\n scale(${scaleString})\n `;\n\n if (params.slideShadows) {\n // Set shadows\n let $shadowEl = $slideEl.find('.swiper-slide-shadow');\n if ($shadowEl.length === 0) {\n $shadowEl = createShadow(params, $slideEl);\n }\n if ($shadowEl.length)\n $shadowEl[0].style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform);\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.cardsEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n\n effectVirtualTransitionEnd({ swiper, duration, transformEl });\n };\n\n effectInit({\n effect: 'cards',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","'use strict';\n\nconst utils = require('../components/utils');\n\nconst $mainPDPGallery = $('.product-gallery--main');\nconst $modelDescription = $('.js-onmodel-description');\n\n/**\n * Reset (hide) model description\n */\nfunction resetModelDescription() {\n $modelDescription.removeClass('d-block').addClass('d-none');\n}\n\n/**\n * Initialize model data\n * @param {string} onModelValue: Reference to data model of thumbnail image\n * @returns {boolean} True if no errors occur\n */\nfunction getOnModelData(onModelValue) {\n let modelKey;\n let modelValue;\n let modelObject;\n const url = $mainPDPGallery.data('model-url');\n try {\n const onModelObj = onModelValue && JSON.parse(decodeURIComponent(onModelValue));\n if (onModelObj) {\n modelKey = Object.keys(onModelObj)[0];\n modelValue = onModelObj[modelKey];\n modelObject = {\n modelKey: modelKey,\n modelValue: modelValue\n };\n $.ajax({\n url: utils.setUrlKeyValue(url, 'pid', onModelObj.variantUPC.trim()),\n type: 'post',\n dataType: 'json',\n data: modelObject,\n success: function (data) {\n if (data && data.modelDescription) {\n $modelDescription.html(data.modelDescription)\n .removeClass('d-none').addClass('d-block');\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n } catch (e) {\n return false;\n }\n return true;\n}\n\n/**\n * Initialize model data\n * @returns {string} modeldataValue on model data value of image\n */\nfunction imageModelData() {\n let modelImg = $mainPDPGallery.find('.js-model-image');\n let modelDataValue;\n\n if (modelImg) {\n let modelImgArray = Array.from(modelImg);\n modelDataValue = modelImgArray.find(function (element) {\n return $(element).data('onmodel') !== null;\n });\n }\n return modelDataValue;\n}\n\n/**\n * Trigger display of OnModel description\n * Dependency: imageModelData()\n */\nfunction triggerOnModelDescription() {\n const modelValue = imageModelData();\n const imageclick = $(modelValue).data('onmodel');\n\n resetModelDescription();\n getOnModelData(imageclick);\n}\n\nmodule.exports = {\n getOnModelData: getOnModelData,\n imageModelData: imageModelData,\n triggerOnModelDescription: triggerOnModelDescription\n};\n","'use strict';\n\nconst breakpoints = require('../components/breakpoints');\nconst debounce = require('lodash/debounce');\n\n/**\n * Updates the tab and content state for the item that was clicked\n * @param {selector} clickedTabSelector for example: .ofs-item\n */\nfunction updateTabbedContainerContent(clickedTabSelector) {\n var $clickedTab = $(clickedTabSelector);\n var $tabbedContainer = $clickedTab.closest('.tabbed-container');\n var $contentContainer = $tabbedContainer.children('.tabbed-container__content-container');\n var targetContentSelector = $clickedTab.data('target') || $clickedTab.attr('href');\n var $targetContent = $(targetContentSelector);\n\n // Show clicked tab's contents, hide all sibling tabs' contents.\n // This prevents white space below the footer when very long tab content is hidden\n $targetContent.show();\n\n if (breakpoints.isHighRes() || !$targetContent.closest('.responsive-tabs').length) {\n // only apply this style class when the tabbed container is being rendered as tabs (e.g. hybrid view at desktop width, or tab-only view at any width)\n $targetContent.siblings().hide();\n }\n\n // toggle active class on the content\n $contentContainer.children('.tabbed-container__content').removeClass('active');\n $targetContent.addClass('active');\n}\n\n/**\n * Reinitializes any carousels within tabbed content of any variation (e.g. tabs, accordions, hybrid)\n * @param {JQuery} $clickedItem for example: .ofs-item or .card-header\n */\nfunction reinitializeCarousels($clickedItem) {\n var targetContentSelector = $clickedItem.data('target') || $clickedItem.attr('href');\n $(targetContentSelector).find('.slick-initialized').slick('unslick').slick('reinit');\n}\n\nmodule.exports = {\n init: function () {\n // set initial height of all content containers to the size of their active content.\n $('.tabbed-container__content-container').each(function () {\n var $this = $(this);\n var $hybridTabbedContainer = $this.closest('.responsive-tabs'); // may or may not exist depending on which $('.tabbed-container__content-container') we are in\n\n // wait for window.onLoad and try setting the height again, for those instances that weren't ready the first time.\n $(window).on('load', function () {\n if (breakpoints.isHighRes() || !$hybridTabbedContainer.length) {\n // only apply this style class when the tabbed container is being rendered as tabs (e.g. hybrid view at desktop width, or tab-only view at any width)\n $this.find('.active').siblings().hide();\n }\n });\n\n // make sure that we don't lose content if someone rotates their tablet or phone back and forth and the tabbed container transitions between accordion and tab view\n $(window).on('resize', debounce(\n function () {\n if ($hybridTabbedContainer.length) {\n $this.find('.active').siblings().toggle(breakpoints.isLowRes());\n }\n }, 200));\n });\n\n $('.tabbed-container__tabs').on('click', '.ofs__item', function (e) {\n e.preventDefault();\n var $thisItem = $(this);\n\n // toggle active classes on the tabs\n $thisItem.siblings('.ofs__item').removeClass('active');\n $thisItem.addClass('active');\n\n var $ofs = $thisItem.closest('.overflow-slider');\n $ofs.prop('ofs').slideToItem($ofs, $thisItem);\n\n // reinitialize the carousels in case they got cut short on initial page load and tab content hiding\n reinitializeCarousels($thisItem);\n\n updateTabbedContainerContent($thisItem);\n });\n\n $('.accordions').on('click', '.card-header', function () {\n var $thisItem = $(this);\n\n // reinitialize the carousels in case they got cut short on initial page load and tab content hiding\n reinitializeCarousels($thisItem);\n });\n\n var hash = location.hash;\n if (hash) {\n // check if any of the ofs__items have this href or target.\n $('.tabbed-container__tabs .ofs__item').each(function () {\n var $thisItem = $(this);\n var targetContentSelector = $thisItem.data('target') || $thisItem.attr('href');\n if (targetContentSelector === hash) {\n // go to this item\n $thisItem.trigger('click'); // this will call the event handler above to make this item active.\n return false; // break out of the .each() loop.\n }\n return true;\n });\n }\n }\n};\n","import * as allExports from './index.js';\nimport { mixin } from './index.js';\n\n// Add all of the Underscore functions to the wrapper object.\nvar _ = mixin(allExports);\n// Legacy Node.js API\n_._ = _;\n// Export the Underscore API.\nexport default _;\n","/* global clientData */\n'use strict';\n\n/**\n * Product Base Module\n */\n\nvar utils = require('../components/utils');\nvar onModel = require('../product/onModelDescription');\nvar Badge = require('../product/badge.js');\nvar Overview = require('../product/overview.js');\nconst minicartSaleItemAlertBadge = require('../components/minicartSaleItemAlertBadge');\n\n/*\n * All needed methods from app_storefront_base/cartridge/client/default/js/product/base.js have been overridden here\n */\n\nvar base = require('base/product/base');\nvar breakpoints = require('../components/breakpoints');\n\nconst $mainPDPGallery = $('.product-gallery--main');\nconst oosData = {};\n\n/**\n * method to identify if BISN is enabled at variant level\n * @param {Object} attrValue color swatch value\n * @param {Object} $productObject Product object\n * @returns {boolean} true if BISN is checked at variant level, else false\n */\nfunction isNotifyMeEnabled(attrValue, $productObject) {\n var enableNotifyMe;\n var varKeys = Object.keys($productObject.variantData);\n varKeys.forEach(function (key) {\n if ($productObject.variantData[key].color === attrValue.id) {\n enableNotifyMe = $productObject.variantData[key].bisnflag;\n return false;\n }\n return true;\n });\n return enableNotifyMe;\n}\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n var pid;\n\n if ($('.quickview-modal').hasClass('show') && !$('.product-set').length) {\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el).closest('.product-detail').find('.product-id').data('pid');\n } else {\n pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n }\n\n return pid;\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {Object} $productObject product object\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {string} topLevelAttribute - Either 'color' or 'sizeType'\n */\nfunction processSwatchValues(attr, $productObject, $productContainer, topLevelAttribute) {\n attr.values.forEach(function (attrValue) {\n const $swatchSpan = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' + attrValue.value + '\"]');\n const $swatchAnchor = $swatchSpan.parent();\n const swatchOutOfStockText = $swatchAnchor.closest('.js-color-attribute').data('attr-oos-text');\n\n // Disable if not selectable\n $swatchSpan.removeClass('selected selectable unselectable');\n $swatchAnchor.removeClass('selected selectable unselectable'); // This is only for visual display\n $swatchAnchor.data('attr-oos', '');\n\n let url;\n if (attr.topLevelAttribute) { // Color as top-level\n /**\n * The top-level attribute (either color or sizeType) should always be clickable:\n *\n * For example, if you selected Standard/Black/M, normally you would not be\n * able to switch from Standard to Big, because Black/M is not a value combination\n * for Big.\n **/\n url = attrValue.url;\n if (url === undefined) {\n // This would be very rare\n $swatchAnchor.data('attr-url', '');\n $swatchAnchor.addClass('unselectable');\n $swatchSpan.addClass('unselectable');\n } else {\n // Top level is always selectable... Unless the URL above is empty.\n $swatchAnchor.data('attr-url', url);\n $swatchAnchor.addClass('selectable');\n $swatchSpan.addClass('selectable');\n }\n } else { // Color when SizeType is top-level.\n url = attrValue.url;\n if (url === undefined) {\n // This would be very rare\n $swatchAnchor.data('attr-url', '');\n $swatchAnchor.addClass('unselectable');\n $swatchSpan.addClass('unselectable');\n } else {\n if (topLevelAttribute === 'sizeType' && attrValue.url === undefined) { // eslint-disable-line\n // If there is a SizeType dimension, this will mess up stuff...\n $swatchAnchor.data('attr-url', '');\n $swatchAnchor.addClass('unselectable');\n $swatchSpan.addClass('unselectable');\n } else {\n $swatchAnchor.data('attr-url', url);\n $swatchAnchor.addClass('selectable');\n $swatchSpan.addClass('selectable');\n }\n }\n }\n const enableNotifyMe = isNotifyMeEnabled(attrValue, $productObject);\n\n // Reset aria-label attribute for each color option\n $swatchAnchor.attr('aria-label', attrValue.displayValue);\n if (attrValue.selected) {\n $swatchAnchor.addClass('selected');\n $swatchAnchor.attr('aria-label', attrValue.displayValue + ' ' + $swatchAnchor.data('selected-label'));\n $swatchAnchor.trigger('blur').on('focus', (e) => {\n e.preventDefault();\n e.target.focus({ preventScroll: true });\n });\n $swatchSpan.addClass('selected');\n $swatchAnchor.trigger('attribute:select', [$swatchAnchor, attrValue]);\n }\n\n if (attrValue.masterSelectable === false && enableNotifyMe !== null && !enableNotifyMe) {\n $swatchAnchor.addClass('not-orderable');\n $swatchSpan.addClass('not-orderable');\n if ($swatchAnchor.hasClass('unselectable')) {\n $swatchAnchor.removeClass('unselectable');\n $swatchSpan.removeClass('unselectable');\n }\n } else if (attrValue.masterSelectable === false && enableNotifyMe) {\n if (!$swatchAnchor.hasClass('unselectable')) {\n $swatchAnchor.addClass('unselectable');\n $swatchSpan.addClass('unselectable');\n }\n }\n\n if (attrValue.pdpUrl === undefined) {\n $swatchAnchor.removeAttr('href');\n } else {\n $swatchAnchor.attr('href', attrValue.pdpUrl);\n }\n\n if ($swatchAnchor.hasClass('unselectable')) {\n $swatchAnchor.attr('data-attr-oos', swatchOutOfStockText); // sets the data attribute to the out of stock text\n } else {\n $swatchAnchor.attr('data-attr-oos', '');\n }\n\n /*\n window.console.log('---',\n 'ID:', attr.id,\n 'Value:', attrValue.value,\n 'Selected:', attrValue.selected,\n 'Selectable:', attrValue.selectable, '\\n',\n 'url:', (attrValue.url && attrValue.url.split('?').length ? attrValue.url.split('?')[1] : attrValue.url), '\\n'\n );\n */\n });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {string} topLevelAttribute - Either 'color' or 'sizeType'\n */\nfunction processNonSwatchValues(attr, $productContainer, topLevelAttribute) { // eslint-disable-line\n let count = 0;\n let selectedCount = 0;\n attr.values.forEach(function (attributeValue) {\n if (attributeValue.selectable) {\n count++;\n }\n if (attributeValue.selected) {\n selectedCount++;\n }\n });\n attr.values.forEach(function (attrValue) {\n const $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' + attrValue.value + '\"]');\n const attrOutOfStockText = $attrValue.closest('.js-size-attribute, .js-dimension-attribute').data('attr-oos-text');\n\n // Reset Everything\n $attrValue.removeClass('selected selectable unselectable');\n $attrValue.data('attr-oos', '');\n if (selectedCount === 0) {\n $attrValue.closest('.js-attribute').find('.js-attr-label-value').removeClass('text-danger').text(''); // reset attribute label\n }\n\n let url;\n if (attr.topLevelAttribute) { // SizeType\n /**\n * The top-level attribute (either color or sizeType) should always be clickable:\n *\n * For example, if you selected Standard/Black/M, normally you would not be\n * able to switch from Standard to Big, because Black/M is not a value combination\n * for Big.\n **/\n url = attrValue.url;\n if (url === undefined) {\n // This would be very rare\n $attrValue.data('attr-url', '');\n $attrValue.addClass('unselectable');\n } else {\n // Top level is always selectable... Unless the URL above is empty.\n $attrValue.data('attr-url', url);\n $attrValue.addClass('selectable');\n }\n } else { // Size or Dimension\n url = attrValue.url;\n if (url === undefined) {\n // This would be very rare\n $attrValue.data('attr-url', '');\n $attrValue.addClass('unselectable');\n } else {\n $attrValue.data('attr-url', url);\n\n if (attrValue.selectable) {\n $attrValue.addClass('selectable');\n } else {\n $attrValue.addClass('unselectable');\n }\n }\n }\n\n // Reset aria-label attribute\n $attrValue.attr('aria-label', $attrValue.data('attr-hover'));\n if (attrValue.selected) {\n $attrValue.addClass('selected');\n $attrValue.attr('aria-label', $attrValue.data('attr-hover') + ' ' + $attrValue.data('selected-label'));\n $attrValue.trigger('blur').on('focus', (e) => {\n e.preventDefault();\n e.target.focus({ preventScroll: true });\n });\n $attrValue.trigger('attribute:select', [$attrValue, attrValue]);\n }\n\n if (attr.attributeId && attr.attributeId.toLowerCase() === 'dimension') {\n if (attrValue.selectable) {\n if (count === 1 && attrValue.selected) {\n $attrValue.addClass('selected');\n } else {\n $attrValue.addClass('selectable');\n }\n } else {\n $attrValue.addClass('unselectable');\n }\n }\n\n if (attrValue.masterSelectable === false) {\n $attrValue.addClass('unselectable');\n }\n\n if (attrValue.pdpUrl === undefined) {\n $attrValue.removeAttr('href');\n } else {\n $attrValue.attr('href', attrValue.pdpUrl);\n }\n\n if ($attrValue.hasClass('unselectable')) {\n $attrValue.attr('data-attr-oos', attrOutOfStockText); // sets the HTML data attribute to the out of stock text\n } else {\n $attrValue.attr('data-attr-oos', '');\n }\n\n /*\n window.\n ('---',\n 'ID:', attr.id,\n 'Value:', attrValue.value,\n 'Selected:', attrValue.selected,\n 'Selectable:', attrValue.selectable, '\\n',\n 'url:', (attrValue.url && attrValue.url.split('?').length ? attrValue.url.split('?')[1] : attrValue.url), '\\n'\n );\n */\n });\n}\n\n/**\n * Color swatches can be broken up into price groups. If all the swatches are hidden, also hide the price label.\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction hideColorPriceGroups($productContainer) {\n $('.priceGroup', $productContainer).each(function () {\n var groupVisible = false;\n $(this).find('.color-value').each(function () {\n if ($(this).hasClass('selectable')\n && $(this).hasClass('not-orderable') === false\n && $(this).hasClass('invalid') === false\n ) {\n groupVisible = true;\n }\n });\n\n if (groupVisible) {\n $(this).show();\n } else {\n $(this).hide();\n }\n });\n}\n\n/**\n * Pass in an array of SKUs, the variantData array, and and Attribute ID\n * Returns an array of unique Attribute Values from the SKUs\n *\n * @param {Object} variantData - Indexed by SKU. See models/product/decorators/variantMatrix.js\n * @param {array} skuArray - Array of skus\n * @param {string} attributeID - Attribute ID\n * @return {array} - Array of unique attribute values\n */\nfunction getSkuValues(variantData, skuArray, attributeID) {\n var arr = [];\n for (var i = 0; i < skuArray.length; i++) {\n var sku = skuArray[i];\n if (variantData[sku] !== undefined) {\n var attributeValue = variantData[sku][attributeID];\n if (arr.indexOf(attributeValue) === -1) {\n arr.push(attributeValue);\n }\n }\n }\n return arr; // These are all the valid values\n}\n\n/**\n * For products with 3 dimensions of attributes, we must hide/show swatch combinations\n * that are not valid possibilities. For example, a pant sizes of SizeType \"Big\" and a\n * Size of \"30/30\". Big pants are not available in this size...\n *\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {array} attrs - Attributes from the AJAX productObject.variationAttributes result\n * @param {string} topLevelAttribute - sizeType, color or empty\n * @param {array} allAttributes - Possible values are sizeType, color, size, dimension\n * @param {Object} variantData - Indexed by SKU. See models/product/decorators/variantMatrix.js\n * @param {Object} variantMatrix - Indexed by Attribute. See models/product/decorators/variantMatrix.js\n */\nfunction hideShowValidSwatches($productContainer, attrs, topLevelAttribute, allAttributes, variantData, variantMatrix) {\n if (topLevelAttribute === '') {\n return;\n }\n\n var hasSizeType = allAttributes.indexOf('sizeType') !== -1;\n var hasColor = allAttributes.indexOf('color') !== -1;\n var hasSize = allAttributes.indexOf('size') !== -1;\n var hasDimension = allAttributes.indexOf('dimension') !== -1;\n\n // The functionality below only applies in these two scenarios:\n // 1. A product which SizeType + Color + Size\n // 2. A product which has Color + Size + Dimension\n if (!(hasSizeType || hasDimension)) {\n return;\n }\n\n // Get all the currently selected attributes values:\n var selectedAttributes = {};\n attrs.forEach(function (attr) {\n attr.values.forEach(function (attrValue) {\n if (attrValue.selected) {\n selectedAttributes[attr.id] = attrValue.value;\n }\n });\n });\n\n var skuArray;\n if (topLevelAttribute === 'sizeType' && hasSizeType) {\n $productContainer.find('.js-attribute-size .js-attribute-value').removeClass('invalid');\n $productContainer.find('.js-attribute-color .js-attribute-value').removeClass('invalid');\n\n // There should always be a SizeType selected, otherwise we\n // cannot determine which color and size swatches are valid.\n var selectedSizeType = selectedAttributes['sizeType']; // eslint-disable-line dot-notation\n if (selectedSizeType === undefined) {\n return;\n }\n\n // Array of skus which have the selected SizeType.\n skuArray = variantMatrix['sizeType'][selectedSizeType]; // eslint-disable-line dot-notation\n\n // Based on the selected SizeType, show/hide \"valid\" Size swatches.\n if (hasSize) {\n var validSizes = getSkuValues(variantData, skuArray, 'size'); // Array of unique \"Size\" values in sku array.\n\n // Hide all skus with invalid values\n if (validSizes.length) {\n $productContainer.find('.js-attribute-size .js-attribute-value').each(function () {\n var val = $(this).data('attr-value');\n if (val !== undefined && validSizes.indexOf(String(val)) === -1) {\n // Value of swatch does not appear in array. Hide swatch.\n $(this).addClass('invalid');\n }\n });\n }\n }\n\n // Based on the selected SizeType, show/hide \"valid\" Color swatches.\n if (hasColor) {\n var validColors = getSkuValues(variantData, skuArray, 'color'); // Array of unique \"Color\" values in sku array.\n\n if (validColors.length) {\n $productContainer.find('.js-attribute-color .js-attribute-value').each(function () {\n var val = $(this).data('attr-value');\n if (val !== undefined && validColors.indexOf(String(val)) === -1) {\n // Value of swatch does not appear in array. Hide swatch.\n $(this).addClass('invalid');\n }\n });\n }\n }\n } else if (topLevelAttribute === 'color' && hasDimension) {\n $productContainer.find('.js-attribute-dimension .js-attribute-value').removeClass('invalid');\n\n // Dimension is an attribute of the selected Size and Color.\n var selectedSize = selectedAttributes['size']; // eslint-disable-line dot-notation\n if (selectedSize === undefined) {\n return;\n }\n\n var skuColorArray = [];\n var skuSizeArray = [];\n if (hasColor) {\n var selectedColor = selectedAttributes['color']; // eslint-disable-line dot-notation\n if (selectedColor !== undefined) {\n skuColorArray = variantMatrix['color'][selectedColor]; // eslint-disable-line dot-notation\n }\n }\n\n // Based on the selected Size, show/hide \"valid\" Size swatches.\n if (hasSize) {\n // Array of skus which have the selected SizeType.\n skuSizeArray = variantMatrix['size'][selectedSize]; // eslint-disable-line dot-notation\n\n // Note: Both Color and Size must be selected to determine which lengths are \"valid\" options.\n if (skuSizeArray.length && skuColorArray.length) {\n // If both Size and Color are selected, determine which skus\n // appear in both arrays via intersection.\n skuArray = utils.arrayIntersection(skuSizeArray, skuColorArray);\n } else {\n skuArray = skuSizeArray;\n }\n\n var validDimensions = getSkuValues(variantData, skuArray, 'dimension'); // Array of unique \"dimension\" values in sku array.\n\n // Hide all skus with invalid values\n if (validDimensions.length) {\n $productContainer.find('.js-attribute-dimension .js-attribute-value').each(function () {\n var val = $(this).data('attr-value');\n if (val !== undefined && validDimensions.indexOf(String(val)) === -1) {\n // Value of swatch does not appear in array. Hide swatch.\n $(this).addClass('invalid');\n }\n });\n }\n }\n }\n}\n\n/**\n * Get selected size/dimension swatch\n * @param {string} variantID Variant ID to locate in the productCache data\n * @param {Object} swatchArrays Contains arrays of variants, organized by size/dim\n * @param {Array} swatchKeys Array containing swatch key values (eg. 'S', 'M', 'L', etc.)\n * @return {string} Size or dimension that is currently selected\n */\nfunction getSelectedSwatchValue(variantID, swatchArrays, swatchKeys) {\n var result;\n for (let i = 0; i < swatchKeys.length; i++) {\n if (swatchArrays[swatchKeys[i]].includes(variantID)) {\n result = swatchKeys[i];\n break;\n }\n }\n return result;\n}\n\n/**\n * Adds 'unselectable' class to color swatches\n * @param {Object} colorVariantArrays Object containing variantID arrays, grouped by color ID\n * @param {Array} colorVariantKeys Array of color ID indices\n * @param {string} variantID Target variant ID\n */\nfunction markOOSColorVariants(colorVariantArrays, colorVariantKeys, variantID) {\n colorVariantKeys.forEach(colorVarKey => {\n if (colorVariantArrays[colorVarKey].includes(variantID)) {\n // Find the matching color swatch span and mark the parent anchor element as 'unselectable'\n $('.js-attribute-value[data-attr-value=\"' + colorVarKey + '\"]')\n .closest('.js-color-swatch')\n .removeClass('selectable')\n .addClass('unselectable');\n }\n });\n}\n\n/**\n *\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateOOSColorVariants($productContainer) {\n const masterID = String($productContainer.data('master-pid'));\n const variantID = String($productContainer.data('pid'));\n\n // Exit function if productCache prerequisites are not met\n if (!window.productCache || !masterID || !variantID ||\n !window.productCache[masterID] ||\n !window.productCache[masterID].variantMatrix ||\n !window.productCache[masterID].variantMatrix.inventory) {\n return;\n }\n\n if (JSON.stringify(oosData) === '{}') {\n oosData.colorVariantArrays = window.productCache[masterID].variantMatrix.color || {};\n oosData.colorVariantKeys = Object.keys(oosData.colorVariantArrays);\n oosData.sizeVariantArrays = window.productCache[masterID].variantMatrix.size || {};\n oosData.sizeVariantKeys = Object.keys(oosData.sizeVariantArrays);\n oosData.dimVariantArrays = window.productCache[masterID].variantMatrix.dimension || {};\n oosData.dimVariantKeys = Object.keys(oosData.dimVariantArrays);\n }\n\n const oosVariants = window.productCache[masterID].variantMatrix.inventory[0];\n if (oosVariants) {\n let selectedSize;\n let selectedDim;\n\n selectedSize = oosData.sizeVariantArrays ? getSelectedSwatchValue(variantID, oosData.sizeVariantArrays, oosData.sizeVariantKeys) : null;\n selectedDim = oosData.dimVariantArrays ? getSelectedSwatchValue(variantID, oosData.dimVariantArrays, oosData.dimVariantKeys) : null;\n\n if (selectedSize) {\n if (selectedDim) {\n // Locate variantID that may exist in intersection of size & dimension arrays\n // and identify which colors are out of stock for this size & dimension combination\n oosData.dimVariantArrays[selectedDim].forEach(variant => {\n if (oosVariants.includes(variant) && oosData.sizeVariantArrays[selectedSize].includes(variant)) {\n markOOSColorVariants(oosData.colorVariantArrays, oosData.colorVariantKeys, variant);\n }\n });\n } else {\n // Loop through 'size' variants and identify which colors are out of stock for this size\n oosData.sizeVariantArrays[selectedSize].forEach(variant => {\n if (oosVariants.includes(variant)) {\n markOOSColorVariants(oosData.colorVariantArrays, oosData.colorVariantKeys, variant);\n }\n });\n }\n }\n }\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} productObject - Product Data\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAttrs(productObject, $productContainer) {\n var attrs = productObject.variationAttributes;\n\n // Currently, the only attribute type that has image swatches is Color.\n var attrsWithSwatches = ['color'];\n\n // Find attribute with topLevelAttribute == true\n var topLevelArray = attrs.filter(function (attr) {\n return attr.topLevelAttribute;\n });\n\n // Possible values are: sizeType, color or empty.\n var topLevelAttribute = topLevelArray.length ? topLevelArray[0].id : '';\n\n // Determine all available attributes: sizeType, color, size, dimension\n var allAttributes = [];\n attrs.forEach(function (attr) {\n allAttributes.push(attr.id);\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\n processSwatchValues(attr, productObject, $productContainer, topLevelAttribute);\n } else {\n processNonSwatchValues(attr, $productContainer, topLevelAttribute);\n }\n });\n\n // variantData and variantMatrix values are set in productDetails.isml and added to the\n // window object. Values are indexed by the master PID so multiple Quickview windows\n // are possible without overwriting these values.\n var pid = productObject.masterId;\n if (window.productCache && window.productCache[pid]) {\n var variantData = window.productCache[pid].variantData;\n var variantMatrix = window.productCache[pid].variantMatrix;\n\n hideShowValidSwatches($productContainer, attrs, topLevelAttribute, allAttributes, variantData, variantMatrix);\n }\n\n hideColorPriceGroups($productContainer);\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n *\n * @param {Object} selectedAttributeID - attribute being updated\n */\nfunction updateAvailability(response, $productContainer, selectedAttributeID) {\n var availabilityValue = '';\n var availabilityMessages = response.product.availability.messages;\n // this boolean is to hide the \"In Stock\" message on PDP page\n var instockBool = response.product.availability.instock;\n var velocityValue = '';\n var velocityMessages = response.product.velocityMessage.messages;\n\n // Adding the condition if price is null then \"Availability message\" should be disabled\n if (!instockBool && response.product.readyToOrder && response.product.price.sales && response.product.price.sales.value && availabilityMessages.length) {\n availabilityValue += '
      ';\n availabilityMessages.forEach(function (message) {\n availabilityValue += '
      ' + message.content + '
      ';\n });\n availabilityValue += '
      ';\n }\n\n // Reset Notify Me form and messages\n $('.notifyMeFormMessage').hide();\n $('.js-notifyMeFormContainer').hide();\n\n if (velocityMessages.length) {\n velocityValue += '
      ';\n velocityMessages.forEach(function (message) {\n velocityValue += $('
      ', {\n class: message.cssClass ? message.cssClass : '',\n text: message.text\n })[0].outerHTML;\n });\n velocityValue += '
      ';\n // Reveal \"Notify Me\" button and update variant ID\n $('.notify-me.btn').show().data('cta', 'showForm').data('pid', response.product.id);\n } else {\n // hide notify me messages and button\n $('.product__message--velocity').hide();\n $('.notify-me.btn').hide();\n }\n\n // Remove initial loading state class\n $('.js-attribute').removeClass('loading-opacity');\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n selectedAttributeID: selectedAttributeID,\n message: availabilityValue,\n availabilityMessages,\n resources: response.resources,\n velocityMessage: velocityValue\n });\n}\n\n/**\n * Make \"notify me\" status visible on variant swatches\n */\nfunction setVariantNotifyMeStatus() {\n const variantMaster = $('.product-detail').data('master-pid');\n const colorSwatchID = $('.js-attribute-value.selected').data('attr-value');\n\n // In checkout, this object does not exist, causing an error to be thrown in the console.\n if (!window.productCache) {\n return;\n }\n\n const colorSwatchVariantArray = window.productCache[variantMaster].variantMatrix.color[colorSwatchID];\n\n if (colorSwatchVariantArray) {\n // Lookup variant sizes\n colorSwatchVariantArray.forEach(function (variant) {\n const variantSize = window.productCache[variantMaster].variantData[variant].size;\n const variantNotifyMe = window.productCache[variantMaster].variantData[variant].bisnflag;\n const $swatch = $('.js-size-swatch[data-attr-hover=\"' + variantSize + '\"]');\n\n // Flag swatches to indicate notify me status (see forceOOSNotifyMe)\n $swatch.toggleClass('js-notifyme-swatch', !!variantNotifyMe);\n });\n }\n}\n\n/**\n * Force notify me message to display if all variants are OOS\n */\nfunction forceOOSNotifyMe() {\n const $notifymeVariant = $('.js-notifyme-swatch.selected');\n const allOOS = $notifymeVariant.length &&\n $('.js-size-swatch.unselectable').length === $('.js-size-swatch').length;\n\n if (allOOS && $('.js-notifyMeFormContainer').is(':empty')) {\n const selectedAttributeID = $notifymeVariant.closest('.js-attribute').data('attr');\n const velocityMessage = $('.selectswatch-size-msg').text();\n const pid = $('.product-detail').data('pid');\n let $productContainer = $notifymeVariant.closest('.set-item');\n\n if (!$productContainer.length) {\n $productContainer = $notifymeVariant.closest('.product-detail');\n }\n\n $(window).trigger('product:triggerNotifyMe', { hideForm: true });\n\n $($productContainer).trigger('product:updateAvailability', {\n product: {\n id: pid,\n notifyme: true\n },\n $productContainer: $productContainer,\n selectedAttributeID: selectedAttributeID,\n velocityMessage: velocityMessage\n });\n }\n}\n\n/**\n * Generates callout message html for promotions\n *\n * @param {array} promotions - list of promotions\n * @return {string} - Compiled HTML\n */\nfunction getPromotionCalloutHtml(promotions) {\n if (!promotions) {\n return '';\n }\n\n var html = '';\n\n promotions.forEach(function (promotion) {\n // Verify that these are not member exclusive promotions and that calloutMsg has a valid value\n // promotion.details is optional\n if (!promotion.isExclusive) {\n promotion.callOutMessageDisplayPages.forEach(function (displayPage) {\n if (displayPage.value === 'PDP' && promotion.calloutMsg) {\n html += `
      ${promotion.calloutMsg}
      `;\n }\n });\n }\n });\n\n return html;\n}\n\n/**\n * Generates callout message html for exclusive member promotions\n *\n * @param {Object} promotion - promotion\n * @return {string} - Compiled HTML\n */\nfunction getExclusivePromotionCalloutHtml(promotion) {\n if (!promotion || !promotion.callOutMessageDisplayPages) {\n return '';\n }\n\n var html = '';\n\n // Verify that these are member exclusive promotions and that calloutMsg has a valid value\n // promotion.details is optional\n promotion.callOutMessageDisplayPages.forEach(function (displayPage) {\n if (displayPage.value === 'PDP' && promotion.calloutMsg) {\n const highlightClass = promotion.messageHighlight ? 'callout--highlight' : '';\n\n if (promotion.calloutOpenAccount) {\n html += `\n `;\n } else {\n html += `
      ${promotion.calloutMsg}
      `;\n }\n }\n });\n\n return html;\n}\n\n/**\n * Change product primary images when user hovers on color swatches\n * @param {Object} images - images to be updated\n * @param {Object} $productContainer - Product Details container reference\n */\nfunction onColorVariantHover(images, $productContainer) {\n // Update primary images\n if (images) {\n const $imageGalleries = $productContainer.find('.js-product-gallery, .js-product-gallery-thumb');\n const retinaEnabled = window.resources.images.retinaEnabled || false;\n const hiresImgUrlParams = window.resources.images.hiresImgUrlParams;\n const pdpImgUrlParams = window.resources.images.pdpProductImgAppend;\n const badgeData = $productContainer.data('badge');\n const pdpTechBadgeData = $productContainer.data('pdp-tech-badge');\n const isQuickView = $productContainer.hasClass('product-quickview');\n const enableStylitics = window.resources.stylitics && window.resources.stylitics.enabled;\n const MAX_QV_IMG_COUNT = 8; // Limit number of images on quickview\n\n $imageGalleries.each(function () {\n const $imageGallery = $(this);\n const $swiperWrapper = $imageGallery.find('.swiper-wrapper');\n const swiperSlideStyle = $swiperWrapper.find('.swiper-slide').first().attr('style') || '';\n const isThumbnail = $imageGallery.hasClass('js-product-gallery-thumb');\n let imageAltIdx = 1;\n\n $swiperWrapper.empty();\n\n for (let idx = 0; idx < images.length; idx++) {\n let imageData = images[idx];\n if (isQuickView && idx === MAX_QV_IMG_COUNT) {\n break;\n }\n\n if (!imageData) {\n continue;\n }\n\n let url = imageData.url;\n const alt = imageData.alt;\n const width = imageData.width;\n const height = imageData.height;\n const badgeHTML = Badge.displayBadge(badgeData);\n const techBadgeHTML = Badge.displayTechBadge(pdpTechBadgeData);\n let swiperSlideClass = '';\n let $swiperSlide;\n let $swiperImg;\n let $zoomControls;\n let $styliticsLink;\n\n if (url.indexOf('scene7') > 0 && url.indexOf('?') <= 0) {\n url += pdpImgUrlParams;\n }\n\n if (idx === 0) {\n swiperSlideClass = isThumbnail ? 'swiper-slide-thumb-active' : 'swiper-slide-active';\n } else if (idx === 1) {\n swiperSlideClass = 'swiper-slide-next';\n }\n\n if (imageData.videoUrl) {\n swiperSlideClass += ' swiper-slide-video';\n } else {\n swiperSlideClass += ' js-product-image';\n }\n\n $swiperSlide = $(`
    2. `);\n\n if (imageData.videoUrl) {\n if (isThumbnail) {\n $swiperImg = $(`\n \n \n \n \n `);\n } else {\n $swiperImg = $(`\n \n `);\n }\n } else {\n var onModelAttribute = imageData.modelData ? `data-onmodel=\"${encodeURIComponent(imageData.modelData)}\"` : '';\n\n // Do not attach zoom controls for QuickView\n $zoomControls = !isQuickView && !isThumbnail ? $(`\n \n `) : null;\n\n // Do not attach stylitics jumplink for QuickView\n $styliticsLink = enableStylitics && !isQuickView && !isThumbnail ? $(`\n \n `) : '';\n\n if (isThumbnail) {\n $swiperImg = $(`\n \n `);\n } else {\n $swiperImg = $(`\n
      \n ${badgeHTML}\n ${techBadgeHTML}\n
      \n \n
      \n
      \n `);\n }\n }\n\n $swiperImg.append($zoomControls);\n $swiperImg.append($styliticsLink);\n $swiperSlide.append($swiperImg);\n $swiperSlide.appendTo($swiperWrapper);\n }\n\n this.swiper.update();\n this.swiper.slideTo(0);\n });\n\n $('body').trigger('product:afterImageGalleryUpdate');\n }\n}\n\n/**\n * Create sketchfab asset\n * @param {Object} assetData - assets to be updated\n * @param {boolean} isThumbnail - if asset is a thumbnail\n * @return {jQuery} $asset\n */\nfunction createSketchfabAsset(assetData, isThumbnail) {\n let $asset;\n\n if (isThumbnail) {\n $asset = $(`\n
    3. \n \n
    4. \n `);\n } else {\n $asset = $(`\n
    5. \n \n
    6. \n `);\n }\n\n return $asset;\n}\n\n/**\n * Create video asset\n * @param {Object} assetData - assets to be updated\n * @param {boolean} isThumbnail - if asset is a thumbnail\n * @return {jQuery} $asset\n */\nfunction createVideoAsset(assetData, isThumbnail) {\n let $asset;\n let $swiperContent;\n\n if (isThumbnail) {\n $asset = $(`\n
    7. \n \n
    8. \n `);\n } else {\n $asset = $(`
    9. `);\n }\n\n $swiperContent = $(`\n \n \n \n `);\n\n $asset.prepend($swiperContent);\n\n return $asset;\n}\n\n/**\n * Create asset slide and thumbnail\n * @param {Object} assetData - assets to be updated\n * @param {string} assetType - Asset type: video or sketchfab\n */\nfunction createSwiperAssets(assetData, assetType) {\n const $imageGalleries = $mainPDPGallery.closest('.primary-images').find('.js-product-gallery, .js-product-gallery-thumb');\n\n $imageGalleries.each(function () {\n const $imageGallery = $(this);\n const $wrapper = $imageGallery.find('.swiper-wrapper');\n const isThumbnail = $imageGallery.hasClass('js-product-gallery-thumb');\n let $swiperSlide;\n\n if (assetType === 'sketchfab') {\n $swiperSlide = createSketchfabAsset(assetData, isThumbnail);\n } else if (assetType === 'video') {\n $swiperSlide = createVideoAsset(assetData, isThumbnail);\n } else {\n return;\n }\n\n $wrapper.append($swiperSlide);\n this.swiper.update();\n });\n}\n\n/**\n * Create asset element\n * @param {Object} assetData - asset to be updated\n * @param {string} assetType - Asset type: video or sketchfab\n * @param {Object} $productContainer - for product container\n */\nfunction createAssets(assetData, assetType) {\n if (assetData) {\n createSwiperAssets(assetData, assetType);\n }\n}\n\n/**\n * Create image container and hide existing images on products\n * @param {Object} images - images to be updated\n * @param {Object} $productContainer - Product Details container reference\n */\nfunction createImagesAndVideo(images, $productContainer) {\n // Update primary images\n if (images) {\n onColorVariantHover(images, $productContainer);\n }\n var altText = window.productThumbnailAltText ? window.productThumbnailAltText : 'null';\n if (window.product_VideoData) {\n var productVideoData = window.product_VideoData;\n var videoData = {\n videoType: productVideoData.videoType,\n videoID: productVideoData.videoID,\n productVideoThumbnail: productVideoData.productVideoThumbnail,\n productVideoThumbnailAltText: altText\n };\n createAssets(videoData, 'video');\n }\n\n // re-initialize video player after swiper update\n $(document).trigger('video:player:update');\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n * @param {Object} selectedAttributeID - attribute being updated\n */\nfunction handleVariantResponse(response, $productContainer, selectedAttributeID) {\n const isChoiceOfBonusProducts = $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n const $omnibusPrice = $('.omnibus-price');\n let isVariant;\n\n if (response.product.variationAttributes) {\n updateAttrs(response.product, $productContainer);\n isVariant = response.product.productType === 'variant';\n if (isChoiceOfBonusProducts && isVariant) {\n $productContainer.parent('.bonus-product-item')\n .data('pid', response.product.id);\n\n $productContainer.parent('.bonus-product-item')\n .data('ready-to-order', response.product.readyToOrder);\n }\n }\n\n if (selectedAttributeID === 'color' && !window.resources.enableServerSideGallery) {\n const primaryImage = response.product.images.large;\n\n // Update quickview/PDP primary images\n if ($('.quickview-modal').length) {\n createImagesAndVideo(primaryImage, $('.product-quickview'));\n } else if ($mainPDPGallery.length) {\n createImagesAndVideo(primaryImage, $('.product-detail'));\n }\n\n // Reset notify me status on variant swatches\n setVariantNotifyMeStatus();\n }\n\n // Store attribute selections in the URL\n if (!$('.product-quickview').length && selectedAttributeID !== 'inventory' && response.variantUrl) {\n history.replaceState({ updatedAttr: selectedAttributeID }, '', response.variantUrl);\n }\n\n // Update linked sizes URLs with attribute selections\n if (response.linkedSizesHtml) {\n $('.js-ext-size-type').replaceWith(response.linkedSizesHtml);\n }\n\n // Update pricing\n if (!isChoiceOfBonusProducts) {\n const $priceSelector = $('.prices .price', $productContainer).length\n ? $('.prices .price', $productContainer)\n : $('.prices .price');\n $priceSelector.replaceWith(response.product.price.html);\n }\n\n // Update Omnibus pricing\n if (!response.product.lowestPrice30Days) {\n $omnibusPrice.empty();\n } else if ($omnibusPrice.length) {\n $omnibusPrice.html(response.product.lowestPrice30Days.html);\n }\n\n // Update promotions\n $('.promotions').html(getPromotionCalloutHtml(response.product.promotions));\n $('.promotions').prepend(getExclusivePromotionCalloutHtml(response.product.exclusivePromotion));\n\n if (isChoiceOfBonusProducts) {\n const $selectButton = $productContainer.find('.select-bonus-product');\n $selectButton.trigger('bonusproduct:updateSelectButton', {\n product: response.product, $productContainer: $productContainer\n });\n } else {\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n product: response.product, $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n }\n\n updateAvailability(response, $productContainer, selectedAttributeID);\n}\n\n\n/**\n * Get the selected swatches from the DOM. This data is used as a fallback to\n * retain the current user selections. Exclude the clicked attribute.\n *\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {jQuery} selectedAttributeID - The attribute that was last clicked (so we can exclude it)\n * @return {Object} - The results\n */\nfunction getUserSelectedAttributes($productContainer, selectedAttributeID) {\n var colorValue = $productContainer.find('.js-color-swatch.selected span').data('attr-value');\n var sizeValue = $productContainer.find('.js-size-swatch.selected').data('attr-value');\n var dimensionValue = $productContainer.find('.js-dimension-swatch.selected').data('attr-value');\n var obj = {};\n if (colorValue !== undefined || sizeValue !== undefined || dimensionValue !== undefined) {\n if (colorValue !== undefined && selectedAttributeID !== 'color') {\n obj['selection.color'] = colorValue;\n }\n if (sizeValue !== undefined && selectedAttributeID !== 'size') {\n obj['selection.size'] = sizeValue;\n }\n if (dimensionValue !== undefined && selectedAttributeID !== 'dimension') {\n obj['selection.dimension'] = dimensionValue;\n }\n }\n return obj;\n}\n\n/**\n * dimension value append in URL parameter\n *\n * @param {string} selectedAttrUrl - the Url for the selected variation value\n * @return {string} - new selected variation value url\n */\nfunction appendDimensionParams(selectedAttrUrl) {\n var $url = selectedAttrUrl;\n var $dimensionSwatches = $('.product-detail').find('div.js-attribute-dimension .js-dimension-swatch');\n if ($dimensionSwatches.length > 0) {\n if ($dimensionSwatches.length === 1 && $dimensionSwatches.hasClass('selected')) {\n $url = $url + '&dwvar_' + $('.product-detail').data('pid') + '_dimension=' + $dimensionSwatches.data('attr-value');\n } else if ($dimensionSwatches.length > 1) {\n var $selectedAttr = $('.product-detail').find('div.js-attribute-dimension .js-dimension-swatch.selectable');\n if ($selectedAttr.length === 1 && $selectedAttr.hasClass('selected')) {\n $url = $url + '&dwvar_' + $('.product-detail').data('pid') + '_dimension=' + $selectedAttr.data('attr-value');\n } else {\n $selectedAttr = $('.product-detail').find('div.js-attribute-dimension .js-dimension-swatch.unselectable');\n var len = $dimensionSwatches.length - $selectedAttr.length;\n if (len === 1) {\n $selectedAttr = $('.product-detail').find('div.js-attribute-dimension .js-dimension-swatch.selected');\n if ($selectedAttr.length === 1) {\n $url = $url + '&dwvar_' + $('.product-detail').data('pid') + '_dimension=' + $selectedAttr.data('attr-value');\n }\n }\n }\n }\n }\n return $url;\n}\n\n/**\n * - Appends or removes the old chemistry message on a specific UPC.\n * - Message will be appended right after the Prop 65 message\n * or at the end of the entire bulleted list if there is no Prop 65 message.\n * - Do nothing if the old chemistry message exists in the data object parameter,\n * but the message already exists in the DOM.\n * - If the no old chemistry message exists in the data object parameter,\n * then remove any existing old chemistry message from the DOM.\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction updateOldChemistryMessaging(data) {\n var $existingOldChemistryListItem = $('.js-old-chemistry');\n\n if (data.product && data.product.oldChemistryText) {\n if (!$existingOldChemistryListItem.length) {\n var $prop65ListItemElement = $('.accordion__details').find('.js-prop-65');\n var oldChemistryListItemHTMLString = '
    10. ' + data.product.oldChemistryText + '
    11. ';\n\n if ($prop65ListItemElement.length) {\n $prop65ListItemElement.after(oldChemistryListItemHTMLString);\n } else {\n $('.pdp-list').append(oldChemistryListItemHTMLString);\n }\n }\n } else {\n $existingOldChemistryListItem.remove();\n }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected\n *\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n * @param {string} selectedAttributeID - The ID of the swatch that was clicked (color, size, sizeType, dimension)\n */\nfunction attributeSelect(selectedValueUrl, $productContainer, selectedAttributeID) {\n if (selectedValueUrl) {\n const variantData = getUserSelectedAttributes($productContainer, selectedAttributeID);\n const galleryURL = (selectedAttributeID === 'color' && $('.js-color-swatch[data-attr-url=\"' + selectedValueUrl + '\"]').data('attr-gallery-url')) || null;\n\n $('body').trigger('product:beforeAttributeSelect', { url: selectedValueUrl, container: $productContainer });\n\n if (selectedAttributeID === 'color' && window.resources.enableServerSideGallery && galleryURL) {\n $.ajax({\n url: galleryURL,\n method: 'GET',\n data: variantData,\n success: function (data) {\n const $$productGalleryContainer = $productContainer.find('.primary-images');\n\n if (data && $$productGalleryContainer.length) {\n const $productGallery = $$productGalleryContainer.find('.js-product-gallery');\n const $productGalleryThumb = $$productGalleryContainer.find('.js-product-gallery-thumb');\n\n if ($productGallery.length && $productGalleryThumb.length) {\n $productGallery[0].swiper.destroy();\n $productGalleryThumb[0].swiper.destroy();\n }\n\n $$productGalleryContainer.replaceWith(data);\n $(document).trigger('product:swiper:update');\n }\n }\n });\n }\n\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n data: variantData, // This data used as fallback to retain current user selections\n success: function (data) {\n if (data) {\n handleVariantResponse(data, $productContainer, selectedAttributeID);\n if (window.preQuickViewModalDigitalData && 'dtmLayer' in data && 'digitalData' in window) {\n // Updating only the pageURL and product object in the digital data when variations are selected from the quick view modal.\n if (data.dtmLayer.page && window.digitalData.page) {\n window.digitalData.page.pageInfo.pageURL = data.dtmLayer.page.pageInfo.pageURL;\n window.digitalData.page.product = data.dtmLayer.page.product;\n }\n } else if ('dtmLayer' in data && 'digitalData' in window) {\n if (data.dtmLayer.page) {\n window.digitalData.page = data.dtmLayer.page;\n }\n if (data.dtmLayer.user) {\n window.digitalData.user = data.dtmLayer.user;\n }\n if (data.dtmLayer.cart) {\n window.digitalData.cart = data.dtmLayer.cart;\n }\n }\n\n $('body').trigger('product:afterAttributeSelect', { data: data, container: $productContainer });\n\n // using native JS .dispatchEvent() rather than jQuery .trigger()\n // so that Adobe Launch can listen for this custom event.\n document.body.dispatchEvent(new CustomEvent('product:afterAttributeSelect:dtm', {\n detail: {\n // data: data, // optionally, we can send the data to Launch rather than have it pull it from digitalData\n attributeType: selectedAttributeID\n }\n }));\n\n updateOOSColorVariants($productContainer);\n onModel.triggerOnModelDescription();\n\n updateOldChemistryMessaging(data);\n }\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $('
      ').append($.parseHTML(html));\n\n var body = $html.find('.choice-of-bonus-product');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n $.spinner().start();\n $('#chooseBonusProductModal').remove();\n\n const bonusUrl = data.bonusChoiceRuleBased ? data.showProductsUrlRuleBased : data.showProductsUrlListBased;\n const htmlString = utils.createModalMarkup('', {\n modalId: 'chooseBonusProductModal',\n title: data.labels.selectprods,\n customClasses: 'choose-bonus-product-dialog'\n });\n $('body').append(htmlString);\n $('#chooseBonusProductModal .modal-dialog').data({\n 'total-qty': data.maxBonusItems,\n UUID: data.uuid,\n pliUUID: data.pliUUID,\n addToCartUrl: data.addToCartUrl,\n pageStart: 0,\n pageSize: data.pageSize,\n moreURL: data.showProductsUrlRuleBased,\n bonusChoiceRuleBased: data.bonusChoiceRuleBased\n });\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'html',\n success: function (html) {\n var parsedHtml = parseHtml(html);\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n $('#chooseBonusProductModal').modal('show');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n if (response && $.isNumeric(response.quantityTotal)) {\n $(document).trigger('minicart:updatecount', response.quantityTotal);\n }\n\n // vars defined to make if/else logic easier to read\n let isReservable = response.reservableProduct;\n let hasError = response.error;\n\n if (isReservable) {\n // reservation banner\n let reservationTimerHelper = require('../components/reservationTimer');\n reservationTimerHelper.updateReservationData(response);\n } else if (hasError) {\n // Add to cart errors pop down a banner under the top menu\n $.alert({\n content: `

      ${response.message}

      `,\n placement: 'banner',\n theme: 'danger'\n });\n } else {\n // minicart\n $(document).trigger('minicart:show');\n\n var hideMinicartTimeout = setTimeout(function () {\n $(document).trigger('minicart:hide');\n }, 7000);\n\n $('body').one('mouseenter', '.minicart-drawer', function () {\n clearTimeout(hideMinicartTimeout);\n });\n }\n\n if ('_satellite' in window && 'dtmEvent' in response) {\n if (!!response.dtmEvent && response.dtmEvent.length) {\n response.dtmEvent.forEach((action) => {\n _satellite.track(action.event, action.data); //eslint-disable-line\n });\n }\n }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n var childProducts = [];\n $('.bundle-item').each(function () {\n childProducts.push({\n pid: $(this).find('.product-id').data('pid'),\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n });\n });\n\n return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n .data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n}\n\n/**\n * Test to see if all available product attributes have been selected\n *\n * @param {jQuery} $addToCartButton - add to cart button that was clicked\n * @returns {boolean} Have all needed selections been made?\n */\nfunction isEverythingSelected($addToCartButton) {\n let $swatchAttributes;\n const commonParentSelector = '.js-product-content';\n const swatchGroupSelectors = '.js-color-attribute, .js-size-attribute, .js-dimension-attribute';\n\n if ($addToCartButton) {\n $swatchAttributes = $addToCartButton.closest(commonParentSelector).find(swatchGroupSelectors);\n } else {\n $swatchAttributes = $(swatchGroupSelectors);\n }\n\n let allAttributesSelected = true;\n $swatchAttributes.each(function () {\n let $thisAttribute = $(this);\n if (!$thisAttribute.find('.selected').length) {\n allAttributesSelected = false;\n }\n });\n\n return allAttributesSelected;\n}\n\n/**\n * Add positioning class to popup if necessary.\n * @param {jQuery} $el - DOM element parent element\n * @param {jQuery} $popup - DOM element current popup\n */\nfunction popupAlignment($el, $popup) {\n var viewportWidth = $(window).width();\n var positionLeft = $el.offset().left;\n var elementWidth = $el.outerWidth();\n var elementCenter = positionLeft + (elementWidth / 2);\n var popupHalfWidth = $popup.outerWidth() / 2;\n var left = elementCenter <= popupHalfWidth;\n var right = popupHalfWidth > (viewportWidth - elementCenter);\n\n $popup[left ? 'addClass' : 'removeClass']('left-arrow');\n $popup[right ? 'addClass' : 'removeClass']('right-arrow');\n}\n\n/**\n * Prana Only: Show out of stock popup on size swatch\n * @param {jQuery} $sizeSwatch - DOM element\n * @param {string} eventType - Event type\n */\nfunction showOutOfStockPopup($sizeSwatch, eventType) {\n // TODO: Needs information about \"Shop Our Partners\" functionality.\n var $popup = $sizeSwatch.find('.product-outofstock__popup');\n\n if ($popup.length) { // This only applicable for Prana\n var thisSwatch = $sizeSwatch;\n\n if (eventType === 'addToCart') {\n // Desktop/Mobile: Show \"Sold Out\" popup after clicking these \"Add to Cart/Out of Stock\" button.\n popupAlignment($sizeSwatch, $popup);\n $popup.removeClass('invisible');\n setTimeout(function () {\n $(thisSwatch).find('.product-outofstock__popup').addClass('invisible');\n }, 3000);\n } else if (breakpoints.isLowRes()) {\n // Mobile: Opens on click.\n if (eventType === 'click') {\n popupAlignment($sizeSwatch, $popup);\n $popup.removeClass('invisible');\n $(document).one('click', function () {\n $(thisSwatch).find('.product-outofstock__popup').addClass('invisible');\n });\n }\n } else {\n // Desktop: Opens on hover.\n if (eventType === 'mouseenter') { // eslint-disable-line\n popupAlignment($sizeSwatch, $popup);\n $popup.removeClass('invisible');\n } else if (eventType === 'mouseleave') {\n popupAlignment($sizeSwatch, $popup);\n $popup.addClass('invisible');\n }\n }\n }\n}\n\n/**\n * Restores the digitalData object.\n * @param {Object} data The data to set in the digitalData object\n */\nfunction restoreDTM(data) {\n if (!!data && 'digitalData' in window) {\n const propsToUpdate = ['pageInstanceID', 'page', 'user'];\n propsToUpdate.forEach((prop) => {\n if (data[prop]) {\n window.digitalData[prop] = data[prop];\n }\n });\n delete window.preQuickViewModalDigitalData;\n }\n}\n\n/**\n * Handle click on button.add-to-cart when it is disabled\n */\nfunction onClickAddToCartButtonDisabled() {\n var $productContainer = $(this).closest('.product-detail');\n\n // Scrolls to the top of the product__attributes section if they are not all set.\n // offset to view all product attributes after alert disapears.\n var offset = $('.siteheader').outerHeight();\n $('.product__attributes').scrollTo(offset, 750); // TODO: GSD-11472 - can we just listen for the alert.closed event?\n\n // Reveal \"Select a size\" message.\n var $sizeSwatchSelected = $productContainer.find('.js-attribute-size .selected');\n var isSizeSwatchSelected = $sizeSwatchSelected.length;\n if (!isSizeSwatchSelected) {\n $('.selectswatch-size-msg', $productContainer).removeClass('d-none');\n }\n\n // Reveal any \"Sold Out\" messaging.\n if ($sizeSwatchSelected.find('.product-outofstock__popup').length) {\n // For Prana reveal the popup \"Sold Out\" message.\n $('body').trigger('product:showOutOfStockPopup', $sizeSwatchSelected);\n } else {\n // For other brands, reveal \"Sold Out\" div if they are not empty\n $('.product__message--velocity:parent', $productContainer).show();\n $('.outofstock-combination-msg:parent', $productContainer).show();\n }\n $('.accordion').trigger('collapse-changed'); // Refresh hc-sticky to avoid ovelaping content if velocity message appears.\n}\n\n/**\n * Handles disabled add to cart button interactions\n */\nfunction disabledAddToCartHandler() {\n if ($('.add-to-cart__container .btn-add-to-cart').eq(0).prop('disabled')) { // if add to cart button is disabled\n var $dimElement = $('.js-dimension-attribute');\n var $sizeElement = $('.js-size-attribute');\n\n if ($dimElement.length) {\n $('.selectswatch-dimension-msg').toggleClass('d-none', !!$dimElement.find('a.selected').length);\n }\n\n if ($sizeElement.length) {\n $('.selectswatch-size-msg').toggleClass('d-none', !!$sizeElement.find('a.selected').length);\n }\n\n onClickAddToCartButtonDisabled();\n }\n}\n\n/**\n * Updates attribute label on swatch interaction\n * @param {jQuery} $swatch swatch element that was interacted with\n */\nfunction updateSwatchAttributeLabel($swatch) {\n let selectedValue;\n const attrType = $swatch.closest('.js-attribute').data('attr');\n\n if (attrType === 'color') {\n selectedValue = $swatch.find('.color-value').attr('title');\n } else {\n selectedValue = $swatch.data('attr-hover');\n }\n\n if (selectedValue !== undefined) {\n $swatch.closest('.js-attribute').find('.js-attr-label-value').text(selectedValue);\n }\n}\n\nmodule.exports = {\n initExclusiveEvents: function () {\n $(document).on('click', '.js-open-account', function (e) {\n const qvPid = $(e.target).closest('.product-quickview').data('pid');\n\n if (qvPid) {\n $(document).on('form:preauth:success.quickview', 'form.authGateway', function () {\n sessionStorage.setItem('quickview', qvPid);\n });\n\n $(document).on('click.quickview', '.js-loyalty-banner-signup-btn', function () {\n sessionStorage.setItem('quickview', qvPid);\n });\n\n // if drawer is closed assume user does not want to sign in/join now\n // remove event listeners and session storage for reopening quickview\n $(document).on('hide.drawer', function () {\n $(document).off('.quickview');\n sessionStorage.removeItem('quickview');\n });\n }\n\n $(document).trigger('accountDrawer:show');\n });\n },\n isEverythingSelected: isEverythingSelected,\n attributeSelect: attributeSelect,\n updateOOSColorVariants: updateOOSColorVariants,\n methods: {\n editBonusProducts: function (data) {\n chooseBonusProducts(data);\n }\n },\n selectAttribute: function () {\n $('.product-detail').find('.js-attribute a.selected').each(function () {\n updateSwatchAttributeLabel($(this));\n });\n\n // js event listener that accepts an html swatch element and runs attributeSelect() code to select that swatch\n document.body.addEventListener('selectAttribute', function (e) {\n const $swatch = $(e.detail);\n\n if ($swatch) {\n const url = $swatch.data('attr-url');\n const $container = $swatch.closest('.product-detail');\n const attrType = $swatch.closest('.js-attribute').data('attr');\n\n attributeSelect(url, $container, attrType);\n }\n });\n\n $(document).on('click touchend', '.product-detail .js-swatch', function (e) {\n e.preventDefault();\n const $swatchClicked = $(e.currentTarget);\n\n if ($swatchClicked.not('.js-notifyme-swatch').hasClass('selected') || $swatchClicked.hasClass('invalid') || $swatchClicked.hasClass('not-orderable')) {\n return;\n }\n\n $swatchClicked.off('mouseleave');\n $swatchClicked.trigger('attribute:click');\n\n updateSwatchAttributeLabel($swatchClicked);\n\n let $productContainer = $swatchClicked.closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $swatchClicked.closest('.product-detail');\n }\n\n const selectedAttributeID = $(this).closest('.js-attribute').data('attr');\n\n let $selectedAttrUrl = $swatchClicked.data('attr-url');\n if (selectedAttributeID === 'size') {\n $selectedAttrUrl = appendDimensionParams($selectedAttrUrl);\n }\n\n attributeSelect($selectedAttrUrl, $productContainer, selectedAttributeID);\n });\n\n // Color Swatch hover effects\n $(document).off('mouseenter').on('mouseenter', '.product-detail .js-swatch', function (e) {\n if (breakpoints.isHighRes()) {\n const $swatchEntered = $(e.currentTarget);\n\n // do not reload selected swatch\n if ($swatchEntered.hasClass('selected')) return;\n\n const currentLabelText = $swatchEntered.closest('.js-attribute').find('.js-attr-label-value').text();\n\n updateSwatchAttributeLabel($swatchEntered);\n\n $swatchEntered.one('mouseleave', function () {\n $swatchEntered.closest('.js-attribute').find('.js-attr-label-value').text(currentLabelText);\n });\n }\n });\n\n // Prana only: \"Sold Out\" popup which appears when hovering/clicking on an out of stock size/dimension swatch.\n $(document).on('mouseenter mouseleave click', '.product-detail .js-size-swatch.unselectable, .product-detail .js-dimension-swatch.unselectable', function (e) {\n showOutOfStockPopup($(this), e.type);\n });\n\n $('body').on('product:showOutOfStockPopup', function (e, sizeSwatch) {\n showOutOfStockPopup($(sizeSwatch), 'addToCart');\n });\n },\n quickViewSwatchFunctionality: function () {\n // On Page Load if a color/size/dimension is selected display the Swatch value in the label\n $('.quickview-modal .product-detail .js-attribute a.selected').each(function () {\n updateSwatchAttributeLabel($(this));\n });\n },\n availability: function () {\n /**\n * Quantity change event for the productlineitems\n * extended with pickupinstore\n */\n $(document).on('change', '.quantity-select', function (e) {\n e.preventDefault();\n\n var searchPID = $(this).closest('.product-detail').attr('data-pid');\n var selectorPrefix = '.product-detail[data-pid=\"' + searchPID + '\"]';\n\n if ($(selectorPrefix + ' .selected-store-with-inventory').is(':visible')) {\n return;\n }\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n }\n\n if ($('.bundle-items', $productContainer).length === 0) {\n base.attributeSelect($(e.currentTarget).find('option:selected').data('url'), $productContainer);\n }\n });\n },\n\n addToCart: function () {\n $(document).off('click', 'button.add-to-cart, button.add-to-cart-global').on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n var addToCartUrl;\n var pid;\n var pidsObj;\n var setPids;\n var $addToCartButton = $(this);\n\n if (!isEverythingSelected($addToCartButton)) {\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').attr('disabled', true);\n disabledAddToCartHandler();\n $.spinner().stop();\n } else {\n $('body').trigger('product:beforeAddToCart', this);\n\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n setPids = [];\n\n $('.product-detail').each(function () {\n if (!$(this).hasClass('product-set-detail')) {\n setPids.push({\n pid: $(this).find('.product-id').data('pid'),\n qty: 1,\n options: getOptions($(this))\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: 1\n };\n\n if (!$('.bundle-item').length) {\n form.options = getOptions($productContainer);\n }\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\n $.spinner().stop();\n handlePostCartAdd(data);\n if (!data.error) {\n $('body').trigger('product:afterAddToCart', data);\n window.dispatchEvent(new Event('cart:updated:dtm'));\n }\n if (window.preQuickViewModalDigitalData) {\n // Restoring the digital data back to that of CLP page before opening the quick view modal.\n window.preQuickViewModalDigitalData = JSON.parse(window.preQuickViewModalDigitalData);\n setTimeout(function () {\n restoreDTM(window.preQuickViewModalDigitalData);\n }, 1000);\n } else if (data.dtmLayer && 'digitalData' in window) {\n if (data.dtmLayer.page) {\n window.digitalData.page = data.dtmLayer.page;\n }\n if (data.dtmLayer.user) {\n window.digitalData.user = data.dtmLayer.user;\n }\n }\n if (data.dtmLayer && data.dtmLayer.cart && 'digitalData' in window) {\n window.digitalData.cart = data.dtmLayer.cart;\n minicartSaleItemAlertBadge.toggleAlertBadge();\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n }\n });\n },\n getPidValue: getPidValue,\n setVariantNotifyMeStatus: setVariantNotifyMeStatus,\n forceOOSNotifyMe: forceOOSNotifyMe,\n overviewInit: Overview.init()\n};\n","'use strict';\n\nmodule.exports = function (include) {\n if (typeof include === 'function') {\n include();\n } else if (typeof include === 'object') {\n Object.keys(include).forEach(function (key) {\n if (typeof include[key] === 'function') {\n include[key]();\n }\n });\n }\n};\n","'use strict';\n\nconst Swiper = require('swiper/swiper-bundle.min.js');\nconst breakpoints = require('../components/breakpoints');\nconst utils = require('../components/utils');\nconst onModel = require('./onModelDescription');\n\nlet $mainGallery;\nlet $thumbnailGallery;\n\n// swiper instances\nlet swiperMain;\nlet swiperThumb;\n\n// video player instance\nlet player;\n\n/**\n * Initialize Swiper Gallery\n * @param {jQuery} $main jQuery reference to main gallery element\n * @param {jQuery|undefined} $thumbnail jQuery reference to thumbnail gallery element\n */\nfunction initSwiperGallery($main, $thumbnail) {\n const swiperGalleryMain = $main[0];\n const swiperConfigMain = {\n centeredSlides: true,\n slidesPerView: 1,\n zoom: { toggle: false },\n navigation: {\n nextEl: '.swiper-button-next',\n prevEl: '.swiper-button-prev',\n disabledClass: 'd-none'\n },\n loop: false\n };\n const removeSlideSelectors = [\n '.product-quickview .video-slide'\n ];\n\n if ($thumbnail.length) {\n const swiperGalleryThumb = $thumbnail[0];\n\n swiperThumb = new Swiper(swiperGalleryThumb, {\n width: 44,\n slidesPerView: 'auto',\n loop: false,\n threshold: 1000 // arbitrary high value to prevent cancellation of click event\n });\n\n swiperConfigMain.thumbs = {\n swiper: swiperThumb\n };\n\n // Prevent screenreader from reading all alt tags whenever the gallery is updated\n $thumbnail.find('.swiper-wrapper').removeAttr('aria-live');\n }\n\n $(removeSlideSelectors.join(',')).each(function (i, slide) {\n $(slide).remove();\n });\n\n swiperMain = new Swiper(swiperGalleryMain, swiperConfigMain);\n\n // Prevent screenreader from reading all alt tags whenever the gallery is updated\n $main.find('.swiper-wrapper').removeAttr('aria-live');\n}\n\n/**\n * Initialize zoom container\n * @param {Object} $zoomModal: Reference to zoom container\n * @param {number} zoomIndex: The index to zoom on init\n */\nfunction initZoom($zoomModal, zoomIndex) {\n const $zoomViewer = $zoomModal.find('.js-product-zoom-viewer');\n const $bigImg = $zoomViewer.find('img');\n\n // On thumbnail click inside zoom viewer, change to the zoomed view of the clicked image\n $zoomModal\n .on('click', '.js-product-thumb', function (e) {\n e.preventDefault();\n const $elem = $(this);\n const hiResImage = $elem.data('img-hi-res');\n const altZoomThumbSubstring = 'Zoom thumbnail:';\n const altZoomSubstring = 'Zoom:';\n\n // Get alt description from thumbnail and modify for zoom image\n let alt = $elem.find('img').attr('alt');\n\n if (alt.substring(altZoomThumbSubstring)) {\n alt = alt.replace(altZoomThumbSubstring, altZoomSubstring);\n }\n\n $zoomModal.find('.js-product-thumb').removeClass('active');\n $elem.addClass('active');\n $bigImg.attr('src', hiResImage);\n $bigImg.attr('alt', alt);\n })\n // Move around the zoomed image with mouse\n .on('mousemove', '.js-product-zoom-viewer', function (e) {\n const viewerWidth = $zoomViewer.outerWidth();\n const viewerHeight = $zoomViewer.outerHeight();\n const difWidth = viewerWidth - $bigImg.outerWidth();\n const difHeight = viewerHeight - $bigImg.outerHeight();\n const viewerOffset = $zoomViewer.offset();\n // Track mouse movement on desktop\n let x = 0;\n let y = 0;\n let imgX;\n let imgY;\n if (difWidth < 0) {\n x = e.pageX - viewerOffset.left;\n imgX = difWidth * ((x / viewerWidth) - 0.5);\n } else {\n imgX = 0;\n }\n if (difHeight < 0) {\n y = e.pageY - viewerOffset.top;\n imgY = difHeight * ((y / viewerHeight) - 0.5);\n } else {\n imgY = 0;\n }\n $bigImg.css('transform', `translate3d(${imgX}px, ${imgY}px, 0)`);\n })\n .on('hide.bs.modal', function () {\n // slide swiper gallery to image that was open in zoom\n const activeIndex = $zoomModal.find('.js-product-thumb.active').data('index');\n swiperMain.slideTo(activeIndex);\n })\n .on('hidden.bs.modal', function () {\n // remove the modal markup completely\n $(this).remove();\n });\n\n // On init, open the last image that was being viewed in the product gallery\n const $activeThumb = $zoomModal.find('.js-product-thumb[data-index=\"' + zoomIndex + '\"]');\n if ($activeThumb.length) {\n $activeThumb.trigger('click');\n }\n}\n\n/**\n * Initialize video player\n */\nfunction initVideoPlayer() {\n const $videoSlide = $mainGallery.find('.js-video-player');\n\n // exit if no video player exists\n if (!$videoSlide.length) return;\n\n const playerHost = $videoSlide.data('host');\n const videoId = $videoSlide.data('video-id');\n const playerId = playerHost === 'youtube' ? 'ytPlayer_' + videoId : 'vimeoPlayer_' + videoId;\n\n // preload youtube video player dependency\n if (playerHost === 'youtube') {\n const tagId = 'youtube-api-script';\n const tagExists = document.getElementById(tagId);\n if (!tagExists) {\n const tag = document.createElement('script');\n tag.src = 'https://www.youtube.com/iframe_api';\n tag.id = tagId;\n const firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n }\n }\n\n // wait for video player node to be created\n const videoPlayerObserver = new MutationObserver(function () {\n player = window.videoPlayers[playerId];\n if (player) {\n videoPlayerObserver.disconnect();\n }\n });\n videoPlayerObserver.observe($videoSlide[0], { childList: true, subtree: true });\n\n // pause product video on slide change\n swiperMain.on('slideChange', function () {\n if (player) {\n if (playerHost === 'youtube') {\n player.pauseVideo();\n } else {\n player.pause();\n }\n }\n });\n}\n\n/**\n * Initialize product gallery events\n */\nfunction initGalleryEvents() {\n $mainGallery\n .off('.zoom')\n // prevent swiping when zoom icon is being interacted with\n .on('mousedown.zoom', '.js-pdp-gallery-zoom', function () {\n if (swiperMain.allowTouchMove) {\n swiperMain.allowTouchMove = false;\n\n setTimeout(() => {\n swiperMain.allowTouchMove = true;\n }, 500);\n }\n })\n // When zoom button is clicked, enable zoom\n .on('click.zoom', '.js-pdp-gallery-zoom', function () {\n if (breakpoints.isLowRes()) {\n swiperMain.zoom.toggle();\n } else {\n const $imageClicked = $(this).closest('.js-product-image');\n let url = $imageClicked.closest('.js-product-gallery').data('zoom-url');\n\n // If a color swatch has been selected\n const $selectedColorSwatch = $('[data-attr=\"color\"] .color-value.selected');\n if ($selectedColorSwatch.length && url) {\n const pid = $('.product-detail').data('pid').toString();\n const color = $selectedColorSwatch.data('attr-value');\n const urlPid = utils.getParamsFromURL(url).pid;\n\n if (pid !== urlPid) {\n url = utils.updateURLParam(url, 'pid', pid);\n }\n if (color && pid) {\n // get base pid without appended _S\n const basePid = pid.split('_')[0];\n url = utils.appendParamToURL(url, 'dwvar_' + basePid + '_color', color);\n }\n }\n\n if (!url) { return; }\n\n $.spinner().start();\n $.ajax({\n url: url,\n method: 'GET',\n dataType: 'html',\n success: function (html) {\n $.spinner().stop();\n\n const modalHTML = utils.createModalMarkup(html, { modalSizeClass: 'modal-fluid' });\n let $zoomModal = $(modalHTML).modal();\n\n let imageIndexToZoom = 0;\n if ($imageClicked.data('index')) {\n imageIndexToZoom = $imageClicked.data('index');\n }\n\n // fix for IE:\n const ua = window.navigator.userAgent;\n if (ua.indexOf('MSIE ') > -1 || ua.indexOf('Trident/') > -1) {\n $zoomModal.one('shown.bs.modal', function () {\n const $modalBody = $zoomModal.find('.modal-body');\n const zoomViewerHeight = $modalBody.find('.js-product-zoom-viewer').outerHeight();\n const modalBodyPadding = parseFloat($modalBody.css('padding-top')) + parseFloat($modalBody.css('padding-bottom'));\n $modalBody.css('height', zoomViewerHeight + modalBodyPadding);\n });\n }\n\n initZoom($zoomModal, imageIndexToZoom);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n });\n\n // use to swap image low/high resolution when zoom button is clicked\n swiperMain.on('zoomChange', function (swiper, scale, imageEl) {\n // zoomChange fires with these params: swiper, scale, imageEl, slideEl\n let setImageUrl = $(imageEl).data('lowres');\n if (scale !== 1) {\n setImageUrl = $(imageEl).data('hires');\n }\n $(imageEl).attr('src', setImageUrl);\n });\n\n // re-initialize video player when swatch interaction refreshes gallery\n $(document).on('video:player:update', function () {\n initVideoPlayer();\n });\n}\n\n/**\n * Disable/hide zoom button\n */\nfunction disableZoom() {\n $('.js-pdp-gallery-zoom').addClass('d-none');\n}\n\n/**\n * Get jQuery elements required to build image gallery via configuration\n * @param {Object} config allowable options specified in configDefault\n * @returns {Object} jQuery elements required to build image gallery\n */\nfunction getGalleryElements(config) {\n const configDefault = {\n hasThumbnails: true,\n isQuickview: false,\n gallerySelector: '.js-product-gallery',\n thumbnailSelector: '.js-product-gallery-thumb',\n galleryContainerSelector: '.primary-images'\n };\n\n const options = $.extend({}, configDefault, config);\n\n const galleryElements = {};\n const $galleryContainer = $(options.galleryContainerSelector).first();\n\n if ($galleryContainer.length) {\n const $gallery = $galleryContainer.find(options.gallerySelector).first();\n\n if ($gallery.length) {\n galleryElements.$gallery = $gallery;\n galleryElements.$galleryContainer = $galleryContainer;\n galleryElements.isQuickview = !!options.isQuickview;\n\n if (options.hasThumbnails) {\n const $thumbnail = $galleryContainer.find(options.thumbnailSelector).first();\n\n if ($thumbnail.length) {\n galleryElements.$thumbnail = $thumbnail;\n galleryElements.hasThumbnails = true;\n }\n }\n }\n }\n\n return galleryElements;\n}\n\nmodule.exports = function (galleryConfig) {\n const galleryElements = getGalleryElements(galleryConfig);\n\n $mainGallery = galleryElements.$gallery;\n $thumbnailGallery = galleryElements.$thumbnail;\n const hasThumbnails = galleryElements.hasThumbnails;\n const isQuickview = galleryElements.isQuickview;\n\n if (!$mainGallery || !$mainGallery.length || $mainGallery[0].swiper) {\n return {\n init: function () {}\n };\n }\n\n this.$gallery = $mainGallery;\n\n if (hasThumbnails) {\n this.$thumbnailGallery = $thumbnailGallery;\n }\n\n this.init = function () {\n initSwiperGallery($mainGallery, $thumbnailGallery);\n\n if (!isQuickview) {\n initVideoPlayer();\n initGalleryEvents();\n onModel.triggerOnModelDescription();\n } else {\n disableZoom();\n }\n };\n\n return this;\n};\n","'use strict';\n\n/**\n * When a promotion multiplier is in effect, highlight the bonus reward\n * if a strikeout price (sibling element) is detected\n */\nfunction highlightMultiplierReward() {\n if ($('.js-rewards-highlight + s').length) {\n $('.js-rewards-highlight').addClass('forecasted-loyalty-rewards__text--highlight');\n }\n}\n\n/**\n * Displays the Loyalty points forecast on PDP\n * @param {HTML} html Product data passed on attribute selection\n */\nfunction updateLoyaltyForecastPoints(html) {\n const $rewardsContainer = $('.js-rewards-container');\n $rewardsContainer.html(html);\n highlightMultiplierReward();\n}\n\nmodule.exports = {\n init: function () {\n // Attribute Select Event\n $('body').on('product:afterAttributeSelect', function (e, response) {\n var rewardsData = response.data.product.rewardsHtml;\n if (rewardsData) {\n updateLoyaltyForecastPoints(rewardsData);\n }\n });\n highlightMultiplierReward();\n }\n};\n","'use strict';\n\n/**\n * Display badge based on product variant response\n * @param {Object} badgeData from product data\n * @return {string} HTML Output\n */\nfunction displayBadge(badgeData) {\n let result = '';\n\n if (!(badgeData && badgeData.gridBadge)) {\n return result;\n }\n\n const gridBadgeValue = badgeData.gridBadge.value || null;\n const gridBadgeDisplay = badgeData.gridBadge.display || null;\n const hasSaleSwatchSelected = $('.js-color-swatch.js-onsale.selected').length;\n const hideDynamicBadges = !!badgeData.gridBadge.hideDynamicBadges;\n // In contrast with the grid tile, the PDP 'Sale' badge will be omitted from this static type array and handled dynamically\n const staticTypes = ['BestSeller', 'New', 'Coming Soon'];\n const isStaticType = staticTypes.includes(badgeData.gridBadge.value);\n\n let badgeType;\n\n if (badgeData.svg) {\n result = `\n
      \n \n
      \n `;\n } else if (gridBadgeValue && gridBadgeDisplay && gridBadgeValue.toLowerCase() !== 'sale') {\n badgeType = gridBadgeValue.toLowerCase();\n } else if (!hideDynamicBadges && hasSaleSwatchSelected && !isStaticType) {\n badgeType = 'sale';\n }\n\n if (badgeType) {\n result = `\n
      \n ${gridBadgeDisplay}\n
      `;\n }\n\n return result;\n}\n\n/**\n * Display PDP image gallery tech badge based on product technology\n * @param {Object} badgeData from pdp data\n * @return {string} HTML Output\n */\nfunction displayTechBadge(badgeData) {\n let result = '';\n\n if (!badgeData) {\n return result;\n }\n\n result = `\n
      \n \n \n \n
      `;\n\n return result;\n}\n\nmodule.exports = {\n displayBadge,\n displayTechBadge\n};\n","'use strict';\n\n/**\n * Remove overview modal and backdrop\n */\nfunction closeModal() {\n $('.overview-modal, .modal-backdrop').remove();\n\n // Account for scrollbars to prevent CLS\n $.enableScroll();\n $('body').removeClass('modal-open').css('padding-right', '');\n $(window).trigger('scroll');\n}\n\n/**\n * Builds HTML element that will display the overview benefit modal contents\n * @param {HTML} html response used render modal content\n * @returns {HTMLElement} Reference to modal JQuery object\n */\nfunction buildModal(html) {\n const $modal = $.modal({\n content: html,\n customClasses: 'overview-modal',\n modalSizeClass: 'modal-lg'\n }).on('hidden.bs.modal', () => {\n closeModal();\n });\n\n return $modal;\n}\n\n/**\n * Fetches overview html from server and launches modal\n * @param {string} url - Overview controller endpoint url\n * @param {HTMLElement} $modal - Reference to modal JQuery object\n */\nfunction launchModal(url) {\n if (!url) {\n return;\n }\n\n $.ajax({\n url: url,\n method: 'GET',\n dataType: 'html',\n success: (data) => {\n buildModal(data);\n },\n complete: () => {\n $.spinner().stop();\n $.disableScroll();\n },\n error: () => {\n closeModal();\n }\n });\n}\n\nmodule.exports = {\n init: function () {\n $('body')\n .off('click.overview', '.js-overview-modal')\n .on('click.overview', '.js-overview-modal', (e) => {\n e.preventDefault();\n let $this = $(e.currentTarget);\n let link = $this.data('link') || $this.attr('href');\n\n launchModal(link);\n });\n },\n buildModal,\n launchModal,\n closeModal\n};\n","'use strict';\nvar breakpoints = require('../components/breakpoints');\nvar tabbedContainer = require('../aem/tabbedContainer');\n\n/**\n * Show unit toggle control if .js-no-unit-toggle class is not present\n */\nfunction showUnitToggle() {\n if ($('.tabbed-container__tabs .js-no-unit-toggle.active').is(':visible')) {\n $('.js-unit-toggle').addClass('d-none');\n } else {\n $('.js-unit-toggle').removeClass('d-none');\n }\n}\n\n/**\n *\n * @param {string} categorySuffix - the category to be shown\n * @param {string} sectionDiv - the section to be shown\n * @param {string} buttonText - the text to be replace the top accordion\n * @param {string} gender - text containing the gender option to show on the top most accordion upon selection\n */\nfunction toggleCategorySizeFit(categorySuffix, sectionDiv, buttonText, gender) {\n if (typeof categorySuffix === 'undefined' || typeof sectionDiv === 'undefined') {\n return;\n }\n\n var $categorySelected = $('div.size-guides-' + categorySuffix);\n var $divSelected = $('div.' + sectionDiv);\n var $activeCategory = $('.category-shown');\n var $activeSection = $('.section-shown');\n\n if ($activeCategory) {\n $activeCategory.addClass('d-none').removeClass('category-shown');\n }\n\n if ($activeSection) {\n $activeSection.addClass('d-none').removeClass('section-shown');\n }\n\n $categorySelected.removeClass('d-none').addClass('category-shown');\n $divSelected.removeClass('d-none').addClass('section-shown');\n var menuText = gender + ' > ' + buttonText;\n var $menu = $('a.selectedCategory div.accordion__title__text');\n $menu.html(menuText);\n\n // Determine if unit toggle control should display\n showUnitToggle();\n\n // Click tab to ensure proper tabbed content height\n $('.ofs__item.active:visible').trigger('click');\n\n var genderCategory = gender.replace(/[^\\w ]+/g, '').toLowerCase();\n\n $('#selectionCategory-' + genderCategory).collapse('toggle');\n $('#selectionAccordion').collapse('toggle');\n}\n\n/**\n * to select a category from the list\n * @param {Object} $element category id value\n */\nfunction selectCategory($element) {\n var elementIdParts = $element.id.split('-');\n var categorySuffix = elementIdParts[0] + '-' + $element.dataset.subcat;\n var genderToShow = $element.dataset.gendershow;\n var sectionDiv = elementIdParts[1];\n var buttonText = $element.innerText;\n toggleCategorySizeFit(categorySuffix, sectionDiv, buttonText, genderToShow);\n}\n\n/**\n * convert inches-to-centimeters and vice-versa\n * @param {boolean} useCentimeters if true then convert to centimeters, else convert to inches\n * @param {string} value value to convert\n * @returns {string} converted value\n */\nfunction unitConversion(useCentimeters, value) {\n var result;\n var radix = 10;\n var unit = (useCentimeters) ? 2.54 : 0.3937;\n if (value.indexOf('-') > -1) {\n var values = value.split('-');\n values.forEach(function (size) {\n if (!isNaN(size)) {\n result = (result == null) ? parseFloat((Number(size) * unit).toFixed(1), radix) : result + '-' + parseFloat((Number(size) * unit).toFixed(1), radix);\n }\n });\n } else if (!isNaN(value)) {\n result = parseFloat((Number(value) * unit).toFixed(1), radix);\n }\n\n return result;\n}\n\n/**\n * function to read the measurement values and set respective converted value\n * @param {boolean} useCentimeters if true then convert to centimeters, else convert to inches\n */\nfunction toggleMeasurements(useCentimeters) {\n const $toggleTables = $('.size-chart-asset table');\n\n $toggleTables.each(function () {\n const $toggleTable = $(this);\n const $columnHeaders = $toggleTable.find('thead th'); // get table column headers\n\n $toggleTable.find('.js-convert-column').each(function () {\n const nthIndex = $columnHeaders.index(this) + 1; // index of .js-convert-column element relative to it's siblings\n const $toggleCells = $toggleTable.find('tbody td:nth-child(' + nthIndex + ')'); // get table cells in the same column as .js-convert-column\n\n $toggleCells.each(function () {\n const $toggleCell = $(this);\n const convertedValue = unitConversion(useCentimeters, $toggleCell.text()); // convert values on relevant table cells\n\n if (convertedValue) {\n $toggleCell.text(convertedValue);\n }\n });\n });\n });\n}\n\n/**\n * Clear table of all styling classes\n * @param {Object} $tableElement - the table that will have the styling removed from its elements\n */\nfunction clearTableClasses($tableElement) {\n $tableElement.find('th, td').removeClass('selected-table-element cross-section-header cross-section-data');\n}\n\n/** Adds the appropriate styling to the table element being passed\n * @param {Object} $tableElement - element to be styled, based of th/td tag\n */\nfunction applyTableElementStyle($tableElement) {\n var className;\n className = $tableElement.is('th') ? 'cross-section-header' : 'cross-section-data';\n $tableElement.addClass(className);\n}\n\n/** For the table in the measurement section\n * @param {Object} tableElement - table element to be focussed on for cross section\n * @returns {boolean} - false to break the loop, true to move on to the next iteration in the each loop.\n */\nfunction tableCrossSection(tableElement) {\n var $tdElement = $(tableElement);\n var $trElement = $tdElement.closest('tr');\n var containsTdElement = $trElement.has('td').length;\n var elementIndex = $tdElement.index();\n var $tableElement = $tdElement.closest('table');\n clearTableClasses($tableElement);\n $tdElement.addClass('selected-table-element');\n\n // Check if row contains td element, if not it is the header row and\n // cross section doesn't need to be calculated\n if (containsTdElement && elementIndex) {\n // Loop through each table row and apply cross section styling\n $tableElement.find('tr').each(function (iterator, rowElement) {\n var $rowElement = $(rowElement);\n\n // If table row does not contain the moused over cell,\n // apply styling to the cell in the same column\n if (!$rowElement.has('td.selected-table-element').length) {\n var $rowCell = $($rowElement.find('th, td')[elementIndex]);\n applyTableElementStyle($rowCell);\n } else {\n // Apply styling to the entire row, prior to the moused over element\n $rowElement.children().each(function (columnIndex, childElement) {\n var $childElement = $(childElement);\n if (columnIndex < elementIndex) {\n applyTableElementStyle($childElement);\n }\n });\n return false;\n }\n return true;\n });\n }\n return true;\n}\n\n/**\n * Create scroll buttons when the table is larger than the size of the screen\n * TODO: Tech Debt: https://columbia.atlassian.net/browse/GSD-18362 - Remove createScrollButtons()\n */\nfunction createScrollButtons() {\n var $activeContent = $('.js-sizefit-content:visible .tabbed-container__content.active');\n var overflow = $activeContent.find('table.size-chart-asset__table').outerWidth() - $activeContent.outerWidth();\n if (overflow > 0 && breakpoints.isLowRes()) {\n $('.js-scroll-button').remove(); // remove old instances\n var tableHeaderHeight = $activeContent.find('table.size-chart-asset__table th').css('height');\n var marginLeft = parseInt($activeContent.find('table.size-chart-asset__table th').css('width'), 10) + 1 + 'px'; // Adds extra pixel for outline\n var $rightScrollButton = ``;\n var $leftScrollButton = ``;\n $activeContent.append($leftScrollButton);\n $activeContent.append($rightScrollButton);\n }\n}\n\n/**\n * Switches position of scroll buttons\n * @param {Object} $container - jQuery element of table element\n */\nfunction scrollButtonPosition($container) {\n var $table = $container.find('table.size-chart-asset__table');\n var tableOverflow = $table.outerWidth() - $container.outerWidth();\n var $tableOffset = $table.offset();\n var offsetLeft = $tableOffset.left - 48; // remove 3rem offset\n\n if (tableOverflow + offsetLeft < 2) {\n $('.scroll-table-right').addClass('d-none');\n $('.js-scroll-button.scroll-table-left.d-none').removeClass('d-none');\n } else if (offsetLeft < 2 && offsetLeft > 0) {\n $('.scroll-table-left').addClass('d-none');\n $('.js-scroll-button.scroll-table-right.d-none').removeClass('d-none');\n }\n}\n\n/**\n * Highlights fit selection in Fit Guide content asset\n */\nfunction highlightFitSelection() {\n const $sizeFitModal = $('.sizefit-modal');\n const fitAsset = $('.js-apparel-fit').data('fit-asset');\n const selection = $sizeFitModal.find('[id*=\"' + fitAsset + '\"]');\n\n // Adds outline to content asset wrapper\n selection.addClass('outline');\n}\n\nmodule.exports = {\n initSizeFit: function () {\n const $unitToggles = $('.js-unit-toggle');\n\n createScrollButtons();\n highlightFitSelection(); // Highlight apparel fit in content asset\n\n // TODO: Add event delegation / investigate if needed.\n $('.js-sizefit-option').on('click', function () {\n selectCategory(this);\n $(window).trigger('resize'); // this fixes the height of the overflow slider tabs\n });\n\n // inches/cm toggle\n $unitToggles.on('click', function () {\n var $element = $(this);\n var useCentimeters = false;\n if ($element.hasClass('inches')) {\n $unitToggles.addClass('centi').removeClass('inches');\n useCentimeters = true;\n } else {\n $unitToggles.addClass('inches').removeClass('centi');\n }\n\n toggleMeasurements(useCentimeters);\n });\n\n $('body').on('click', '.ofs__item', function () {\n createScrollButtons();\n });\n\n $('body').on('click', '.js-no-unit-toggle', function () {\n showUnitToggle();\n });\n\n $('.js-sizefit-content').on('shown.bs.collapse', function () {\n $(window).trigger('resize'); // this fixes the height of the overflow slider tabs\n // and this fixes the height of the active content container which was hidden, so had a height of 0:\n $(this).find('.tabbed-container__content-container').each((index, container) => {\n var $container = $(container);\n return $container.css('height', $container.find('.active').outerHeight());\n });\n createScrollButtons();\n });\n\n $('body').on('click', '.js-scroll-button', function () {\n var $activeTable = $('.js-sizefit-content:visible .tabbed-container__content.active .size-chart-asset');\n var $currentScrollButton = $(this);\n $activeTable.animate({ scrollLeft: $currentScrollButton.data('overflow') }, 200, function () {\n scrollButtonPosition($activeTable);\n });\n });\n $('body').on('mouseover', '.size-chart-asset__table td, .size-chart-asset__table th', function () {\n tableCrossSection(this);\n });\n $('body').on('mouseleave', 'table', function () {\n var $tableElement = $(this);\n clearTableClasses($tableElement);\n });\n $('.size-chart-asset').on('scroll', function () {\n var $container = $(this);\n scrollButtonPosition($container);\n });\n },\n getSizeFitGuideContent: function ($modalContentWrapper, url) {\n var successHandler = (html) => {\n // append the template HTML of the interactive size/fit guide to the '.modal-body'\n $modalContentWrapper.find('.modal-body').html(html);\n\n // initialize the event handlers and interactive behavior\n $modalContentWrapper.find('.overflow-slider').overflowSlider();\n tabbedContainer.init();\n $modalContentWrapper.find('.tabbed-container__content-container .active').siblings().hide(); // full page load already happened so we need to do this explicitly\n this.initSizeFit();\n };\n\n // fetch the HTML content for the interactive size/fit guide and\n $.ajax({\n url: url,\n method: 'GET',\n dataType: 'json',\n success: (data) => {\n if (!$modalContentWrapper[0].parentElement) {\n // success was called before the modal is shown.\n $modalContentWrapper.on('shown.bs.modal', () => {\n successHandler(data.renderedTemplate);\n });\n } else {\n successHandler(data.renderedTemplate);\n }\n },\n error: () => {\n $modalContentWrapper.modal('hide');\n }\n });\n }\n};\n","'use strict';\n\nmodule.exports = function () {\n /**\n * overflowSlider - a jQuery plugin that allows for content to be dragged by\n * the mouse or by touch if it overflows the container.\n *\n * Struction of the markup:\n *
      \n *
      \n *
      \n *
      Item
      \n *
      Item
      \n *
      ...
      \n *
      \n *
      \n *
      \n *\n * @param {Object} options JSON object containing optional settings.\n * @return {Object} jQuery object of the selected element.\n */\n $.fn.overflowSlider = function (options) {\n var settings = $.extend({}, $.fn.overflowSlider.defaults, options);\n\n var collection = this;\n\n // TODO: define these per instance, not on the collection.\n var containerSelector = '.' + settings.containerClass;\n var sliderSelector = '.' + settings.sliderClass;\n var arrowLeftSelector = '.' + settings.arrowLeftClass;\n var arrowRightSelector = '.' + settings.arrowRightClass;\n\n // functions (avoid no-use-before-define lint errors)\n var slideByAmount;\n var slideToItem;\n var slideToX;\n var dragStart;\n var dragging;\n var dragEnd;\n var toggleArrows;\n var listenForArrowClicks;\n var setHeight;\n var init;\n var clamp;\n\n /**\n * Slides the slider by the given percentage of the overflow-slider.\n * @param {Object} $ofs This instance of the overflow slider.\n * @param {number} percentToSlide The amount to slide the slider within the container. 0 - 1.\n */\n slideByAmount = function ($ofs, percentToSlide) {\n var newXPos = 0;\n var endX = $ofs.prop('ofs').endX;\n var startXPos = parseFloat($ofs.find(sliderSelector).css('left')) || 0; // parse float to drop the 'px'\n var containerSize = $ofs.find(containerSelector).innerWidth();\n var sliderSize = $ofs.find(sliderSelector).outerWidth(true);\n if ($ofs.prop('ofs').settings.centered && containerSize > sliderSize) {\n // center the slider within the container\n newXPos = (containerSize - sliderSize) / 2;\n $ofs.find(sliderSelector).stop().animate({ left: newXPos }, {\n always: function () {\n toggleArrows($ofs, newXPos, 0, endX);\n }\n });\n } else {\n var slideSize = $ofs.innerWidth() * percentToSlide;\n newXPos = startXPos + slideSize;\n slideToX($ofs, newXPos);\n }\n };\n\n /**\n * Slide the slider to the specified item if it is overflowing the slider.\n * @param {Object} $ofs This instance of the overflow slider.\n * @param {Object} $item jQuery object of the item within the slider.\n */\n slideToItem = function ($ofs, $item) {\n var itemLeft = $item.position().left;\n var $slider = $ofs.find(sliderSelector);\n var currentSliderXPos = parseFloat($slider.css('left')) || 0;\n var sliderMargin = parseFloat($slider.css('margin-left'));\n var endX = $ofs.prop('ofs').endX;\n var arrowSize = 0;\n if ($ofs.prop('ofs').settings.showArrows) {\n // add the width of the arrows\n arrowSize = $ofs.find(arrowRightSelector).outerWidth(true) || $ofs.find(arrowLeftSelector).outerWidth(true) || 0;\n }\n\n var containerSize = $ofs.find(containerSelector).innerWidth();\n var sliderSize = $ofs.find(sliderSelector).outerWidth(true);\n if (containerSize > sliderSize) {\n // there's enough space to show the entire slider\n if ($ofs.prop('ofs').settings.centered) {\n // center the slider within the container\n var newXPos = (containerSize - sliderSize) / 2;\n $ofs.find(sliderSelector).stop().animate({ left: newXPos }, {\n always: function () {\n toggleArrows($ofs, newXPos, 0, endX);\n }\n });\n } else {\n slideToX($ofs, 0);\n }\n } else if (itemLeft + currentSliderXPos < 0 + arrowSize) {\n // the active item is off to the left\n slideToX($ofs, (itemLeft * -1) - (sliderMargin - arrowSize));\n } else {\n var itemRight = itemLeft + $item.outerWidth(true);\n var ofsWidth = $ofs.find(containerSelector).innerWidth();\n if (itemRight + currentSliderXPos + sliderMargin > ofsWidth - arrowSize) {\n // the active item is off to the right\n slideToX($ofs, (ofsWidth - itemRight - sliderMargin - arrowSize));\n } else {\n // the slider is wider than the container, but the active item is in view.\n toggleArrows($ofs, currentSliderXPos, 0, endX);\n }\n }\n };\n\n /**\n * Slide the slider to the specified x position.\n * @param {Object} $ofs This instance of the overflow slider.\n * @param {number} x The slider left position to slide to.\n */\n slideToX = function ($ofs, x) {\n var endX = $ofs.prop('ofs').endX;\n var newXPos = clamp(x, endX, 0);\n $ofs.find(sliderSelector).stop().animate({ left: newXPos }, {\n always: function () {\n toggleArrows($ofs, newXPos, 0, endX);\n }\n });\n };\n\n /**\n * when the user initiates a mouse click or touch dragging event\n * @param {Event} e The event that triggered the start of a drag.\n */\n dragStart = function (e) {\n // 'this' is the .overflow-slider element\n var $ofs = $(this);\n\n if ($ofs.prop('ofs').settings.preventDefault && e.type !== 'touchstart') {\n e.preventDefault();\n }\n\n if ($ofs.prop('ofs').settings.centered) {\n var containerSize = $ofs.find(containerSelector).innerWidth();\n var sliderSize = $ofs.find(sliderSelector).outerWidth(true);\n if (containerSize > sliderSize) {\n // The slider fits within the container. No dragging needed.\n return;\n }\n }\n\n // mouse is down on the slider. get data.\n if (e.type === 'touchstart') {\n this.ofs.mouseX = e.touches[0].clientX;\n } else {\n this.ofs.mouseX = e.clientX;\n }\n this.ofs.sliderX = parseFloat($ofs.find(sliderSelector).css('left')) || 0;\n\n // start listening for movement\n $ofs.on('mousemove.ofs', dragging);\n $ofs.on('touchmove.ofs', dragging);\n // $ofs.on('pointermove.ofs', dragging); // for IE\n\n // start listening for a mouse up anywhere on the page\n $(document).one('mouseup.ofs', dragEnd);\n $(document).one('touchend.ofs', dragEnd);\n // $(document).one('pointerup.ofs', dragEnd); // for IE\n };\n\n /**\n * \"on dragging\" functionality that takes in either touch event or on click event types and updates the x position of the slider within the container.\n * @param {Event} e The event triggering the drag.\n */\n dragging = function (e) {\n // 'this' is the .overflow-slider element\n var $ofs = $(this);\n\n if ($ofs.prop('ofs').settings.preventDefault) {\n e.preventDefault();\n }\n\n this.ofs.isDragging = true;\n var clientX;\n if (e.type === 'touchmove') {\n clientX = e.touches[0].clientX;\n } else {\n clientX = e.clientX;\n }\n // update the left postion\n var currentSliderXPos = this.ofs.sliderX;\n var mouseDownXPos = this.ofs.mouseX;\n var endX = this.ofs.endX;\n var newXPos = currentSliderXPos + (clientX - mouseDownXPos);\n newXPos = clamp(newXPos, endX, 0);\n $ofs.find(sliderSelector).css('left', newXPos);\n };\n\n /**\n * This is called when the user releases the mouse click or touch dragging event\n * @param {Event} e The mouseup/touchend event.\n */\n dragEnd = function () {\n // 'this' is document\n // stop listening for movement\n $(collection).off('mousemove.ofs');\n $(collection).off('touchmove.ofs');\n // $ofs.off('pointermove.ofs'); // for IE\n\n $(collection).each(function () {\n if (this.ofs.isDragging) {\n this.ofs.isDragging = false;\n var newXPos = parseFloat($(this).find(sliderSelector).css('left')) || 0;\n var endX = this.ofs.endX;\n // this.ofs.sliderX = newXPos;\n toggleArrows($(this), newXPos, 0, endX);\n } else {\n // mouse did not move. this is a regular click.\n this.ofs.isDragging = false;\n }\n });\n };\n\n /**\n * Uses the x position of the slider to hide or show the left and right arrows.\n * If we're within 3px (see threshold) of the left or right position, the arrow will be hidden.\n * @param {Object} $ofs This instance of the overflow slider.\n * @param {number} x The current x position of the slider.\n * @param {number} left The minimum x position of the slider.\n * @param {number} right The maximum x position of the slider.\n */\n toggleArrows = function ($ofs, x, left, right) {\n // threshold is an arbitrary minimum distance the slider must travel\n // before the arrows will show. If the slider is within 3px of the min\n // or max, the arrow will not show.\n var threshold = 3;\n $ofs.find(arrowLeftSelector).toggle(x < left - threshold);\n $ofs.find(arrowRightSelector).toggle(x > right + threshold);\n };\n\n /**\n * this binds a click event to the arrows. The settings for slideAmount are defined in the .overflowSlider.defaults\n * @param {Object} $ofs This instance of the overflow slider.\n */\n listenForArrowClicks = function ($ofs) {\n var slideAmount = $ofs.prop('ofs').settings.slideAmount;\n $ofs.on('click.ofs', arrowLeftSelector, function () {\n slideByAmount($ofs, slideAmount); // slide 75% of the swiper width to the right (positive is right)\n });\n $ofs.on('click.ofs', arrowRightSelector, function () {\n slideByAmount($ofs, (-1 * slideAmount)); // slide 75% of the swiper width to the left (negative is left)\n });\n };\n\n /**\n * Set the height of the slider container.\n * @param {Object} $ofs This instance of the overflow slider.\n * @param {Object} instanceSettings Options this instance of the overflow slider; if undefined, $.extend will be ignore it\n */\n setHeight = function ($ofs, instanceSettings) {\n var sliderHeight = $ofs.find(sliderSelector).outerHeight();\n var $sliderContainer = $ofs.find(containerSelector);\n settings = $.extend({}, $.fn.overflowSlider.defaults, instanceSettings);\n\n if (settings.expectedHeight && parseInt(settings.expectedHeight, 10) > 0) {\n $sliderContainer.css('height', settings.expectedHeight);\n } else if (sliderHeight) {\n $sliderContainer.css('height', sliderHeight);\n } else {\n // oh well, we tried.\n // the height is still 0 and we don't have an expectedHeight. Is the slider hidden?\n }\n };\n\n /**\n * Initialiizing function that establishes defaults for each instance of selected colletion.\n * @param {Object} $ofs This instance of the overflow slider.\n */\n init = function ($ofs) {\n var instanceSettings = settings;\n // get settings from a data attribute\n // this will override any settings set in JS.\n if ($ofs.data('ofs-options')) {\n // var attrOptions = JSON.parse($ofs.data('ofs-options')); // TODO: error handling\n var attrOptions = $ofs.data('ofs-options');\n instanceSettings = $.extend({}, settings, attrOptions);\n }\n\n var elem = $ofs[0]; // this is needed to avoid the no-param-reassign eslint error.\n\n // var itemSelector = '.' + instanceSettings.itemClass;\n elem.containerSelector = '.' + instanceSettings.containerClass;\n elem.sliderSelector = '.' + instanceSettings.sliderClass;\n elem.arrowLeftSelector = '.' + instanceSettings.arrowLeftClass;\n elem.arrowRightSelector = '.' + instanceSettings.arrowRightClass;\n\n var endX = $ofs.find(elem.containerSelector).innerWidth() - $ofs.find(elem.sliderSelector).outerWidth(true); // had to place this value here because endX was diplaying the incorrect value or NaN value\n\n $ofs.addClass('overflow-slider'); // in case a different selector was used.\n\n // the slider is positioned absolutely, so the $ofs has a height of 0.\n // it should match the height of the slider.\n setHeight($ofs, instanceSettings);\n var $imgsInSlider = $ofs.find(elem.sliderSelector).find('img');\n var imgLoadedTimeoutID;\n $imgsInSlider.each(function () {\n if (!this.complete) {\n // the image has not finished loading.\n $(this).one('load', function () {\n clearTimeout(imgLoadedTimeoutID);\n imgLoadedTimeoutID = setTimeout(function () {\n elem.ofs.setHeight($ofs);\n }, 100);\n });\n }\n });\n\n // elem.ofs = $.extend({}, $ofs.prop('ofs'), {\n elem.ofs = {\n settings: instanceSettings,\n isDragging: false,\n sliderX: 0, // keep track of the x position of the slider\n mouseX: null, // the x position of the mouse at the time of the last mouseDown\n endX: endX, // the x position of the slider when it is slid to the left. 0 is the start, the right position.\n clickedTab: null, // record clicked tab, so we can activate it if we don't drag.\n init: init,\n setHeight: setHeight,\n toggleArrows: toggleArrows,\n slideToX: slideToX,\n slideToItem: slideToItem\n };\n\n var $items = $ofs.find(elem.sliderSelector).children();\n $items.addClass(instanceSettings.itemClass);\n\n if (instanceSettings.showArrows) {\n // check for arrows, add if not found.\n if ($ofs.find(elem.arrowRightSelector).length < 1) {\n var arrowBtns = `\n \n \n `;\n $ofs.append(arrowBtns);\n }\n listenForArrowClicks($ofs);\n\n if (instanceSettings.alignArrowsToImgs) {\n // try to center the left/right arrows on the images\n var firstImg = $ofs.find('img:first');\n if (firstImg) {\n var imgHeight = firstImg.height();\n $ofs.find('.' + instanceSettings.arrowClass).css('top', imgHeight / 2);\n }\n }\n }\n\n setTimeout(function () {\n // ensure the slider is properly positioned at the start.\n var $activeItem = $ofs.find('.' + instanceSettings.activeItemClass);\n if ($activeItem.length) {\n slideToItem($ofs, $activeItem);\n } else {\n slideByAmount($ofs, 0);\n }\n }, 0);\n };\n\n /**\n * Resize listener to re-initalize the sliders, and to adjust position if necessary.\n */\n var windowResizeTimeoutId;\n var resizeHandler = function () {\n clearTimeout(windowResizeTimeoutId);\n windowResizeTimeoutId = setTimeout(function () {\n $(collection).each(function () {\n var $ofs = $(this);\n init($ofs);\n });\n }, 500);\n };\n $(window).on('resize.ofs', resizeHandler);\n\n /**\n * This constrains x btween two numbers. min <= x <= max\n * @param {number} x The number to clamp within the min and max\n * @param {number} min The minimum allowed value\n * @param {number} max The maximum allowed value\n * @return {number} x, clamped between min and max. This will be equal to min, x, or max.\n */\n clamp = function (x, min, max) {\n var c = Math.min(Math.max(x, min), max);\n return c;\n };\n\n /**\n * This is the start of the functionality which supports multiple instances of .overflowSlider.\n * \"this\" is a jQuery object containing one or more matching element. For each element, an overflow slider is created.\n */\n return this.each(function () {\n // \"this\" is one of the selected elements\n var $ofs = $(this);\n\n init($ofs); // why is this miscalculating the endX?\n // setTimeout(init($ofs), 0); // why do I need to init twice?!\n\n // on mouse down within the overflowSlider...\n $ofs.on('mousedown.ofs', dragStart);\n $ofs.on('touchstart.ofs', dragStart);\n // $ofs.on('pointerdown.ofs', dragStart); // for IE\n\n var itemSelector = '.' + $ofs.prop('ofs').settings.itemClass;\n $ofs.on('focus', itemSelector, function () {\n slideToItem($ofs, $(this));\n });\n\n return this;\n });\n };\n\n /**\n * Default settings for the overflow sliders.\n */\n $.fn.overflowSlider.defaults = {\n arrowClass: 'ofs__arrow',\n arrowLeftClass: 'ofs__arrow--left',\n arrowRightClass: 'ofs__arrow--right',\n arrowLeftLabel: 'Slide Right',\n arrowRightLabel: 'Slide Left',\n containerClass: 'ofs__container',\n sliderClass: 'ofs__slider',\n itemClass: 'ofs__item',\n showArrows: true,\n alignArrowsToImgs: false, // attempt to align left/right arrows to the images\n slideAmount: 0.75, // slide up to 75% of the container width when left/right buttons are clicked\n centered: true, // when the slider fits within the container, should it be centered or left-aligned?\n activeItemClass: 'active', // active and selected item at overflowSlider\n expectedHeight: 0, // set to the approximate height of the slider content, to prevent a 0 height slider when the height is measured before content has finished loading.\n preventDefault: true // should be prevented default events?\n };\n\n /**\n * For each element having the \"overflow-slider\" class, initialize the overflowSlider\n * with the default settings.\n */\n $(function () {\n // set up the overflow sliders\n // this one line will initialize multiple sliders all having the same settings.\n $('.overflow-slider').overflowSlider();\n });\n};\n\n","'use strict';\n\n/**\n* Checks if the current bootstrap UI breakpoint matches the breakpoint abbreviation.\n* @param {string} breakpointAbbreviation Breakpoint abbreviations. Options are: xs, sm, md, lg, xl\n* @returns {boolean} True if the breakpoint abbreviation is the current breakpoint.\n*/\nfunction isCurrentBreakpointAbbreviation(breakpointAbbreviation) {\n if (\n breakpointAbbreviation !== 'xs' &&\n breakpointAbbreviation !== 'sm' &&\n breakpointAbbreviation !== 'md' &&\n breakpointAbbreviation !== 'lg' &&\n breakpointAbbreviation !== 'xl') {\n throw new Error('Invalid breakpoint abbreviation: ' + breakpointAbbreviation);\n }\n\n var selector = '.bootstrap-breakpoints-' + breakpointAbbreviation;\n var $breakpointIndicator = $(selector);\n\n if ($breakpointIndicator.length === 0) {\n throw new Error('Breakpoint indicator not found for: ' + breakpointAbbreviation);\n }\n return $breakpointIndicator.css('display') === 'block';\n}\n\n/**\n * Finds the current breakpoint from the hidden .bootstrap-breakpoints element.\n * @returns {string} The currently active breakpoint abbreviation. ('xs', 'sm', 'md', 'lg', or 'xl')\n */\nfunction getCurrentBreakpoint() {\n var $breakpointIndicators = $('.bootstrap-breakpoints > div');\n var currentBP;\n $breakpointIndicators.each(function () {\n var $bpIndicator = $(this);\n if ($bpIndicator.css('display') === 'block') {\n currentBP = $bpIndicator.data('bp');\n return false; // break out of the each loop\n }\n return true; // continue to next item in loop\n });\n return currentBP;\n}\n\nmodule.exports = {\n /**\n * This check is only for the resolution of the screen, it should\n * not be used to infer device type or user interaction (touch/click).\n * @returns {boolean} True if the screen is low resolution.\n */\n isLowRes: function () {\n return this.isCurrentBreakpoint('xs', 'sm', 'md');\n },\n /**\n * This check is only for the resolution of the screen, it should\n * not be used to infer device type or user interaction (touch/click).\n * @returns {boolean} True if the screen is high resolution.\n */\n isHighRes: function () {\n return this.isCurrentBreakpoint('lg', 'xl');\n },\n\n /**\n * Checks if the current bootstrap UI breakpoint matches a parameter.\n * @example isCurrentBreakpoint('xs', 'sm')\n * @param {arguments} breakpointAbbreviations One of more comma separated string breakpoint parameters. Options are: xs, sm, md, lg, xl\n * @returns {boolean} True if any of the breakpoint abbreviations are the current breakpoint.\n */\n isCurrentBreakpoint: function () {\n if (arguments.length === 0) {\n throw new Error('No breakpoint abbreviations specified.');\n }\n\n for (var i = 0, len = arguments.length; i < len; i++) {\n var abbreviation = arguments[i];\n\n if (isCurrentBreakpointAbbreviation(abbreviation)) {\n return true;\n }\n }\n\n /**\n * NOTE: it is explicitly intentional that this function accepts the breakpoint abbreviations and returns a boolean.\n * If the function was instead 'getCurrentBreakpoint' where it returns the breakpoint abbreviation...\n * then it might make future refactors and bootstrap updates more difficult if the abbreviations change\n * because the return value may not be consumed near the function call (difficult to track/update).\n */\n return false;\n },\n\n getCurrentBreakpoint: getCurrentBreakpoint\n};\n","// Underscore.js 1.10.2\n// https://underscorejs.org\n// (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n// Underscore may be freely distributed under the MIT license.\n\n// Baseline setup\n// --------------\n\n// Establish the root object, `window` (`self`) in the browser, `global`\n// on the server, or `this` in some virtual machines. We use `self`\n// instead of `window` for `WebWorker` support.\nvar root = typeof self == 'object' && self.self === self && self ||\n typeof global == 'object' && global.global === global && global ||\n Function('return this')() ||\n {};\n\n// Save bytes in the minified (but not gzipped) version:\nvar ArrayProto = Array.prototype, ObjProto = Object.prototype;\nvar SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;\n\n// Create quick reference variables for speed access to core prototypes.\nvar push = ArrayProto.push,\n slice = ArrayProto.slice,\n toString = ObjProto.toString,\n hasOwnProperty = ObjProto.hasOwnProperty;\n\n// All **ECMAScript 5** native function implementations that we hope to use\n// are declared here.\nvar nativeIsArray = Array.isArray,\n nativeKeys = Object.keys,\n nativeCreate = Object.create;\n\n// Create references to these builtin functions because we override them.\nvar _isNaN = root.isNaN,\n _isFinite = root.isFinite;\n\n// Naked function reference for surrogate-prototype-swapping.\nvar Ctor = function(){};\n\n// The Underscore object. All exported functions below are added to it in the\n// modules/index-all.js using the mixin function.\nexport default function _(obj) {\n if (obj instanceof _) return obj;\n if (!(this instanceof _)) return new _(obj);\n this._wrapped = obj;\n}\n\n// Current version.\nexport var VERSION = _.VERSION = '1.10.2';\n\n// Internal function that returns an efficient (for current engines) version\n// of the passed-in callback, to be repeatedly applied in other Underscore\n// functions.\nfunction optimizeCb(func, context, argCount) {\n if (context === void 0) return func;\n switch (argCount == null ? 3 : argCount) {\n case 1: return function(value) {\n return func.call(context, value);\n };\n // The 2-argument case is omitted because we’re not using it.\n case 3: return function(value, index, collection) {\n return func.call(context, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(context, accumulator, value, index, collection);\n };\n }\n return function() {\n return func.apply(context, arguments);\n };\n}\n\n// An internal function to generate callbacks that can be applied to each\n// element in a collection, returning the desired result — either `identity`,\n// an arbitrary callback, a property matcher, or a property accessor.\nfunction baseIteratee(value, context, argCount) {\n if (value == null) return identity;\n if (isFunction(value)) return optimizeCb(value, context, argCount);\n if (isObject(value) && !isArray(value)) return matcher(value);\n return property(value);\n}\n\n// External wrapper for our callback generator. Users may customize\n// `_.iteratee` if they want additional predicate/iteratee shorthand styles.\n// This abstraction hides the internal-only argCount argument.\n_.iteratee = iteratee;\nexport function iteratee(value, context) {\n return baseIteratee(value, context, Infinity);\n}\n\n// The function we actually call internally. It invokes _.iteratee if\n// overridden, otherwise baseIteratee.\nfunction cb(value, context, argCount) {\n if (_.iteratee !== iteratee) return _.iteratee(value, context);\n return baseIteratee(value, context, argCount);\n}\n\n// Some functions take a variable number of arguments, or a few expected\n// arguments at the beginning and then a variable number of values to operate\n// on. This helper accumulates all remaining arguments past the function’s\n// argument length (or an explicit `startIndex`), into an array that becomes\n// the last argument. Similar to ES6’s \"rest parameter\".\nexport function restArguments(func, startIndex) {\n startIndex = startIndex == null ? func.length - 1 : +startIndex;\n return function() {\n var length = Math.max(arguments.length - startIndex, 0),\n rest = Array(length),\n index = 0;\n for (; index < length; index++) {\n rest[index] = arguments[index + startIndex];\n }\n switch (startIndex) {\n case 0: return func.call(this, rest);\n case 1: return func.call(this, arguments[0], rest);\n case 2: return func.call(this, arguments[0], arguments[1], rest);\n }\n var args = Array(startIndex + 1);\n for (index = 0; index < startIndex; index++) {\n args[index] = arguments[index];\n }\n args[startIndex] = rest;\n return func.apply(this, args);\n };\n}\n\n// An internal function for creating a new object that inherits from another.\nfunction baseCreate(prototype) {\n if (!isObject(prototype)) return {};\n if (nativeCreate) return nativeCreate(prototype);\n Ctor.prototype = prototype;\n var result = new Ctor;\n Ctor.prototype = null;\n return result;\n}\n\nfunction shallowProperty(key) {\n return function(obj) {\n return obj == null ? void 0 : obj[key];\n };\n}\n\nfunction _has(obj, path) {\n return obj != null && hasOwnProperty.call(obj, path);\n}\n\nfunction deepGet(obj, path) {\n var length = path.length;\n for (var i = 0; i < length; i++) {\n if (obj == null) return void 0;\n obj = obj[path[i]];\n }\n return length ? obj : void 0;\n}\n\n// Helper for collection methods to determine whether a collection\n// should be iterated as an array or as an object.\n// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\nvar MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\nvar getLength = shallowProperty('length');\nfunction isArrayLike(collection) {\n var length = getLength(collection);\n return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n}\n\n// Collection Functions\n// --------------------\n\n// The cornerstone, an `each` implementation, aka `forEach`.\n// Handles raw objects in addition to array-likes. Treats all\n// sparse array-likes as if they were dense.\nexport function each(obj, iteratee, context) {\n iteratee = optimizeCb(iteratee, context);\n var i, length;\n if (isArrayLike(obj)) {\n for (i = 0, length = obj.length; i < length; i++) {\n iteratee(obj[i], i, obj);\n }\n } else {\n var _keys = keys(obj);\n for (i = 0, length = _keys.length; i < length; i++) {\n iteratee(obj[_keys[i]], _keys[i], obj);\n }\n }\n return obj;\n}\nexport { each as forEach };\n\n// Return the results of applying the iteratee to each element.\nexport function map(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length,\n results = Array(length);\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n results[index] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n}\nexport { map as collect };\n\n// Create a reducing function iterating left or right.\nfunction createReduce(dir) {\n // Wrap code that reassigns argument variables in a separate function than\n // the one that accesses `arguments.length` to avoid a perf hit. (#1991)\n var reducer = function(obj, iteratee, memo, initial) {\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length,\n index = dir > 0 ? 0 : length - 1;\n if (!initial) {\n memo = obj[_keys ? _keys[index] : index];\n index += dir;\n }\n for (; index >= 0 && index < length; index += dir) {\n var currentKey = _keys ? _keys[index] : index;\n memo = iteratee(memo, obj[currentKey], currentKey, obj);\n }\n return memo;\n };\n\n return function(obj, iteratee, memo, context) {\n var initial = arguments.length >= 3;\n return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);\n };\n}\n\n// **Reduce** builds up a single result from a list of values, aka `inject`,\n// or `foldl`.\nexport var reduce = createReduce(1);\nexport { reduce as foldl, reduce as inject };\n\n// The right-associative version of reduce, also known as `foldr`.\nexport var reduceRight = createReduce(-1);\nexport { reduceRight as foldr };\n\n// Return the first value which passes a truth test.\nexport function find(obj, predicate, context) {\n var keyFinder = isArrayLike(obj) ? findIndex : findKey;\n var key = keyFinder(obj, predicate, context);\n if (key !== void 0 && key !== -1) return obj[key];\n}\nexport { find as detect };\n\n// Return all the elements that pass a truth test.\nexport function filter(obj, predicate, context) {\n var results = [];\n predicate = cb(predicate, context);\n each(obj, function(value, index, list) {\n if (predicate(value, index, list)) results.push(value);\n });\n return results;\n}\nexport { filter as select };\n\n// Return all the elements for which a truth test fails.\nexport function reject(obj, predicate, context) {\n return filter(obj, negate(cb(predicate)), context);\n}\n\n// Determine whether all of the elements match a truth test.\nexport function every(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n if (!predicate(obj[currentKey], currentKey, obj)) return false;\n }\n return true;\n}\nexport { every as all };\n\n// Determine if at least one element in the object matches a truth test.\nexport function some(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n if (predicate(obj[currentKey], currentKey, obj)) return true;\n }\n return false;\n}\nexport { some as any };\n\n// Determine if the array or object contains a given item (using `===`).\nexport function contains(obj, item, fromIndex, guard) {\n if (!isArrayLike(obj)) obj = values(obj);\n if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n return indexOf(obj, item, fromIndex) >= 0;\n}\nexport { contains as includes, contains as include };\n\n// Invoke a method (with arguments) on every item in a collection.\nexport var invoke = restArguments(function(obj, path, args) {\n var contextPath, func;\n if (isFunction(path)) {\n func = path;\n } else if (isArray(path)) {\n contextPath = path.slice(0, -1);\n path = path[path.length - 1];\n }\n return map(obj, function(context) {\n var method = func;\n if (!method) {\n if (contextPath && contextPath.length) {\n context = deepGet(context, contextPath);\n }\n if (context == null) return void 0;\n method = context[path];\n }\n return method == null ? method : method.apply(context, args);\n });\n});\n\n// Convenience version of a common use case of `map`: fetching a property.\nexport function pluck(obj, key) {\n return map(obj, property(key));\n}\n\n// Convenience version of a common use case of `filter`: selecting only objects\n// containing specific `key:value` pairs.\nexport function where(obj, attrs) {\n return filter(obj, matcher(attrs));\n}\n\n// Convenience version of a common use case of `find`: getting the first object\n// containing specific `key:value` pairs.\nexport function findWhere(obj, attrs) {\n return find(obj, matcher(attrs));\n}\n\n// Return the maximum element (or element-based computation).\nexport function max(obj, iteratee, context) {\n var result = -Infinity, lastComputed = -Infinity,\n value, computed;\n if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {\n obj = isArrayLike(obj) ? obj : values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value != null && value > result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n each(obj, function(v, index, list) {\n computed = iteratee(v, index, list);\n if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n result = v;\n lastComputed = computed;\n }\n });\n }\n return result;\n}\n\n// Return the minimum element (or element-based computation).\nexport function min(obj, iteratee, context) {\n var result = Infinity, lastComputed = Infinity,\n value, computed;\n if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {\n obj = isArrayLike(obj) ? obj : values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value != null && value < result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n each(obj, function(v, index, list) {\n computed = iteratee(v, index, list);\n if (computed < lastComputed || computed === Infinity && result === Infinity) {\n result = v;\n lastComputed = computed;\n }\n });\n }\n return result;\n}\n\n// Shuffle a collection.\nexport function shuffle(obj) {\n return sample(obj, Infinity);\n}\n\n// Sample **n** random values from a collection using the modern version of the\n// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n// If **n** is not specified, returns a single random element.\n// The internal `guard` argument allows it to work with `map`.\nexport function sample(obj, n, guard) {\n if (n == null || guard) {\n if (!isArrayLike(obj)) obj = values(obj);\n return obj[random(obj.length - 1)];\n }\n var sample = isArrayLike(obj) ? clone(obj) : values(obj);\n var length = getLength(sample);\n n = Math.max(Math.min(n, length), 0);\n var last = length - 1;\n for (var index = 0; index < n; index++) {\n var rand = random(index, last);\n var temp = sample[index];\n sample[index] = sample[rand];\n sample[rand] = temp;\n }\n return sample.slice(0, n);\n}\n\n// Sort the object's values by a criterion produced by an iteratee.\nexport function sortBy(obj, iteratee, context) {\n var index = 0;\n iteratee = cb(iteratee, context);\n return pluck(map(obj, function(value, key, list) {\n return {\n value: value,\n index: index++,\n criteria: iteratee(value, key, list)\n };\n }).sort(function(left, right) {\n var a = left.criteria;\n var b = right.criteria;\n if (a !== b) {\n if (a > b || a === void 0) return 1;\n if (a < b || b === void 0) return -1;\n }\n return left.index - right.index;\n }), 'value');\n}\n\n// An internal function used for aggregate \"group by\" operations.\nfunction group(behavior, partition) {\n return function(obj, iteratee, context) {\n var result = partition ? [[], []] : {};\n iteratee = cb(iteratee, context);\n each(obj, function(value, index) {\n var key = iteratee(value, index, obj);\n behavior(result, value, key);\n });\n return result;\n };\n}\n\n// Groups the object's values by a criterion. Pass either a string attribute\n// to group by, or a function that returns the criterion.\nexport var groupBy = group(function(result, value, key) {\n if (_has(result, key)) result[key].push(value); else result[key] = [value];\n});\n\n// Indexes the object's values by a criterion, similar to `groupBy`, but for\n// when you know that your index values will be unique.\nexport var indexBy = group(function(result, value, key) {\n result[key] = value;\n});\n\n// Counts instances of an object that group by a certain criterion. Pass\n// either a string attribute to count by, or a function that returns the\n// criterion.\nexport var countBy = group(function(result, value, key) {\n if (_has(result, key)) result[key]++; else result[key] = 1;\n});\n\nvar reStrSymbol = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\n// Safely create a real, live array from anything iterable.\nexport function toArray(obj) {\n if (!obj) return [];\n if (isArray(obj)) return slice.call(obj);\n if (isString(obj)) {\n // Keep surrogate pair characters together\n return obj.match(reStrSymbol);\n }\n if (isArrayLike(obj)) return map(obj, identity);\n return values(obj);\n}\n\n// Return the number of elements in an object.\nexport function size(obj) {\n if (obj == null) return 0;\n return isArrayLike(obj) ? obj.length : keys(obj).length;\n}\n\n// Split a collection into two arrays: one whose elements all satisfy the given\n// predicate, and one whose elements all do not satisfy the predicate.\nexport var partition = group(function(result, value, pass) {\n result[pass ? 0 : 1].push(value);\n}, true);\n\n// Array Functions\n// ---------------\n\n// Get the first element of an array. Passing **n** will return the first N\n// values in the array. The **guard** check allows it to work with `map`.\nexport function first(array, n, guard) {\n if (array == null || array.length < 1) return n == null ? void 0 : [];\n if (n == null || guard) return array[0];\n return initial(array, array.length - n);\n}\nexport { first as head, first as take };\n\n// Returns everything but the last entry of the array. Especially useful on\n// the arguments object. Passing **n** will return all the values in\n// the array, excluding the last N.\nexport function initial(array, n, guard) {\n return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n}\n\n// Get the last element of an array. Passing **n** will return the last N\n// values in the array.\nexport function last(array, n, guard) {\n if (array == null || array.length < 1) return n == null ? void 0 : [];\n if (n == null || guard) return array[array.length - 1];\n return rest(array, Math.max(0, array.length - n));\n}\n\n// Returns everything but the first entry of the array. Especially useful on\n// the arguments object. Passing an **n** will return the rest N values in the\n// array.\nexport function rest(array, n, guard) {\n return slice.call(array, n == null || guard ? 1 : n);\n}\nexport { rest as tail, rest as drop };\n\n// Trim out all falsy values from an array.\nexport function compact(array) {\n return filter(array, Boolean);\n}\n\n// Internal implementation of a recursive `flatten` function.\nfunction _flatten(input, shallow, strict, output) {\n output = output || [];\n var idx = output.length;\n for (var i = 0, length = getLength(input); i < length; i++) {\n var value = input[i];\n if (isArrayLike(value) && (isArray(value) || isArguments(value))) {\n // Flatten current level of array or arguments object.\n if (shallow) {\n var j = 0, len = value.length;\n while (j < len) output[idx++] = value[j++];\n } else {\n _flatten(value, shallow, strict, output);\n idx = output.length;\n }\n } else if (!strict) {\n output[idx++] = value;\n }\n }\n return output;\n}\n\n// Flatten out an array, either recursively (by default), or just one level.\nexport function flatten(array, shallow) {\n return _flatten(array, shallow, false);\n}\n\n// Return a version of the array that does not contain the specified value(s).\nexport var without = restArguments(function(array, otherArrays) {\n return difference(array, otherArrays);\n});\n\n// Produce a duplicate-free version of the array. If the array has already\n// been sorted, you have the option of using a faster algorithm.\n// The faster algorithm will not work with an iteratee if the iteratee\n// is not a one-to-one function, so providing an iteratee will disable\n// the faster algorithm.\nexport function uniq(array, isSorted, iteratee, context) {\n if (!isBoolean(isSorted)) {\n context = iteratee;\n iteratee = isSorted;\n isSorted = false;\n }\n if (iteratee != null) iteratee = cb(iteratee, context);\n var result = [];\n var seen = [];\n for (var i = 0, length = getLength(array); i < length; i++) {\n var value = array[i],\n computed = iteratee ? iteratee(value, i, array) : value;\n if (isSorted && !iteratee) {\n if (!i || seen !== computed) result.push(value);\n seen = computed;\n } else if (iteratee) {\n if (!contains(seen, computed)) {\n seen.push(computed);\n result.push(value);\n }\n } else if (!contains(result, value)) {\n result.push(value);\n }\n }\n return result;\n}\nexport { uniq as unique };\n\n// Produce an array that contains the union: each distinct element from all of\n// the passed-in arrays.\nexport var union = restArguments(function(arrays) {\n return uniq(_flatten(arrays, true, true));\n});\n\n// Produce an array that contains every item shared between all the\n// passed-in arrays.\nexport function intersection(array) {\n var result = [];\n var argsLength = arguments.length;\n for (var i = 0, length = getLength(array); i < length; i++) {\n var item = array[i];\n if (contains(result, item)) continue;\n var j;\n for (j = 1; j < argsLength; j++) {\n if (!contains(arguments[j], item)) break;\n }\n if (j === argsLength) result.push(item);\n }\n return result;\n}\n\n// Take the difference between one array and a number of other arrays.\n// Only the elements present in just the first array will remain.\nexport var difference = restArguments(function(array, rest) {\n rest = _flatten(rest, true, true);\n return filter(array, function(value){\n return !contains(rest, value);\n });\n});\n\n// Complement of zip. Unzip accepts an array of arrays and groups\n// each array's elements on shared indices.\nexport function unzip(array) {\n var length = array && max(array, getLength).length || 0;\n var result = Array(length);\n\n for (var index = 0; index < length; index++) {\n result[index] = pluck(array, index);\n }\n return result;\n}\n\n// Zip together multiple lists into a single array -- elements that share\n// an index go together.\nexport var zip = restArguments(unzip);\n\n// Converts lists into objects. Pass either a single array of `[key, value]`\n// pairs, or two parallel arrays of the same length -- one of keys, and one of\n// the corresponding values. Passing by pairs is the reverse of pairs.\nexport function object(list, values) {\n var result = {};\n for (var i = 0, length = getLength(list); i < length; i++) {\n if (values) {\n result[list[i]] = values[i];\n } else {\n result[list[i][0]] = list[i][1];\n }\n }\n return result;\n}\n\n// Generator function to create the findIndex and findLastIndex functions.\nfunction createPredicateIndexFinder(dir) {\n return function(array, predicate, context) {\n predicate = cb(predicate, context);\n var length = getLength(array);\n var index = dir > 0 ? 0 : length - 1;\n for (; index >= 0 && index < length; index += dir) {\n if (predicate(array[index], index, array)) return index;\n }\n return -1;\n };\n}\n\n// Returns the first index on an array-like that passes a predicate test.\nexport var findIndex = createPredicateIndexFinder(1);\nexport var findLastIndex = createPredicateIndexFinder(-1);\n\n// Use a comparator function to figure out the smallest index at which\n// an object should be inserted so as to maintain order. Uses binary search.\nexport function sortedIndex(array, obj, iteratee, context) {\n iteratee = cb(iteratee, context, 1);\n var value = iteratee(obj);\n var low = 0, high = getLength(array);\n while (low < high) {\n var mid = Math.floor((low + high) / 2);\n if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n }\n return low;\n}\n\n// Generator function to create the indexOf and lastIndexOf functions.\nfunction createIndexFinder(dir, predicateFind, sortedIndex) {\n return function(array, item, idx) {\n var i = 0, length = getLength(array);\n if (typeof idx == 'number') {\n if (dir > 0) {\n i = idx >= 0 ? idx : Math.max(idx + length, i);\n } else {\n length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n }\n } else if (sortedIndex && idx && length) {\n idx = sortedIndex(array, item);\n return array[idx] === item ? idx : -1;\n }\n if (item !== item) {\n idx = predicateFind(slice.call(array, i, length), isNaN);\n return idx >= 0 ? idx + i : -1;\n }\n for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n if (array[idx] === item) return idx;\n }\n return -1;\n };\n}\n\n// Return the position of the first occurrence of an item in an array,\n// or -1 if the item is not included in the array.\n// If the array is large and already in sort order, pass `true`\n// for **isSorted** to use binary search.\nexport var indexOf = createIndexFinder(1, findIndex, sortedIndex);\nexport var lastIndexOf = createIndexFinder(-1, findLastIndex);\n\n// Generate an integer Array containing an arithmetic progression. A port of\n// the native Python `range()` function. See\n// [the Python documentation](https://docs.python.org/library/functions.html#range).\nexport function range(start, stop, step) {\n if (stop == null) {\n stop = start || 0;\n start = 0;\n }\n if (!step) {\n step = stop < start ? -1 : 1;\n }\n\n var length = Math.max(Math.ceil((stop - start) / step), 0);\n var range = Array(length);\n\n for (var idx = 0; idx < length; idx++, start += step) {\n range[idx] = start;\n }\n\n return range;\n}\n\n// Chunk a single array into multiple arrays, each containing `count` or fewer\n// items.\nexport function chunk(array, count) {\n if (count == null || count < 1) return [];\n var result = [];\n var i = 0, length = array.length;\n while (i < length) {\n result.push(slice.call(array, i, i += count));\n }\n return result;\n}\n\n// Function (ahem) Functions\n// ------------------\n\n// Determines whether to execute a function as a constructor\n// or a normal function with the provided arguments.\nfunction executeBound(sourceFunc, boundFunc, context, callingContext, args) {\n if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n var self = baseCreate(sourceFunc.prototype);\n var result = sourceFunc.apply(self, args);\n if (isObject(result)) return result;\n return self;\n}\n\n// Create a function bound to a given object (assigning `this`, and arguments,\n// optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n// available.\nexport var bind = restArguments(function(func, context, args) {\n if (!isFunction(func)) throw new TypeError('Bind must be called on a function');\n var bound = restArguments(function(callArgs) {\n return executeBound(func, bound, context, this, args.concat(callArgs));\n });\n return bound;\n});\n\n// Partially apply a function by creating a version that has had some of its\n// arguments pre-filled, without changing its dynamic `this` context. _ acts\n// as a placeholder by default, allowing any combination of arguments to be\n// pre-filled. Set `partial.placeholder` for a custom placeholder argument.\nexport var partial = restArguments(function(func, boundArgs) {\n var placeholder = partial.placeholder;\n var bound = function() {\n var position = 0, length = boundArgs.length;\n var args = Array(length);\n for (var i = 0; i < length; i++) {\n args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];\n }\n while (position < arguments.length) args.push(arguments[position++]);\n return executeBound(func, bound, this, this, args);\n };\n return bound;\n});\n\npartial.placeholder = _;\n\n// Bind a number of an object's methods to that object. Remaining arguments\n// are the method names to be bound. Useful for ensuring that all callbacks\n// defined on an object belong to it.\nexport var bindAll = restArguments(function(obj, _keys) {\n _keys = _flatten(_keys, false, false);\n var index = _keys.length;\n if (index < 1) throw new Error('bindAll must be passed function names');\n while (index--) {\n var key = _keys[index];\n obj[key] = bind(obj[key], obj);\n }\n});\n\n// Memoize an expensive function by storing its results.\nexport function memoize(func, hasher) {\n var memoize = function(key) {\n var cache = memoize.cache;\n var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n if (!_has(cache, address)) cache[address] = func.apply(this, arguments);\n return cache[address];\n };\n memoize.cache = {};\n return memoize;\n}\n\n// Delays a function for the given number of milliseconds, and then calls\n// it with the arguments supplied.\nexport var delay = restArguments(function(func, wait, args) {\n return setTimeout(function() {\n return func.apply(null, args);\n }, wait);\n});\n\n// Defers a function, scheduling it to run after the current call stack has\n// cleared.\nexport var defer = partial(delay, _, 1);\n\n// Returns a function, that, when invoked, will only be triggered at most once\n// during a given window of time. Normally, the throttled function will run\n// as much as it can, without ever going more than once per `wait` duration;\n// but if you'd like to disable the execution on the leading edge, pass\n// `{leading: false}`. To disable execution on the trailing edge, ditto.\nexport function throttle(func, wait, options) {\n var timeout, context, args, result;\n var previous = 0;\n if (!options) options = {};\n\n var later = function() {\n previous = options.leading === false ? 0 : now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n\n var throttled = function() {\n var _now = now();\n if (!previous && options.leading === false) previous = _now;\n var remaining = wait - (_now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = _now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n\n throttled.cancel = function() {\n clearTimeout(timeout);\n previous = 0;\n timeout = context = args = null;\n };\n\n return throttled;\n}\n\n// Returns a function, that, as long as it continues to be invoked, will not\n// be triggered. The function will be called after it stops being called for\n// N milliseconds. If `immediate` is passed, trigger the function on the\n// leading edge, instead of the trailing.\nexport function debounce(func, wait, immediate) {\n var timeout, result;\n\n var later = function(context, args) {\n timeout = null;\n if (args) result = func.apply(context, args);\n };\n\n var debounced = restArguments(function(args) {\n if (timeout) clearTimeout(timeout);\n if (immediate) {\n var callNow = !timeout;\n timeout = setTimeout(later, wait);\n if (callNow) result = func.apply(this, args);\n } else {\n timeout = delay(later, wait, this, args);\n }\n\n return result;\n });\n\n debounced.cancel = function() {\n clearTimeout(timeout);\n timeout = null;\n };\n\n return debounced;\n}\n\n// Returns the first function passed as an argument to the second,\n// allowing you to adjust arguments, run code before and after, and\n// conditionally execute the original function.\nexport function wrap(func, wrapper) {\n return partial(wrapper, func);\n}\n\n// Returns a negated version of the passed-in predicate.\nexport function negate(predicate) {\n return function() {\n return !predicate.apply(this, arguments);\n };\n}\n\n// Returns a function that is the composition of a list of functions, each\n// consuming the return value of the function that follows.\nexport function compose() {\n var args = arguments;\n var start = args.length - 1;\n return function() {\n var i = start;\n var result = args[start].apply(this, arguments);\n while (i--) result = args[i].call(this, result);\n return result;\n };\n}\n\n// Returns a function that will only be executed on and after the Nth call.\nexport function after(times, func) {\n return function() {\n if (--times < 1) {\n return func.apply(this, arguments);\n }\n };\n}\n\n// Returns a function that will only be executed up to (but not including) the Nth call.\nexport function before(times, func) {\n var memo;\n return function() {\n if (--times > 0) {\n memo = func.apply(this, arguments);\n }\n if (times <= 1) func = null;\n return memo;\n };\n}\n\n// Returns a function that will be executed at most one time, no matter how\n// often you call it. Useful for lazy initialization.\nexport var once = partial(before, 2);\n\n// Object Functions\n// ----------------\n\n// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\nvar hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\nvar nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\nfunction collectNonEnumProps(obj, _keys) {\n var nonEnumIdx = nonEnumerableProps.length;\n var constructor = obj.constructor;\n var proto = isFunction(constructor) && constructor.prototype || ObjProto;\n\n // Constructor is a special case.\n var prop = 'constructor';\n if (_has(obj, prop) && !contains(_keys, prop)) _keys.push(prop);\n\n while (nonEnumIdx--) {\n prop = nonEnumerableProps[nonEnumIdx];\n if (prop in obj && obj[prop] !== proto[prop] && !contains(_keys, prop)) {\n _keys.push(prop);\n }\n }\n}\n\n// Retrieve the names of an object's own properties.\n// Delegates to **ECMAScript 5**'s native `Object.keys`.\nexport function keys(obj) {\n if (!isObject(obj)) return [];\n if (nativeKeys) return nativeKeys(obj);\n var _keys = [];\n for (var key in obj) if (_has(obj, key)) _keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, _keys);\n return _keys;\n}\n\n// Retrieve all the property names of an object.\nexport function allKeys(obj) {\n if (!isObject(obj)) return [];\n var _keys = [];\n for (var key in obj) _keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, _keys);\n return _keys;\n}\n\n// Retrieve the values of an object's properties.\nexport function values(obj) {\n var _keys = keys(obj);\n var length = _keys.length;\n var values = Array(length);\n for (var i = 0; i < length; i++) {\n values[i] = obj[_keys[i]];\n }\n return values;\n}\n\n// Returns the results of applying the iteratee to each element of the object.\n// In contrast to map it returns an object.\nexport function mapObject(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var _keys = keys(obj),\n length = _keys.length,\n results = {};\n for (var index = 0; index < length; index++) {\n var currentKey = _keys[index];\n results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n}\n\n// Convert an object into a list of `[key, value]` pairs.\n// The opposite of object.\nexport function pairs(obj) {\n var _keys = keys(obj);\n var length = _keys.length;\n var pairs = Array(length);\n for (var i = 0; i < length; i++) {\n pairs[i] = [_keys[i], obj[_keys[i]]];\n }\n return pairs;\n}\n\n// Invert the keys and values of an object. The values must be serializable.\nexport function invert(obj) {\n var result = {};\n var _keys = keys(obj);\n for (var i = 0, length = _keys.length; i < length; i++) {\n result[obj[_keys[i]]] = _keys[i];\n }\n return result;\n}\n\n// Return a sorted list of the function names available on the object.\nexport function functions(obj) {\n var names = [];\n for (var key in obj) {\n if (isFunction(obj[key])) names.push(key);\n }\n return names.sort();\n}\nexport { functions as methods };\n\n// An internal function for creating assigner functions.\nfunction createAssigner(keysFunc, defaults) {\n return function(obj) {\n var length = arguments.length;\n if (defaults) obj = Object(obj);\n if (length < 2 || obj == null) return obj;\n for (var index = 1; index < length; index++) {\n var source = arguments[index],\n _keys = keysFunc(source),\n l = _keys.length;\n for (var i = 0; i < l; i++) {\n var key = _keys[i];\n if (!defaults || obj[key] === void 0) obj[key] = source[key];\n }\n }\n return obj;\n };\n}\n\n// Extend a given object with all the properties in passed-in object(s).\nexport var extend = createAssigner(allKeys);\n\n// Assigns a given object with all the own properties in the passed-in object(s).\n// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\nexport var extendOwn = createAssigner(keys);\nexport { extendOwn as assign };\n\n// Returns the first key on an object that passes a predicate test.\nexport function findKey(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = keys(obj), key;\n for (var i = 0, length = _keys.length; i < length; i++) {\n key = _keys[i];\n if (predicate(obj[key], key, obj)) return key;\n }\n}\n\n// Internal pick helper function to determine if `obj` has key `key`.\nfunction keyInObj(value, key, obj) {\n return key in obj;\n}\n\n// Return a copy of the object only containing the whitelisted properties.\nexport var pick = restArguments(function(obj, _keys) {\n var result = {}, iteratee = _keys[0];\n if (obj == null) return result;\n if (isFunction(iteratee)) {\n if (_keys.length > 1) iteratee = optimizeCb(iteratee, _keys[1]);\n _keys = allKeys(obj);\n } else {\n iteratee = keyInObj;\n _keys = _flatten(_keys, false, false);\n obj = Object(obj);\n }\n for (var i = 0, length = _keys.length; i < length; i++) {\n var key = _keys[i];\n var value = obj[key];\n if (iteratee(value, key, obj)) result[key] = value;\n }\n return result;\n});\n\n// Return a copy of the object without the blacklisted properties.\nexport var omit = restArguments(function(obj, _keys) {\n var iteratee = _keys[0], context;\n if (isFunction(iteratee)) {\n iteratee = negate(iteratee);\n if (_keys.length > 1) context = _keys[1];\n } else {\n _keys = map(_flatten(_keys, false, false), String);\n iteratee = function(value, key) {\n return !contains(_keys, key);\n };\n }\n return pick(obj, iteratee, context);\n});\n\n// Fill in a given object with default properties.\nexport var defaults = createAssigner(allKeys, true);\n\n// Creates an object that inherits from the given prototype object.\n// If additional properties are provided then they will be added to the\n// created object.\nexport function create(prototype, props) {\n var result = baseCreate(prototype);\n if (props) extendOwn(result, props);\n return result;\n}\n\n// Create a (shallow-cloned) duplicate of an object.\nexport function clone(obj) {\n if (!isObject(obj)) return obj;\n return isArray(obj) ? obj.slice() : extend({}, obj);\n}\n\n// Invokes interceptor with the obj, and then returns obj.\n// The primary purpose of this method is to \"tap into\" a method chain, in\n// order to perform operations on intermediate results within the chain.\nexport function tap(obj, interceptor) {\n interceptor(obj);\n return obj;\n}\n\n// Returns whether an object has a given set of `key:value` pairs.\nexport function isMatch(object, attrs) {\n var _keys = keys(attrs), length = _keys.length;\n if (object == null) return !length;\n var obj = Object(object);\n for (var i = 0; i < length; i++) {\n var key = _keys[i];\n if (attrs[key] !== obj[key] || !(key in obj)) return false;\n }\n return true;\n}\n\n\n// Internal recursive comparison function for `isEqual`.\nfunction eq(a, b, aStack, bStack) {\n // Identical objects are equal. `0 === -0`, but they aren't identical.\n // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n if (a === b) return a !== 0 || 1 / a === 1 / b;\n // `null` or `undefined` only equal to itself (strict comparison).\n if (a == null || b == null) return false;\n // `NaN`s are equivalent, but non-reflexive.\n if (a !== a) return b !== b;\n // Exhaust primitive checks\n var type = typeof a;\n if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;\n return deepEq(a, b, aStack, bStack);\n}\n\n// Internal recursive comparison function for `isEqual`.\nfunction deepEq(a, b, aStack, bStack) {\n // Unwrap any wrapped objects.\n if (a instanceof _) a = a._wrapped;\n if (b instanceof _) b = b._wrapped;\n // Compare `[[Class]]` names.\n var className = toString.call(a);\n if (className !== toString.call(b)) return false;\n switch (className) {\n // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n case '[object RegExp]':\n // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n case '[object String]':\n // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n // equivalent to `new String(\"5\")`.\n return '' + a === '' + b;\n case '[object Number]':\n // `NaN`s are equivalent, but non-reflexive.\n // Object(NaN) is equivalent to NaN.\n if (+a !== +a) return +b !== +b;\n // An `egal` comparison is performed for other numeric values.\n return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n case '[object Date]':\n case '[object Boolean]':\n // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n // millisecond representations. Note that invalid dates with millisecond representations\n // of `NaN` are not equivalent.\n return +a === +b;\n case '[object Symbol]':\n return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);\n }\n\n var areArrays = className === '[object Array]';\n if (!areArrays) {\n if (typeof a != 'object' || typeof b != 'object') return false;\n\n // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n // from different frames are.\n var aCtor = a.constructor, bCtor = b.constructor;\n if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&\n isFunction(bCtor) && bCtor instanceof bCtor)\n && ('constructor' in a && 'constructor' in b)) {\n return false;\n }\n }\n // Assume equality for cyclic structures. The algorithm for detecting cyclic\n // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n // Initializing stack of traversed objects.\n // It's done here since we only need them for objects and arrays comparison.\n aStack = aStack || [];\n bStack = bStack || [];\n var length = aStack.length;\n while (length--) {\n // Linear search. Performance is inversely proportional to the number of\n // unique nested structures.\n if (aStack[length] === a) return bStack[length] === b;\n }\n\n // Add the first object to the stack of traversed objects.\n aStack.push(a);\n bStack.push(b);\n\n // Recursively compare objects and arrays.\n if (areArrays) {\n // Compare array lengths to determine if a deep comparison is necessary.\n length = a.length;\n if (length !== b.length) return false;\n // Deep compare the contents, ignoring non-numeric properties.\n while (length--) {\n if (!eq(a[length], b[length], aStack, bStack)) return false;\n }\n } else {\n // Deep compare objects.\n var _keys = keys(a), key;\n length = _keys.length;\n // Ensure that both objects contain the same number of properties before comparing deep equality.\n if (keys(b).length !== length) return false;\n while (length--) {\n // Deep compare each member\n key = _keys[length];\n if (!(_has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n }\n }\n // Remove the first object from the stack of traversed objects.\n aStack.pop();\n bStack.pop();\n return true;\n}\n\n// Perform a deep comparison to check if two objects are equal.\nexport function isEqual(a, b) {\n return eq(a, b);\n}\n\n// Is a given array, string, or object empty?\n// An \"empty\" object has no enumerable own-properties.\nexport function isEmpty(obj) {\n if (obj == null) return true;\n if (isArrayLike(obj) && (isArray(obj) || isString(obj) || isArguments(obj))) return obj.length === 0;\n return keys(obj).length === 0;\n}\n\n// Is a given value a DOM element?\nexport function isElement(obj) {\n return !!(obj && obj.nodeType === 1);\n}\n\n// Internal function for creating a toString-based type tester.\nfunction tagTester(name) {\n return function(obj) {\n return toString.call(obj) === '[object ' + name + ']';\n };\n}\n\n// Is a given value an array?\n// Delegates to ECMA5's native Array.isArray\nexport var isArray = nativeIsArray || tagTester('Array');\n\n// Is a given variable an object?\nexport function isObject(obj) {\n var type = typeof obj;\n return type === 'function' || type === 'object' && !!obj;\n}\n\n// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet.\nexport var isArguments = tagTester('Arguments');\nexport var isFunction = tagTester('Function');\nexport var isString = tagTester('String');\nexport var isNumber = tagTester('Number');\nexport var isDate = tagTester('Date');\nexport var isRegExp = tagTester('RegExp');\nexport var isError = tagTester('Error');\nexport var isSymbol = tagTester('Symbol');\nexport var isMap = tagTester('Map');\nexport var isWeakMap = tagTester('WeakMap');\nexport var isSet = tagTester('Set');\nexport var isWeakSet = tagTester('WeakSet');\n\n// Define a fallback version of the method in browsers (ahem, IE < 9), where\n// there isn't any inspectable \"Arguments\" type.\n(function() {\n if (!isArguments(arguments)) {\n isArguments = function(obj) {\n return _has(obj, 'callee');\n };\n }\n}());\n\n// Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,\n// IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).\nvar nodelist = root.document && root.document.childNodes;\nif (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {\n isFunction = function(obj) {\n return typeof obj == 'function' || false;\n };\n}\n\n// Is a given object a finite number?\nexport function isFinite(obj) {\n return !isSymbol(obj) && _isFinite(obj) && !_isNaN(parseFloat(obj));\n}\n\n// Is the given value `NaN`?\nexport function isNaN(obj) {\n return isNumber(obj) && _isNaN(obj);\n}\n\n// Is a given value a boolean?\nexport function isBoolean(obj) {\n return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n}\n\n// Is a given value equal to null?\nexport function isNull(obj) {\n return obj === null;\n}\n\n// Is a given variable undefined?\nexport function isUndefined(obj) {\n return obj === void 0;\n}\n\n// Shortcut function for checking if an object has a given property directly\n// on itself (in other words, not on a prototype).\nexport function has(obj, path) {\n if (!isArray(path)) {\n return _has(obj, path);\n }\n var length = path.length;\n for (var i = 0; i < length; i++) {\n var key = path[i];\n if (obj == null || !hasOwnProperty.call(obj, key)) {\n return false;\n }\n obj = obj[key];\n }\n return !!length;\n}\n\n// Utility Functions\n// -----------------\n\n// Keep the identity function around for default iteratees.\nexport function identity(value) {\n return value;\n}\n\n// Predicate-generating functions. Often useful outside of Underscore.\nexport function constant(value) {\n return function() {\n return value;\n };\n}\n\nexport function noop(){}\n\n// Creates a function that, when passed an object, will traverse that object’s\n// properties down the given `path`, specified as an array of keys or indexes.\nexport function property(path) {\n if (!isArray(path)) {\n return shallowProperty(path);\n }\n return function(obj) {\n return deepGet(obj, path);\n };\n}\n\n// Generates a function for a given object that returns a given property.\nexport function propertyOf(obj) {\n if (obj == null) {\n return function(){};\n }\n return function(path) {\n return !isArray(path) ? obj[path] : deepGet(obj, path);\n };\n}\n\n// Returns a predicate for checking whether an object has a given set of\n// `key:value` pairs.\nexport function matcher(attrs) {\n attrs = extendOwn({}, attrs);\n return function(obj) {\n return isMatch(obj, attrs);\n };\n}\nexport { matcher as matches };\n\n// Run a function **n** times.\nexport function times(n, iteratee, context) {\n var accum = Array(Math.max(0, n));\n iteratee = optimizeCb(iteratee, context, 1);\n for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n return accum;\n}\n\n// Return a random integer between min and max (inclusive).\nexport function random(min, max) {\n if (max == null) {\n max = min;\n min = 0;\n }\n return min + Math.floor(Math.random() * (max - min + 1));\n}\n\n// A (possibly faster) way to get the current timestamp as an integer.\nexport var now = Date.now || function() {\n return new Date().getTime();\n};\n\n// List of HTML entities for escaping.\nvar escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n};\nvar unescapeMap = invert(escapeMap);\n\n// Functions for escaping and unescaping strings to/from HTML interpolation.\nfunction createEscaper(map) {\n var escaper = function(match) {\n return map[match];\n };\n // Regexes for identifying a key that needs to be escaped.\n var source = '(?:' + keys(map).join('|') + ')';\n var testRegexp = RegExp(source);\n var replaceRegexp = RegExp(source, 'g');\n return function(string) {\n string = string == null ? '' : '' + string;\n return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n };\n}\nexport var escape = createEscaper(escapeMap);\nexport var unescape = createEscaper(unescapeMap);\n\n// Traverses the children of `obj` along `path`. If a child is a function, it\n// is invoked with its parent as context. Returns the value of the final\n// child, or `fallback` if any child is undefined.\nexport function result(obj, path, fallback) {\n if (!isArray(path)) path = [path];\n var length = path.length;\n if (!length) {\n return isFunction(fallback) ? fallback.call(obj) : fallback;\n }\n for (var i = 0; i < length; i++) {\n var prop = obj == null ? void 0 : obj[path[i]];\n if (prop === void 0) {\n prop = fallback;\n i = length; // Ensure we don't continue iterating.\n }\n obj = isFunction(prop) ? prop.call(obj) : prop;\n }\n return obj;\n}\n\n// Generate a unique integer id (unique within the entire client session).\n// Useful for temporary DOM ids.\nvar idCounter = 0;\nexport function uniqueId(prefix) {\n var id = ++idCounter + '';\n return prefix ? prefix + id : id;\n}\n\n// By default, Underscore uses ERB-style template delimiters, change the\n// following template settings to use alternative delimiters.\nexport var templateSettings = _.templateSettings = {\n evaluate: /<%([\\s\\S]+?)%>/g,\n interpolate: /<%=([\\s\\S]+?)%>/g,\n escape: /<%-([\\s\\S]+?)%>/g\n};\n\n// When customizing `templateSettings`, if you don't want to define an\n// interpolation, evaluation or escaping regex, we need one that is\n// guaranteed not to match.\nvar noMatch = /(.)^/;\n\n// Certain characters need to be escaped so that they can be put into a\n// string literal.\nvar escapes = {\n \"'\": \"'\",\n '\\\\': '\\\\',\n '\\r': 'r',\n '\\n': 'n',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n};\n\nvar escapeRegExp = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\nvar escapeChar = function(match) {\n return '\\\\' + escapes[match];\n};\n\n// JavaScript micro-templating, similar to John Resig's implementation.\n// Underscore templating handles arbitrary delimiters, preserves whitespace,\n// and correctly escapes quotes within interpolated code.\n// NB: `oldSettings` only exists for backwards compatibility.\nexport function template(text, settings, oldSettings) {\n if (!settings && oldSettings) settings = oldSettings;\n settings = defaults({}, settings, _.templateSettings);\n\n // Combine delimiters into one regular expression via alternation.\n var matcher = RegExp([\n (settings.escape || noMatch).source,\n (settings.interpolate || noMatch).source,\n (settings.evaluate || noMatch).source\n ].join('|') + '|$', 'g');\n\n // Compile the template source, escaping string literals appropriately.\n var index = 0;\n var source = \"__p+='\";\n text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n source += text.slice(index, offset).replace(escapeRegExp, escapeChar);\n index = offset + match.length;\n\n if (escape) {\n source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n } else if (interpolate) {\n source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n } else if (evaluate) {\n source += \"';\\n\" + evaluate + \"\\n__p+='\";\n }\n\n // Adobe VMs need the match returned to produce the correct offset.\n return match;\n });\n source += \"';\\n\";\n\n // If a variable is not specified, place data values in local scope.\n if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n source = \"var __t,__p='',__j=Array.prototype.join,\" +\n \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n source + 'return __p;\\n';\n\n var render;\n try {\n render = new Function(settings.variable || 'obj', '_', source);\n } catch (e) {\n e.source = source;\n throw e;\n }\n\n var template = function(data) {\n return render.call(this, data, _);\n };\n\n // Provide the compiled source as a convenience for precompilation.\n var argument = settings.variable || 'obj';\n template.source = 'function(' + argument + '){\\n' + source + '}';\n\n return template;\n}\n\n// Add a \"chain\" function. Start chaining a wrapped Underscore object.\nexport function chain(obj) {\n var instance = _(obj);\n instance._chain = true;\n return instance;\n}\n\n// OOP\n// ---------------\n// If Underscore is called as a function, it returns a wrapped object that\n// can be used OO-style. This wrapper holds altered versions of all the\n// underscore functions. Wrapped objects may be chained.\n\n// Helper function to continue chaining intermediate results.\nfunction chainResult(instance, obj) {\n return instance._chain ? _(obj).chain() : obj;\n}\n\n// Add your own custom functions to the Underscore object.\nexport function mixin(obj) {\n each(functions(obj), function(name) {\n var func = _[name] = obj[name];\n _.prototype[name] = function() {\n var args = [this._wrapped];\n push.apply(args, arguments);\n return chainResult(this, func.apply(_, args));\n };\n });\n return _;\n}\n\n// Add all mutator Array functions to the wrapper.\neach(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n var method = ArrayProto[name];\n _.prototype[name] = function() {\n var obj = this._wrapped;\n method.apply(obj, arguments);\n if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];\n return chainResult(this, obj);\n };\n});\n\n// Add all accessor Array functions to the wrapper.\neach(['concat', 'join', 'slice'], function(name) {\n var method = ArrayProto[name];\n _.prototype[name] = function() {\n return chainResult(this, method.apply(this._wrapped, arguments));\n };\n});\n\n// Extracts the result from a wrapped and chained object.\n_.prototype.value = function() {\n return this._wrapped;\n};\n\n// Provide unwrapping proxy for some methods used in engine operations\n// such as arithmetic and JSON stringification.\n_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n_.prototype.toString = function() {\n return String(this._wrapped);\n};\n","'use strict';\n\n/**\n * Product Details Module\n */\n\nvar ImageGallery = require('./imageGallery');\nvar loyalty = require('./loyalty');\nvar breakpoints = require('../components/breakpoints');\nvar utils = require('../components/utils');\nvar base = require('./base');\nvar sizefitJs = require('../sizefit/sizefit');\nvar tabbedContainer = require('../aem/tabbedContainer');\nvar overflowSlider = require('../aem/overflowSlider');\nvar _ = require('underscore');\nvar pollWriteAReviewButtonInterval = 250;\nvar pollCountMax = 5;\nvar initialPageLoad = true;\n\n/**\n * Make the Add to Cart Button Sticky\n */\nfunction stickyAddToCart() {\n var $stickyButton = $('.add-to-cart__container');\n\n if ($stickyButton.length === 0 || breakpoints.isHighRes()) {\n return;\n }\n\n var stickyButtonOffsetTop = $stickyButton.offset().top;\n\n $(window)\n .off('scroll.stickyAddToCart')\n .on('scroll.stickyAddToCart', _.throttle(function () {\n var $discountPercentage = $stickyButton.find('.js-discount-percent');\n var $pranaRating = $stickyButton.find('.js-prana-rating');\n if ($(this).scrollTop() > stickyButtonOffsetTop) {\n $('html').addClass('is-addToCart-sticky');\n $discountPercentage.addClass('d-none');\n $pranaRating.removeClass('d-none d-lg-inline-block');\n $('.footer-container__copyright').addClass('mb-8');\n } else {\n $('html').removeClass('is-addToCart-sticky');\n $discountPercentage.removeClass('d-none');\n $pranaRating.addClass('d-none d-lg-inline-block');\n $('.footer-container__copyright').removeClass('mb-8');\n }\n }, 100));\n}\n\n/**\n * Klarna Placements\n * The data.price object does not always contain the price that is displayed on the page,\n * So to get the displayed price, we'll scrape it from the page.\n */\nfunction refreshKlarnaPlacements() {\n var displayedPrice = $('.prices .value:first').attr('content'); // content attribute is the unformatted value.\n var klarnaPriceValue = displayedPrice ? Math.round(displayedPrice * 100) : 1;\n $('klarna-placement').attr('data-purchase-amount', klarnaPriceValue); // CAN NOT USE .data() HERE. Gotta update the attribute directly.\n if (window.Klarna && window.Klarna.OnsiteMessaging) {\n window.Klarna.OnsiteMessaging.refresh();\n }\n}\n\n/**\n * Update Product Attributes and Details\n */\nfunction updateAttributesAndDetails() {\n $('body').on('product:statusUpdate', function (e, data) {\n /**\n * Get a reference to the product container\n */\n var $productContainer = $('.product-detail[data-pid=\"' + data.id + '\"]');\n\n /**\n * Product Description and Details\n */\n $productContainer.find('.description-and-detail .product-attributes')\n .empty()\n .html(data.attributesHtml);\n\n if (data.shortDescription) {\n $productContainer.find('.description-and-detail .description')\n .removeClass('hidden-xl-down');\n $productContainer.find('.description-and-detail .description .content')\n .empty()\n .html(data.shortDescription);\n } else {\n $productContainer.find('.description-and-detail .description')\n .addClass('hidden-xl-down');\n }\n\n if (data.longDescription) {\n $productContainer.find('.description-and-detail .details')\n .removeClass('hidden-xl-down');\n $productContainer.find('.description-and-detail .details .content')\n .empty()\n .html(data.longDescription);\n } else {\n $productContainer.find('.description-and-detail .details')\n .addClass('hidden-xl-down');\n }\n\n /**\n * Product In-Store Pickup\n */\n var $inStorePickupContainer = $('.product-detail .product-instore__inventory');\n\n if ($inStorePickupContainer.length > 0) {\n if (data.availableForInStorePickup) {\n $inStorePickupContainer.removeClass('d-none');\n } else {\n $inStorePickupContainer.addClass('d-none');\n }\n }\n\n /**\n * Klarna Placements\n */\n refreshKlarnaPlacements();\n });\n}\n\n/**\n * Show the Spinner\n */\nfunction showSpinner() {\n if (window.resources.enableServerSideGallery) {\n $('body').on('product:beforeAddToCart', function () {\n $.spinner().start();\n });\n } else {\n $('body').on('product:beforeAddToCart product:beforeAttributeSelect', function () {\n $.spinner().start();\n });\n }\n}\n\n/**\n * Update Product Attributes\n */\nfunction updateAttribute() {\n $('body').on('product:afterAttributeSelect', function (e, response) {\n if ($('.product-detail>.bundle-items').length) {\n $(response.container).data('pid', response.data.product.id);\n $(response.container).find('.product-id')\n .data('pid', response.data.product.id)\n .text(response.data.product.masterId);\n } else if ($('.product-set-detail').eq(0)) {\n $(response.container).data('pid', response.data.product.id);\n $(response.container).find('.product-id')\n .data('pid', response.data.product.id)\n .text(response.data.product.masterId);\n } else {\n $('.product-id').data('pid', response.data.product.id)\n .text(response.data.product.masterId);\n $('.product-detail:not(\".bundle-item\")').data('pid', response.data.product.id);\n }\n });\n}\n\n/**\n * Update the Add To Cart Button\n */\nfunction updateAddToCart() {\n $('body').on('product:updateAddToCart', function (e, response) {\n // update local add to cart (for sets)\n if (response.product.readyToOrder && !response.product.available) {\n $('.js-product__message--partners').show();\n }\n\n if (base.isEverythingSelected()) {\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').attr('disabled', false);\n }\n\n // Upon initial load, products are not ready for order because a size isn't selected (unless O/S or only one size in stock).\n // At that time, the button to add to cart should be enabled until the customer clicks it.\n // After that, the button should disabled and the customer should follow displayed messaging regarding making a selection.\n const disableAddToCart = !response.product.available || (!response.product.readyToOrder && !initialPageLoad);\n $('button.add-to-cart, button.update-cart-product-global', response.$productContainer)\n .attr('disabled', disableAddToCart)\n .text(response.product.buttonText);\n\n if (disableAddToCart) {\n initialPageLoad = false;\n }\n\n let enable = $('.product-availability').toArray().every(function (item) {\n return $(item).data('available') && $(item).data('ready-to-order');\n });\n\n if (enable) {\n $('.js-product__message--partners').hide();\n }\n });\n}\n\n/**\n * Update Product Availability\n */\nfunction updateAvailability() {\n $('body').on('product:updateAvailability', function (e, response) {\n $('div.availability', response.$productContainer)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available);\n\n // Might need to preface with div.availability\n const $availabilityMsgContainer = $('.availability-msg', response.$productContainer).toggleClass('d-none', !response.message);\n\n if (response.availabilityMessages && response.availabilityMessages.length) {\n response.availabilityMessages.forEach(message => {\n $availabilityMsgContainer.alert({\n content: message.content,\n theme: message.theme,\n dismissible: false,\n autoClose: false\n });\n });\n }\n\n $('.product__message--velocity', response.$productContainer)\n .empty()\n .html(response.velocityMessage);\n\n $('.selectswatch-' + response.selectedAttributeID + '-msg', response.$productContainer).removeClass('d-inline').addClass('d-none');\n\n $('.outofstock-combination-msg', response.$productContainer);\n\n if (response.product.notifyme && !response.product.isMaster) {\n $('.product__add-to-cart', response.$productContainer).hide();\n $('.product__notify-me', response.$productContainer).show();\n $('.product__message--velocity', response.$productContainer).addClass('product__message--velocity--notifyme').show();\n $('.outofstock-combination-msg', response.$productContainer).show();\n $('input[name=variantPID]', response.$productContainer).val(response.product.id);\n } else {\n $('.product__add-to-cart', response.$productContainer).show();\n $('.product__notify-me', response.$productContainer).hide();\n $('input[name=variantPID]', response.$productContainer).val('');\n\n // Display inventory threshold message\n if (response.velocityMessage !== '') {\n $('.product__message--velocity', response.$productContainer).removeClass('product__message--velocity--notifyme').show();\n }\n }\n\n if ($('.global-availability').length) {\n // This is used for a Product Bundles and Product Sets. Checks all the\n // sub-products for Available and Ready. If all selected variants are\n // selected, then update the global-availability data.\n var allAvailable = $('.product-availability').toArray()\n .every(function (item) { return $(item).data('available'); });\n\n var allReady = $('.product-availability').toArray()\n .every(function (item) { return $(item).data('ready-to-order'); });\n\n $('.global-availability')\n .data('ready-to-order', allReady)\n .data('available', allAvailable);\n\n $('.global-availability .availability-msg').empty(); // response.resources.info_selectforstock\n\n if (response.availabilityMessages && response.availabilityMessages.length) {\n response.availabilityMessages.forEach(message => {\n $availabilityMsgContainer.alert({\n content: message.content,\n theme: message.theme,\n dismissible: false,\n autoClose: false\n });\n });\n }\n }\n $('.accordion').trigger('collapse-changed'); // Refresh hc-sticky to avoid ovelaping content\n $('body').trigger('product:checkOutOfStock', response);\n });\n}\n\n/**\n * Scroll the viewport to the a given accordion section\n *\n * @param {string} sectionSelector - Accordian Section to scroll to\n * @param {JQuery} $productDetailsContainer - Reference to product detail container\n */\nfunction scrollToAccordionSection(sectionSelector, $productDetailsContainer) {\n var $productAccordianDrawer = $productDetailsContainer.find(sectionSelector);\n\n if ($productAccordianDrawer.length) {\n $productAccordianDrawer.collapse('show');\n\n var headerHeight = $('.js-site-header').height();\n\n $('html, body').animate({\n scrollTop: $productAccordianDrawer.closest('.accordion__section').offset().top - headerHeight - 10\n }, 300);\n }\n}\n\n/**\n * Initialize the Image Gallery\n */\nfunction initGallery() {\n const swiperImageGallery = new ImageGallery();\n swiperImageGallery.init();\n}\n\n/**\n * Hide Size Fit Modal\n */\nvar hideSizeFitModal = () => {\n $('.sizefit-modal').remove(); // this class is added to the modal when it is created, in createQVModal().\n // also remove the backdrop\n $('.modal-backdrop').remove();\n $('body').removeClass('modal-open').css('padding-right', '');\n $.enableScroll();\n $(window).trigger('scroll');\n};\n\n/**\n * Create Modal for SizeFIt Guide\n * @returns {HTMLElement} $modal - Reference to modal JQuery object\n */\nvar createSizeFitModal = () => {\n var isMobile = breakpoints.isLowRes();\n var modalConfig = {\n customClasses: 'sizefit-modal'\n };\n if (isMobile) {\n modalConfig.centeredClass = 'modal-dialog-scrollable banner-size-fit';\n }\n let modalMarkup = utils.createModalMarkup('', modalConfig);\n let $modal = $(modalMarkup).modal();\n $modal.on('hidden.bs.modal', () => {\n hideSizeFitModal();\n });\n return $modal;\n};\n\n/**\n * Fetches sizefitguide html from server and launches modal\n * @param {string} sizeGuideUrl - SizeFit Guide view controller endpoint url\n * @param {HTMLElement} $modal - Reference to modal JQuery object\n */\nvar launchSizeGuide = (sizeGuideUrl, $modal) => {\n if (!sizeGuideUrl) {\n return;\n }\n\n if (!$modal) {\n $modal = createSizeFitModal(); // eslint-disable-line no-param-reassign\n }\n\n $modal.modal('show');\n $.spinner().start();\n\n let successHandler = (html, unitType) => {\n $modal.find('.modal-body').html(html);\n tabbedContainer.init();\n overflowSlider();\n if (window.ssp) {\n window.ssp('start', 'fitpredictor');\n }\n if (sizeGuideUrl.indexOf('GarmentGuide') > -1) {\n var sizefitSwitch = $modal.find('.js-garment-sizefit');\n var toggleHTML = `
      \n
      \n \n
      \n
      `;\n sizefitSwitch.html(toggleHTML);\n }\n sizefitJs.initSizeFit();\n };\n\n $.ajax({\n url: sizeGuideUrl,\n method: 'GET',\n dataType: 'json',\n success: (data) => {\n if (!$modal[0].parentElement) {\n // success was called before the modal is shown.\n $modal.on('shown.bs.modal', () => {\n successHandler(data.renderedTemplate, data.unitType);\n });\n } else {\n successHandler(data.renderedTemplate, data.unitType);\n }\n },\n complete: () => {\n $.spinner().stop();\n $.disableScroll();\n },\n error: () => {\n hideSizeFitModal();\n }\n });\n};\n\n/**\n * Sets Out of Stock status text based on the selectable/unselectable state of the attribute\n * @param {jQuery} $swatchEntered - targeted swatch on click/hover\n * @param {string} selectedValue - selected text value\n * @param {jQuery} $attributeLabelValue - selected text element\n * @param {jQuery} $auxSwatch optional parameter that indicates an auxiliary swatch should be updated\n */\nfunction setSelectedInventoryStatus($swatchEntered, selectedValue, $attributeLabelValue, $auxSwatch) {\n const outOfStockText = $swatchEntered.closest('[data-attr-oos-text]').data('attr-oos-text');\n\n if (selectedValue !== undefined) {\n if ($swatchEntered.hasClass('unselectable')) {\n $attributeLabelValue.text(selectedValue + ' ' + outOfStockText).addClass('text-danger');\n if ($auxSwatch) {\n $auxSwatch.attr('data-attr-oos', outOfStockText);\n } else {\n $swatchEntered.attr('data-attr-oos', outOfStockText);\n }\n } else {\n $attributeLabelValue.text(selectedValue).removeClass('text-danger');\n if ($auxSwatch) {\n $auxSwatch.attr('data-attr-oos', '');\n } else {\n $swatchEntered.attr('data-attr-oos', '');\n }\n }\n }\n}\n\n/**\n * Custom events on Attribute click and hover\n */\nfunction onSelectAttribute() {\n // Color Attribute click event to display selected/selectable status\n $('.js-product-content').on('attribute:click', '.js-color-swatch, .js-size-swatch, .js-dimension-swatch', function (e) {\n const $swatchClicked = $(e.currentTarget);\n const attrType = $swatchClicked.closest('.js-attribute').data('attr');\n const $attrValue = $swatchClicked.closest('.js-attribute').find('.js-attr-label-value');\n let selectedValue;\n\n if (attrType === 'color') {\n selectedValue = $swatchClicked.find('.color-value').attr('title');\n } else {\n const $selectedColorSwatch = $('.js-attribute-color .js-color-swatch.selected');\n const $colorValue = $selectedColorSwatch.closest('.js-attribute').find('.js-attr-label-value');\n const colorSelected = $selectedColorSwatch.find('.color-value').attr('title');\n selectedValue = $swatchClicked.data('attr-hover');\n\n // Color label may also need to be updated to reflect inventory status when a size/dimension swatchis selected\n setSelectedInventoryStatus($swatchClicked, colorSelected, $colorValue, $selectedColorSwatch);\n }\n\n setSelectedInventoryStatus($swatchClicked, selectedValue, $attrValue);\n });\n\n // Attribute Select event to get the new attribute selected/selectable status for Size/Dimension attributes\n $(document).on('attribute:select', '.product-detail .js-size-swatch, .product-detail .js-dimension-swatch', function (e, $attrValue, attrValue) {\n const outOfStockText = $attrValue.closest('[data-attr-oos-text]').data('attr-oos-text');\n const attributeLabelValue = $attrValue.closest('.js-attribute').find('.js-attr-label-value');\n attributeLabelValue.text($attrValue.data('attr-hover'));\n if (!attrValue.selectable) {\n attributeLabelValue.addClass('text-danger').text($attrValue.data('attr-hover') + ' ' + outOfStockText);\n $attrValue.attr('data-attr-oos', outOfStockText);\n } else {\n attributeLabelValue.removeClass('text-danger').text($attrValue.data('attr-hover'));\n $attrValue.attr('data-attr-oos', '');\n }\n });\n}\n\n/**\n * Poll to see when the write a review button loads in the ratings and reviews accordion section.\n * - activate by setting url param: bvOpenWriteReview=true\n */\nfunction onWriteReviewButtonPoll() {\n var pollCallback = function () {\n var queryString = utils.getParamsFromURL(window.location.search);\n\n if (queryString && queryString.bvOpenWriteReview && queryString.bvOpenWriteReview === 'true') {\n if (pollCountMax > 0) {\n pollCountMax -= 1;\n var $button = $('.bv-write-review.bv-submission-button:button');\n if ($button.length === 1) {\n $button.click();\n } else {\n setTimeout(pollCallback, pollWriteAReviewButtonInterval);\n }\n }\n }\n };\n\n setTimeout(pollCallback, pollWriteAReviewButtonInterval);\n}\n\n/**\n * Method to observe review drawer and check if any comments are added\n */\nfunction observeReviewDrawer() {\n const $targetNode = $('.js-review-drawer')[0];\n const config = { attributes: true, childList: true, subtree: true };\n const observer = new MutationObserver(function (mutationsList) {\n for (const mutation of mutationsList) {\n if (mutation.type === 'childList') {\n if ($('.js-review-drawer').find('ol li').length >= 1) {\n var $bvReviewRatings = $('.js-true-to-size');\n if ($bvReviewRatings.length) {\n $bvReviewRatings.removeClass('d-none');\n observer.disconnect();\n }\n }\n }\n }\n });\n // Start observing the target node for configured mutations\n if ($targetNode) {\n observer.observe($targetNode, config);\n }\n}\n\n/**\n * Ensure proper formatting of global process variable\n */\nfunction enforceGlobalProcessFormatting() {\n let internalProcessValue;\n let processCopy = window.process; // get initial process value if it exists\n\n /**\n * Checks if param is an object\n * @param {*} param to check type of\n * @returns {boolean} if param is an object\n */\n function isObject(param) {\n return typeof param === 'object' && param !== null && !Array.isArray(param);\n }\n\n Object.defineProperty(window, 'process', {\n get: function () {\n if (typeof internalProcessValue === 'undefined') { // if value not previously set\n const processValue = isObject(processCopy) ? processCopy : {}; // process must be an object\n processValue.env = isObject(processValue.env) ? processValue.env : {}; // process.env must be an object\n\n internalProcessValue = processValue;\n }\n\n return internalProcessValue;\n },\n set: function (param) {\n processCopy = isObject(processCopy) ? processCopy : {}; // process must be an object\n const processParam = isObject(param) ? param : {}; // process must be an object\n const processValue = Object.assign({}, processCopy, processParam); // combine existing and new process properties\n processValue.env = isObject(processValue.env) ? processValue.env : {}; // process.env must be an object\n\n processCopy = processValue; // update copied process value\n internalProcessValue = processValue;\n }\n });\n}\n\n/**\n * PLEASE NOTE\n * THE FOLLOWING METHODS HAVE BEEN INCLUDED GLOBALLY IN product/pdpActions.js FOR QUICKVIEW,\n * SO NO NEED TO INCLUDE THEM HERE\n *\n * selectAttribute: base.selectAttribute,\n * availabilty: base.avaliability,\n * addToCart: base.addToCart,\n **/\n\nmodule.exports = {\n /**\n * This is necessary for page load if the product variant is already selected.\n *\n * Edit productDetails.isml to add the master ID\n *\n *\n * Check Quick View\n *\n *\n * Also check to make sure everything is selected\n *\n * Check Gift Card\n *\n * * Check to see if the data-pid is the same as the master id, if it is do the following:\n *\n * may only need to call attributeSelect once, pick the first and then fire\n *\n */\n init: function () {\n const $productContainer = $('.product-detail');\n const $dimensionSwatchSelected = $('.product__attributes .js-dimension-swatch.selected.selectable');\n const $sizeSwatchSelected = $('.product__attributes .js-size-swatch.selected');\n const $selectedColorSwatch = $('.js-attribute-color .js-color-swatch.selected');\n const $colorValue = $selectedColorSwatch.closest('.js-attribute').find('.js-attr-label-value');\n const colorSelected = $selectedColorSwatch.find('.color-value').attr('title');\n const queryScOnLoad = utils.getParamsFromURL(window.location.search);\n\n observeReviewDrawer();\n\n if (queryScOnLoad && queryScOnLoad.scOnLoad && queryScOnLoad.scOnLoad.toUpperCase() === 'Y') {\n launchSizeGuide($('.js-sizeguide-modal').attr('data-link'), '');\n }\n\n if ($productContainer.data('pid') === $productContainer.data('master-pid')) {\n if (base.isEverythingSelected()) {\n const $swatchSelected = $('.product__attributes a.selected').first();\n const selectedAttributeID = $swatchSelected.closest('.js-attribute').data('attr');\n\n base.attributeSelect($swatchSelected.data('attr-url'), $productContainer, selectedAttributeID);\n } else if ($dimensionSwatchSelected.length && !$sizeSwatchSelected.length) {\n base.attributeSelect($dimensionSwatchSelected.data('attr-url'), $productContainer, 'dimension');\n }\n }\n\n // Refresh Product-Variation data based on initial selection\n if ($productContainer.data('availability-refresh')) {\n var customValueUrl = $('.js-color-swatch.selected').data('attr-url');\n base.attributeSelect(customValueUrl, $productContainer, 'inventory');\n }\n\n base.updateOOSColorVariants($productContainer);\n setSelectedInventoryStatus($sizeSwatchSelected, colorSelected, $colorValue, $selectedColorSwatch);\n refreshKlarnaPlacements();\n\n // Flag swatches to indicate notify me status (see base.forceOOSNotifyMe)\n base.setVariantNotifyMeStatus();\n },\n initProcess: enforceGlobalProcessFormatting,\n stickyAddToCart: stickyAddToCart,\n updateAttributesAndDetails: updateAttributesAndDetails,\n showSpinner: showSpinner,\n updateAttribute: updateAttribute,\n updateAddToCart: updateAddToCart,\n updateAvailability: updateAvailability,\n onScrollToDetails: () => {\n $(document).on('click', '.js-view-details-jumplink', function (e) {\n e.preventDefault();\n var $productDetailsContainer = $(this).closest('.product-detail');\n scrollToAccordionSection('#product-accordion-details', $productDetailsContainer);\n });\n },\n initGallery: function () {\n initGallery();\n\n $(document).on('product:swiper:update', function () {\n initGallery();\n });\n },\n initLoyalty: loyalty.init,\n onClickReviewStars: function () {\n $(window).on('load', function () {\n $(document).on('click', '.product-detail .ratings, .js-accordion-reviews, .true-to-size, .bv_modal_component_container .bv_button_buttonFull', function (e) {\n e.preventDefault();\n var $productDetailsContainer = $(this).closest('.product-detail');\n if (!$productDetailsContainer.length) {\n $productDetailsContainer = $('.product-detail');\n }\n scrollToAccordionSection('#product-accordion-reviews', $productDetailsContainer);\n });\n // Reviews Drawer should be open on page load while clicking review rating from product list page.\n var queryParamProductReviews = utils.getParamsFromURL(window.location.search);\n if (queryParamProductReviews && queryParamProductReviews.bvOpen && queryParamProductReviews.bvOpen.toUpperCase() === 'TRUE') {\n scrollToAccordionSection('#product-accordion-reviews', $('.product-detail'));\n }\n });\n },\n launchOmnibusReviewModal: function () {\n $('body')\n .off('click', '.js-omnibus-review-msg')\n .on('click', '.js-omnibus-review-msg', (e) => {\n e.preventDefault();\n const $this = $(e.currentTarget);\n const modalTitle = $this.data('message-title');\n const modalContent = $this.data('message-content');\n $.modal({\n title: modalTitle,\n content: modalContent,\n modalSizeClass: 'modal-md modal-pad-fix'\n });\n });\n },\n launchSizeGuideModal: function () {\n $('body')\n .off('click', '.js-sizeguide-modal')\n .on('click', '.js-sizeguide-modal', (e) => {\n e.preventDefault();\n let $this = $(e.currentTarget);\n let $modal = createSizeFitModal();\n launchSizeGuide($this.data('link'), $modal);\n });\n },\n onSelectAttribute: onSelectAttribute,\n onWriteReviewButtonPoll: onWriteReviewButtonPoll,\n forceOOSNotifyMe: base.forceOOSNotifyMe\n};\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","'use strict';\n/**\n * File includes the ajax call to submit the notifyMe form\n */\nlet formValidation = require('../components/formValidation');\n\n/**\n * Add error message to invalid feedback container\n * @param {string} message validation error message\n * @return {void}\n */\nfunction showValidationFeedback(message) {\n $('.invalid-feedback').text(message).show();\n}\n\n/**\n * Clears and hides the invalid feedback container\n * @return {void}\n */\nfunction clearValidationFeedback() {\n $('.is-invalid').removeClass('is-invalid');\n $('.invalid-feedback').empty().hide();\n}\n\n/**\n * Validates HTML input fields\n * @param {HTMLElement} inputElem HTML input element to be validated\n * @return {array} is input valid, validation message\n */\nfunction checkValidInput(inputElem) {\n inputElem.setCustomValidity('');\n if (!inputElem.checkValidity()) { // if input is invalid\n $(inputElem).addClass('is-invalid').closest('.form-group').addClass('is-invalid');\n return [false, inputElem.validationMessage];\n }\n return [true, ''];\n}\n\n/**\n * Validates form by checking each input\n * @return {boolean} is form valid\n */\nfunction validateNotifyMeForm() {\n clearValidationFeedback();\n if ($('.notifyMeForm')[0] && !$('.notifyMeForm')[0].checkValidity()) { // if form invalid\n let errors = '';\n $('.notifyMeForm div.material-text-input').find('input').each(function () { // loop through inputs\n let [validationResult, validationResponse] = checkValidInput(this);\n if (!validationResult) { // if input is invalid\n errors += validationResponse + ' '; // add error message\n }\n });\n if (errors) {\n showValidationFeedback(errors); // display error messages\n return false;\n }\n }\n return true;\n}\n\n/**\n * If the form is valid submit it\n * @return {boolean} is form valid\n */\nfunction submitNotifyMeForm() {\n let isValid = validateNotifyMeForm();\n if (isValid) { // if form is valid\n $('.notifyMeForm').trigger('submit');\n $('.notify-me.btn').hide();\n }\n return isValid;\n}\n\n/**\n * Handles AJAX success response\n * @param {Object} data AJAX return data\n * @return {void}\n */\nfunction handleNotifyMeSuccess(data) {\n // hide velocity message and form (prevent duplicate submission)\n $('.product__message--velocity').removeClass('product__message--velocity--notifyme').hide();\n $('.notifyMeForm').hide();\n // show response message\n $('.notifyMeFormMessage').html(data.message).show();\n}\n\n/**\n * Changes form submit to make AJAX call\n * @return {void}\n */\nfunction registerNotifyMeForm() {\n $(document).on('submit', '.notifyMeForm', function (e) {\n let form = $(this);\n e.preventDefault();\n let url = form.attr('action');\n\n if (!this.elements.variantPID.value) {\n throw new Error('Notify Me: product variant not selected, invalid request.');\n }\n\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'POST',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n if (!data.success && data.success === false && 'fields' in data) {\n formValidation(form, data);\n } else {\n handleNotifyMeSuccess(data);\n }\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n}\n\n/**\n * Builds the Notify Me form\n * @param {boolean|undefined} hideForm create notify me form without unhiding it\n * @return {void}\n */\nfunction createNotifyMeForm(hideForm) {\n var $formContainer = $('.js-notifyMeFormContainer');\n var $button = $('.notify-me.btn');\n\n if ($button.data('cta') === 'showForm') {\n /**\n * Instead of remote including the Notify Me form\n * when the page is loaded, only make the call\n * when the form is requested (lazy load)\n */\n if ($button.data('is-loading')) {\n return;\n }\n\n var lazyLoadUrl = $button.data('lazy-load-url');\n\n if (!hideForm) {\n // show form\n $formContainer.show();\n }\n\n if ($formContainer.is(':empty')) {\n /**\n * Mark as loading before the call returns so rapid clicks by the user\n * doesn't load the form multiple times.\n */\n $button.data('is-loading', true);\n\n $.ajax({\n url: lazyLoadUrl,\n method: 'GET',\n success: function (responseHTML) {\n $formContainer.append(responseHTML);\n\n // form creation event will prep form for validation\n $formContainer.find('form').trigger('form:created');\n\n // add variant ID to variant form input\n $formContainer.find('#variantPID').val($button.data('pid'));\n\n // hide response message\n $formContainer.find('.notifyMeFormMessage').empty().hide();\n\n // register listener for form submission\n $button.data('cta', 'submitForm');\n registerNotifyMeForm();\n },\n complete: function () {\n $button.data('is-loading', false);\n }\n });\n } else {\n // show form in case it is hidden\n $formContainer.find('.notifyMeForm').show();\n $button.data('cta', 'submitForm');\n }\n } else if ($button.data('cta') === 'submitForm') {\n submitNotifyMeForm();\n }\n}\n\nmodule.exports = {\n init: function () {\n $(document).on('click', '.notify-me.btn', function () {\n createNotifyMeForm();\n });\n\n $(window).on('product:triggerNotifyMe', function (e, options) {\n const hideForm = options && options.hideForm;\n createNotifyMeForm(hideForm);\n });\n\n $(document).on('change blur', '.notifyMeForm input', function (e) {\n clearValidationFeedback();\n\n let [validationResult, validationResponse] = checkValidInput(this);\n\n if (!$(e.target).val()) {\n $(e.target).closest('.focus-fill').removeClass('focus-fill');\n }\n if (!validationResult) {\n showValidationFeedback(validationResponse);\n }\n });\n\n $(document).on('focus', '.notifyMeForm input', function (e) {\n $(e.target).closest('.form-group').addClass('focus-fill');\n });\n }\n};\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n"],"sourceRoot":""}