{"version":3,"sources":["global.js","plugins/select-replace.js","../../node_modules/js-tools/svg.js","../../vendor/d3r/core/resources/javascript/d3r.js","../../node_modules/magnific-popup/dist/jquery.magnific-popup.min.js","../../node_modules/wnumb/wNumb.js","../../node_modules/slick-carousel/slick/slick.js","../../node_modules/js-cookie/src/js.cookie.js","../../node_modules/selectize/dist/js/standalone/selectize.js","../../node_modules/scroll-lock/dist/scroll-lock.js","../../node_modules/photoswipe/dist/umd/photoswipe.umd.min.js","../../node_modules/photoswipe/dist/umd/photoswipe-lightbox.umd.min.js","components/url.js","components/state.js","components/basket.js","components/filters.js","components/grid.js","components/gallery.js","components/newsletter.js","components/kit-price.js","components/design-directory.js","components/qty.js","components/family.js","components/product.js","plugins/nouislider.js","components/carousel.js","components/notice.js","components/bloomreach.js","components/klaviyo.js","plugins/check-replace.js","plugins/custom-check-replace.js"],"names":["_toConsumableArray","r","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","TypeError","Symbol","iterator","Array","from","isArray","_arrayLikeToArray","_createForOfIteratorHelper","e","t","length","_n4","F","s","n","done","value","f","o","a","u","call","next","return","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","l","i","Object","push","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","enumerable","apply","_objectSpread2","arguments","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","configurable","writable","_callSuper","_getPrototypeOf","_possibleConstructorReturn","_isNativeReflectConstruct","Reflect","construct","_typeof","_assertThisInitialized","ReferenceError","Boolean","prototype","valueOf","setPrototypeOf","getPrototypeOf","bind","__proto__","_inherits","create","_setPrototypeOf","_classCallCheck","_defineProperties","key","_createClass","_toPrimitive","toPrimitive","String","Number","SELECTREPLACE","classes","focused","disabled","multiple","active","search","listitem","selected","current","nobbled","hidden","image","overview","mobileOverview","action","actions","icon","back","count","up","dn","pgup","pgdn","escape","space","enter","page","$focused","svgIconPath","AndrewMartin","svgSymbolsFile","svgIcon","dropdown","clear","$","fn","selectReplace","this","each","$select","$form","closest","$label","prev","$extra","$wrapper","wrap","parent","$drop","appendTo","$list","find","ndx","$option","$li","val","text","is","addClass","undefined","attr","toLowerCase","prependTo","all","$overviewMobile","$overview","$options","prop","on","preventDefault","stopPropagation","deactivateFilterRanges","trigger","$item","toggleClass","eventName","hasClass","showAll","$items","data","removeClass","parents","list","target","querySelector","drop","parentElement","childElementCount","classList","add","centrePoint","window","innerWidth","getBoundingClientRect","x","countListItems","initial","$selected","not","html","show","hide","eq","document","which","contains","get","$target","$this","autoclose","off","location","assign","selectors","join","split","index","checkValidity","setTimeout","message","confirm","replace","pathname","hash","removeAttr","animate","scrollTop","offset","top","url","width","height","newwindow","open","focus","define","amd","exports","require","jQuery","Zepto","c","d","m","ev","I","p","createElement","className","innerHTML","appendChild","triggerHandler","st","callbacks","charAt","A","currTemplate","closeBtn","closeMarkup","tClose","magnificPopup","instance","init","y","v","after","detach","body","req","abort","g","h","z","w","C","b","j","T","N","k","P","_","S","proto","navigator","appVersion","isLowIE","isIE8","addEventListener","isAndroid","isIOS","supportsTransition","style","transition","pop","probablyMobile","userAgent","popupsCache","isObj","items","toArray","parsed","el","isOpen","types","mainEl","extend","defaults","fixedContentPos","modal","closeOnContentClick","closeOnBgClick","showCloseBtn","enableEscapeKey","bgOverlay","close","_checkIfClose","container","contentContainer","preloader","tLoading","modules","toUpperCase","closeBtnInside","close_replaceWith","type","append","alignTop","css","overflow","overflowY","overflowX","position","fixedBgPos","keyCode","updateSize","wH","_hasScrollBar","_getScrollbarSize","marginRight","isIE7","mainClass","_addClassToMFP","updateItemHTML","_lastFocusedEl","activeElement","content","_setFocus","_onFocusIn","removalDelay","_close","empty","_removeClassFromMFP","currItem","autoFocusLast","prevHeight","documentElement","clientWidth","innerHeight","parseEl","markup","appendContent","preloaded","prepend","tagName","src","addGroup","mfpEl","_openClick","delegate","midClick","ctrlKey","metaKey","altKey","shiftKey","disableOn","updateStatus","status","allowHTMLInStatusIndicator","stopImmediatePropagation","scrollHeight","_parseMarkup","replaceWith","allowHTMLInTemplate","scrollbarSize","cssText","offsetWidth","removeChild","registerModule","options","parseInt","E","hiddenClass","tNotFound","initInline","getInline","inline","parentNode","inlineElement","O","L","M","D","settings","cursor","tError","initAjax","ajax","getAjax","success","xhr","finished","error","loadError","titleSrc","verticalFit","initImage","resizeImage","img","_onImageHasSize","hasSize","clearInterval","isCheckingImgSize","imgHidden","findImageSize","setInterval","naturalWidth","getImage","loaded","alt","complete","clone","title","img_replaceWith","loading","enabled","easing","duration","opener","initZoom","zoom","zIndex","left","_allowZoom","clearTimeout","_getItemToZoom","_getOffset","remove","offsetHeight","B","MozTransform","transform","H","srcAction","patterns","youtube","id","vimeo","gmaps","initIframe","getIframe","iframe","indexOf","substr","lastIndexOf","arrowMarkup","preload","navigateByImgClick","arrows","tPrev","tNext","tCounter","langDir","loop","initGallery","gallery","direction","dir","updateGalleryButtons","counter","arrowLeft","arrowRight","arrowNext","arrowPrev","_preloadTimeout","preloadNearbyImages","goTo","Math","min","_preloadItem","replaceSrc","ratio","initRetina","devicePixelRatio","retina","isNaN","SVG_DEFAULT_PATH","SVG_DEFAULT_PREFIX","Svg","imagePath","imageClassPrefix","setImagePath","path","setImageClassPrefix","prefix","render","prepare","factory","module","wNumb","FormatOptions","strReverse","reverse","strStartsWith","input","match","substring","throwEqualError","Error","isValidNumber","isFinite","formatTo","decimals","thousand","mark","suffix","encoder","decoder","negativeBefore","negative","edit","undo","inputIsNegative","inputPieces","inputBase","originalInput","inputDecimals","output","parseFloat","toFixed","abs","exp","round","formatFrom","strEndsWith","passAll","method","args","inputOptions","optionName","optionValue","filteredOptions","validate","to","instanceUid","Slick","element","dataSettings","accessibility","adaptiveHeight","appendArrows","appendDots","asNavFor","prevArrow","nextArrow","autoplay","autoplaySpeed","centerMode","centerPadding","cssEase","customPaging","slider","dots","dotsClass","draggable","edgeFriction","fade","focusOnSelect","focusOnChange","infinite","initialSlide","lazyLoad","mobileFirst","pauseOnHover","pauseOnFocus","pauseOnDotsHover","respondTo","responsive","rows","rtl","slide","slidesPerRow","slidesToShow","slidesToScroll","speed","swipe","swipeToSlide","touchMove","touchThreshold","useCSS","useTransform","variableWidth","vertical","verticalSwiping","waitForAnimate","initials","animating","dragging","autoPlayTimer","currentDirection","currentLeft","currentSlide","$dots","listWidth","listHeight","loadIndex","$nextArrow","$prevArrow","scrolling","slideCount","slideWidth","$slideTrack","$slides","sliding","slideOffset","swipeLeft","swiping","touchObject","transformsEnabled","unslicked","activeBreakpoint","animType","animProp","breakpoints","breakpointSettings","cssTransitions","focussed","interrupted","paused","positionProp","rowCount","shouldClick","$slider","$slidesCache","transformType","transitionType","visibilityChange","windowWidth","windowTimer","originalSettings","mozHidden","webkitHidden","autoPlay","proxy","autoPlayClear","autoPlayIterator","changeSlide","clickHandler","selectHandler","setPosition","swipeHandler","dragHandler","keyHandler","htmlExpr","registerBreakpoints","activateADA","tabindex","addSlide","slickAdd","addBefore","unload","insertBefore","insertAfter","children","reinit","animateHeight","targetHeight","outerHeight","animateSlide","targetLeft","callback","animProps","animStart","step","now","ceil","applyTransition","disableTransition","getNavTarget","slick","slideHandler","slideTo","buildArrows","buildDots","dot","getDotCount","first","buildOut","wrapAll","setupInfinite","updateDots","setSlideClasses","buildRows","newSlides","numOfSlides","originalSlides","slidesPerSection","createDocumentFragment","row","display","checkResponsive","forceUpdate","breakpoint","targetBreakpoint","respondToWidth","triggerBreakpoint","sliderWidth","hasOwnProperty","unslick","refresh","event","dontAnimate","indexOffset","currentTarget","checkNavigable","navigables","prevNavigable","getNavigableIndexes","cleanUpEvents","interrupt","visibility","cleanUpSlideEvents","orientationChange","resize","cleanUpRows","destroy","fadeSlide","slideIndex","opacity","fadeSlideOut","filterSlides","slickFilter","focusHandler","$sf","getCurrent","slickCurrentSlide","breakPoint","pagerQty","getLeft","verticalHeight","targetSlide","coef","verticalOffset","floor","offsetLeft","outerWidth","getOption","slickGetOption","option","max","indexes","getSlick","getSlideCount","swipedSlide","centerOffset","slickGoTo","creation","setProps","startLoad","loadSlider","initializeEvents","updateArrows","initADA","numDotGroups","tabControlIndexes","slideControlIndex","role","ariaButtonControl","mappedSlideIndex","end","initArrowEvents","initDotEvents","initSlideEvents","initUI","loadRange","rangeStart","rangeEnd","loadImages","imagesScope","imageSource","imageSrcSet","imageSizes","imageToLoad","onload","onerror","prevSlide","nextSlide","progressiveLazyLoad","slickNext","pause","slickPause","play","slickPlay","postSlide","slickPrev","tryCount","$imgsToLoad","initializing","lastVisibleIndex","currentBreakpoint","responsiveSettings","splice","sort","windowDelay","removeSlide","slickRemove","removeBefore","removeAll","setCSS","positionProps","setDimensions","padding","setFade","right","setHeight","setOption","slickSetOption","item","opt","bodyStyle","WebkitTransition","MozTransition","msTransition","OTransform","perspectiveProperty","webkitPerspective","MozPerspective","webkitTransform","msTransform","allSlides","remainder","evenCoef","infiniteCount","toggle","targetElement","sync","animSlide","oldSlide","slideLeft","navTarget","swipeDirection","xDist","yDist","swipeAngle","startX","curX","startY","curY","atan2","PI","swipeEnd","swipeLength","edgeHit","minSwipe","fingerCount","originalEvent","touches","swipeStart","swipeMove","curLeft","positionOffset","verticalSwipeLength","pageX","clientX","pageY","clientY","sqrt","pow","unfilterSlides","slickUnfilter","fromBreakpoint","ret","registeredInModuleLoader","OldCookies","Cookies","api","noConflict","result","attributes","decode","decodeURIComponent","converter","set","expires","Date","toUTCString","JSON","stringify","write","encodeURIComponent","stringifiedAttributes","attributeName","cookie","json","jar","cookies","parts","read","parse","getJSON","withConverter","root","Sifter","diacritics","tokenize","query","trim","regex","letter","tokens","words","escape_regex","DIACRITICS","RegExp","string","object","is_array","getScoreFunction","fields","token_count","nesting","prepareSearch","field_count","scoreValue","token","score","pos","scoreObject","getattr","sum","conjunction","getSortFunction","self","field","fields_count","multiplier","multipliers","get_field","implicit_score","sort_empty","unshift","cmp","option_fields","option_sort","option_sort_empty","total","fn_sort","fn_score","limit","asciifold","obj","names","shift","str","q","chunk","foreignletters","lookup","regexp","foreignletter","MicroPlugin","Interface","plugins","initializePlugins","queue","requested","utils","loadPlugin","plugin","vArg","Selectize","highlight","$element","pattern","node","skip","nodeType","spannode","middlebit","splitText","middleclone","cloneNode","replaceChild","childNodes","removeHighlight","firstChild","nodeName","normalize","MicroEvent","fct","_events","mixin","destObject","props","IS_MAC","KEY_CMD","KEY_CTRL","SUPPORTS_VALIDITY_API","validity","isset","hash_key","escape_html","hook","original","debounce_events","event_args","getSelection","start","selectionStart","selectionEnd","selection","sel","createRange","selLen","moveStart","autoGrow","$input","currentWidth","update","printable","placeholder","character","$parent","force","fromCharCode","$testInput","whiteSpace","$from","$to","properties","styles","transferStyles","domToString","tmp","selectize","delay","timeout","computedStyle","getComputedStyle","getPropertyValue","currentStyle","order","tabIndex","tagType","eventNS","highlightedValue","isBlurring","isDisabled","isRequired","isInvalid","isLocked","isFocused","isInputHidden","isSetup","isShiftDown","isCmdDown","isCtrlDown","ignoreFocus","ignoreBlur","ignoreHover","hasOptions","currentResults","lastValue","caretPos","loadedSearches","$activeOption","$activeItems","optgroups","userOptions","renderCache","onSearchChange","loadThrottle","sifter","registerOption","registerOptionGroup","mode","maxItems","hideSelected","setupCallbacks","setupTemplates","setup","explanation","console","component","group","groupEnd","$control","$control_input","$dropdown","$dropdown_content","$dropdown_parent","inputMode","classes_plugins","inputId","selector","$window","$document","wrapperClass","inputClass","dropdownParent","dropdownClass","dropdownContentClass","copyClassesToDropdown","splitOn","delimiter","delimiterEscaped","onOptionHover","onOptionSelect","onItemSelect","child","mousedown","onMouseDown","click","onClick","keydown","onKeyDown","keyup","onKeyUp","keypress","onKeyPress","positionDropdown","blur","onBlur","onFocus","paste","onPaste","has","revertSettings","$children","setValue","refreshState","updateOriginalInput","refreshItems","updatePlaceholder","disable","onChange","field_label","labelField","field_optgroup","optgroupLabelField","templates","optgroup","optgroup_header","option_create","initialize","change","item_add","item_remove","option_add","option_remove","option_clear","optgroup_add","optgroup_remove","optgroup_clear","dropdown_open","dropdown_close","load","defaultPrevented","isDefaultPrevented","setActiveItem","isFull","pastedText","splitInput","createItem","selectAll","$next","getAdjacentOption","setActiveOption","$prev","advanceSelection","selectOnTab","deleteSelection","refreshOptions","wasFocused","showInput","openOnFocus","dest","deactivate","setTextboxValue","setCaret","createOnBlur","closeAfterSelect","lastQuery","addItem","loadingClass","results","addOption","getValue","silent","addItems","idx","begin","swap","$last","hideInput","scroll","height_menu","height_item","scroll_top","scroll_bottom","stop","scrollDuration","getSearchOptions","sortField","searchField","searchConjunction","calculateScore","triggerDropdown","groups","groups_order","option_html","html_children","has_create_option","$active","$active_before","$create","active_before","maxOptions","optgroupField","lockOptgroupOrder","$order","dom","canCreate","addPrecedence","valueField","optgroupValueField","addOptionGroup","removeOptionGroup","clearOptionGroups","updateOption","$item_new","value_new","index_item","cache_items","cache_options","order_old","getItem","removeOption","removeItem","clearOptions","getElementWithValue","$els","getAttribute","values","buffer","isPending","control","value_next","wasFull","insertAtCaret","persist","caret","lock","called","unlock","refreshValidityState","refreshClasses","invalid","isEmptyObject","opts","label","$el","option_select","$option_select","$tail","onDelete","tail","valueLength","advanceCaret","$adj","$child","before","enable","removeData","templateName","cache","disabledField","clearCache","createFilter","allowEmptyOption","dataAttr","settings_user","attr_data","field_value","field_disabled","field_optgroup_label","field_optgroup_value","tag_name","settings_element","optionsMap","readData","arr","$optgroup","init_select","data_raw","init_textbox","support","sortable","forcePlaceholderSize","ui","helper","headerClass","titleRowClass","labelClass","closeClass","$dropdown_header","equalizeWidth","equalizeHeight","getScrollbarWidth","div","doc","equalizeSizes","height_max","width_last","width_parent","$optgroups","thisRef","render_item","html_container","html_element","multiClose","context","singleClose","installedModules","__webpack_require__","moduleId","getter","toStringTag","__esModule","ns","property","__webpack_exports__","argumentAsArray","argument","isElement","Node","eachNode","nodeList","NodeList","isElementList","throwError","concat","arrayAsSelector","array","nodeListAsArray","nodes","findParentBySelector","$root","querySelectorAll","elementHasSelector","elementHasOverflowHidden","elementScrollTopOnStart","elementScrollTopOnEnd","elementScrollLeftOnStart","scrollLeft","elementScrollLeftOnEnd","scrollWidth","_defineProperty","disablePageScroll","enablePageScroll","getScrollState","clearQueueScrollLocks","scroll_lock_getTargetScrollBarWidth","scroll_lock_getCurrentTargetScrollBarWidth","getPageScrollBarWidth","getCurrentPageScrollBarWidth","scroll_lock_addScrollableTarget","scroll_lock_removeScrollableTarget","scroll_lock_addScrollableSelector","scroll_lock_removeScrollableSelector","scroll_lock_addLockableTarget","scroll_lock_addLockableSelector","scroll_lock_setFillGapMethod","scroll_lock_addFillGapTarget","scroll_lock_removeFillGapTarget","scroll_lock_addFillGapSelector","scroll_lock_removeFillGapSelector","refillGaps","FILL_GAP_AVAILABLE_METHODS","state","scrollableSelectors","lockableSelectors","fillGapSelectors","fillGapMethod","startTouchY","startTouchX","scroll_lock_hideLockableOverflow","fillGaps","scroll_lock_showLockableOverflow","unfillGaps","onlyExists","currentOverflowYProperty","documentWidth","borderLeftWidthCurrentProperty","borderLeftWidth","borderRightWidthCurrentProperty","borderRightWidth","_currentWidth","map","$targets","setAttribute","removeAttribute","sSelector","methods","scroll_lock_fillGapTarget","scroll_lock_unfillGapTarget","scroll_lock_fillGapSelector","fSelector","scroll_lock_unfillGapSelector","scroll_lock_hideLockableOverflowSelector","scroll_lock_showLockableOverflowSelector","scroll_lock_hideLockableOverflowTarget","scroll_lock_showLockableOverflowTarget","isLockable","scrollBarWidth","$lockableParent","currentMargin","maxWidth","currentPadding","paddingRight","currentFillGapMethod","currentClientY","currentClientX","down","directionWithOffset","handle","parentScrollableEl","elementIsInputRange","elementIsScrollableField","prevent","cancelable","passive","deprecatedMethods","getState","getWidth","getCurrentWidth","setScrollableTargets","setFillGapSelectors","setFillGapTargets","clearQueue","scrollLock","source","sym","_objectSpread","getTargetScrollBarWidth","getCurrentTargetScrollBarWidth","addScrollableSelector","removeScrollableSelector","addScrollableTarget","removeScrollableTarget","addLockableSelector","addLockableTarget","addFillGapSelector","removeFillGapSelector","addFillGapTarget","removeFillGapTarget","setFillGapMethod","_state","globalThis","PhotoSwipe","vendor","_this","listener","_this2","getViewportSizeFn","paddingFn","currZoomLevel","center","pswp","dispatch","reset","viewportSize","panAreaSize","itemData","elementSize","fit","fill","vFill","secondary","zoomLevels","slideData","isActive","currIndex","currentResolution","pan","isFirstSlide","contentLoader","getContentBySlide","holderElement","heavyAppended","bounds","prevDisplayedWidth","prevDisplayedHeight","activate","transformOrigin","calculateSize","updateContentSize","appendHeavy","zoomAndPanToInitial","applyCurrentZoomPan","mainScroll","isShifted","hasSlide","panTo","sizeChanged","setDisplayedSize","_this3","isZoomable","destZoomLevel","centerPoint","transitionDuration","animations","stopAllPan","setZoomLevel","calculateZoomToPanOffset","startTransition","isPan","getCurrentTransform","onComplete","zoomTo","zoomAnimationDuration","getViewportCenterPoint","correctPan","currSlide","gestures","startPan","stopAll","_this$gestures","p1","prevP1","dragAxis","closeOnVerticalDrag","isMultitouch","panY","applyBgOpacity","velocity","_this$pswp","getCurrSlideX","moveIndexBy","correctZoomPan","_this4","bgOpacity","startSpring","dampingRatio","onUpdate","_this$gestures2","_this$pswp2","isPannable","moveTo","allowPanToNext","_this$gestures3","startP1","p2","startP2","pinchToClose","naturalFrequency","point","toggleZoom","clickToCloseNonZoomable","_this5","prevP2","Z","R","PointerEvent","supportsTouch","maxTouchPoints","U","V","isDragging","isZooming","raf","G","drag","tapHandler","events","scrollWrap","ontouchmove","ontouchend","onPointerDown","onPointerMove","onPointerUp","pointerType","button","mouseDetected","K","W","X","Y","J","tt","it","ht","requestAnimationFrame","et","_this6","doubleTapAction","doubleTap","tap","cancelAnimationFrame","applyFilters","findIndex","pointerId","nt","identifier","ot","rt","lt","itemHolders","_this7","spacing","getNumItems","_this8","potentialIndex","canLoop","getLoopedIndex","stopMainScroll","isMainScroll","updateCurrItem","setContent","resetPosition","setIsActive","updateLazy","Escape","ArrowLeft","ArrowUp","ArrowRight","ArrowDown","Tab","_this9","ct","trapFocus","initialPointerPos","dt","ut","vt","returnFocus","escKey","arrowKeys","template","_this0","_t$onFinish","onFinish","_t$duration","_t$easing","ft","wt","gt","yt","_t","xt","removeEventListener","bt","St","zt","cos","sin","_this1","Mt","_t$onFinish2","easeFrame","activeAnimations","Pt","_this10","some","Ct","deltaX","deltaY","wheelToZoom","deltaMode","isButton","ariaLabel","isCustomSVG","size","outlineID","inner","onInit","onclick","topBar","isLoading","preloaderDelay","updatePreloaderVisibility","innerText","indexIndicatorSep","isRegistered","uiElementsData","Tt","_this11","registerElement","At","_this$pswp3","isClosing","imageClickAction","decoding","displayedImageWidth","displayedImageHeight","isAttached","isDecoding","_this12","keepPlaceholder","usePlaceholder","msrc","isLazy","isImageContent","loadImage","_this13","updateSrcsetSizes","srcset","onLoaded","onError","removePlaceholder","displayError","isError","dataset","largestUsedSize","sizes","errorMsg","_this14","catch","finally","appendImage","createContentFromData","Q","Dt","loadSlideByIndex","getContentByIndex","getItemData","addToCache","setSlide","removeByIndex","isClosed","isOpening","It","Et","Lt","kt","Zt","Bt","Ft","Ot","Rt","Nt","Ut","_this15","hideAnimationDuration","maxWidthToAnimate","Vt","showAnimationDuration","showHideAnimationType","showHideOpacity","Gt","getThumbBounds","getPlaceholderElement","$t","bg","innerRect","qt","willChange","_this16","Promise","resolve","Ht","setProperty","Kt","Wt","jt","Xt","_this17","bgClickAction","tapAction","_ref","_class","_this18","ii","si","isDestroying","hasMouse","hi","keyboard","_this19","ei","scrollWheel","pageYOffset","ni","oi","_i10","Yt","_this20","matchMedia","matches","_this21","setScrollOffset","appendHolders","appendToEl","thumbBounds","thumbSelector","thumbCropped","_ref2","_class2","dataSource","Qt","numItems","Element","ti","childSelector","pswpSrc","href","pswpSrcset","pswpWidth","pswpHeight","pswpType","currentSrc","pswpCropped","cropped","_class3","Jt","priority","addFilter","removeFilter","_this22","_len","_key","_this23","PhotoSwipeLightbox","_this24","_this25","_this26","_ref3","_class4","_this27","shouldOpen","onThumbnailsClick","_this28","gallerySelector","getClickedIndex","loadAndOpen","getClickedIndexFn","_this29","pswpModule","openPromise","preloadFirstSlide","then","_this30","default","_this31","_ref4","_class5","_class6","_this32","_len2","_key2","_this33","version","orig","widgetUuid","widgetHasOwnProperty","widgetSlice","cleanData","elems","elem","_data","widget","base","existingConstructor","basePrototype","proxiedPrototype","namespace","fullName","Widget","expr","pseudos","_createWidget","_proto","_childConstructors","_super","_superApply","returnValue","__super","__superApply","widgetEventPrefix","widgetName","widgetFullName","childPrototype","bridge","inputIndex","inputLength","isPlainObject","isMethodCall","methodValue","jquery","pushStack","_init","defaultElement","uuid","eventNamespace","bindings","hoverable","focusable","classesElementLookup","_on","ownerDocument","defaultView","parentWindow","_getCreateOptions","_create","_setOptionDisabled","_trigger","_getCreateEventData","noop","that","_destroy","_removeClass","curOption","_setOptions","_setOption","_setOptionClasses","classKey","elements","currentElements","_classes","_toggleClass","full","bindRemoveEvent","nodesToBind","processClassString","checkOption","uniqueSort","extra","_untrackClassesElement","inArray","_off","_addClass","suppressDisabledCheck","handlers","delegateElement","handler","handlerProxy","guid","_delay","_hoverable","mouseenter","mouseleave","_focusable","focusin","focusout","Event","defaultEffect","effect","effectName","effects","canvas","backdrop","debug","_debug","_canvas","_findElement","_backdrop","backgroundImage","backgroundRepeat","_width","_height","_left","_top","_updatePosition","_updatePositionFromCoords","log","basketChange","basketChangeTimeout","AMURL","build","querystring","paramsToQueryString","params","pairs","queryStringToParams","queryString","pair","setQueryStringParam","STATE","getParams","getChanged","oldParams","changed","setParam","setState","setHash","protocol","hostname","history","pushState","getUrl","pushUrl","replaceUrl","replaceState","getStorage","localStorage","sessionStorage","save","activate_sel","setItem","scope","$scope","stored","kav","triggered","loadHandlers","updateHeaderBasket","price","qty","disableCheckoutButton","checkMaxStock","disableButton","maximum","updateBufferTime","serialize","payload","table","sliders","filterUrl","updateAjax","grid","listingItem","ListingItem","fromItemNum","toItemNum","productCount","handlePaintLinks","updateFilterRanges","allRanges","updateFilterRangesOverview","column","rangeIsDefault","updateFilterRangesSelection","capitalize","range","noUiSlider","activateFilterRanges","checkFilterCount","filterCount","filterType","onpopstate","reload","hasAttribute","form","tag","valid","windowResizing","oldMode","moveElement","setBoth","allowed","onfocus","onkeypress","charCode","dimension","minInput","maxInput","onchange","format","connect","siblings","URL","load_more","searchParams","more","initProductGallery","videoContainer","video","thumbnail","player","videojs","watchVideo","pauseVideo","aspectRatio","initGalery","getElementById","HAZE","instantiate","hazeGallery","popupScroll","$button","fadeIn","fadeOut","CYLINDO","cylindoGallery","$popup","cylindo","newsletter","initPopups","link","price_str","rollsTxt","rolls","fadeTo","newItems","loadMore","decimal_places","minimum","total_qty","quantities","products","sku","product_price","fromPrice","sizePrice","updateBatchPrices","getQueryParameters","setQueryParameters","showAllColours","firstElementChild","textContent","app","eventType","HTMLElement","SVGElement","GTM","dataLayerName","addData","ecommerce","dataLayer","timeoutId","productData","tracking","hasRedirected","google_tag_manager","currencyCode","actionField","eventCallback","eventTimeout","request","clearEcommerce","showMoreButton","AddToBasketPlugin","quantity","totalPrice","flyout","_this34","Overlay","wait_for_scripts","modifiers","flyoutupsell","upsellContainer","upsellContinueForm","upsellsArray","upsells","layoutClass","upsell","returnUpsellElement","insertAdjacentHTML","returnHiddenInput","qtyField","QuantityControl","upsellAddButton","qtyContainer","previousElementSibling","getCount","upsellCount","basketText","thumbnail_alt","_this35","disableBasketButton","refreshAfterAjax","openUpsellBasket","openBasket","fail","MultiProduct","_this36","updatePrice","updateWishlistAdd","initMultiSizeSelect","pieces","single_qty","getProducts","combination","sendToBasket","zeroQuantities","_this37","productSizeSelect","quantityStep","quantityPrice","selectedSize","selectedSizeSKU","selectedSizePrice","bubbles","dispatchEvent","selectElements","multiproduct","FlyoutUpsell","_this38","hiddenInputs","serializeArray","entry","TradeMaterial","_this39","optionsArray","optionsString","$visibleInputs","updateReserveText","hideReserveBlock","hideMaterialBlock","batch_price","selectedIndex","baseAction","tradematerial","SingleProduct","_this40","formId","singleproduct","Sample","_this41","updateFinancing","fdOptions","$finTable","fdPrice","tdDetails","fdMinPrice","fdOpt","code","depositPerc","FinanceDetails","m_inst","d_amount","apr","p_name","cur","goods_val","d_pc","l_amount","term","l_repay","Loop","PaintQuantityCalculator","svg","submit","inputs","validCharacters","exists","calculate","resetForm","confirmQuantity","validateInputs","checkValue","validateInputKeypress","onblur","validateInputBlur","sample","specification","offer","has_offer","price_raw","currency","basket_url","stock_message","select","delivery_information","paintQuantityCalculator","Viewport","mediaQuery","customMediaQuery","customMatchMedia","customMatches","PaintMap","links","random","xDirection","yDirection","paintMapResults","global","VERSION","Function","ArrayProto","ObjProto","SymbolProto","supportsArrayBuffer","ArrayBuffer","supportsDataView","DataView","nativeIsArray","nativeKeys","nativeCreate","nativeIsView","isView","_isNaN","_isFinite","hasEnumBug","propertyIsEnumerable","nonEnumerableProps","MAX_ARRAY_INDEX","restArguments","func","startIndex","rest","isObject","isUndefined","isBoolean","tagTester","isString","isNumber","isDate","isRegExp","isSymbol","isArrayBuffer","isFunction","nodelist","Int8Array","isFunction$1","hasObjectTag","hasDataViewBug","isIE11","Map","isDataView","isDataView$1","getInt8","has$1","isArguments","isArguments$1","isNaN$1","constant","createSizePropertyCheck","getSizeProperty","collection","sizeProperty","shallowProperty","getByteLength","isBufferLike","typedArrayPattern","isTypedArray$1","getLength","collectNonEnumProps","emulatedSet","nonEnumIdx","isMatch","attrs","_keys","_$1","_wrapped","toBufferView","bufferSource","Uint8Array","byteOffset","toJSON","tagDataView","allKeys","ie11fingerprint","weakMapMethods","forEachName","commonInit","mapTail","mapMethods","setMethods","isMap","isWeakMap","isSet","isWeakSet","invert","functions","createAssigner","keysFunc","extendOwn","baseCreate","Ctor","toPath$1","toPath","deepGet","defaultValue","identity","matcher","optimizeCb","argCount","accumulator","baseIteratee","iteratee","Infinity","cb","getTime","createEscaper","escaper","testRegexp","replaceRegexp","escapeMap","_escape","_unescape","templateSettings","evaluate","interpolate","noMatch","escapes","escapeRegExp","escapeChar","bareIdentifier","idCounter","executeBound","sourceFunc","boundFunc","callingContext","partial","boundArgs","bound","callArgs","isArrayLike","flatten$1","depth","strict","stack","frame","bindAll","wait","defer","negate","predicate","times","memo","once","findKey","createPredicateIndexFinder","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","currentKey","createReduce","reducer","reduce","reduceRight","every","fromIndex","guard","invoke","contextPath","pluck","computed","lastComputed","reStrSymbol","last","rand","temp","behavior","partition","groupBy","indexBy","countBy","pass","keyInObj","pick","omit","difference","without","otherArrays","uniq","isSorted","seen","union","arrays","unzip","zip","chainResult","_chain","chain","allExports","isNull","isTypedArray","isEmpty","isEqual","todo","aStack","bStack","areArrays","aCtor","bCtor","interceptor","mapObject","propertyOf","accum","unescape","oldSettings","variable","fallback","uniqueId","memoize","hasher","address","throttle","previous","later","leading","throttled","_now","remaining","trailing","cancel","debounce","immediate","passed","debounced","_args","wrapper","compose","detect","findWhere","collect","foldl","inject","foldr","reject","any","includes","include","where","shuffle","sortBy","criteria","head","take","compact","flatten","unique","intersection","argsLength","transpose","paintMap","scrollToEl","Carousel","viewport","slickArrow","unslickable","watch","playVideo","watchFilter","carousel","_this42","filtered","setFilter","unsetFilter","carousels","activeButton","activeSlideIndex","currentSlideElement","heroItemRightExists","slickDots","heroItem","observer","IntersectionObserver","_ref5","isIntersecting","hero_banner_id","gaId","hero_banner","gaLabel","hero_banner_position","disconnect","observe","tablet","prevButton","nextButton","photoswipe","photoswipeEl","_step","dataSourceImages","photoSwipeButtons","leftArrow","rightArrow","arrowPrevSVG","arrowNextSVG","initButton","clickedIndex","photoswipeId","_iterator","err","siteNoticeMessages","siteNotice","loopMessages","bloomreach","exponea","email","identify","email_id","klaviyo","_klOnsite","Proxy","checkReplace","customCheckReplace","isTrigger","isNumeric","addClassFor","asArray","countDecimals","numStr","getPageOffset","supportPageOffset","pageXOffset","isCSS1Compat","compatMode","subRangeRatio","pa","pb","fromPercentage","getJ","toStepping","xVal","xPct","va","vb","toPercentage","getStep","xSteps","snap","handleEntryPoint","percentage","xHighestCompleteStep","handleStepPoint","totalSteps","xNumSteps","highestStep","Spectrum","singleStep","ordered","getMargin","fromStepping","isPercentage","getNearbySteps","stepBefore","startValue","thisStep","stepAfter","countStepDecimals","stepDecimals","convert","defaultFormatter","validateFormat","isValidFormatter","testStep","testRange","spectrum","testStart","handles","testSnap","testAnimate","testAnimationDuration","animationDuration","testConnect","testOrientation","ort","testMargin","margin","testLimit","testPadding","testDirection","testBehaviour","fixed","hover","testTooltips","tooltips","formatter","testAriaFormat","ariaFormat","testFormat","testCssPrefix","cssPrefix","testCssClasses","cssClasses","testUseRaf","useRequestAnimationFrame","testOptions","tests","orientation","behaviour","origin","handleLower","handleUpper","horizontal","background","ltr","tooltip","pips","pipsHorizontal","pipsVertical","marker","markerHorizontal","markerVertical","markerNormal","markerLarge","markerSub","valueHorizontal","valueVertical","valueNormal","valueLarge","valueSub","styleOposite","closure","originalOptions","scope_Base","scope_Handles","scope_Connects","scope_Self","scope_Pips","tips","pointerEnabled","move","msPointerEnabled","supportsPassive","CSS","supports","getSupportsPassive","scope_Target","scope_Locations","scope_HandleNumbers","scope_ActiveHandle","scope_Spectrum","scope_Values","scope_Events","scope_Listeners","scope_Document","scope_DocumentElement","scope_Body","addNodeTo","addOrigin","handleNumber","addConnect","addTooltip","addMarking","spread","filterFunc","valueSizeClasses","markerSizeClasses","valueOrientationClasses","markerOrientationClasses","getClasses","sizeClasses","addSpread","removePips","density","stepped","getGroup","safeIncrement","increment","firstInRange","lastInRange","ignoreFirst","ignoreLast","prevPct","newPct","pctDifference","steps","realSteps","stepsize","generateSpread","baseSize","rect","attachEvent","pageOffset","touch","mouse","pointer","changedTouches","points","fixEvent","buttons","calcPoint","calcPointToPercentage","docElem","proposal","clientTop","clientLeft","moveHandles","upward","locations","handleNumbers","proposals","checkHandlePosition","setHandle","fireEvent","targetEvent","documentLeave","relatedTarget","eventEnd","eventMove","buttonsProperty","movement","startCalcPoint","setZindex","eventStart","moveEvent","endEvent","outEvent","eventTap","getClosestHandle","eventHover","reference","lookBackward","lookForward","toPct","pct","stateUpdate","updateConnect","updateHandlePosition","valueSet","fireSetEvent","isInit","valueGet","bindEvent","namespacedEvent","addSlider","connectOptions","addElements","nearbySteps","decrement","tEvent","tNamespace","__moveHandles","updateOptions","optionsToUpdate","updateAble","newOptions","handleBefore","handleAfter","eventHolders","eventHolder","unencoded","formattedValue","positions","noZensmooth","install","zenscroll","isNativeSmoothScrollEnabledOn","makeScroller","defaultDuration","edgeOffset","scrollTimeoutId","setScrollTimeoutId","newValue","stopScroll","getTopWithEdgeOffset","getTopOf","scrollToY","targetY","onDone","toY","getY","distance","startTime","loopScroll","getHeight","scrollToElem","newDefaultDuration","newEdgeOffset","intoView","elemHeight","elemBottom","containerHeight","containerBottom","moving","getDocY","scrollY","scrollingElement","scrollTo","clientHeight","offsetTop","createScroller","scrollContainer","isHistorySupported","isScrollRestorationSupported","scrollRestoration","zenscrollY","targetElem","diff","RE_noZensmooth","anchor","historyState","heroButtons","accordion","setSlickDotsTop","bottom","getHeroContentHeight","resetDots","heights","checkHomePage","header","checkMobile","setupSampleModal","clicked","span","stackDots","initProductVideos","flash","swf","ready","muted","isDesktop","checkHash","reInit","socials","social","productGrid","bindEventListenersToAccordionTabs","tab","checkCustomiserSelection"],"mappings":"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","file":"../../javascript/global.js","sourcesContent":["\nvar SELECTREPLACE = {\n    classes: {\n        focused:  'multi-select-replace--focused',\n        disabled: 'multi-select-replace--disabled',\n        // single:   'multi-select-replace--single',\n        multiple: 'multi-select-replace--multiple',\n        active: 'multi-select-replace--active',\n        search:   'multi-select-replace--search',\n        listitem: 'multi-select-replace__list-item',\n        selected: 'multi-select-replace__list-item--selected',\n        current:  'multi-select-replace__list-item--current',\n        nobbled:  'multi-select-replace__list-item--disabled',\n        hidden:   'multi-select-replace__list-item--hidden',\n        image:    'multi-select-replace__list-item--image',\n        overview: 'multi-select-replace__overview',\n        mobileOverview: 'multi-select-replace__mobile-overview',\n        action:   'multi-select-replace__action',\n        actions:  'multi-select-replace__actions',\n        icon:     'multi-select-replace__icon',\n        back:     'multi-select-replace__back',\n        count:    'multi-select-replace__count'\n    },\n\n    keys: {\n        up:     38,\n        dn:     40,\n        pgup:   33,\n        pgdn:   34,\n        escape: 27,\n        space:  32,\n        enter:  13,\n    },\n\n    page: 5,\n\n    $focused: false,\n\n    svgIconPath: AndrewMartin.svgSymbolsFile,\n    svgIcon: {\n        back: 'icon-select',\n        dropdown: 'icon-select',\n        selected: 'icon-tick',\n        clear: 'icon-close'\n    }\n};\n\n// Styled select elements\n$.fn.selectReplace = function() {\n    $(this).filter(':not(.multi-select-replaced)').each(function() {\n        var $select = $(this);\n\n        var $form     = $select.closest('form');\n        var $label    = $select.prev('label');\n        var $extra    = $select.next('.filterable__extra-content');\n        var $wrapper  = $select.wrap('<div class=\"multi-select-replace\"></div>').parent();\n        var $input    = $('<input class=\"multi-select-replace__search\">').appendTo($wrapper);\n        var $drop     = $('<div class=\"multi-select-replace__drop\"></div>').appendTo($wrapper);\n        var $up       = $('<a href=\"#\" class=\"multi-select-replace__elevator-button multi-select-replace__elevator-button--up\"></a>').appendTo($drop);\n        var $down     = $('<a href=\"#\" class=\"multi-select-replace__elevator-button multi-select-replace__elevator-button--down\"></a>').appendTo($drop);\n\n        var $list = $('<ul class=\"multi-select-replace__list\"></ul>');\n\n        $select.find('option').each(function(ndx) {\n            var $option = $(this);\n\n            var $li = $('<li class=\"' + SELECTREPLACE.classes.listitem + '\" data-value=\"' + $option.val() + '\"><a href=\"#0\">' + $option.text() + '</a></li>');\n\n            if ($option.is('[data-hidden]')) {\n                $li.addClass(SELECTREPLACE.classes.hidden);\n            }\n\n            if ($option.is(':disabled')) {\n                $li.addClass(SELECTREPLACE.classes.nobbled);\n            }\n\n            if ($option.attr('data-image') !== undefined) {\n                $('<img src=\"' + $option.attr('data-image') + '\" />').appendTo($li);\n                $li.addClass(SELECTREPLACE.classes.image);\n            }\n\n            $li.appendTo($list);\n\n            var $icon = $('<span class=\"multi-select-replace__status\"><svg class=\"' + SELECTREPLACE.svgIcon.selected + '\">\\\n                <use xlink:href=\"' + SELECTREPLACE.svgIconPath + '#' + SELECTREPLACE.svgIcon.selected + '\" />\\\n            </svg></span>').appendTo($li);\n\n\n            if ($option.text().toLowerCase() == 'multicoloured') {\n                var $swatch = $('<div class=\"multi-select-replace__swatch multi-select-replace__swatch--multicoloured\"></div>').prependTo($li);\n            } else if ($option.attr('color') !== '') {\n                var $swatch = $('<div class=\"multi-select-replace__swatch\" style=\"color: ' + $option.attr('color') + ';\"></div>').prependTo($li);\n            }\n        });\n\n        var all = '<span class=\"' + SELECTREPLACE.classes.action + ' ' + SELECTREPLACE.classes.action + '--all\">Select all</span>';\n        var clear = '<span class=\"' + SELECTREPLACE.classes.action + ' ' + SELECTREPLACE.classes.action + '--clear\">Clear all</span>';\n\n        var $overviewMobile = $('<div class=\"' + SELECTREPLACE.classes.listitem + ' ' + SELECTREPLACE.classes.listitem + '--overview ' + SELECTREPLACE.classes.listitem + '--overview-1\" data-value=\"all\"><div class=\"' + SELECTREPLACE.classes.actions + '\">' + all + clear + '</div></div>');\n        $overviewMobile.appendTo($drop);\n\n        var $overview = $('<div class=\"' + SELECTREPLACE.classes.listitem + ' ' + SELECTREPLACE.classes.listitem + '--overview ' + SELECTREPLACE.classes.listitem + '--overview-2\" data-value=\"all\"><div class=\"' + SELECTREPLACE.classes.actions + '\">' + all + clear + '</div></div>');\n        $overview.appendTo($drop);\n\n        $list.appendTo($drop);\n\n        if ($extra) {\n            $extra.appendTo($drop);\n        }\n\n        var $options = $list.find('li');\n\n        $wrapper.addClass(SELECTREPLACE.classes.multiple);\n\n        if ($select.prop('id')) {\n            $select.parent().prop('id', $select.prop('id') + '_replace');\n        }\n\n        $select.addClass('multi-select-replaced');\n\n        $label.on('click', function(e) {\n            e.preventDefault();\n            e.stopPropagation();\n            deactivateFilterRanges($('.js-filter-ranges'))\n            if (SELECTREPLACE.$focused) {\n                if (SELECTREPLACE.$focused !== $wrapper) {\n                    // clicked a different select\n                    SELECTREPLACE.$focused.trigger('_blur');\n\n                    $wrapper.trigger('_focus');\n                } else {\n                    $wrapper.trigger('_blur');\n                }\n            } else {\n                $wrapper.trigger('_focus');\n            }\n        });\n\n        $list.on('click', '.' + SELECTREPLACE.classes.listitem, function(e) {\n            e.preventDefault();\n\n            var $item = $(this);\n\n            // if ($item.data('value') != 'all') {\n                $item.toggleClass(SELECTREPLACE.classes.selected);\n\n                var eventName = $item.hasClass(SELECTREPLACE.classes.selected) ? '_selected' : '_unselected';\n\n                $select.trigger(eventName, this);\n            // }\n\n            $wrapper.trigger('_change');\n        });\n\n        $wrapper.on('click', '.' + SELECTREPLACE.classes.back, function(e) {\n            $wrapper.trigger('_blur');\n        });\n\n        $wrapper.on('click', '.' + SELECTREPLACE.classes.actions, function(e) {\n            var $items = $list.find('.' + SELECTREPLACE.classes.listitem)//.not($item);\n\n            var showAll;\n\n            $wrapper.find('.' + SELECTREPLACE.classes.actions).each(function() {\n                var $item = $(this).parent();\n                $item.data('active', !$item.data('active'));\n\n                showAll = $item.data('active');\n\n                $overviewMobile.attr('data-all', showAll);\n                $overview.attr('data-all', showAll);\n            });\n\n            $items.each(function() {\n                var $item = $(this);\n                var eventName = '_unselected';\n                $item.removeClass(SELECTREPLACE.classes.selected);\n\n                if (showAll) {\n                    $item.addClass(SELECTREPLACE.classes.selected);\n                    eventName = '_selected';\n                }\n\n                $select.trigger(eventName, this);\n            });\n\n            $wrapper.trigger('_change');\n        });\n\n        $wrapper.on('_focus', function(e) {\n            SELECTREPLACE.$focused = $wrapper;\n            $wrapper.addClass(SELECTREPLACE.classes.focused);\n            $wrapper.parents('.filterable__dimension').addClass('filterable__dimension--active');\n            $wrapper.parents('.filterable__content').addClass('filterable__content--active');\n            countListItems(e)\n        });\n\n        // Count number of li's\n\n        function countListItems(e) {\n\n            var list = e.target.querySelector('.multi-select-replace__list')\n            var drop = list.parentElement\n\n            if ( list.childElementCount > 17) {\n                list.classList.add('multi-select-replace__list--large')\n                drop.classList.add('multi-select-replace__drop--large')\n\n            } else if ( list.childElementCount >= 7) {\n                list.classList.add('multi-select-replace__list--medium')\n\n            } else if ( list.childElementCount <= 6) {\n                list.classList.add('multi-select-replace__list--small')\n            }\n\n            var centrePoint = (window.innerWidth / 2);\n\n            if (drop.getBoundingClientRect().x > centrePoint) {\n                drop.classList.add('multi-select-replace__drop--right-align')\n            }\n        }\n\n        $wrapper.on('_blur', function() {\n            SELECTREPLACE.$focused = false;\n            $wrapper.removeClass(SELECTREPLACE.classes.focused);\n            $wrapper.parents('.filterable__dimension').removeClass('filterable__dimension--active');\n            $wrapper.parents('.filterable__content').removeClass('filterable__content--active');\n        });\n\n        $wrapper.on('_change', function(e, initial) {\n            var $selected = $options.filter('.' + SELECTREPLACE.classes.selected).not('[data-value=\"all\"]');\n            var $items = $options.not('[data-value=\"all\"]');\n\n            var selectValue = '';\n            if ($select.data('blank') !== undefined) {\n                selectValue = $select.data('blank');\n            }\n\n            var html = '';\n\n            if ($selected.length) {\n                $selected.each(function(i) {\n                    html += $(this).find('a').html();\n\n                    if (i < $selected.length - 1) {\n                        html += ', ';\n                    }\n                });\n                selectValue = $selected.length + ' selected';\n                $wrapper.addClass(SELECTREPLACE.classes.active);\n                $wrapper.parent().addClass('filterable__dimension--has-selection');\n                $('.js-clear-filters').show();\n            } else {\n                html = 'None selected';\n                $wrapper.removeClass(SELECTREPLACE.classes.active);\n                $wrapper.parent().removeClass('filterable__dimension--has-selection');\n                $('.js-clear-filters').hide();\n            }\n\n            $wrapper.find('.' + SELECTREPLACE.classes.count).html($selected.length);\n\n            if ($selected.length > 0) {\n                $label.find('.js-filterable__count').html('(' + $selected.length + ')');\n            } else {\n                $label.find('.js-filterable__count').html('');\n            }\n\n            if ($selected.length == 0) {\n                $overview.data('active', false);\n                $overview.attr('data-all', false);\n                $overviewMobile.attr('data-all', false);\n            } else {\n                $overview.data('active', true);\n                $overview.attr('data-all', true);\n                $overviewMobile.attr('data-all', true);\n            }\n\n            // $value.html(selectValue);\n            $wrapper.find('.' + SELECTREPLACE.classes.overview).html(html).attr('data-is-empty', $selected.length == 0);\n\n            $select.find('option').each(function(ndx) {\n                var $option = $(this);\n\n                if ($options.eq(ndx).hasClass(SELECTREPLACE.classes.selected)) {\n                    $option.prop('selected', true);\n                } else {\n                    $option.prop('selected', null);\n                }\n            });\n\n            if (!initial) {\n                $select.trigger('change', initial);\n            }\n        });\n\n        $(document).on('keydown', function(e) {\n            if (!SELECTREPLACE.$focused) {\n                return;\n            }\n\n            if (e.which == SELECTREPLACE.keys.escape) {\n                $wrapper.trigger('_blur');\n            }\n        });\n\n        $select.on('_change', function() {\n            $select.find('option').each(function(ndx) {\n                var $option = $(this);\n\n                if ($option.prop('selected')) {\n                    $li = $options.eq(ndx);\n                    $li.addClass(SELECTREPLACE.classes.selected);\n                }\n            });\n        });\n\n        $form.on('reset', function(e) {\n            $options.removeClass(SELECTREPLACE.classes.selected);\n            $wrapper.trigger('_change');\n        });\n\n        $select.trigger('_change', true);\n    });\n};\n\n$(document).on('click', function(e) {\n    if (SELECTREPLACE.$focused) {\n        if (!$.contains(SELECTREPLACE.$focused.get(0), e.target)) {\n            // clicked outside of the current select\n            SELECTREPLACE.$focused.trigger('_blur');\n        }\n    }\n});\n\n$('select[multiple]').selectReplace();\n\n\n/*\n * Copyright 2014 D3R Ltd\n * http://d3r.com\n *\n * D3R Standard Javascript\n *\n * You'll want at least:\n\n    .js .d3r-show,\n    .js .d3r-hide {\n        cursor: pointer;\n    }\n    .js .d3r-hidden {\n        display: none;\n    }\n    .js .d3r-shown {\n        display: block;\n    }\n    .d3r-chooser {\n\n    }\n        .d3r-chooser-option,\n        .d3r-multichooser-option {\n            display: none;\n        }\n *\n */\n\n// hidey showey\n$(document).on('click', '.d3r-show, .d3r-hide', function(e) {\n    var $this = $(this),\n        $target;\n    if ($this.is('a')) e.preventDefault();\n    if (!!$this.data('target')) {\n        $target = $('#'+$this.data('target'));\n    } else if (!!$this.attr('href') && \"#\" == $this.attr('href')[0]) {\n        $target = $($this.attr('href'));\n    }\n    if ($target.length) {\n        var hide = $this.hasClass('d3r-hide');\n        $target[hide ? 'toggleClass' : 'addClass']('d3r-shown');\n        $this[hide ? 'toggleClass' : 'addClass']('d3r-active');\n    }\n    if ($target.hasClass('d3r-shown') && $this.hasClass('d3r-autoclose')) {\n        var autoclose = function(e) {\n            if (!$.contains($target[0], e.target)) {\n                if ($target.hasClass('d3r-shown')) {\n                    e.preventDefault();\n                    $target.removeClass('d3r-shown');\n                    $this.removeClass('d3r-active');\n                }\n                $(document).off('click', autoclose);\n            }\n        };\n        $(document).on('click', autoclose);\n    }\n});\n// redirect from dropdowns\n$(document).on('change', 'select.d3r-redirector', function(e) {\n    window.location.assign($(this).val());\n});\n// display things based on dropdowns\n$(document).on('change', 'select.d3r-chooser', function(e) {\n    var $this = $(this),\n        $options = $('.d3r-chooser-option').filter('[data-chooser=\"'+$this.attr('id')+'\"]');\n    $options.removeClass('d3r-shown');\n\n    var selectors = ['[data-chooservalue=\"' + $this.val() + '\"]'];\n\n    if ($this.val()) {\n        selectors.push('#' + $this.val());\n    }\n\n    $options.filter(selectors.join(',')).addClass('d3r-shown');\n});\n$(document).on('change', 'select.d3r-multichooser', function(e) {\n    var $this = $(this),\n        $options = $('.d3r-multichooser-option').filter('[data-multichooser=\"'+$this.attr('id')+'\"]'),\n        $option = $('option:selected', this);\n    $options.removeClass('d3r-shown');\n    $.each($option.data('values').split(' '), function(index, val) {\n        var selectors = ['[data-chooservalue=\"' + val + '\"]'];\n\n        if (val) {\n            selectors.push('#' + val);\n        }\n\n        $options.filter(selectors.join(',')).addClass('d3r-shown');\n    });\n});\n$(document).on('change', 'input[type=\"radio\"].d3r-chooser', function(e) {\n    var $this = $(this),\n        $options = $('.d3r-chooser-option').filter('[data-chooser=\"'+$this.attr('name')+'\"]');\n    $options.removeClass('d3r-shown');\n\n    if ($this.is(':checked')) {\n        var selectors = ['[data-chooservalue=\"' + $this.val() + '\"]'];\n\n        if ($this.val()) {\n            selectors.push('#' + $this.val());\n        }\n\n        $options.filter(selectors.join(',')).addClass('d3r-shown');\n    }\n});\n\n$('input[type=\"radio\"].d3r-chooser:checked').trigger('change');\n\n$(document).on('click', '.d3r-submit', function(e) {\n    var $this = $(this);\n\n    // If the form is invalid, don't disable the button.\n    if ($this.closest('form') &&\n        !$this.closest('form')[0].checkValidity()) {\n        return;\n    }\n    // The timeout is to allow this submission to proceed. Nasty I know, sorry.\n    if ($this.hasClass('d3r-disabled')) {\n        e.preventDefault();\n    }\n    $this.addClass('d3r-disabled');\n    if (!$this.is('a')) {\n        setTimeout(function() {\n            $this.prop('disabled', true);\n        }, 0);\n    }\n});\n$(document).on('click', '.d3r-confirm', function(e) {\n    var $this = $(this),\n        message = 'Are you sure?';\n    if (!!$this.data('confirm')) message = $this.data('confirm');\n    if (!window.confirm(message)) e.preventDefault();\n});\n$(document).on('click', '.d3r-scrollto', function(e) {\n    var $this = $(this),\n        $target;\n    if (!!$this.data('target')) {\n        $target = $('#'+$this.data('target'));\n    } else if (!!$this.attr('href') && \"#\" == $this.attr('href').replace(window.location.pathname,\"\")[0]) {\n        $target = $($this.attr('href').replace(window.location.pathname,\"\"));\n    }\n    if ($target.length) {\n        var hash = $target.attr(\"id\");\n        $target.removeAttr(\"id\");\n        $(\"html,body\").animate({\n            scrollTop: $target.offset().top\n        }, 500, function() {\n            $target.attr(\"id\", hash);\n        });\n    }\n});\n$(document).on('click', '.d3r-popup', function(e) {\n    e.preventDefault();\n    var $this = $(this),\n        url = $this.attr('href'),\n        width = 600,\n        height = 300,\n        target = 'popup';\n    if (!!$this.data('width')) width = $this.data('width');\n    if (!!$this.data('height')) height = $this.data('height');\n    if (!!$this.attr('target')) target = $this.attr('target');\n\n    var newwindow = window.open(url, target ,'height='+height+',width='+width);\n    if (window.focus) newwindow.focus();\n});\n\n\n!function(e){\"function\"==typeof define&&define.amd?define([\"jquery\"],e):\"object\"==typeof exports?e(require(\"jquery\")):e(window.jQuery||window.Zepto)}(function(c){function e(){}function d(e,t){m.ev.on(x+e+I,t)}function p(e,t,n,o){var i=document.createElement(\"div\");return i.className=\"mfp-\"+e,n&&(i.innerHTML=n),o?t&&t.appendChild(i):(i=c(i),t&&i.appendTo(t)),i}function u(e,t){m.ev.triggerHandler(x+e,t),m.st.callbacks&&(e=e.charAt(0).toLowerCase()+e.slice(1),m.st.callbacks[e])&&m.st.callbacks[e].apply(m,Array.isArray(t)?t:[t])}function f(e){return e===A&&m.currTemplate.closeBtn||(m.currTemplate.closeBtn=c(m.st.closeMarkup.replace(\"%title%\",m.st.tClose)),A=e),m.currTemplate.closeBtn}function r(){c.magnificPopup.instance||((m=new e).init(),c.magnificPopup.instance=m)}function a(){y&&(v.after(y.addClass(l)).detach(),y=null)}function i(){n&&c(document.body).removeClass(n)}function t(){i(),m.req&&m.req.abort()}var m,o,g,s,h,A,l,v,y,n,w=\"Close\",F=\"BeforeClose\",C=\"MarkupParse\",b=\"Open\",j=\"Change\",x=\"mfp\",I=\".\"+x,T=\"mfp-ready\",N=\"mfp-removing\",k=\"mfp-prevent-close\",P=!!window.jQuery,_=c(window),S=(c.magnificPopup={instance:null,proto:e.prototype={constructor:e,init:function(){var e=navigator.appVersion;m.isLowIE=m.isIE8=document.all&&!document.addEventListener,m.isAndroid=/android/gi.test(e),m.isIOS=/iphone|ipad|ipod/gi.test(e),m.supportsTransition=function(){var e=document.createElement(\"p\").style,t=[\"ms\",\"O\",\"Moz\",\"Webkit\"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+\"Transition\"in e)return!0;return!1}(),m.probablyMobile=m.isAndroid||m.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),g=c(document),m.popupsCache={}},open:function(e){if(!1===e.isObj){m.items=e.items.toArray(),m.index=0;for(var t,n=e.items,o=0;o<n.length;o++)if((t=(t=n[o]).parsed?t.el[0]:t)===e.el[0]){m.index=o;break}}else m.items=Array.isArray(e.items)?e.items:[e.items],m.index=e.index||0;if(!m.isOpen){m.types=[],h=\"\",e.mainEl&&e.mainEl.length?m.ev=e.mainEl.eq(0):m.ev=g,e.key?(m.popupsCache[e.key]||(m.popupsCache[e.key]={}),m.currTemplate=m.popupsCache[e.key]):m.currTemplate={},m.st=c.extend(!0,{},c.magnificPopup.defaults,e),m.fixedContentPos=\"auto\"===m.st.fixedContentPos?!m.probablyMobile:m.st.fixedContentPos,m.st.modal&&(m.st.closeOnContentClick=!1,m.st.closeOnBgClick=!1,m.st.showCloseBtn=!1,m.st.enableEscapeKey=!1),m.bgOverlay||(m.bgOverlay=p(\"bg\").on(\"click\"+I,function(){m.close()}),m.wrap=p(\"wrap\").attr(\"tabindex\",-1).on(\"click\"+I,function(e){m._checkIfClose(e.target)&&m.close()}),m.container=p(\"container\",m.wrap)),m.contentContainer=p(\"content\"),m.st.preloader&&(m.preloader=p(\"preloader\",m.container,m.st.tLoading));var i=c.magnificPopup.modules;for(o=0;o<i.length;o++){var r=(r=i[o]).charAt(0).toUpperCase()+r.slice(1);m[\"init\"+r].call(m)}u(\"BeforeOpen\"),m.st.showCloseBtn&&(m.st.closeBtnInside?(d(C,function(e,t,n,o){n.close_replaceWith=f(o.type)}),h+=\" mfp-close-btn-in\"):m.wrap.append(f())),m.st.alignTop&&(h+=\" mfp-align-top\"),m.fixedContentPos?m.wrap.css({overflow:m.st.overflowY,overflowX:\"hidden\",overflowY:m.st.overflowY}):m.wrap.css({top:_.scrollTop(),position:\"absolute\"}),!1!==m.st.fixedBgPos&&(\"auto\"!==m.st.fixedBgPos||m.fixedContentPos)||m.bgOverlay.css({height:g.height(),position:\"absolute\"}),m.st.enableEscapeKey&&g.on(\"keyup\"+I,function(e){27===e.keyCode&&m.close()}),_.on(\"resize\"+I,function(){m.updateSize()}),m.st.closeOnContentClick||(h+=\" mfp-auto-cursor\"),h&&m.wrap.addClass(h);var a=m.wH=_.height(),s={},l=(m.fixedContentPos&&m._hasScrollBar(a)&&(l=m._getScrollbarSize())&&(s.marginRight=l),m.fixedContentPos&&(m.isIE7?c(\"body, html\").css(\"overflow\",\"hidden\"):s.overflow=\"hidden\"),m.st.mainClass);return m.isIE7&&(l+=\" mfp-ie7\"),l&&m._addClassToMFP(l),m.updateItemHTML(),u(\"BuildControls\"),c(\"html\").css(s),m.bgOverlay.add(m.wrap).prependTo(m.st.prependTo||c(document.body)),m._lastFocusedEl=document.activeElement,setTimeout(function(){m.content?(m._addClassToMFP(T),m._setFocus()):m.bgOverlay.addClass(T),g.on(\"focusin\"+I,m._onFocusIn)},16),m.isOpen=!0,m.updateSize(a),u(b),e}m.updateItemHTML()},close:function(){m.isOpen&&(u(F),m.isOpen=!1,m.st.removalDelay&&!m.isLowIE&&m.supportsTransition?(m._addClassToMFP(N),setTimeout(function(){m._close()},m.st.removalDelay)):m._close())},_close:function(){u(w);var e=N+\" \"+T+\" \";m.bgOverlay.detach(),m.wrap.detach(),m.container.empty(),m.st.mainClass&&(e+=m.st.mainClass+\" \"),m._removeClassFromMFP(e),m.fixedContentPos&&(e={marginRight:\"\"},m.isIE7?c(\"body, html\").css(\"overflow\",\"\"):e.overflow=\"\",c(\"html\").css(e)),g.off(\"keyup.mfp focusin\"+I),m.ev.off(I),m.wrap.attr(\"class\",\"mfp-wrap\").removeAttr(\"style\"),m.bgOverlay.attr(\"class\",\"mfp-bg\"),m.container.attr(\"class\",\"mfp-container\"),!m.st.showCloseBtn||m.st.closeBtnInside&&!0!==m.currTemplate[m.currItem.type]||m.currTemplate.closeBtn&&m.currTemplate.closeBtn.detach(),m.st.autoFocusLast&&m._lastFocusedEl&&c(m._lastFocusedEl).trigger(\"focus\"),m.currItem=null,m.content=null,m.currTemplate=null,m.prevHeight=0,u(\"AfterClose\")},updateSize:function(e){var t;m.isIOS?(t=document.documentElement.clientWidth/window.innerWidth,t=window.innerHeight*t,m.wrap.css(\"height\",t),m.wH=t):m.wH=e||_.height(),m.fixedContentPos||m.wrap.css(\"height\",m.wH),u(\"Resize\")},updateItemHTML:function(){var e=m.items[m.index],t=(m.contentContainer.detach(),m.content&&m.content.detach(),(e=e.parsed?e:m.parseEl(m.index)).type),n=(u(\"BeforeChange\",[m.currItem?m.currItem.type:\"\",t]),m.currItem=e,m.currTemplate[t]||(n=!!m.st[t]&&m.st[t].markup,u(\"FirstMarkupParse\",n),m.currTemplate[t]=!n||c(n)),s&&s!==e.type&&m.container.removeClass(\"mfp-\"+s+\"-holder\"),m[\"get\"+t.charAt(0).toUpperCase()+t.slice(1)](e,m.currTemplate[t]));m.appendContent(n,t),e.preloaded=!0,u(j,e),s=e.type,m.container.prepend(m.contentContainer),u(\"AfterChange\")},appendContent:function(e,t){(m.content=e)?m.st.showCloseBtn&&m.st.closeBtnInside&&!0===m.currTemplate[t]?m.content.find(\".mfp-close\").length||m.content.append(f()):m.content=e:m.content=\"\",u(\"BeforeAppend\"),m.container.addClass(\"mfp-\"+t+\"-holder\"),m.contentContainer.append(m.content)},parseEl:function(e){var t,n=m.items[e];if((n=n.tagName?{el:c(n)}:(t=n.type,{data:n,src:n.src})).el){for(var o=m.types,i=0;i<o.length;i++)if(n.el.hasClass(\"mfp-\"+o[i])){t=o[i];break}n.src=n.el.attr(\"data-mfp-src\"),n.src||(n.src=n.el.attr(\"href\"))}return n.type=t||m.st.type||\"inline\",n.index=e,n.parsed=!0,m.items[e]=n,u(\"ElementParse\",n),m.items[e]},addGroup:function(t,n){function e(e){e.mfpEl=this,m._openClick(e,t,n)}var o=\"click.magnificPopup\";(n=n||{}).mainEl=t,n.items?(n.isObj=!0,t.off(o).on(o,e)):(n.isObj=!1,n.delegate?t.off(o).on(o,n.delegate,e):(n.items=t).off(o).on(o,e))},_openClick:function(e,t,n){var o=(void 0!==n.midClick?n:c.magnificPopup.defaults).midClick;if(o||!(2===e.which||e.ctrlKey||e.metaKey||e.altKey||e.shiftKey)){o=(void 0!==n.disableOn?n:c.magnificPopup.defaults).disableOn;if(o)if(\"function\"==typeof o){if(!o.call(m))return!0}else if(_.width()<o)return!0;e.type&&(e.preventDefault(),m.isOpen)&&e.stopPropagation(),n.el=c(e.mfpEl),n.delegate&&(n.items=t.find(n.delegate)),m.open(n)}},updateStatus:function(e,t){var n;m.preloader&&(o!==e&&m.container.removeClass(\"mfp-s-\"+o),n={status:e,text:t=t||\"loading\"!==e?t:m.st.tLoading},u(\"UpdateStatus\",n),e=n.status,t=n.text,m.st.allowHTMLInStatusIndicator?m.preloader.html(t):m.preloader.text(t),m.preloader.find(\"a\").on(\"click\",function(e){e.stopImmediatePropagation()}),m.container.addClass(\"mfp-s-\"+e),o=e)},_checkIfClose:function(e){if(!c(e).closest(\".\"+k).length){var t=m.st.closeOnContentClick,n=m.st.closeOnBgClick;if(t&&n)return!0;if(!m.content||c(e).closest(\".mfp-close\").length||m.preloader&&e===m.preloader[0])return!0;if(e===m.content[0]||c.contains(m.content[0],e)){if(t)return!0}else if(n&&c.contains(document,e))return!0;return!1}},_addClassToMFP:function(e){m.bgOverlay.addClass(e),m.wrap.addClass(e)},_removeClassFromMFP:function(e){this.bgOverlay.removeClass(e),m.wrap.removeClass(e)},_hasScrollBar:function(e){return(m.isIE7?g.height():document.body.scrollHeight)>(e||_.height())},_setFocus:function(){(m.st.focus?m.content.find(m.st.focus).eq(0):m.wrap).trigger(\"focus\")},_onFocusIn:function(e){if(e.target!==m.wrap[0]&&!c.contains(m.wrap[0],e.target))return m._setFocus(),!1},_parseMarkup:function(i,e,t){var r;t.data&&(e=c.extend(t.data,e)),u(C,[i,e,t]),c.each(e,function(e,t){if(void 0===t||!1===t)return!0;var n,o;1<(r=e.split(\"_\")).length?0<(n=i.find(I+\"-\"+r[0])).length&&(\"replaceWith\"===(o=r[1])?n[0]!==t[0]&&n.replaceWith(t):\"img\"===o?n.is(\"img\")?n.attr(\"src\",t):n.replaceWith(c(\"<img>\").attr(\"src\",t).attr(\"class\",n.attr(\"class\"))):n.attr(r[1],t)):m.st.allowHTMLInTemplate?i.find(I+\"-\"+e).html(t):i.find(I+\"-\"+e).text(t)})},_getScrollbarSize:function(){var e;return void 0===m.scrollbarSize&&((e=document.createElement(\"div\")).style.cssText=\"width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;\",document.body.appendChild(e),m.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),m.scrollbarSize}},modules:[],open:function(e,t){return r(),(e=e?c.extend(!0,{},e):{}).isObj=!0,e.index=t||0,this.instance.open(e)},close:function(){return c.magnificPopup.instance&&c.magnificPopup.instance.close()},registerModule:function(e,t){t.options&&(c.magnificPopup.defaults[e]=t.options),c.extend(this.proto,t.proto),this.modules.push(e)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:\"\",preloader:!0,focus:\"\",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:\"auto\",fixedBgPos:\"auto\",overflowY:\"auto\",closeMarkup:'<button title=\"%title%\" type=\"button\" class=\"mfp-close\">&#215;</button>',tClose:\"Close (Esc)\",tLoading:\"Loading...\",autoFocusLast:!0,allowHTMLInStatusIndicator:!1,allowHTMLInTemplate:!1}},c.fn.magnificPopup=function(e){r();var t,n,o,i=c(this);return\"string\"==typeof e?\"open\"===e?(t=P?i.data(\"magnificPopup\"):i[0].magnificPopup,n=parseInt(arguments[1],10)||0,o=t.items?t.items[n]:(o=i,(o=t.delegate?o.find(t.delegate):o).eq(n)),m._openClick({mfpEl:o},i,t)):m.isOpen&&m[e].apply(m,Array.prototype.slice.call(arguments,1)):(e=c.extend(!0,{},e),P?i.data(\"magnificPopup\",e):i[0].magnificPopup=e,m.addGroup(i,e)),i},\"inline\"),E=(c.magnificPopup.registerModule(S,{options:{hiddenClass:\"hide\",markup:\"\",tNotFound:\"Content not found\"},proto:{initInline:function(){m.types.push(S),d(w+\".\"+S,function(){a()})},getInline:function(e,t){var n,o,i;return a(),e.src?(n=m.st.inline,(o=c(e.src)).length?((i=o[0].parentNode)&&i.tagName&&(v||(l=n.hiddenClass,v=p(l),l=\"mfp-\"+l),y=o.after(v).detach().removeClass(l)),m.updateStatus(\"ready\")):(m.updateStatus(\"error\",n.tNotFound),o=c(\"<div>\")),e.inlineElement=o):(m.updateStatus(\"ready\"),m._parseMarkup(t,{},e),t)}}}),\"ajax\");c.magnificPopup.registerModule(E,{options:{settings:null,cursor:\"mfp-ajax-cur\",tError:\"The content could not be loaded.\"},proto:{initAjax:function(){m.types.push(E),n=m.st.ajax.cursor,d(w+\".\"+E,t),d(\"BeforeChange.\"+E,t)},getAjax:function(o){n&&c(document.body).addClass(n),m.updateStatus(\"loading\");var e=c.extend({url:o.src,success:function(e,t,n){e={data:e,xhr:n};u(\"ParseAjax\",e),m.appendContent(c(e.data),E),o.finished=!0,i(),m._setFocus(),setTimeout(function(){m.wrap.addClass(T)},16),m.updateStatus(\"ready\"),u(\"AjaxContentAdded\")},error:function(){i(),o.finished=o.loadError=!0,m.updateStatus(\"error\",m.st.ajax.tError.replace(\"%url%\",o.src))}},m.st.ajax.settings);return m.req=c.ajax(e),\"\"}}});var z;c.magnificPopup.registerModule(\"image\",{options:{markup:'<div class=\"mfp-figure\"><div class=\"mfp-close\"></div><figure><div class=\"mfp-img\"></div><figcaption><div class=\"mfp-bottom-bar\"><div class=\"mfp-title\"></div><div class=\"mfp-counter\"></div></div></figcaption></figure></div>',cursor:\"mfp-zoom-out-cur\",titleSrc:\"title\",verticalFit:!0,tError:\"The image could not be loaded.\"},proto:{initImage:function(){var e=m.st.image,t=\".image\";m.types.push(\"image\"),d(b+t,function(){\"image\"===m.currItem.type&&e.cursor&&c(document.body).addClass(e.cursor)}),d(w+t,function(){e.cursor&&c(document.body).removeClass(e.cursor),_.off(\"resize\"+I)}),d(\"Resize\"+t,m.resizeImage),m.isLowIE&&d(\"AfterChange\",m.resizeImage)},resizeImage:function(){var e,t=m.currItem;t&&t.img&&m.st.image.verticalFit&&(e=0,m.isLowIE&&(e=parseInt(t.img.css(\"padding-top\"),10)+parseInt(t.img.css(\"padding-bottom\"),10)),t.img.css(\"max-height\",m.wH-e))},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,z&&clearInterval(z),e.isCheckingImgSize=!1,u(\"ImageHasSize\",e),e.imgHidden)&&(m.content&&m.content.removeClass(\"mfp-loading\"),e.imgHidden=!1)},findImageSize:function(t){function n(e){z&&clearInterval(z),z=setInterval(function(){0<i.naturalWidth?m._onImageHasSize(t):(200<o&&clearInterval(z),3===++o?n(10):40===o?n(50):100===o&&n(500))},e)}var o=0,i=t.img[0];n(1)},getImage:function(e,t){function n(){e&&(e.img.off(\".mfploader\"),e===m.currItem&&(m._onImageHasSize(e),m.updateStatus(\"error\",a.tError.replace(\"%url%\",e.src))),e.hasSize=!0,e.loaded=!0,e.loadError=!0)}function o(){e&&(e.img[0].complete?(e.img.off(\".mfploader\"),e===m.currItem&&(m._onImageHasSize(e),m.updateStatus(\"ready\")),e.hasSize=!0,e.loaded=!0,u(\"ImageLoadComplete\")):++r<200?setTimeout(o,100):n())}var i,r=0,a=m.st.image,s=t.find(\".mfp-img\");return s.length&&((i=document.createElement(\"img\")).className=\"mfp-img\",e.el&&e.el.find(\"img\").length&&(i.alt=e.el.find(\"img\").attr(\"alt\")),e.img=c(i).on(\"load.mfploader\",o).on(\"error.mfploader\",n),i.src=e.src,s.is(\"img\")&&(e.img=e.img.clone()),0<(i=e.img[0]).naturalWidth?e.hasSize=!0:i.width||(e.hasSize=!1)),m._parseMarkup(t,{title:function(e){if(e.data&&void 0!==e.data.title)return e.data.title;var t=m.st.image.titleSrc;if(t){if(\"function\"==typeof t)return t.call(m,e);if(e.el)return e.el.attr(t)||\"\"}return\"\"}(e),img_replaceWith:e.img},e),m.resizeImage(),e.hasSize?(z&&clearInterval(z),e.loadError?(t.addClass(\"mfp-loading\"),m.updateStatus(\"error\",a.tError.replace(\"%url%\",e.src))):(t.removeClass(\"mfp-loading\"),m.updateStatus(\"ready\"))):(m.updateStatus(\"loading\"),e.loading=!0,e.hasSize||(e.imgHidden=!0,t.addClass(\"mfp-loading\"),m.findImageSize(e))),t}}});function O(e){var t;m.currTemplate[L]&&(t=m.currTemplate[L].find(\"iframe\")).length&&(e||(t[0].src=\"//about:blank\"),m.isIE8)&&t.css(\"display\",e?\"block\":\"none\")}function M(e){var t=m.items.length;return t-1<e?e-t:e<0?t+e:e}function D(e,t,n){return e.replace(/%curr%/gi,t+1).replace(/%total%/gi,n)}c.magnificPopup.registerModule(\"zoom\",{options:{enabled:!1,easing:\"ease-in-out\",duration:300,opener:function(e){return e.is(\"img\")?e:e.find(\"img\")}},proto:{initZoom:function(){var e,t,n,o,i,r,a=m.st.zoom,s=\".zoom\";a.enabled&&m.supportsTransition&&(t=a.duration,n=function(e){var e=e.clone().removeAttr(\"style\").removeAttr(\"class\").addClass(\"mfp-animated-image\"),t=\"all \"+a.duration/1e3+\"s \"+a.easing,n={position:\"fixed\",zIndex:9999,left:0,top:0,\"-webkit-backface-visibility\":\"hidden\"},o=\"transition\";return n[\"-webkit-\"+o]=n[\"-moz-\"+o]=n[\"-o-\"+o]=n[o]=t,e.css(n),e},o=function(){m.content.css(\"visibility\",\"visible\")},d(\"BuildControls\"+s,function(){m._allowZoom()&&(clearTimeout(i),m.content.css(\"visibility\",\"hidden\"),(e=m._getItemToZoom())?((r=n(e)).css(m._getOffset()),m.wrap.append(r),i=setTimeout(function(){r.css(m._getOffset(!0)),i=setTimeout(function(){o(),setTimeout(function(){r.remove(),e=r=null,u(\"ZoomAnimationEnded\")},16)},t)},16)):o())}),d(F+s,function(){if(m._allowZoom()){if(clearTimeout(i),m.st.removalDelay=t,!e){if(!(e=m._getItemToZoom()))return;r=n(e)}r.css(m._getOffset(!0)),m.wrap.append(r),m.content.css(\"visibility\",\"hidden\"),setTimeout(function(){r.css(m._getOffset())},16)}}),d(w+s,function(){m._allowZoom()&&(o(),r&&r.remove(),e=null)}))},_allowZoom:function(){return\"image\"===m.currItem.type},_getItemToZoom:function(){return!!m.currItem.hasSize&&m.currItem.img},_getOffset:function(e){var e=e?m.currItem.img:m.st.zoom.opener(m.currItem.el||m.currItem),t=e.offset(),n=parseInt(e.css(\"padding-top\"),10),o=parseInt(e.css(\"padding-bottom\"),10),e=(t.top-=c(window).scrollTop()-n,{width:e.width(),height:(P?e.innerHeight():e[0].offsetHeight)-o-n});return(B=void 0===B?void 0!==document.createElement(\"p\").style.MozTransform:B)?e[\"-moz-transform\"]=e.transform=\"translate(\"+t.left+\"px,\"+t.top+\"px)\":(e.left=t.left,e.top=t.top),e}}});var B,L=\"iframe\",H=(c.magnificPopup.registerModule(L,{options:{markup:'<div class=\"mfp-iframe-scaler\"><div class=\"mfp-close\"></div><iframe class=\"mfp-iframe\" src=\"//about:blank\" frameborder=\"0\" allowfullscreen></iframe></div>',srcAction:\"iframe_src\",patterns:{youtube:{index:\"youtube.com\",id:\"v=\",src:\"//www.youtube.com/embed/%id%?autoplay=1\"},vimeo:{index:\"vimeo.com/\",id:\"/\",src:\"//player.vimeo.com/video/%id%?autoplay=1\"},gmaps:{index:\"//maps.google.\",src:\"%id%&output=embed\"}}},proto:{initIframe:function(){m.types.push(L),d(\"BeforeChange\",function(e,t,n){t!==n&&(t===L?O():n===L&&O(!0))}),d(w+\".\"+L,function(){O()})},getIframe:function(e,t){var n=e.src,o=m.st.iframe,i=(c.each(o.patterns,function(){if(-1<n.indexOf(this.index))return this.id&&(n=\"string\"==typeof this.id?n.substr(n.lastIndexOf(this.id)+this.id.length,n.length):this.id.call(this,n)),n=this.src.replace(\"%id%\",n),!1}),{});return o.srcAction&&(i[o.srcAction]=n),m._parseMarkup(t,i,e),m.updateStatus(\"ready\"),t}}}),c.magnificPopup.registerModule(\"gallery\",{options:{enabled:!1,arrowMarkup:'<button title=\"%title%\" type=\"button\" class=\"mfp-arrow mfp-arrow-%dir%\"></button>',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:\"Previous (Left arrow key)\",tNext:\"Next (Right arrow key)\",tCounter:\"%curr% of %total%\",langDir:null,loop:!0},proto:{initGallery:function(){var r=m.st.gallery,e=\".mfp-gallery\";if(m.direction=!0,!r||!r.enabled)return!1;r.langDir||(r.langDir=document.dir||\"ltr\"),h+=\" mfp-gallery\",d(b+e,function(){r.navigateByImgClick&&m.wrap.on(\"click\"+e,\".mfp-img\",function(){if(1<m.items.length)return m.next(),!1}),g.on(\"keydown\"+e,function(e){37===e.keyCode?\"rtl\"===r.langDir?m.next():m.prev():39===e.keyCode&&(\"rtl\"===r.langDir?m.prev():m.next())}),m.updateGalleryButtons()}),d(\"UpdateStatus\"+e,function(){m.updateGalleryButtons()}),d(\"UpdateStatus\"+e,function(e,t){t.text&&(t.text=D(t.text,m.currItem.index,m.items.length))}),d(C+e,function(e,t,n,o){var i=m.items.length;n.counter=1<i?D(r.tCounter,o.index,i):\"\"}),d(\"BuildControls\"+e,function(){var e,t,n,o,i;1<m.items.length&&r.arrows&&!m.arrowLeft&&(t=\"rtl\"===r.langDir?(o=r.tNext,e=r.tPrev,i=\"next\",\"prev\"):(o=r.tPrev,e=r.tNext,i=\"prev\",\"next\"),n=r.arrowMarkup,o=m.arrowLeft=c(n.replace(/%title%/gi,o).replace(/%action%/gi,i).replace(/%dir%/gi,\"left\")).addClass(k),i=m.arrowRight=c(n.replace(/%title%/gi,e).replace(/%action%/gi,t).replace(/%dir%/gi,\"right\")).addClass(k),\"rtl\"===r.langDir?(m.arrowNext=o,m.arrowPrev=i):(m.arrowNext=i,m.arrowPrev=o),o.on(\"click\",function(){\"rtl\"===r.langDir?m.next():m.prev()}),i.on(\"click\",function(){\"rtl\"===r.langDir?m.prev():m.next()}),m.container.append(o.add(i)))}),d(j+e,function(){m._preloadTimeout&&clearTimeout(m._preloadTimeout),m._preloadTimeout=setTimeout(function(){m.preloadNearbyImages(),m._preloadTimeout=null},16)}),d(w+e,function(){g.off(e),m.wrap.off(\"click\"+e),m.arrowRight=m.arrowLeft=null})},next:function(){var e=M(m.index+1);if(!m.st.gallery.loop&&0===e)return!1;m.direction=!0,m.index=e,m.updateItemHTML()},prev:function(){var e=m.index-1;if(!m.st.gallery.loop&&e<0)return!1;m.direction=!1,m.index=M(e),m.updateItemHTML()},goTo:function(e){m.direction=e>=m.index,m.index=e,m.updateItemHTML()},preloadNearbyImages:function(){for(var e=m.st.gallery.preload,t=Math.min(e[0],m.items.length),n=Math.min(e[1],m.items.length),o=1;o<=(m.direction?n:t);o++)m._preloadItem(m.index+o);for(o=1;o<=(m.direction?t:n);o++)m._preloadItem(m.index-o)},_preloadItem:function(e){var t;e=M(e),m.items[e].preloaded||((t=m.items[e]).parsed||(t=m.parseEl(e)),u(\"LazyLoad\",t),\"image\"===t.type&&(t.img=c('<img class=\"mfp-img\" />').on(\"load.mfploader\",function(){t.hasSize=!0}).on(\"error.mfploader\",function(){t.hasSize=!0,t.loadError=!0,u(\"LazyLoadError\",t)}).attr(\"src\",t.src)),t.preloaded=!0)},updateGalleryButtons:function(){m.st.gallery.loop||\"object\"!=typeof m.arrowPrev||null===m.arrowPrev||(0===m.index?m.arrowPrev.hide():m.arrowPrev.show(),m.index===m.items.length-1?m.arrowNext.hide():m.arrowNext.show())}}}),\"retina\");c.magnificPopup.registerModule(H,{options:{replaceSrc:function(e){return e.src.replace(/\\.\\w+$/,function(e){return\"@2x\"+e})},ratio:1},proto:{initRetina:function(){var n,o;1<window.devicePixelRatio&&(n=m.st.retina,o=n.ratio,1<(o=isNaN(o)?o():o))&&(d(\"ImageHasSize.\"+H,function(e,t){t.img.css({\"max-width\":t.img[0].naturalWidth/o,width:\"100%\"})}),d(\"ElementParse.\"+H,function(e,t){t.src=n.replaceSrc(t,o)}))}}}),r()});\nif (typeof SVG_DEFAULT_PATH == \"undefined\") {\n    var SVG_DEFAULT_PATH = '/images/svg-symbols.svg';\n}\nif (typeof SVG_DEFAULT_PREFIX == \"undefined\") {\n    var SVG_DEFAULT_PREFIX = 'icon';\n}\nfunction Svg() {\n\n    this.imagePath = SVG_DEFAULT_PATH;\n\n    this.imageClassPrefix = SVG_DEFAULT_PREFIX;\n\n    this.setImagePath = function(path) {\n        if (path) {\n            this.imagePath = path;\n        }\n    }\n\n    this.setImageClassPrefix = function(prefix) {\n        if (prefix) {\n            this.imageClassPrefix = prefix;\n        }\n    }\n\n    this.render = function(icon) {\n        return '<svg role=\"img\" class=\"' + this.imageClassPrefix + '-' + this.prepare(icon) + '\">' +\n                        '<use xlink:href=\"' + this.imagePath + '#icon-' + this.prepare(icon) + '\"></use>' +\n                    '</svg>'\n    }\n\n    this.prepare = function(icon) {\n        return icon.replace('icon-', '');\n    }\n}\n\nSVG_DEFAULT_PATH = AndrewMartin.svgSymbolsFile;\n\n\n(function(factory) {\r\n\n  if (typeof define === \"function\" && define.amd) {\r\n\n    // AMD. Register as an anonymous module.\r\n\n    define([], factory);\r\n\n  } else if (typeof exports === \"object\") {\r\n\n    // Node/CommonJS\r\n\n    module.exports = factory();\r\n\n  } else {\r\n\n    // Browser globals\r\n\n    window.wNumb = factory();\r\n\n  }\r\n\n})(function() {\r\n\n  \"use strict\";\r\n\n\r\n\n  var FormatOptions = [\r\n\n    \"decimals\",\r\n\n    \"thousand\",\r\n\n    \"mark\",\r\n\n    \"prefix\",\r\n\n    \"suffix\",\r\n\n    \"encoder\",\r\n\n    \"decoder\",\r\n\n    \"negativeBefore\",\r\n\n    \"negative\",\r\n\n    \"edit\",\r\n\n    \"undo\"\r\n\n  ];\r\n\n\r\n\n  // General\r\n\n\r\n\n  // Reverse a string\r\n\n  function strReverse(a) {\r\n\n    return a\r\n\n      .split(\"\")\r\n\n      .reverse()\r\n\n      .join(\"\");\r\n\n  }\r\n\n\r\n\n  // Check if a string starts with a specified prefix.\r\n\n  function strStartsWith(input, match) {\r\n\n    return input.substring(0, match.length) === match;\r\n\n  }\r\n\n\r\n\n  // Check is a string ends in a specified suffix.\r\n\n  function strEndsWith(input, match) {\r\n\n    return input.slice(-1 * match.length) === match;\r\n\n  }\r\n\n\r\n\n  // Throw an error if formatting options are incompatible.\r\n\n  function throwEqualError(F, a, b) {\r\n\n    if ((F[a] || F[b]) && F[a] === F[b]) {\r\n\n      throw new Error(a);\r\n\n    }\r\n\n  }\r\n\n\r\n\n  // Check if a number is finite and not NaN\r\n\n  function isValidNumber(input) {\r\n\n    return typeof input === \"number\" && isFinite(input);\r\n\n  }\r\n\n\r\n\n  // Provide rounding-accurate toFixed method.\r\n\n  // Borrowed: http://stackoverflow.com/a/21323330/775265\r\n\n  function toFixed(value, exp) {\r\n\n    value = value.toString().split(\"e\");\r\n\n    value = Math.round(+(value[0] + \"e\" + (value[1] ? +value[1] + exp : exp)));\r\n\n    value = value.toString().split(\"e\");\r\n\n    return (+(value[0] + \"e\" + (value[1] ? +value[1] - exp : -exp))).toFixed(exp);\r\n\n  }\r\n\n\r\n\n  // Formatting\r\n\n\r\n\n  // Accept a number as input, output formatted string.\r\n\n  function formatTo(\r\n\n    decimals,\r\n\n    thousand,\r\n\n    mark,\r\n\n    prefix,\r\n\n    suffix,\r\n\n    encoder,\r\n\n    decoder,\r\n\n    negativeBefore,\r\n\n    negative,\r\n\n    edit,\r\n\n    undo,\r\n\n    input\r\n\n  ) {\r\n\n    var originalInput = input,\r\n\n      inputIsNegative,\r\n\n      inputPieces,\r\n\n      inputBase,\r\n\n      inputDecimals = \"\",\r\n\n      output = \"\";\r\n\n\r\n\n    // Apply user encoder to the input.\r\n\n    // Expected outcome: number.\r\n\n    if (encoder) {\r\n\n      input = encoder(input);\r\n\n    }\r\n\n\r\n\n    // Stop if no valid number was provided, the number is infinite or NaN.\r\n\n    if (!isValidNumber(input)) {\r\n\n      return false;\r\n\n    }\r\n\n\r\n\n    // Rounding away decimals might cause a value of -0\r\n\n    // when using very small ranges. Remove those cases.\r\n\n    if (decimals !== false && parseFloat(input.toFixed(decimals)) === 0) {\r\n\n      input = 0;\r\n\n    }\r\n\n\r\n\n    // Formatting is done on absolute numbers,\r\n\n    // decorated by an optional negative symbol.\r\n\n    if (input < 0) {\r\n\n      inputIsNegative = true;\r\n\n      input = Math.abs(input);\r\n\n    }\r\n\n\r\n\n    // Reduce the number of decimals to the specified option.\r\n\n    if (decimals !== false) {\r\n\n      input = toFixed(input, decimals);\r\n\n    }\r\n\n\r\n\n    // Transform the number into a string, so it can be split.\r\n\n    input = input.toString();\r\n\n\r\n\n    // Break the number on the decimal separator.\r\n\n    if (input.indexOf(\".\") !== -1) {\r\n\n      inputPieces = input.split(\".\");\r\n\n\r\n\n      inputBase = inputPieces[0];\r\n\n\r\n\n      if (mark) {\r\n\n        inputDecimals = mark + inputPieces[1];\r\n\n      }\r\n\n    } else {\r\n\n      // If it isn't split, the entire number will do.\r\n\n      inputBase = input;\r\n\n    }\r\n\n\r\n\n    // Group numbers in sets of three.\r\n\n    if (thousand) {\r\n\n      inputBase = strReverse(inputBase).match(/.{1,3}/g);\r\n\n      inputBase = strReverse(inputBase.join(strReverse(thousand)));\r\n\n    }\r\n\n\r\n\n    // If the number is negative, prefix with negation symbol.\r\n\n    if (inputIsNegative && negativeBefore) {\r\n\n      output += negativeBefore;\r\n\n    }\r\n\n\r\n\n    // Prefix the number\r\n\n    if (prefix) {\r\n\n      output += prefix;\r\n\n    }\r\n\n\r\n\n    // Normal negative option comes after the prefix. Defaults to '-'.\r\n\n    if (inputIsNegative && negative) {\r\n\n      output += negative;\r\n\n    }\r\n\n\r\n\n    // Append the actual number.\r\n\n    output += inputBase;\r\n\n    output += inputDecimals;\r\n\n\r\n\n    // Apply the suffix.\r\n\n    if (suffix) {\r\n\n      output += suffix;\r\n\n    }\r\n\n\r\n\n    // Run the output through a user-specified post-formatter.\r\n\n    if (edit) {\r\n\n      output = edit(output, originalInput);\r\n\n    }\r\n\n\r\n\n    // All done.\r\n\n    return output;\r\n\n  }\r\n\n\r\n\n  // Accept a sting as input, output decoded number.\r\n\n  function formatFrom(\r\n\n    decimals,\r\n\n    thousand,\r\n\n    mark,\r\n\n    prefix,\r\n\n    suffix,\r\n\n    encoder,\r\n\n    decoder,\r\n\n    negativeBefore,\r\n\n    negative,\r\n\n    edit,\r\n\n    undo,\r\n\n    input\r\n\n  ) {\r\n\n    var originalInput = input,\r\n\n      inputIsNegative,\r\n\n      output = \"\";\r\n\n\r\n\n    // User defined pre-decoder. Result must be a non empty string.\r\n\n    if (undo) {\r\n\n      input = undo(input);\r\n\n    }\r\n\n\r\n\n    // Test the input. Can't be empty.\r\n\n    if (!input || typeof input !== \"string\") {\r\n\n      return false;\r\n\n    }\r\n\n\r\n\n    // If the string starts with the negativeBefore value: remove it.\r\n\n    // Remember is was there, the number is negative.\r\n\n    if (negativeBefore && strStartsWith(input, negativeBefore)) {\r\n\n      input = input.replace(negativeBefore, \"\");\r\n\n      inputIsNegative = true;\r\n\n    }\r\n\n\r\n\n    // Repeat the same procedure for the prefix.\r\n\n    if (prefix && strStartsWith(input, prefix)) {\r\n\n      input = input.replace(prefix, \"\");\r\n\n    }\r\n\n\r\n\n    // And again for negative.\r\n\n    if (negative && strStartsWith(input, negative)) {\r\n\n      input = input.replace(negative, \"\");\r\n\n      inputIsNegative = true;\r\n\n    }\r\n\n\r\n\n    // Remove the suffix.\r\n\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice\r\n\n    if (suffix && strEndsWith(input, suffix)) {\r\n\n      input = input.slice(0, -1 * suffix.length);\r\n\n    }\r\n\n\r\n\n    // Remove the thousand grouping.\r\n\n    if (thousand) {\r\n\n      input = input.split(thousand).join(\"\");\r\n\n    }\r\n\n\r\n\n    // Set the decimal separator back to period.\r\n\n    if (mark) {\r\n\n      input = input.replace(mark, \".\");\r\n\n    }\r\n\n\r\n\n    // Prepend the negative symbol.\r\n\n    if (inputIsNegative) {\r\n\n      output += \"-\";\r\n\n    }\r\n\n\r\n\n    // Add the number\r\n\n    output += input;\r\n\n\r\n\n    // Trim all non-numeric characters (allow '.' and '-');\r\n\n    output = output.replace(/[^0-9\\.\\-.]/g, \"\");\r\n\n\r\n\n    // The value contains no parse-able number.\r\n\n    if (output === \"\") {\r\n\n      return false;\r\n\n    }\r\n\n\r\n\n    // Covert to number.\r\n\n    output = Number(output);\r\n\n\r\n\n    // Run the user-specified post-decoder.\r\n\n    if (decoder) {\r\n\n      output = decoder(output);\r\n\n    }\r\n\n\r\n\n    // Check is the output is valid, otherwise: return false.\r\n\n    if (!isValidNumber(output)) {\r\n\n      return false;\r\n\n    }\r\n\n\r\n\n    return output;\r\n\n  }\r\n\n\r\n\n  // Framework\r\n\n\r\n\n  // Validate formatting options\r\n\n  function validate(inputOptions) {\r\n\n    var i,\r\n\n      optionName,\r\n\n      optionValue,\r\n\n      filteredOptions = {};\r\n\n\r\n\n    if (inputOptions[\"suffix\"] === undefined) {\r\n\n      inputOptions[\"suffix\"] = inputOptions[\"postfix\"];\r\n\n    }\r\n\n\r\n\n    for (i = 0; i < FormatOptions.length; i += 1) {\r\n\n      optionName = FormatOptions[i];\r\n\n      optionValue = inputOptions[optionName];\r\n\n\r\n\n      if (optionValue === undefined) {\r\n\n        // Only default if negativeBefore isn't set.\r\n\n        if (optionName === \"negative\" && !filteredOptions.negativeBefore) {\r\n\n          filteredOptions[optionName] = \"-\";\r\n\n          // Don't set a default for mark when 'thousand' is set.\r\n\n        } else if (optionName === \"mark\" && filteredOptions.thousand !== \".\") {\r\n\n          filteredOptions[optionName] = \".\";\r\n\n        } else {\r\n\n          filteredOptions[optionName] = false;\r\n\n        }\r\n\n\r\n\n        // Floating points in JS are stable up to 7 decimals.\r\n\n      } else if (optionName === \"decimals\") {\r\n\n        if (optionValue >= 0 && optionValue < 8) {\r\n\n          filteredOptions[optionName] = optionValue;\r\n\n        } else {\r\n\n          throw new Error(optionName);\r\n\n        }\r\n\n\r\n\n        // These options, when provided, must be functions.\r\n\n      } else if (\r\n\n        optionName === \"encoder\" ||\r\n\n        optionName === \"decoder\" ||\r\n\n        optionName === \"edit\" ||\r\n\n        optionName === \"undo\"\r\n\n      ) {\r\n\n        if (typeof optionValue === \"function\") {\r\n\n          filteredOptions[optionName] = optionValue;\r\n\n        } else {\r\n\n          throw new Error(optionName);\r\n\n        }\r\n\n\r\n\n        // Other options are strings.\r\n\n      } else {\r\n\n        if (typeof optionValue === \"string\") {\r\n\n          filteredOptions[optionName] = optionValue;\r\n\n        } else {\r\n\n          throw new Error(optionName);\r\n\n        }\r\n\n      }\r\n\n    }\r\n\n\r\n\n    // Some values can't be extracted from a\r\n\n    // string if certain combinations are present.\r\n\n    throwEqualError(filteredOptions, \"mark\", \"thousand\");\r\n\n    throwEqualError(filteredOptions, \"prefix\", \"negative\");\r\n\n    throwEqualError(filteredOptions, \"prefix\", \"negativeBefore\");\r\n\n\r\n\n    return filteredOptions;\r\n\n  }\r\n\n\r\n\n  // Pass all options as function arguments\r\n\n  function passAll(options, method, input) {\r\n\n    var i,\r\n\n      args = [];\r\n\n\r\n\n    // Add all options in order of FormatOptions\r\n\n    for (i = 0; i < FormatOptions.length; i += 1) {\r\n\n      args.push(options[FormatOptions[i]]);\r\n\n    }\r\n\n\r\n\n    // Append the input, then call the method, presenting all\r\n\n    // options as arguments.\r\n\n    args.push(input);\r\n\n    return method.apply(\"\", args);\r\n\n  }\r\n\n\r\n\n  function wNumb(options) {\r\n\n    if (!(this instanceof wNumb)) {\r\n\n      return new wNumb(options);\r\n\n    }\r\n\n\r\n\n    if (typeof options !== \"object\") {\r\n\n      return;\r\n\n    }\r\n\n\r\n\n    options = validate(options);\r\n\n\r\n\n    // Call 'formatTo' with proper arguments.\r\n\n    this.to = function(input) {\r\n\n      return passAll(options, formatTo, input);\r\n\n    };\r\n\n\r\n\n    // Call 'formatFrom' with proper arguments.\r\n\n    this.from = function(input) {\r\n\n      return passAll(options, formatFrom, input);\r\n\n    };\r\n\n  }\r\n\n\r\n\n  return wNumb;\r\n\n});\r\n\n\n/*\n     _ _      _       _\n ___| (_) ___| | __  (_)___\n/ __| | |/ __| |/ /  | / __|\n\\__ \\ | | (__|   < _ | \\__ \\\n|___/_|_|\\___|_|\\_(_)/ |___/\n                   |__/\n\n Version: 1.8.1\n  Author: Ken Wheeler\n Website: http://kenwheeler.github.io\n    Docs: http://kenwheeler.github.io/slick\n    Repo: http://github.com/kenwheeler/slick\n  Issues: http://github.com/kenwheeler/slick/issues\n\n */\n/* global window, document, define, jQuery, setInterval, clearInterval */\n;(function(factory) {\n    'use strict';\n    if (typeof define === 'function' && define.amd) {\n        define(['jquery'], factory);\n    } else if (typeof exports !== 'undefined') {\n        module.exports = factory(require('jquery'));\n    } else {\n        factory(jQuery);\n    }\n\n}(function($) {\n    'use strict';\n    var Slick = window.Slick || {};\n\n    Slick = (function() {\n\n        var instanceUid = 0;\n\n        function Slick(element, settings) {\n\n            var _ = this, dataSettings;\n\n            _.defaults = {\n                accessibility: true,\n                adaptiveHeight: false,\n                appendArrows: $(element),\n                appendDots: $(element),\n                arrows: true,\n                asNavFor: null,\n                prevArrow: '<button class=\"slick-prev\" aria-label=\"Previous\" type=\"button\">Previous</button>',\n                nextArrow: '<button class=\"slick-next\" aria-label=\"Next\" type=\"button\">Next</button>',\n                autoplay: false,\n                autoplaySpeed: 3000,\n                centerMode: false,\n                centerPadding: '50px',\n                cssEase: 'ease',\n                customPaging: function(slider, i) {\n                    return $('<button type=\"button\" />').text(i + 1);\n                },\n                dots: false,\n                dotsClass: 'slick-dots',\n                draggable: true,\n                easing: 'linear',\n                edgeFriction: 0.35,\n                fade: false,\n                focusOnSelect: false,\n                focusOnChange: false,\n                infinite: true,\n                initialSlide: 0,\n                lazyLoad: 'ondemand',\n                mobileFirst: false,\n                pauseOnHover: true,\n                pauseOnFocus: true,\n                pauseOnDotsHover: false,\n                respondTo: 'window',\n                responsive: null,\n                rows: 1,\n                rtl: false,\n                slide: '',\n                slidesPerRow: 1,\n                slidesToShow: 1,\n                slidesToScroll: 1,\n                speed: 500,\n                swipe: true,\n                swipeToSlide: false,\n                touchMove: true,\n                touchThreshold: 5,\n                useCSS: true,\n                useTransform: true,\n                variableWidth: false,\n                vertical: false,\n                verticalSwiping: false,\n                waitForAnimate: true,\n                zIndex: 1000\n            };\n\n            _.initials = {\n                animating: false,\n                dragging: false,\n                autoPlayTimer: null,\n                currentDirection: 0,\n                currentLeft: null,\n                currentSlide: 0,\n                direction: 1,\n                $dots: null,\n                listWidth: null,\n                listHeight: null,\n                loadIndex: 0,\n                $nextArrow: null,\n                $prevArrow: null,\n                scrolling: false,\n                slideCount: null,\n                slideWidth: null,\n                $slideTrack: null,\n                $slides: null,\n                sliding: false,\n                slideOffset: 0,\n                swipeLeft: null,\n                swiping: false,\n                $list: null,\n                touchObject: {},\n                transformsEnabled: false,\n                unslicked: false\n            };\n\n            $.extend(_, _.initials);\n\n            _.activeBreakpoint = null;\n            _.animType = null;\n            _.animProp = null;\n            _.breakpoints = [];\n            _.breakpointSettings = [];\n            _.cssTransitions = false;\n            _.focussed = false;\n            _.interrupted = false;\n            _.hidden = 'hidden';\n            _.paused = true;\n            _.positionProp = null;\n            _.respondTo = null;\n            _.rowCount = 1;\n            _.shouldClick = true;\n            _.$slider = $(element);\n            _.$slidesCache = null;\n            _.transformType = null;\n            _.transitionType = null;\n            _.visibilityChange = 'visibilitychange';\n            _.windowWidth = 0;\n            _.windowTimer = null;\n\n            dataSettings = $(element).data('slick') || {};\n\n            _.options = $.extend({}, _.defaults, settings, dataSettings);\n\n            _.currentSlide = _.options.initialSlide;\n\n            _.originalSettings = _.options;\n\n            if (typeof document.mozHidden !== 'undefined') {\n                _.hidden = 'mozHidden';\n                _.visibilityChange = 'mozvisibilitychange';\n            } else if (typeof document.webkitHidden !== 'undefined') {\n                _.hidden = 'webkitHidden';\n                _.visibilityChange = 'webkitvisibilitychange';\n            }\n\n            _.autoPlay = $.proxy(_.autoPlay, _);\n            _.autoPlayClear = $.proxy(_.autoPlayClear, _);\n            _.autoPlayIterator = $.proxy(_.autoPlayIterator, _);\n            _.changeSlide = $.proxy(_.changeSlide, _);\n            _.clickHandler = $.proxy(_.clickHandler, _);\n            _.selectHandler = $.proxy(_.selectHandler, _);\n            _.setPosition = $.proxy(_.setPosition, _);\n            _.swipeHandler = $.proxy(_.swipeHandler, _);\n            _.dragHandler = $.proxy(_.dragHandler, _);\n            _.keyHandler = $.proxy(_.keyHandler, _);\n\n            _.instanceUid = instanceUid++;\n\n            // A simple way to check for HTML strings\n            // Strict HTML recognition (must start with <)\n            // Extracted from jQuery v1.11 source\n            _.htmlExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*)$/;\n\n\n            _.registerBreakpoints();\n            _.init(true);\n\n        }\n\n        return Slick;\n\n    }());\n\n    Slick.prototype.activateADA = function() {\n        var _ = this;\n\n        _.$slideTrack.find('.slick-active').attr({\n            'aria-hidden': 'false'\n        }).find('a, input, button, select').attr({\n            'tabindex': '0'\n        });\n\n    };\n\n    Slick.prototype.addSlide = Slick.prototype.slickAdd = function(markup, index, addBefore) {\n\n        var _ = this;\n\n        if (typeof(index) === 'boolean') {\n            addBefore = index;\n            index = null;\n        } else if (index < 0 || (index >= _.slideCount)) {\n            return false;\n        }\n\n        _.unload();\n\n        if (typeof(index) === 'number') {\n            if (index === 0 && _.$slides.length === 0) {\n                $(markup).appendTo(_.$slideTrack);\n            } else if (addBefore) {\n                $(markup).insertBefore(_.$slides.eq(index));\n            } else {\n                $(markup).insertAfter(_.$slides.eq(index));\n            }\n        } else {\n            if (addBefore === true) {\n                $(markup).prependTo(_.$slideTrack);\n            } else {\n                $(markup).appendTo(_.$slideTrack);\n            }\n        }\n\n        _.$slides = _.$slideTrack.children(this.options.slide);\n\n        _.$slideTrack.children(this.options.slide).detach();\n\n        _.$slideTrack.append(_.$slides);\n\n        _.$slides.each(function(index, element) {\n            $(element).attr('data-slick-index', index);\n        });\n\n        _.$slidesCache = _.$slides;\n\n        _.reinit();\n\n    };\n\n    Slick.prototype.animateHeight = function() {\n        var _ = this;\n        if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {\n            var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);\n            _.$list.animate({\n                height: targetHeight\n            }, _.options.speed);\n        }\n    };\n\n    Slick.prototype.animateSlide = function(targetLeft, callback) {\n\n        var animProps = {},\n            _ = this;\n\n        _.animateHeight();\n\n        if (_.options.rtl === true && _.options.vertical === false) {\n            targetLeft = -targetLeft;\n        }\n        if (_.transformsEnabled === false) {\n            if (_.options.vertical === false) {\n                _.$slideTrack.animate({\n                    left: targetLeft\n                }, _.options.speed, _.options.easing, callback);\n            } else {\n                _.$slideTrack.animate({\n                    top: targetLeft\n                }, _.options.speed, _.options.easing, callback);\n            }\n\n        } else {\n\n            if (_.cssTransitions === false) {\n                if (_.options.rtl === true) {\n                    _.currentLeft = -(_.currentLeft);\n                }\n                $({\n                    animStart: _.currentLeft\n                }).animate({\n                    animStart: targetLeft\n                }, {\n                    duration: _.options.speed,\n                    easing: _.options.easing,\n                    step: function(now) {\n                        now = Math.ceil(now);\n                        if (_.options.vertical === false) {\n                            animProps[_.animType] = 'translate(' +\n                                now + 'px, 0px)';\n                            _.$slideTrack.css(animProps);\n                        } else {\n                            animProps[_.animType] = 'translate(0px,' +\n                                now + 'px)';\n                            _.$slideTrack.css(animProps);\n                        }\n                    },\n                    complete: function() {\n                        if (callback) {\n                            callback.call();\n                        }\n                    }\n                });\n\n            } else {\n\n                _.applyTransition();\n                targetLeft = Math.ceil(targetLeft);\n\n                if (_.options.vertical === false) {\n                    animProps[_.animType] = 'translate3d(' + targetLeft + 'px, 0px, 0px)';\n                } else {\n                    animProps[_.animType] = 'translate3d(0px,' + targetLeft + 'px, 0px)';\n                }\n                _.$slideTrack.css(animProps);\n\n                if (callback) {\n                    setTimeout(function() {\n\n                        _.disableTransition();\n\n                        callback.call();\n                    }, _.options.speed);\n                }\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.getNavTarget = function() {\n\n        var _ = this,\n            asNavFor = _.options.asNavFor;\n\n        if ( asNavFor && asNavFor !== null ) {\n            asNavFor = $(asNavFor).not(_.$slider);\n        }\n\n        return asNavFor;\n\n    };\n\n    Slick.prototype.asNavFor = function(index) {\n\n        var _ = this,\n            asNavFor = _.getNavTarget();\n\n        if ( asNavFor !== null && typeof asNavFor === 'object' ) {\n            asNavFor.each(function() {\n                var target = $(this).slick('getSlick');\n                if(!target.unslicked) {\n                    target.slideHandler(index, true);\n                }\n            });\n        }\n\n    };\n\n    Slick.prototype.applyTransition = function(slide) {\n\n        var _ = this,\n            transition = {};\n\n        if (_.options.fade === false) {\n            transition[_.transitionType] = _.transformType + ' ' + _.options.speed + 'ms ' + _.options.cssEase;\n        } else {\n            transition[_.transitionType] = 'opacity ' + _.options.speed + 'ms ' + _.options.cssEase;\n        }\n\n        if (_.options.fade === false) {\n            _.$slideTrack.css(transition);\n        } else {\n            _.$slides.eq(slide).css(transition);\n        }\n\n    };\n\n    Slick.prototype.autoPlay = function() {\n\n        var _ = this;\n\n        _.autoPlayClear();\n\n        if ( _.slideCount > _.options.slidesToShow ) {\n            _.autoPlayTimer = setInterval( _.autoPlayIterator, _.options.autoplaySpeed );\n        }\n\n    };\n\n    Slick.prototype.autoPlayClear = function() {\n\n        var _ = this;\n\n        if (_.autoPlayTimer) {\n            clearInterval(_.autoPlayTimer);\n        }\n\n    };\n\n    Slick.prototype.autoPlayIterator = function() {\n\n        var _ = this,\n            slideTo = _.currentSlide + _.options.slidesToScroll;\n\n        if ( !_.paused && !_.interrupted && !_.focussed ) {\n\n            if ( _.options.infinite === false ) {\n\n                if ( _.direction === 1 && ( _.currentSlide + 1 ) === ( _.slideCount - 1 )) {\n                    _.direction = 0;\n                }\n\n                else if ( _.direction === 0 ) {\n\n                    slideTo = _.currentSlide - _.options.slidesToScroll;\n\n                    if ( _.currentSlide - 1 === 0 ) {\n                        _.direction = 1;\n                    }\n\n                }\n\n            }\n\n            _.slideHandler( slideTo );\n\n        }\n\n    };\n\n    Slick.prototype.buildArrows = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true ) {\n\n            _.$prevArrow = $(_.options.prevArrow).addClass('slick-arrow');\n            _.$nextArrow = $(_.options.nextArrow).addClass('slick-arrow');\n\n            if( _.slideCount > _.options.slidesToShow ) {\n\n                _.$prevArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex');\n                _.$nextArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex');\n\n                if (_.htmlExpr.test(_.options.prevArrow)) {\n                    _.$prevArrow.prependTo(_.options.appendArrows);\n                }\n\n                if (_.htmlExpr.test(_.options.nextArrow)) {\n                    _.$nextArrow.appendTo(_.options.appendArrows);\n                }\n\n                if (_.options.infinite !== true) {\n                    _.$prevArrow\n                        .addClass('slick-disabled')\n                        .attr('aria-disabled', 'true');\n                }\n\n            } else {\n\n                _.$prevArrow.add( _.$nextArrow )\n\n                    .addClass('slick-hidden')\n                    .attr({\n                        'aria-disabled': 'true',\n                        'tabindex': '-1'\n                    });\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.buildDots = function() {\n\n        var _ = this,\n            i, dot;\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$slider.addClass('slick-dotted');\n\n            dot = $('<ul />').addClass(_.options.dotsClass);\n\n            for (i = 0; i <= _.getDotCount(); i += 1) {\n                dot.append($('<li />').append(_.options.customPaging.call(this, _, i)));\n            }\n\n            _.$dots = dot.appendTo(_.options.appendDots);\n\n            _.$dots.find('li').first().addClass('slick-active');\n\n        }\n\n    };\n\n    Slick.prototype.buildOut = function() {\n\n        var _ = this;\n\n        _.$slides =\n            _.$slider\n                .children( _.options.slide + ':not(.slick-cloned)')\n                .addClass('slick-slide');\n\n        _.slideCount = _.$slides.length;\n\n        _.$slides.each(function(index, element) {\n            $(element)\n                .attr('data-slick-index', index)\n                .data('originalStyling', $(element).attr('style') || '');\n        });\n\n        _.$slider.addClass('slick-slider');\n\n        _.$slideTrack = (_.slideCount === 0) ?\n            $('<div class=\"slick-track\"/>').appendTo(_.$slider) :\n            _.$slides.wrapAll('<div class=\"slick-track\"/>').parent();\n\n        _.$list = _.$slideTrack.wrap(\n            '<div class=\"slick-list\"/>').parent();\n        _.$slideTrack.css('opacity', 0);\n\n        if (_.options.centerMode === true || _.options.swipeToSlide === true) {\n            _.options.slidesToScroll = 1;\n        }\n\n        $('img[data-lazy]', _.$slider).not('[src]').addClass('slick-loading');\n\n        _.setupInfinite();\n\n        _.buildArrows();\n\n        _.buildDots();\n\n        _.updateDots();\n\n\n        _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);\n\n        if (_.options.draggable === true) {\n            _.$list.addClass('draggable');\n        }\n\n    };\n\n    Slick.prototype.buildRows = function() {\n\n        var _ = this, a, b, c, newSlides, numOfSlides, originalSlides,slidesPerSection;\n\n        newSlides = document.createDocumentFragment();\n        originalSlides = _.$slider.children();\n\n        if(_.options.rows > 0) {\n\n            slidesPerSection = _.options.slidesPerRow * _.options.rows;\n            numOfSlides = Math.ceil(\n                originalSlides.length / slidesPerSection\n            );\n\n            for(a = 0; a < numOfSlides; a++){\n                var slide = document.createElement('div');\n                for(b = 0; b < _.options.rows; b++) {\n                    var row = document.createElement('div');\n                    for(c = 0; c < _.options.slidesPerRow; c++) {\n                        var target = (a * slidesPerSection + ((b * _.options.slidesPerRow) + c));\n                        if (originalSlides.get(target)) {\n                            row.appendChild(originalSlides.get(target));\n                        }\n                    }\n                    slide.appendChild(row);\n                }\n                newSlides.appendChild(slide);\n            }\n\n            _.$slider.empty().append(newSlides);\n            _.$slider.children().children().children()\n                .css({\n                    'width':(100 / _.options.slidesPerRow) + '%',\n                    'display': 'inline-block'\n                });\n\n        }\n\n    };\n\n    Slick.prototype.checkResponsive = function(initial, forceUpdate) {\n\n        var _ = this,\n            breakpoint, targetBreakpoint, respondToWidth, triggerBreakpoint = false;\n        var sliderWidth = _.$slider.width();\n        var windowWidth = window.innerWidth || $(window).width();\n\n        if (_.respondTo === 'window') {\n            respondToWidth = windowWidth;\n        } else if (_.respondTo === 'slider') {\n            respondToWidth = sliderWidth;\n        } else if (_.respondTo === 'min') {\n            respondToWidth = Math.min(windowWidth, sliderWidth);\n        }\n\n        if ( _.options.responsive &&\n            _.options.responsive.length &&\n            _.options.responsive !== null) {\n\n            targetBreakpoint = null;\n\n            for (breakpoint in _.breakpoints) {\n                if (_.breakpoints.hasOwnProperty(breakpoint)) {\n                    if (_.originalSettings.mobileFirst === false) {\n                        if (respondToWidth < _.breakpoints[breakpoint]) {\n                            targetBreakpoint = _.breakpoints[breakpoint];\n                        }\n                    } else {\n                        if (respondToWidth > _.breakpoints[breakpoint]) {\n                            targetBreakpoint = _.breakpoints[breakpoint];\n                        }\n                    }\n                }\n            }\n\n            if (targetBreakpoint !== null) {\n                if (_.activeBreakpoint !== null) {\n                    if (targetBreakpoint !== _.activeBreakpoint || forceUpdate) {\n                        _.activeBreakpoint =\n                            targetBreakpoint;\n                        if (_.breakpointSettings[targetBreakpoint] === 'unslick') {\n                            _.unslick(targetBreakpoint);\n                        } else {\n                            _.options = $.extend({}, _.originalSettings,\n                                _.breakpointSettings[\n                                    targetBreakpoint]);\n                            if (initial === true) {\n                                _.currentSlide = _.options.initialSlide;\n                            }\n                            _.refresh(initial);\n                        }\n                        triggerBreakpoint = targetBreakpoint;\n                    }\n                } else {\n                    _.activeBreakpoint = targetBreakpoint;\n                    if (_.breakpointSettings[targetBreakpoint] === 'unslick') {\n                        _.unslick(targetBreakpoint);\n                    } else {\n                        _.options = $.extend({}, _.originalSettings,\n                            _.breakpointSettings[\n                                targetBreakpoint]);\n                        if (initial === true) {\n                            _.currentSlide = _.options.initialSlide;\n                        }\n                        _.refresh(initial);\n                    }\n                    triggerBreakpoint = targetBreakpoint;\n                }\n            } else {\n                if (_.activeBreakpoint !== null) {\n                    _.activeBreakpoint = null;\n                    _.options = _.originalSettings;\n                    if (initial === true) {\n                        _.currentSlide = _.options.initialSlide;\n                    }\n                    _.refresh(initial);\n                    triggerBreakpoint = targetBreakpoint;\n                }\n            }\n\n            // only trigger breakpoints during an actual break. not on initialize.\n            if( !initial && triggerBreakpoint !== false ) {\n                _.$slider.trigger('breakpoint', [_, triggerBreakpoint]);\n            }\n        }\n\n    };\n\n    Slick.prototype.changeSlide = function(event, dontAnimate) {\n\n        var _ = this,\n            $target = $(event.currentTarget),\n            indexOffset, slideOffset, unevenOffset;\n\n        // If target is a link, prevent default action.\n        if($target.is('a')) {\n            event.preventDefault();\n        }\n\n        // If target is not the <li> element (ie: a child), find the <li>.\n        if(!$target.is('li')) {\n            $target = $target.closest('li');\n        }\n\n        unevenOffset = (_.slideCount % _.options.slidesToScroll !== 0);\n        indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) % _.options.slidesToScroll;\n\n        switch (event.data.message) {\n\n            case 'previous':\n                slideOffset = indexOffset === 0 ? _.options.slidesToScroll : _.options.slidesToShow - indexOffset;\n                if (_.slideCount > _.options.slidesToShow) {\n                    _.slideHandler(_.currentSlide - slideOffset, false, dontAnimate);\n                }\n                break;\n\n            case 'next':\n                slideOffset = indexOffset === 0 ? _.options.slidesToScroll : indexOffset;\n                if (_.slideCount > _.options.slidesToShow) {\n                    _.slideHandler(_.currentSlide + slideOffset, false, dontAnimate);\n                }\n                break;\n\n            case 'index':\n                var index = event.data.index === 0 ? 0 :\n                    event.data.index || $target.index() * _.options.slidesToScroll;\n\n                _.slideHandler(_.checkNavigable(index), false, dontAnimate);\n                $target.children().trigger('focus');\n                break;\n\n            default:\n                return;\n        }\n\n    };\n\n    Slick.prototype.checkNavigable = function(index) {\n\n        var _ = this,\n            navigables, prevNavigable;\n\n        navigables = _.getNavigableIndexes();\n        prevNavigable = 0;\n        if (index > navigables[navigables.length - 1]) {\n            index = navigables[navigables.length - 1];\n        } else {\n            for (var n in navigables) {\n                if (index < navigables[n]) {\n                    index = prevNavigable;\n                    break;\n                }\n                prevNavigable = navigables[n];\n            }\n        }\n\n        return index;\n    };\n\n    Slick.prototype.cleanUpEvents = function() {\n\n        var _ = this;\n\n        if (_.options.dots && _.$dots !== null) {\n\n            $('li', _.$dots)\n                .off('click.slick', _.changeSlide)\n                .off('mouseenter.slick', $.proxy(_.interrupt, _, true))\n                .off('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n            if (_.options.accessibility === true) {\n                _.$dots.off('keydown.slick', _.keyHandler);\n            }\n        }\n\n        _.$slider.off('focus.slick blur.slick');\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n            _.$prevArrow && _.$prevArrow.off('click.slick', _.changeSlide);\n            _.$nextArrow && _.$nextArrow.off('click.slick', _.changeSlide);\n\n            if (_.options.accessibility === true) {\n                _.$prevArrow && _.$prevArrow.off('keydown.slick', _.keyHandler);\n                _.$nextArrow && _.$nextArrow.off('keydown.slick', _.keyHandler);\n            }\n        }\n\n        _.$list.off('touchstart.slick mousedown.slick', _.swipeHandler);\n        _.$list.off('touchmove.slick mousemove.slick', _.swipeHandler);\n        _.$list.off('touchend.slick mouseup.slick', _.swipeHandler);\n        _.$list.off('touchcancel.slick mouseleave.slick', _.swipeHandler);\n\n        _.$list.off('click.slick', _.clickHandler);\n\n        $(document).off(_.visibilityChange, _.visibility);\n\n        _.cleanUpSlideEvents();\n\n        if (_.options.accessibility === true) {\n            _.$list.off('keydown.slick', _.keyHandler);\n        }\n\n        if (_.options.focusOnSelect === true) {\n            $(_.$slideTrack).children().off('click.slick', _.selectHandler);\n        }\n\n        $(window).off('orientationchange.slick.slick-' + _.instanceUid, _.orientationChange);\n\n        $(window).off('resize.slick.slick-' + _.instanceUid, _.resize);\n\n        $('[draggable!=true]', _.$slideTrack).off('dragstart', _.preventDefault);\n\n        $(window).off('load.slick.slick-' + _.instanceUid, _.setPosition);\n\n    };\n\n    Slick.prototype.cleanUpSlideEvents = function() {\n\n        var _ = this;\n\n        _.$list.off('mouseenter.slick', $.proxy(_.interrupt, _, true));\n        _.$list.off('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n    };\n\n    Slick.prototype.cleanUpRows = function() {\n\n        var _ = this, originalSlides;\n\n        if(_.options.rows > 0) {\n            originalSlides = _.$slides.children().children();\n            originalSlides.removeAttr('style');\n            _.$slider.empty().append(originalSlides);\n        }\n\n    };\n\n    Slick.prototype.clickHandler = function(event) {\n\n        var _ = this;\n\n        if (_.shouldClick === false) {\n            event.stopImmediatePropagation();\n            event.stopPropagation();\n            event.preventDefault();\n        }\n\n    };\n\n    Slick.prototype.destroy = function(refresh) {\n\n        var _ = this;\n\n        _.autoPlayClear();\n\n        _.touchObject = {};\n\n        _.cleanUpEvents();\n\n        $('.slick-cloned', _.$slider).detach();\n\n        if (_.$dots) {\n            _.$dots.remove();\n        }\n\n        if ( _.$prevArrow && _.$prevArrow.length ) {\n\n            _.$prevArrow\n                .removeClass('slick-disabled slick-arrow slick-hidden')\n                .removeAttr('aria-hidden aria-disabled tabindex')\n                .css('display','');\n\n            if ( _.htmlExpr.test( _.options.prevArrow )) {\n                _.$prevArrow.remove();\n            }\n        }\n\n        if ( _.$nextArrow && _.$nextArrow.length ) {\n\n            _.$nextArrow\n                .removeClass('slick-disabled slick-arrow slick-hidden')\n                .removeAttr('aria-hidden aria-disabled tabindex')\n                .css('display','');\n\n            if ( _.htmlExpr.test( _.options.nextArrow )) {\n                _.$nextArrow.remove();\n            }\n        }\n\n\n        if (_.$slides) {\n\n            _.$slides\n                .removeClass('slick-slide slick-active slick-center slick-visible slick-current')\n                .removeAttr('aria-hidden')\n                .removeAttr('data-slick-index')\n                .each(function(){\n                    $(this).attr('style', $(this).data('originalStyling'));\n                });\n\n            _.$slideTrack.children(this.options.slide).detach();\n\n            _.$slideTrack.detach();\n\n            _.$list.detach();\n\n            _.$slider.append(_.$slides);\n        }\n\n        _.cleanUpRows();\n\n        _.$slider.removeClass('slick-slider');\n        _.$slider.removeClass('slick-initialized');\n        _.$slider.removeClass('slick-dotted');\n\n        _.unslicked = true;\n\n        if(!refresh) {\n            _.$slider.trigger('destroy', [_]);\n        }\n\n    };\n\n    Slick.prototype.disableTransition = function(slide) {\n\n        var _ = this,\n            transition = {};\n\n        transition[_.transitionType] = '';\n\n        if (_.options.fade === false) {\n            _.$slideTrack.css(transition);\n        } else {\n            _.$slides.eq(slide).css(transition);\n        }\n\n    };\n\n    Slick.prototype.fadeSlide = function(slideIndex, callback) {\n\n        var _ = this;\n\n        if (_.cssTransitions === false) {\n\n            _.$slides.eq(slideIndex).css({\n                zIndex: _.options.zIndex\n            });\n\n            _.$slides.eq(slideIndex).animate({\n                opacity: 1\n            }, _.options.speed, _.options.easing, callback);\n\n        } else {\n\n            _.applyTransition(slideIndex);\n\n            _.$slides.eq(slideIndex).css({\n                opacity: 1,\n                zIndex: _.options.zIndex\n            });\n\n            if (callback) {\n                setTimeout(function() {\n\n                    _.disableTransition(slideIndex);\n\n                    callback.call();\n                }, _.options.speed);\n            }\n\n        }\n\n    };\n\n    Slick.prototype.fadeSlideOut = function(slideIndex) {\n\n        var _ = this;\n\n        if (_.cssTransitions === false) {\n\n            _.$slides.eq(slideIndex).animate({\n                opacity: 0,\n                zIndex: _.options.zIndex - 2\n            }, _.options.speed, _.options.easing);\n\n        } else {\n\n            _.applyTransition(slideIndex);\n\n            _.$slides.eq(slideIndex).css({\n                opacity: 0,\n                zIndex: _.options.zIndex - 2\n            });\n\n        }\n\n    };\n\n    Slick.prototype.filterSlides = Slick.prototype.slickFilter = function(filter) {\n\n        var _ = this;\n\n        if (filter !== null) {\n\n            _.$slidesCache = _.$slides;\n\n            _.unload();\n\n            _.$slideTrack.children(this.options.slide).detach();\n\n            _.$slidesCache.filter(filter).appendTo(_.$slideTrack);\n\n            _.reinit();\n\n        }\n\n    };\n\n    Slick.prototype.focusHandler = function() {\n\n        var _ = this;\n\n        _.$slider\n            .off('focus.slick blur.slick')\n            .on('focus.slick blur.slick', '*', function(event) {\n\n            event.stopImmediatePropagation();\n            var $sf = $(this);\n\n            setTimeout(function() {\n\n                if( _.options.pauseOnFocus ) {\n                    _.focussed = $sf.is(':focus');\n                    _.autoPlay();\n                }\n\n            }, 0);\n\n        });\n    };\n\n    Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide = function() {\n\n        var _ = this;\n        return _.currentSlide;\n\n    };\n\n    Slick.prototype.getDotCount = function() {\n\n        var _ = this;\n\n        var breakPoint = 0;\n        var counter = 0;\n        var pagerQty = 0;\n\n        if (_.options.infinite === true) {\n            if (_.slideCount <= _.options.slidesToShow) {\n                 ++pagerQty;\n            } else {\n                while (breakPoint < _.slideCount) {\n                    ++pagerQty;\n                    breakPoint = counter + _.options.slidesToScroll;\n                    counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n                }\n            }\n        } else if (_.options.centerMode === true) {\n            pagerQty = _.slideCount;\n        } else if(!_.options.asNavFor) {\n            pagerQty = 1 + Math.ceil((_.slideCount - _.options.slidesToShow) / _.options.slidesToScroll);\n        }else {\n            while (breakPoint < _.slideCount) {\n                ++pagerQty;\n                breakPoint = counter + _.options.slidesToScroll;\n                counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n            }\n        }\n\n        return pagerQty - 1;\n\n    };\n\n    Slick.prototype.getLeft = function(slideIndex) {\n\n        var _ = this,\n            targetLeft,\n            verticalHeight,\n            verticalOffset = 0,\n            targetSlide,\n            coef;\n\n        _.slideOffset = 0;\n        verticalHeight = _.$slides.first().outerHeight(true);\n\n        if (_.options.infinite === true) {\n            if (_.slideCount > _.options.slidesToShow) {\n                _.slideOffset = (_.slideWidth * _.options.slidesToShow) * -1;\n                coef = -1\n\n                if (_.options.vertical === true && _.options.centerMode === true) {\n                    if (_.options.slidesToShow === 2) {\n                        coef = -1.5;\n                    } else if (_.options.slidesToShow === 1) {\n                        coef = -2\n                    }\n                }\n                verticalOffset = (verticalHeight * _.options.slidesToShow) * coef;\n            }\n            if (_.slideCount % _.options.slidesToScroll !== 0) {\n                if (slideIndex + _.options.slidesToScroll > _.slideCount && _.slideCount > _.options.slidesToShow) {\n                    if (slideIndex > _.slideCount) {\n                        _.slideOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * _.slideWidth) * -1;\n                        verticalOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * verticalHeight) * -1;\n                    } else {\n                        _.slideOffset = ((_.slideCount % _.options.slidesToScroll) * _.slideWidth) * -1;\n                        verticalOffset = ((_.slideCount % _.options.slidesToScroll) * verticalHeight) * -1;\n                    }\n                }\n            }\n        } else {\n            if (slideIndex + _.options.slidesToShow > _.slideCount) {\n                _.slideOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * _.slideWidth;\n                verticalOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * verticalHeight;\n            }\n        }\n\n        if (_.slideCount <= _.options.slidesToShow) {\n            _.slideOffset = 0;\n            verticalOffset = 0;\n        }\n\n        if (_.options.centerMode === true && _.slideCount <= _.options.slidesToShow) {\n            _.slideOffset = ((_.slideWidth * Math.floor(_.options.slidesToShow)) / 2) - ((_.slideWidth * _.slideCount) / 2);\n        } else if (_.options.centerMode === true && _.options.infinite === true) {\n            _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2) - _.slideWidth;\n        } else if (_.options.centerMode === true) {\n            _.slideOffset = 0;\n            _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2);\n        }\n\n        if (_.options.vertical === false) {\n            targetLeft = ((slideIndex * _.slideWidth) * -1) + _.slideOffset;\n        } else {\n            targetLeft = ((slideIndex * verticalHeight) * -1) + verticalOffset;\n        }\n\n        if (_.options.variableWidth === true) {\n\n            if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {\n                targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);\n            } else {\n                targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow);\n            }\n\n            if (_.options.rtl === true) {\n                if (targetSlide[0]) {\n                    targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;\n                } else {\n                    targetLeft =  0;\n                }\n            } else {\n                targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;\n            }\n\n            if (_.options.centerMode === true) {\n                if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {\n                    targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);\n                } else {\n                    targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow + 1);\n                }\n\n                if (_.options.rtl === true) {\n                    if (targetSlide[0]) {\n                        targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;\n                    } else {\n                        targetLeft =  0;\n                    }\n                } else {\n                    targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;\n                }\n\n                targetLeft += (_.$list.width() - targetSlide.outerWidth()) / 2;\n            }\n        }\n\n        return targetLeft;\n\n    };\n\n    Slick.prototype.getOption = Slick.prototype.slickGetOption = function(option) {\n\n        var _ = this;\n\n        return _.options[option];\n\n    };\n\n    Slick.prototype.getNavigableIndexes = function() {\n\n        var _ = this,\n            breakPoint = 0,\n            counter = 0,\n            indexes = [],\n            max;\n\n        if (_.options.infinite === false) {\n            max = _.slideCount;\n        } else {\n            breakPoint = _.options.slidesToScroll * -1;\n            counter = _.options.slidesToScroll * -1;\n            max = _.slideCount * 2;\n        }\n\n        while (breakPoint < max) {\n            indexes.push(breakPoint);\n            breakPoint = counter + _.options.slidesToScroll;\n            counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n        }\n\n        return indexes;\n\n    };\n\n    Slick.prototype.getSlick = function() {\n\n        return this;\n\n    };\n\n    Slick.prototype.getSlideCount = function() {\n\n        var _ = this,\n            slidesTraversed, swipedSlide, centerOffset;\n\n        centerOffset = _.options.centerMode === true ? _.slideWidth * Math.floor(_.options.slidesToShow / 2) : 0;\n\n        if (_.options.swipeToSlide === true) {\n            _.$slideTrack.find('.slick-slide').each(function(index, slide) {\n                if (slide.offsetLeft - centerOffset + ($(slide).outerWidth() / 2) > (_.swipeLeft * -1)) {\n                    swipedSlide = slide;\n                    return false;\n                }\n            });\n\n            slidesTraversed = Math.abs($(swipedSlide).attr('data-slick-index') - _.currentSlide) || 1;\n\n            return slidesTraversed;\n\n        } else {\n            return _.options.slidesToScroll;\n        }\n\n    };\n\n    Slick.prototype.goTo = Slick.prototype.slickGoTo = function(slide, dontAnimate) {\n\n        var _ = this;\n\n        _.changeSlide({\n            data: {\n                message: 'index',\n                index: parseInt(slide)\n            }\n        }, dontAnimate);\n\n    };\n\n    Slick.prototype.init = function(creation) {\n\n        var _ = this;\n\n        if (!$(_.$slider).hasClass('slick-initialized')) {\n\n            $(_.$slider).addClass('slick-initialized');\n\n            _.buildRows();\n            _.buildOut();\n            _.setProps();\n            _.startLoad();\n            _.loadSlider();\n            _.initializeEvents();\n            _.updateArrows();\n            _.updateDots();\n            _.checkResponsive(true);\n            _.focusHandler();\n\n        }\n\n        if (creation) {\n            _.$slider.trigger('init', [_]);\n        }\n\n        if (_.options.accessibility === true) {\n            _.initADA();\n        }\n\n        if ( _.options.autoplay ) {\n\n            _.paused = false;\n            _.autoPlay();\n\n        }\n\n    };\n\n    Slick.prototype.initADA = function() {\n        var _ = this,\n                numDotGroups = Math.ceil(_.slideCount / _.options.slidesToShow),\n                tabControlIndexes = _.getNavigableIndexes().filter(function(val) {\n                    return (val >= 0) && (val < _.slideCount);\n                });\n\n        _.$slides.add(_.$slideTrack.find('.slick-cloned')).attr({\n            'aria-hidden': 'true',\n            'tabindex': '-1'\n        }).find('a, input, button, select').attr({\n            'tabindex': '-1'\n        });\n\n        if (_.$dots !== null) {\n            _.$slides.not(_.$slideTrack.find('.slick-cloned')).each(function(i) {\n                var slideControlIndex = tabControlIndexes.indexOf(i);\n\n                $(this).attr({\n                    'role': 'tabpanel',\n                    'id': 'slick-slide' + _.instanceUid + i,\n                    'tabindex': -1\n                });\n\n                if (slideControlIndex !== -1) {\n                   var ariaButtonControl = 'slick-slide-control' + _.instanceUid + slideControlIndex\n                   if ($('#' + ariaButtonControl).length) {\n                     $(this).attr({\n                         'aria-describedby': ariaButtonControl\n                     });\n                   }\n                }\n            });\n\n            _.$dots.attr('role', 'tablist').find('li').each(function(i) {\n                var mappedSlideIndex = tabControlIndexes[i];\n\n                $(this).attr({\n                    'role': 'presentation'\n                });\n\n                $(this).find('button').first().attr({\n                    'role': 'tab',\n                    'id': 'slick-slide-control' + _.instanceUid + i,\n                    'aria-controls': 'slick-slide' + _.instanceUid + mappedSlideIndex,\n                    'aria-label': (i + 1) + ' of ' + numDotGroups,\n                    'aria-selected': null,\n                    'tabindex': '-1'\n                });\n\n            }).eq(_.currentSlide).find('button').attr({\n                'aria-selected': 'true',\n                'tabindex': '0'\n            }).end();\n        }\n\n        for (var i=_.currentSlide, max=i+_.options.slidesToShow; i < max; i++) {\n          if (_.options.focusOnChange) {\n            _.$slides.eq(i).attr({'tabindex': '0'});\n          } else {\n            _.$slides.eq(i).removeAttr('tabindex');\n          }\n        }\n\n        _.activateADA();\n\n    };\n\n    Slick.prototype.initArrowEvents = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n            _.$prevArrow\n               .off('click.slick')\n               .on('click.slick', {\n                    message: 'previous'\n               }, _.changeSlide);\n            _.$nextArrow\n               .off('click.slick')\n               .on('click.slick', {\n                    message: 'next'\n               }, _.changeSlide);\n\n            if (_.options.accessibility === true) {\n                _.$prevArrow.on('keydown.slick', _.keyHandler);\n                _.$nextArrow.on('keydown.slick', _.keyHandler);\n            }\n        }\n\n    };\n\n    Slick.prototype.initDotEvents = function() {\n\n        var _ = this;\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n            $('li', _.$dots).on('click.slick', {\n                message: 'index'\n            }, _.changeSlide);\n\n            if (_.options.accessibility === true) {\n                _.$dots.on('keydown.slick', _.keyHandler);\n            }\n        }\n\n        if (_.options.dots === true && _.options.pauseOnDotsHover === true && _.slideCount > _.options.slidesToShow) {\n\n            $('li', _.$dots)\n                .on('mouseenter.slick', $.proxy(_.interrupt, _, true))\n                .on('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n        }\n\n    };\n\n    Slick.prototype.initSlideEvents = function() {\n\n        var _ = this;\n\n        if ( _.options.pauseOnHover ) {\n\n            _.$list.on('mouseenter.slick', $.proxy(_.interrupt, _, true));\n            _.$list.on('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n        }\n\n    };\n\n    Slick.prototype.initializeEvents = function() {\n\n        var _ = this;\n\n        _.initArrowEvents();\n\n        _.initDotEvents();\n        _.initSlideEvents();\n\n        _.$list.on('touchstart.slick mousedown.slick', {\n            action: 'start'\n        }, _.swipeHandler);\n        _.$list.on('touchmove.slick mousemove.slick', {\n            action: 'move'\n        }, _.swipeHandler);\n        _.$list.on('touchend.slick mouseup.slick', {\n            action: 'end'\n        }, _.swipeHandler);\n        _.$list.on('touchcancel.slick mouseleave.slick', {\n            action: 'end'\n        }, _.swipeHandler);\n\n        _.$list.on('click.slick', _.clickHandler);\n\n        $(document).on(_.visibilityChange, $.proxy(_.visibility, _));\n\n        if (_.options.accessibility === true) {\n            _.$list.on('keydown.slick', _.keyHandler);\n        }\n\n        if (_.options.focusOnSelect === true) {\n            $(_.$slideTrack).children().on('click.slick', _.selectHandler);\n        }\n\n        $(window).on('orientationchange.slick.slick-' + _.instanceUid, $.proxy(_.orientationChange, _));\n\n        $(window).on('resize.slick.slick-' + _.instanceUid, $.proxy(_.resize, _));\n\n        $('[draggable!=true]', _.$slideTrack).on('dragstart', _.preventDefault);\n\n        $(window).on('load.slick.slick-' + _.instanceUid, _.setPosition);\n        $(_.setPosition);\n\n    };\n\n    Slick.prototype.initUI = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$prevArrow.show();\n            _.$nextArrow.show();\n\n        }\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$dots.show();\n\n        }\n\n    };\n\n    Slick.prototype.keyHandler = function(event) {\n\n        var _ = this;\n         //Dont slide if the cursor is inside the form fields and arrow keys are pressed\n        if(!event.target.tagName.match('TEXTAREA|INPUT|SELECT')) {\n            if (event.keyCode === 37 && _.options.accessibility === true) {\n                _.changeSlide({\n                    data: {\n                        message: _.options.rtl === true ? 'next' :  'previous'\n                    }\n                });\n            } else if (event.keyCode === 39 && _.options.accessibility === true) {\n                _.changeSlide({\n                    data: {\n                        message: _.options.rtl === true ? 'previous' : 'next'\n                    }\n                });\n            }\n        }\n\n    };\n\n    Slick.prototype.lazyLoad = function() {\n\n        var _ = this,\n            loadRange, cloneRange, rangeStart, rangeEnd;\n\n        function loadImages(imagesScope) {\n\n            $('img[data-lazy]', imagesScope).each(function() {\n\n                var image = $(this),\n                    imageSource = $(this).attr('data-lazy'),\n                    imageSrcSet = $(this).attr('data-srcset'),\n                    imageSizes  = $(this).attr('data-sizes') || _.$slider.attr('data-sizes'),\n                    imageToLoad = document.createElement('img');\n\n                imageToLoad.onload = function() {\n\n                    image\n                        .animate({ opacity: 0 }, 100, function() {\n\n                            if (imageSrcSet) {\n                                image\n                                    .attr('srcset', imageSrcSet );\n\n                                if (imageSizes) {\n                                    image\n                                        .attr('sizes', imageSizes );\n                                }\n                            }\n\n                            image\n                                .attr('src', imageSource)\n                                .animate({ opacity: 1 }, 200, function() {\n                                    image\n                                        .removeAttr('data-lazy data-srcset data-sizes')\n                                        .removeClass('slick-loading');\n                                });\n                            _.$slider.trigger('lazyLoaded', [_, image, imageSource]);\n                        });\n\n                };\n\n                imageToLoad.onerror = function() {\n\n                    image\n                        .removeAttr( 'data-lazy' )\n                        .removeClass( 'slick-loading' )\n                        .addClass( 'slick-lazyload-error' );\n\n                    _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]);\n\n                };\n\n                imageToLoad.src = imageSource;\n\n            });\n\n        }\n\n        if (_.options.centerMode === true) {\n            if (_.options.infinite === true) {\n                rangeStart = _.currentSlide + (_.options.slidesToShow / 2 + 1);\n                rangeEnd = rangeStart + _.options.slidesToShow + 2;\n            } else {\n                rangeStart = Math.max(0, _.currentSlide - (_.options.slidesToShow / 2 + 1));\n                rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) + _.currentSlide;\n            }\n        } else {\n            rangeStart = _.options.infinite ? _.options.slidesToShow + _.currentSlide : _.currentSlide;\n            rangeEnd = Math.ceil(rangeStart + _.options.slidesToShow);\n            if (_.options.fade === true) {\n                if (rangeStart > 0) rangeStart--;\n                if (rangeEnd <= _.slideCount) rangeEnd++;\n            }\n        }\n\n        loadRange = _.$slider.find('.slick-slide').slice(rangeStart, rangeEnd);\n\n        if (_.options.lazyLoad === 'anticipated') {\n            var prevSlide = rangeStart - 1,\n                nextSlide = rangeEnd,\n                $slides = _.$slider.find('.slick-slide');\n\n            for (var i = 0; i < _.options.slidesToScroll; i++) {\n                if (prevSlide < 0) prevSlide = _.slideCount - 1;\n                loadRange = loadRange.add($slides.eq(prevSlide));\n                loadRange = loadRange.add($slides.eq(nextSlide));\n                prevSlide--;\n                nextSlide++;\n            }\n        }\n\n        loadImages(loadRange);\n\n        if (_.slideCount <= _.options.slidesToShow) {\n            cloneRange = _.$slider.find('.slick-slide');\n            loadImages(cloneRange);\n        } else\n        if (_.currentSlide >= _.slideCount - _.options.slidesToShow) {\n            cloneRange = _.$slider.find('.slick-cloned').slice(0, _.options.slidesToShow);\n            loadImages(cloneRange);\n        } else if (_.currentSlide === 0) {\n            cloneRange = _.$slider.find('.slick-cloned').slice(_.options.slidesToShow * -1);\n            loadImages(cloneRange);\n        }\n\n    };\n\n    Slick.prototype.loadSlider = function() {\n\n        var _ = this;\n\n        _.setPosition();\n\n        _.$slideTrack.css({\n            opacity: 1\n        });\n\n        _.$slider.removeClass('slick-loading');\n\n        _.initUI();\n\n        if (_.options.lazyLoad === 'progressive') {\n            _.progressiveLazyLoad();\n        }\n\n    };\n\n    Slick.prototype.next = Slick.prototype.slickNext = function() {\n\n        var _ = this;\n\n        _.changeSlide({\n            data: {\n                message: 'next'\n            }\n        });\n\n    };\n\n    Slick.prototype.orientationChange = function() {\n\n        var _ = this;\n\n        _.checkResponsive();\n        _.setPosition();\n\n    };\n\n    Slick.prototype.pause = Slick.prototype.slickPause = function() {\n\n        var _ = this;\n\n        _.autoPlayClear();\n        _.paused = true;\n\n    };\n\n    Slick.prototype.play = Slick.prototype.slickPlay = function() {\n\n        var _ = this;\n\n        _.autoPlay();\n        _.options.autoplay = true;\n        _.paused = false;\n        _.focussed = false;\n        _.interrupted = false;\n\n    };\n\n    Slick.prototype.postSlide = function(index) {\n\n        var _ = this;\n\n        if( !_.unslicked ) {\n\n            _.$slider.trigger('afterChange', [_, index]);\n\n            _.animating = false;\n\n            if (_.slideCount > _.options.slidesToShow) {\n                _.setPosition();\n            }\n\n            _.swipeLeft = null;\n\n            if ( _.options.autoplay ) {\n                _.autoPlay();\n            }\n\n            if (_.options.accessibility === true) {\n                _.initADA();\n\n                if (_.options.focusOnChange) {\n                    var $currentSlide = $(_.$slides.get(_.currentSlide));\n                    $currentSlide.attr('tabindex', 0).focus();\n                }\n            }\n\n        }\n\n    };\n\n    Slick.prototype.prev = Slick.prototype.slickPrev = function() {\n\n        var _ = this;\n\n        _.changeSlide({\n            data: {\n                message: 'previous'\n            }\n        });\n\n    };\n\n    Slick.prototype.preventDefault = function(event) {\n\n        event.preventDefault();\n\n    };\n\n    Slick.prototype.progressiveLazyLoad = function( tryCount ) {\n\n        tryCount = tryCount || 1;\n\n        var _ = this,\n            $imgsToLoad = $( 'img[data-lazy]', _.$slider ),\n            image,\n            imageSource,\n            imageSrcSet,\n            imageSizes,\n            imageToLoad;\n\n        if ( $imgsToLoad.length ) {\n\n            image = $imgsToLoad.first();\n            imageSource = image.attr('data-lazy');\n            imageSrcSet = image.attr('data-srcset');\n            imageSizes  = image.attr('data-sizes') || _.$slider.attr('data-sizes');\n            imageToLoad = document.createElement('img');\n\n            imageToLoad.onload = function() {\n\n                if (imageSrcSet) {\n                    image\n                        .attr('srcset', imageSrcSet );\n\n                    if (imageSizes) {\n                        image\n                            .attr('sizes', imageSizes );\n                    }\n                }\n\n                image\n                    .attr( 'src', imageSource )\n                    .removeAttr('data-lazy data-srcset data-sizes')\n                    .removeClass('slick-loading');\n\n                if ( _.options.adaptiveHeight === true ) {\n                    _.setPosition();\n                }\n\n                _.$slider.trigger('lazyLoaded', [ _, image, imageSource ]);\n                _.progressiveLazyLoad();\n\n            };\n\n            imageToLoad.onerror = function() {\n\n                if ( tryCount < 3 ) {\n\n                    /**\n                     * try to load the image 3 times,\n                     * leave a slight delay so we don't get\n                     * servers blocking the request.\n                     */\n                    setTimeout( function() {\n                        _.progressiveLazyLoad( tryCount + 1 );\n                    }, 500 );\n\n                } else {\n\n                    image\n                        .removeAttr( 'data-lazy' )\n                        .removeClass( 'slick-loading' )\n                        .addClass( 'slick-lazyload-error' );\n\n                    _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]);\n\n                    _.progressiveLazyLoad();\n\n                }\n\n            };\n\n            imageToLoad.src = imageSource;\n\n        } else {\n\n            _.$slider.trigger('allImagesLoaded', [ _ ]);\n\n        }\n\n    };\n\n    Slick.prototype.refresh = function( initializing ) {\n\n        var _ = this, currentSlide, lastVisibleIndex;\n\n        lastVisibleIndex = _.slideCount - _.options.slidesToShow;\n\n        // in non-infinite sliders, we don't want to go past the\n        // last visible index.\n        if( !_.options.infinite && ( _.currentSlide > lastVisibleIndex )) {\n            _.currentSlide = lastVisibleIndex;\n        }\n\n        // if less slides than to show, go to start.\n        if ( _.slideCount <= _.options.slidesToShow ) {\n            _.currentSlide = 0;\n\n        }\n\n        currentSlide = _.currentSlide;\n\n        _.destroy(true);\n\n        $.extend(_, _.initials, { currentSlide: currentSlide });\n\n        _.init();\n\n        if( !initializing ) {\n\n            _.changeSlide({\n                data: {\n                    message: 'index',\n                    index: currentSlide\n                }\n            }, false);\n\n        }\n\n    };\n\n    Slick.prototype.registerBreakpoints = function() {\n\n        var _ = this, breakpoint, currentBreakpoint, l,\n            responsiveSettings = _.options.responsive || null;\n\n        if ( $.type(responsiveSettings) === 'array' && responsiveSettings.length ) {\n\n            _.respondTo = _.options.respondTo || 'window';\n\n            for ( breakpoint in responsiveSettings ) {\n\n                l = _.breakpoints.length-1;\n\n                if (responsiveSettings.hasOwnProperty(breakpoint)) {\n                    currentBreakpoint = responsiveSettings[breakpoint].breakpoint;\n\n                    // loop through the breakpoints and cut out any existing\n                    // ones with the same breakpoint number, we don't want dupes.\n                    while( l >= 0 ) {\n                        if( _.breakpoints[l] && _.breakpoints[l] === currentBreakpoint ) {\n                            _.breakpoints.splice(l,1);\n                        }\n                        l--;\n                    }\n\n                    _.breakpoints.push(currentBreakpoint);\n                    _.breakpointSettings[currentBreakpoint] = responsiveSettings[breakpoint].settings;\n\n                }\n\n            }\n\n            _.breakpoints.sort(function(a, b) {\n                return ( _.options.mobileFirst ) ? a-b : b-a;\n            });\n\n        }\n\n    };\n\n    Slick.prototype.reinit = function() {\n\n        var _ = this;\n\n        _.$slides =\n            _.$slideTrack\n                .children(_.options.slide)\n                .addClass('slick-slide');\n\n        _.slideCount = _.$slides.length;\n\n        if (_.currentSlide >= _.slideCount && _.currentSlide !== 0) {\n            _.currentSlide = _.currentSlide - _.options.slidesToScroll;\n        }\n\n        if (_.slideCount <= _.options.slidesToShow) {\n            _.currentSlide = 0;\n        }\n\n        _.registerBreakpoints();\n\n        _.setProps();\n        _.setupInfinite();\n        _.buildArrows();\n        _.updateArrows();\n        _.initArrowEvents();\n        _.buildDots();\n        _.updateDots();\n        _.initDotEvents();\n        _.cleanUpSlideEvents();\n        _.initSlideEvents();\n\n        _.checkResponsive(false, true);\n\n        if (_.options.focusOnSelect === true) {\n            $(_.$slideTrack).children().on('click.slick', _.selectHandler);\n        }\n\n        _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);\n\n        _.setPosition();\n        _.focusHandler();\n\n        _.paused = !_.options.autoplay;\n        _.autoPlay();\n\n        _.$slider.trigger('reInit', [_]);\n\n    };\n\n    Slick.prototype.resize = function() {\n\n        var _ = this;\n\n        if ($(window).width() !== _.windowWidth) {\n            clearTimeout(_.windowDelay);\n            _.windowDelay = window.setTimeout(function() {\n                _.windowWidth = $(window).width();\n                _.checkResponsive();\n                if( !_.unslicked ) { _.setPosition(); }\n            }, 50);\n        }\n    };\n\n    Slick.prototype.removeSlide = Slick.prototype.slickRemove = function(index, removeBefore, removeAll) {\n\n        var _ = this;\n\n        if (typeof(index) === 'boolean') {\n            removeBefore = index;\n            index = removeBefore === true ? 0 : _.slideCount - 1;\n        } else {\n            index = removeBefore === true ? --index : index;\n        }\n\n        if (_.slideCount < 1 || index < 0 || index > _.slideCount - 1) {\n            return false;\n        }\n\n        _.unload();\n\n        if (removeAll === true) {\n            _.$slideTrack.children().remove();\n        } else {\n            _.$slideTrack.children(this.options.slide).eq(index).remove();\n        }\n\n        _.$slides = _.$slideTrack.children(this.options.slide);\n\n        _.$slideTrack.children(this.options.slide).detach();\n\n        _.$slideTrack.append(_.$slides);\n\n        _.$slidesCache = _.$slides;\n\n        _.reinit();\n\n    };\n\n    Slick.prototype.setCSS = function(position) {\n\n        var _ = this,\n            positionProps = {},\n            x, y;\n\n        if (_.options.rtl === true) {\n            position = -position;\n        }\n        x = _.positionProp == 'left' ? Math.ceil(position) + 'px' : '0px';\n        y = _.positionProp == 'top' ? Math.ceil(position) + 'px' : '0px';\n\n        positionProps[_.positionProp] = position;\n\n        if (_.transformsEnabled === false) {\n            _.$slideTrack.css(positionProps);\n        } else {\n            positionProps = {};\n            if (_.cssTransitions === false) {\n                positionProps[_.animType] = 'translate(' + x + ', ' + y + ')';\n                _.$slideTrack.css(positionProps);\n            } else {\n                positionProps[_.animType] = 'translate3d(' + x + ', ' + y + ', 0px)';\n                _.$slideTrack.css(positionProps);\n            }\n        }\n\n    };\n\n    Slick.prototype.setDimensions = function() {\n\n        var _ = this;\n\n        if (_.options.vertical === false) {\n            if (_.options.centerMode === true) {\n                _.$list.css({\n                    padding: ('0px ' + _.options.centerPadding)\n                });\n            }\n        } else {\n            _.$list.height(_.$slides.first().outerHeight(true) * _.options.slidesToShow);\n            if (_.options.centerMode === true) {\n                _.$list.css({\n                    padding: (_.options.centerPadding + ' 0px')\n                });\n            }\n        }\n\n        _.listWidth = _.$list.width();\n        _.listHeight = _.$list.height();\n\n\n        if (_.options.vertical === false && _.options.variableWidth === false) {\n            _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow);\n            _.$slideTrack.width(Math.ceil((_.slideWidth * _.$slideTrack.children('.slick-slide').length)));\n\n        } else if (_.options.variableWidth === true) {\n            _.$slideTrack.width(5000 * _.slideCount);\n        } else {\n            _.slideWidth = Math.ceil(_.listWidth);\n            _.$slideTrack.height(Math.ceil((_.$slides.first().outerHeight(true) * _.$slideTrack.children('.slick-slide').length)));\n        }\n\n        var offset = _.$slides.first().outerWidth(true) - _.$slides.first().width();\n        if (_.options.variableWidth === false) _.$slideTrack.children('.slick-slide').width(_.slideWidth - offset);\n\n    };\n\n    Slick.prototype.setFade = function() {\n\n        var _ = this,\n            targetLeft;\n\n        _.$slides.each(function(index, element) {\n            targetLeft = (_.slideWidth * index) * -1;\n            if (_.options.rtl === true) {\n                $(element).css({\n                    position: 'relative',\n                    right: targetLeft,\n                    top: 0,\n                    zIndex: _.options.zIndex - 2,\n                    opacity: 0\n                });\n            } else {\n                $(element).css({\n                    position: 'relative',\n                    left: targetLeft,\n                    top: 0,\n                    zIndex: _.options.zIndex - 2,\n                    opacity: 0\n                });\n            }\n        });\n\n        _.$slides.eq(_.currentSlide).css({\n            zIndex: _.options.zIndex - 1,\n            opacity: 1\n        });\n\n    };\n\n    Slick.prototype.setHeight = function() {\n\n        var _ = this;\n\n        if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {\n            var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);\n            _.$list.css('height', targetHeight);\n        }\n\n    };\n\n    Slick.prototype.setOption =\n    Slick.prototype.slickSetOption = function() {\n\n        /**\n         * accepts arguments in format of:\n         *\n         *  - for changing a single option's value:\n         *     .slick(\"setOption\", option, value, refresh )\n         *\n         *  - for changing a set of responsive options:\n         *     .slick(\"setOption\", 'responsive', [{}, ...], refresh )\n         *\n         *  - for updating multiple values at once (not responsive)\n         *     .slick(\"setOption\", { 'option': value, ... }, refresh )\n         */\n\n        var _ = this, l, item, option, value, refresh = false, type;\n\n        if( $.type( arguments[0] ) === 'object' ) {\n\n            option =  arguments[0];\n            refresh = arguments[1];\n            type = 'multiple';\n\n        } else if ( $.type( arguments[0] ) === 'string' ) {\n\n            option =  arguments[0];\n            value = arguments[1];\n            refresh = arguments[2];\n\n            if ( arguments[0] === 'responsive' && $.type( arguments[1] ) === 'array' ) {\n\n                type = 'responsive';\n\n            } else if ( typeof arguments[1] !== 'undefined' ) {\n\n                type = 'single';\n\n            }\n\n        }\n\n        if ( type === 'single' ) {\n\n            _.options[option] = value;\n\n\n        } else if ( type === 'multiple' ) {\n\n            $.each( option , function( opt, val ) {\n\n                _.options[opt] = val;\n\n            });\n\n\n        } else if ( type === 'responsive' ) {\n\n            for ( item in value ) {\n\n                if( $.type( _.options.responsive ) !== 'array' ) {\n\n                    _.options.responsive = [ value[item] ];\n\n                } else {\n\n                    l = _.options.responsive.length-1;\n\n                    // loop through the responsive object and splice out duplicates.\n                    while( l >= 0 ) {\n\n                        if( _.options.responsive[l].breakpoint === value[item].breakpoint ) {\n\n                            _.options.responsive.splice(l,1);\n\n                        }\n\n                        l--;\n\n                    }\n\n                    _.options.responsive.push( value[item] );\n\n                }\n\n            }\n\n        }\n\n        if ( refresh ) {\n\n            _.unload();\n            _.reinit();\n\n        }\n\n    };\n\n    Slick.prototype.setPosition = function() {\n\n        var _ = this;\n\n        _.setDimensions();\n\n        _.setHeight();\n\n        if (_.options.fade === false) {\n            _.setCSS(_.getLeft(_.currentSlide));\n        } else {\n            _.setFade();\n        }\n\n        _.$slider.trigger('setPosition', [_]);\n\n    };\n\n    Slick.prototype.setProps = function() {\n\n        var _ = this,\n            bodyStyle = document.body.style;\n\n        _.positionProp = _.options.vertical === true ? 'top' : 'left';\n\n        if (_.positionProp === 'top') {\n            _.$slider.addClass('slick-vertical');\n        } else {\n            _.$slider.removeClass('slick-vertical');\n        }\n\n        if (bodyStyle.WebkitTransition !== undefined ||\n            bodyStyle.MozTransition !== undefined ||\n            bodyStyle.msTransition !== undefined) {\n            if (_.options.useCSS === true) {\n                _.cssTransitions = true;\n            }\n        }\n\n        if ( _.options.fade ) {\n            if ( typeof _.options.zIndex === 'number' ) {\n                if( _.options.zIndex < 3 ) {\n                    _.options.zIndex = 3;\n                }\n            } else {\n                _.options.zIndex = _.defaults.zIndex;\n            }\n        }\n\n        if (bodyStyle.OTransform !== undefined) {\n            _.animType = 'OTransform';\n            _.transformType = '-o-transform';\n            _.transitionType = 'OTransition';\n            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;\n        }\n        if (bodyStyle.MozTransform !== undefined) {\n            _.animType = 'MozTransform';\n            _.transformType = '-moz-transform';\n            _.transitionType = 'MozTransition';\n            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.MozPerspective === undefined) _.animType = false;\n        }\n        if (bodyStyle.webkitTransform !== undefined) {\n            _.animType = 'webkitTransform';\n            _.transformType = '-webkit-transform';\n            _.transitionType = 'webkitTransition';\n            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;\n        }\n        if (bodyStyle.msTransform !== undefined) {\n            _.animType = 'msTransform';\n            _.transformType = '-ms-transform';\n            _.transitionType = 'msTransition';\n            if (bodyStyle.msTransform === undefined) _.animType = false;\n        }\n        if (bodyStyle.transform !== undefined && _.animType !== false) {\n            _.animType = 'transform';\n            _.transformType = 'transform';\n            _.transitionType = 'transition';\n        }\n        _.transformsEnabled = _.options.useTransform && (_.animType !== null && _.animType !== false);\n    };\n\n\n    Slick.prototype.setSlideClasses = function(index) {\n\n        var _ = this,\n            centerOffset, allSlides, indexOffset, remainder;\n\n        allSlides = _.$slider\n            .find('.slick-slide')\n            .removeClass('slick-active slick-center slick-current')\n            .attr('aria-hidden', 'true');\n\n        _.$slides\n            .eq(index)\n            .addClass('slick-current');\n\n        if (_.options.centerMode === true) {\n\n            var evenCoef = _.options.slidesToShow % 2 === 0 ? 1 : 0;\n\n            centerOffset = Math.floor(_.options.slidesToShow / 2);\n\n            if (_.options.infinite === true) {\n\n                if (index >= centerOffset && index <= (_.slideCount - 1) - centerOffset) {\n                    _.$slides\n                        .slice(index - centerOffset + evenCoef, index + centerOffset + 1)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                } else {\n\n                    indexOffset = _.options.slidesToShow + index;\n                    allSlides\n                        .slice(indexOffset - centerOffset + 1 + evenCoef, indexOffset + centerOffset + 2)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                }\n\n                if (index === 0) {\n\n                    allSlides\n                        .eq(allSlides.length - 1 - _.options.slidesToShow)\n                        .addClass('slick-center');\n\n                } else if (index === _.slideCount - 1) {\n\n                    allSlides\n                        .eq(_.options.slidesToShow)\n                        .addClass('slick-center');\n\n                }\n\n            }\n\n            _.$slides\n                .eq(index)\n                .addClass('slick-center');\n\n        } else {\n\n            if (index >= 0 && index <= (_.slideCount - _.options.slidesToShow)) {\n\n                _.$slides\n                    .slice(index, index + _.options.slidesToShow)\n                    .addClass('slick-active')\n                    .attr('aria-hidden', 'false');\n\n            } else if (allSlides.length <= _.options.slidesToShow) {\n\n                allSlides\n                    .addClass('slick-active')\n                    .attr('aria-hidden', 'false');\n\n            } else {\n\n                remainder = _.slideCount % _.options.slidesToShow;\n                indexOffset = _.options.infinite === true ? _.options.slidesToShow + index : index;\n\n                if (_.options.slidesToShow == _.options.slidesToScroll && (_.slideCount - index) < _.options.slidesToShow) {\n\n                    allSlides\n                        .slice(indexOffset - (_.options.slidesToShow - remainder), indexOffset + remainder)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                } else {\n\n                    allSlides\n                        .slice(indexOffset, indexOffset + _.options.slidesToShow)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                }\n\n            }\n\n        }\n\n        if (_.options.lazyLoad === 'ondemand' || _.options.lazyLoad === 'anticipated') {\n            _.lazyLoad();\n        }\n    };\n\n    Slick.prototype.setupInfinite = function() {\n\n        var _ = this,\n            i, slideIndex, infiniteCount;\n\n        if (_.options.fade === true) {\n            _.options.centerMode = false;\n        }\n\n        if (_.options.infinite === true && _.options.fade === false) {\n\n            slideIndex = null;\n\n            if (_.slideCount > _.options.slidesToShow) {\n\n                if (_.options.centerMode === true) {\n                    infiniteCount = _.options.slidesToShow + 1;\n                } else {\n                    infiniteCount = _.options.slidesToShow;\n                }\n\n                for (i = _.slideCount; i > (_.slideCount -\n                        infiniteCount); i -= 1) {\n                    slideIndex = i - 1;\n                    $(_.$slides[slideIndex]).clone(true).attr('id', '')\n                        .attr('data-slick-index', slideIndex - _.slideCount)\n                        .prependTo(_.$slideTrack).addClass('slick-cloned');\n                }\n                for (i = 0; i < infiniteCount  + _.slideCount; i += 1) {\n                    slideIndex = i;\n                    $(_.$slides[slideIndex]).clone(true).attr('id', '')\n                        .attr('data-slick-index', slideIndex + _.slideCount)\n                        .appendTo(_.$slideTrack).addClass('slick-cloned');\n                }\n                _.$slideTrack.find('.slick-cloned').find('[id]').each(function() {\n                    $(this).attr('id', '');\n                });\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.interrupt = function( toggle ) {\n\n        var _ = this;\n\n        if( !toggle ) {\n            _.autoPlay();\n        }\n        _.interrupted = toggle;\n\n    };\n\n    Slick.prototype.selectHandler = function(event) {\n\n        var _ = this;\n\n        var targetElement =\n            $(event.target).is('.slick-slide') ?\n                $(event.target) :\n                $(event.target).parents('.slick-slide');\n\n        var index = parseInt(targetElement.attr('data-slick-index'));\n\n        if (!index) index = 0;\n\n        if (_.slideCount <= _.options.slidesToShow) {\n\n            _.slideHandler(index, false, true);\n            return;\n\n        }\n\n        _.slideHandler(index);\n\n    };\n\n    Slick.prototype.slideHandler = function(index, sync, dontAnimate) {\n\n        var targetSlide, animSlide, oldSlide, slideLeft, targetLeft = null,\n            _ = this, navTarget;\n\n        sync = sync || false;\n\n        if (_.animating === true && _.options.waitForAnimate === true) {\n            return;\n        }\n\n        if (_.options.fade === true && _.currentSlide === index) {\n            return;\n        }\n\n        if (sync === false) {\n            _.asNavFor(index);\n        }\n\n        targetSlide = index;\n        targetLeft = _.getLeft(targetSlide);\n        slideLeft = _.getLeft(_.currentSlide);\n\n        _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft;\n\n        if (_.options.infinite === false && _.options.centerMode === false && (index < 0 || index > _.getDotCount() * _.options.slidesToScroll)) {\n            if (_.options.fade === false) {\n                targetSlide = _.currentSlide;\n                if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n                    _.animateSlide(slideLeft, function() {\n                        _.postSlide(targetSlide);\n                    });\n                } else {\n                    _.postSlide(targetSlide);\n                }\n            }\n            return;\n        } else if (_.options.infinite === false && _.options.centerMode === true && (index < 0 || index > (_.slideCount - _.options.slidesToScroll))) {\n            if (_.options.fade === false) {\n                targetSlide = _.currentSlide;\n                if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n                    _.animateSlide(slideLeft, function() {\n                        _.postSlide(targetSlide);\n                    });\n                } else {\n                    _.postSlide(targetSlide);\n                }\n            }\n            return;\n        }\n\n        if ( _.options.autoplay ) {\n            clearInterval(_.autoPlayTimer);\n        }\n\n        if (targetSlide < 0) {\n            if (_.slideCount % _.options.slidesToScroll !== 0) {\n                animSlide = _.slideCount - (_.slideCount % _.options.slidesToScroll);\n            } else {\n                animSlide = _.slideCount + targetSlide;\n            }\n        } else if (targetSlide >= _.slideCount) {\n            if (_.slideCount % _.options.slidesToScroll !== 0) {\n                animSlide = 0;\n            } else {\n                animSlide = targetSlide - _.slideCount;\n            }\n        } else {\n            animSlide = targetSlide;\n        }\n\n        _.animating = true;\n\n        _.$slider.trigger('beforeChange', [_, _.currentSlide, animSlide]);\n\n        oldSlide = _.currentSlide;\n        _.currentSlide = animSlide;\n\n        _.setSlideClasses(_.currentSlide);\n\n        if ( _.options.asNavFor ) {\n\n            navTarget = _.getNavTarget();\n            navTarget = navTarget.slick('getSlick');\n\n            if ( navTarget.slideCount <= navTarget.options.slidesToShow ) {\n                navTarget.setSlideClasses(_.currentSlide);\n            }\n\n        }\n\n        _.updateDots();\n        _.updateArrows();\n\n        if (_.options.fade === true) {\n            if (dontAnimate !== true) {\n\n                _.fadeSlideOut(oldSlide);\n\n                _.fadeSlide(animSlide, function() {\n                    _.postSlide(animSlide);\n                });\n\n            } else {\n                _.postSlide(animSlide);\n            }\n            _.animateHeight();\n            return;\n        }\n\n        if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n            _.animateSlide(targetLeft, function() {\n                _.postSlide(animSlide);\n            });\n        } else {\n            _.postSlide(animSlide);\n        }\n\n    };\n\n    Slick.prototype.startLoad = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$prevArrow.hide();\n            _.$nextArrow.hide();\n\n        }\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$dots.hide();\n\n        }\n\n        _.$slider.addClass('slick-loading');\n\n    };\n\n    Slick.prototype.swipeDirection = function() {\n\n        var xDist, yDist, r, swipeAngle, _ = this;\n\n        xDist = _.touchObject.startX - _.touchObject.curX;\n        yDist = _.touchObject.startY - _.touchObject.curY;\n        r = Math.atan2(yDist, xDist);\n\n        swipeAngle = Math.round(r * 180 / Math.PI);\n        if (swipeAngle < 0) {\n            swipeAngle = 360 - Math.abs(swipeAngle);\n        }\n\n        if ((swipeAngle <= 45) && (swipeAngle >= 0)) {\n            return (_.options.rtl === false ? 'left' : 'right');\n        }\n        if ((swipeAngle <= 360) && (swipeAngle >= 315)) {\n            return (_.options.rtl === false ? 'left' : 'right');\n        }\n        if ((swipeAngle >= 135) && (swipeAngle <= 225)) {\n            return (_.options.rtl === false ? 'right' : 'left');\n        }\n        if (_.options.verticalSwiping === true) {\n            if ((swipeAngle >= 35) && (swipeAngle <= 135)) {\n                return 'down';\n            } else {\n                return 'up';\n            }\n        }\n\n        return 'vertical';\n\n    };\n\n    Slick.prototype.swipeEnd = function(event) {\n\n        var _ = this,\n            slideCount,\n            direction;\n\n        _.dragging = false;\n        _.swiping = false;\n\n        if (_.scrolling) {\n            _.scrolling = false;\n            return false;\n        }\n\n        _.interrupted = false;\n        _.shouldClick = ( _.touchObject.swipeLength > 10 ) ? false : true;\n\n        if ( _.touchObject.curX === undefined ) {\n            return false;\n        }\n\n        if ( _.touchObject.edgeHit === true ) {\n            _.$slider.trigger('edge', [_, _.swipeDirection() ]);\n        }\n\n        if ( _.touchObject.swipeLength >= _.touchObject.minSwipe ) {\n\n            direction = _.swipeDirection();\n\n            switch ( direction ) {\n\n                case 'left':\n                case 'down':\n\n                    slideCount =\n                        _.options.swipeToSlide ?\n                            _.checkNavigable( _.currentSlide + _.getSlideCount() ) :\n                            _.currentSlide + _.getSlideCount();\n\n                    _.currentDirection = 0;\n\n                    break;\n\n                case 'right':\n                case 'up':\n\n                    slideCount =\n                        _.options.swipeToSlide ?\n                            _.checkNavigable( _.currentSlide - _.getSlideCount() ) :\n                            _.currentSlide - _.getSlideCount();\n\n                    _.currentDirection = 1;\n\n                    break;\n\n                default:\n\n\n            }\n\n            if( direction != 'vertical' ) {\n\n                _.slideHandler( slideCount );\n                _.touchObject = {};\n                _.$slider.trigger('swipe', [_, direction ]);\n\n            }\n\n        } else {\n\n            if ( _.touchObject.startX !== _.touchObject.curX ) {\n\n                _.slideHandler( _.currentSlide );\n                _.touchObject = {};\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.swipeHandler = function(event) {\n\n        var _ = this;\n\n        if ((_.options.swipe === false) || ('ontouchend' in document && _.options.swipe === false)) {\n            return;\n        } else if (_.options.draggable === false && event.type.indexOf('mouse') !== -1) {\n            return;\n        }\n\n        _.touchObject.fingerCount = event.originalEvent && event.originalEvent.touches !== undefined ?\n            event.originalEvent.touches.length : 1;\n\n        _.touchObject.minSwipe = _.listWidth / _.options\n            .touchThreshold;\n\n        if (_.options.verticalSwiping === true) {\n            _.touchObject.minSwipe = _.listHeight / _.options\n                .touchThreshold;\n        }\n\n        switch (event.data.action) {\n\n            case 'start':\n                _.swipeStart(event);\n                break;\n\n            case 'move':\n                _.swipeMove(event);\n                break;\n\n            case 'end':\n                _.swipeEnd(event);\n                break;\n\n        }\n\n    };\n\n    Slick.prototype.swipeMove = function(event) {\n\n        var _ = this,\n            edgeWasHit = false,\n            curLeft, swipeDirection, swipeLength, positionOffset, touches, verticalSwipeLength;\n\n        touches = event.originalEvent !== undefined ? event.originalEvent.touches : null;\n\n        if (!_.dragging || _.scrolling || touches && touches.length !== 1) {\n            return false;\n        }\n\n        curLeft = _.getLeft(_.currentSlide);\n\n        _.touchObject.curX = touches !== undefined ? touches[0].pageX : event.clientX;\n        _.touchObject.curY = touches !== undefined ? touches[0].pageY : event.clientY;\n\n        _.touchObject.swipeLength = Math.round(Math.sqrt(\n            Math.pow(_.touchObject.curX - _.touchObject.startX, 2)));\n\n        verticalSwipeLength = Math.round(Math.sqrt(\n            Math.pow(_.touchObject.curY - _.touchObject.startY, 2)));\n\n        if (!_.options.verticalSwiping && !_.swiping && verticalSwipeLength > 4) {\n            _.scrolling = true;\n            return false;\n        }\n\n        if (_.options.verticalSwiping === true) {\n            _.touchObject.swipeLength = verticalSwipeLength;\n        }\n\n        swipeDirection = _.swipeDirection();\n\n        if (event.originalEvent !== undefined && _.touchObject.swipeLength > 4) {\n            _.swiping = true;\n            event.preventDefault();\n        }\n\n        positionOffset = (_.options.rtl === false ? 1 : -1) * (_.touchObject.curX > _.touchObject.startX ? 1 : -1);\n        if (_.options.verticalSwiping === true) {\n            positionOffset = _.touchObject.curY > _.touchObject.startY ? 1 : -1;\n        }\n\n\n        swipeLength = _.touchObject.swipeLength;\n\n        _.touchObject.edgeHit = false;\n\n        if (_.options.infinite === false) {\n            if ((_.currentSlide === 0 && swipeDirection === 'right') || (_.currentSlide >= _.getDotCount() && swipeDirection === 'left')) {\n                swipeLength = _.touchObject.swipeLength * _.options.edgeFriction;\n                _.touchObject.edgeHit = true;\n            }\n        }\n\n        if (_.options.vertical === false) {\n            _.swipeLeft = curLeft + swipeLength * positionOffset;\n        } else {\n            _.swipeLeft = curLeft + (swipeLength * (_.$list.height() / _.listWidth)) * positionOffset;\n        }\n        if (_.options.verticalSwiping === true) {\n            _.swipeLeft = curLeft + swipeLength * positionOffset;\n        }\n\n        if (_.options.fade === true || _.options.touchMove === false) {\n            return false;\n        }\n\n        if (_.animating === true) {\n            _.swipeLeft = null;\n            return false;\n        }\n\n        _.setCSS(_.swipeLeft);\n\n    };\n\n    Slick.prototype.swipeStart = function(event) {\n\n        var _ = this,\n            touches;\n\n        _.interrupted = true;\n\n        if (_.touchObject.fingerCount !== 1 || _.slideCount <= _.options.slidesToShow) {\n            _.touchObject = {};\n            return false;\n        }\n\n        if (event.originalEvent !== undefined && event.originalEvent.touches !== undefined) {\n            touches = event.originalEvent.touches[0];\n        }\n\n        _.touchObject.startX = _.touchObject.curX = touches !== undefined ? touches.pageX : event.clientX;\n        _.touchObject.startY = _.touchObject.curY = touches !== undefined ? touches.pageY : event.clientY;\n\n        _.dragging = true;\n\n    };\n\n    Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter = function() {\n\n        var _ = this;\n\n        if (_.$slidesCache !== null) {\n\n            _.unload();\n\n            _.$slideTrack.children(this.options.slide).detach();\n\n            _.$slidesCache.appendTo(_.$slideTrack);\n\n            _.reinit();\n\n        }\n\n    };\n\n    Slick.prototype.unload = function() {\n\n        var _ = this;\n\n        $('.slick-cloned', _.$slider).remove();\n\n        if (_.$dots) {\n            _.$dots.remove();\n        }\n\n        if (_.$prevArrow && _.htmlExpr.test(_.options.prevArrow)) {\n            _.$prevArrow.remove();\n        }\n\n        if (_.$nextArrow && _.htmlExpr.test(_.options.nextArrow)) {\n            _.$nextArrow.remove();\n        }\n\n        _.$slides\n            .removeClass('slick-slide slick-active slick-visible slick-current')\n            .attr('aria-hidden', 'true')\n            .css('width', '');\n\n    };\n\n    Slick.prototype.unslick = function(fromBreakpoint) {\n\n        var _ = this;\n        _.$slider.trigger('unslick', [_, fromBreakpoint]);\n        _.destroy();\n\n    };\n\n    Slick.prototype.updateArrows = function() {\n\n        var _ = this,\n            centerOffset;\n\n        centerOffset = Math.floor(_.options.slidesToShow / 2);\n\n        if ( _.options.arrows === true &&\n            _.slideCount > _.options.slidesToShow &&\n            !_.options.infinite ) {\n\n            _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n            _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            if (_.currentSlide === 0) {\n\n                _.$prevArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n                _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow && _.options.centerMode === false) {\n\n                _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n                _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            } else if (_.currentSlide >= _.slideCount - 1 && _.options.centerMode === true) {\n\n                _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n                _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.updateDots = function() {\n\n        var _ = this;\n\n        if (_.$dots !== null) {\n\n            _.$dots\n                .find('li')\n                    .removeClass('slick-active')\n                    .end();\n\n            _.$dots\n                .find('li')\n                .eq(Math.floor(_.currentSlide / _.options.slidesToScroll))\n                .addClass('slick-active');\n\n        }\n\n    };\n\n    Slick.prototype.visibility = function() {\n\n        var _ = this;\n\n        if ( _.options.autoplay ) {\n\n            if ( document[_.hidden] ) {\n\n                _.interrupted = true;\n\n            } else {\n\n                _.interrupted = false;\n\n            }\n\n        }\n\n    };\n\n    $.fn.slick = function() {\n        var _ = this,\n            opt = arguments[0],\n            args = Array.prototype.slice.call(arguments, 1),\n            l = _.length,\n            i,\n            ret;\n        for (i = 0; i < l; i++) {\n            if (typeof opt == 'object' || typeof opt == 'undefined')\n                _[i].slick = new Slick(_[i], opt);\n            else\n                ret = _[i].slick[opt].apply(_[i].slick, args);\n            if (typeof ret != 'undefined') return ret;\n        }\n        return _;\n    };\n\n}));\n\n/*!\n * JavaScript Cookie v2.2.1\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader;\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction decode (s) {\n\t\treturn s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api() {}\n\n\t\tfunction set (key, value, attributes) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattributes = extend({\n\t\t\t\tpath: '/'\n\t\t\t}, api.defaults, attributes);\n\n\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\tattributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);\n\t\t\t}\n\n\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\ttry {\n\t\t\t\tvar result = JSON.stringify(value);\n\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\tvalue = result;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\n\t\t\tvalue = converter.write ?\n\t\t\t\tconverter.write(value, key) :\n\t\t\t\tencodeURIComponent(String(value))\n\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n\t\t\tkey = encodeURIComponent(String(key))\n\t\t\t\t.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)\n\t\t\t\t.replace(/[\\(\\)]/g, escape);\n\n\t\t\tvar stringifiedAttributes = '';\n\t\t\tfor (var attributeName in attributes) {\n\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Considers RFC 6265 section 5.2:\n\t\t\t\t// ...\n\t\t\t\t// 3.  If the remaining unparsed-attributes contains a %x3B (\";\")\n\t\t\t\t//     character:\n\t\t\t\t// Consume the characters of the unparsed-attributes up to,\n\t\t\t\t// not including, the first %x3B (\";\") character.\n\t\t\t\t// ...\n\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n\t\t\t}\n\n\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t}\n\n\t\tfunction get (key, json) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jar = {};\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all.\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = decode(parts[0]);\n\t\t\t\t\tcookie = (converter.read || converter)(cookie, name) ||\n\t\t\t\t\t\tdecode(cookie);\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tjar[name] = cookie;\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn key ? jar[key] : jar;\n\t\t}\n\n\t\tapi.set = set;\n\t\tapi.get = function (key) {\n\t\t\treturn get(key, false /* read as raw */);\n\t\t};\n\t\tapi.getJSON = function (key) {\n\t\t\treturn get(key, true /* read as json */);\n\t\t};\n\t\tapi.remove = function (key, attributes) {\n\t\t\tset(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.defaults = {};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n\n/**\n * sifter.js\n * Copyright (c) 2013 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\n(function(root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine('sifter', factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.Sifter = factory();\n\t}\n}(this, function() {\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tvar Sifter = function(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t * @param {string} query\n\t * @returns {array}\n\t */\n\tSifter.prototype.tokenize = function(query) {\n\t\tquery = trim(String(query || '').toLowerCase());\n\t\tif (!query || !query.length) return [];\n\n\t\tvar i, n, regex, letter;\n\t\tvar tokens = [];\n\t\tvar words = query.split(/ +/);\n\n\t\tfor (i = 0, n = words.length; i < n; i++) {\n\t\t\tregex = escape_regex(words[i]);\n\t\t\tif (this.settings.diacritics) {\n\t\t\t\tfor (letter in DIACRITICS) {\n\t\t\t\t\tif (DIACRITICS.hasOwnProperty(letter)) {\n\t\t\t\t\t\tregex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttokens.push({\n\t\t\t\tstring : words[i],\n\t\t\t\tregex  : new RegExp(regex, 'i')\n\t\t\t});\n\t\t}\n\n\t\treturn tokens;\n\t};\n\n\t/**\n\t * Iterates over arrays and hashes.\n\t *\n\t * ```\n\t * this.iterator(this.items, function(item, id) {\n\t *    // invoked for each item\n\t * });\n\t * ```\n\t *\n\t * @param {array|object} object\n\t */\n\tSifter.prototype.iterator = function(object, callback) {\n\t\tvar iterator;\n\t\tif (is_array(object)) {\n\t\t\titerator = Array.prototype.forEach || function(callback) {\n\t\t\t\tfor (var i = 0, n = this.length; i < n; i++) {\n\t\t\t\t\tcallback(this[i], i, this);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\titerator = function(callback) {\n\t\t\t\tfor (var key in this) {\n\t\t\t\t\tif (this.hasOwnProperty(key)) {\n\t\t\t\t\t\tcallback(this[key], key, this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\titerator.apply(object, [callback]);\n\t};\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @param {object|string} search\n\t * @param {object} options (optional)\n\t * @returns {function}\n\t */\n\tSifter.prototype.getScoreFunction = function(search, options) {\n\t\tvar self, fields, tokens, token_count, nesting;\n\n\t\tself        = this;\n\t\tsearch      = self.prepareSearch(search, options);\n\t\ttokens      = search.tokens;\n\t\tfields      = search.options.fields;\n\t\ttoken_count = tokens.length;\n\t\tnesting     = search.options.nesting;\n\n\t\t/**\n\t\t * Calculates how close of a match the\n\t\t * given value is against a search token.\n\t\t *\n\t\t * @param {mixed} value\n\t\t * @param {object} token\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreValue = function(value, token) {\n\t\t\tvar score, pos;\n\n\t\t\tif (!value) return 0;\n\t\t\tvalue = String(value || '');\n\t\t\tpos = value.search(token.regex);\n\t\t\tif (pos === -1) return 0;\n\t\t\tscore = token.string.length / value.length;\n\t\t\tif (pos === 0) score += 0.5;\n\t\t\treturn score;\n\t\t};\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {object} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreObject = (function() {\n\t\t\tvar field_count = fields.length;\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token, data) {\n\t\t\t\t\treturn scoreValue(getattr(data, fields[0], nesting), token);\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn function(token, data) {\n\t\t\t\tfor (var i = 0, sum = 0; i < field_count; i++) {\n\t\t\t\t\tsum += scoreValue(getattr(data, fields[i], nesting), token);\n\t\t\t\t}\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar score;\n\t\t\t\tfor (var i = 0, sum = 0; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tfor (var i = 0, sum = 0; i < token_count; i++) {\n\t\t\t\t\tsum += scoreObject(tokens[i], data);\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @param {string|object} search\n\t * @param {object} options\n\t * @return function(a,b)\n\t */\n\tSifter.prototype.getSortFunction = function(search, options) {\n\t\tvar i, n, self, field, fields, fields_count, multiplier, multipliers, get_field, implicit_score, sort;\n\n\t\tself   = this;\n\t\tsearch = self.prepareSearch(search, options);\n\t\tsort   = (!search.query && options.sort_empty) || options.sort;\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param  {string} name\n\t\t * @param  {object} result\n\t\t * @return {mixed}\n\t\t */\n\t\tget_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn getattr(self.items[result.id], name, options.nesting);\n\t\t};\n\n\t\t// parse options\n\t\tfields = [];\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tfields.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = fields.length; i < n; i++) {\n\t\t\t\tif (fields[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tfields.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = fields.length; i < n; i++) {\n\t\t\t\tif (fields[i].field === '$score') {\n\t\t\t\t\tfields.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmultipliers = [];\n\t\tfor (i = 0, n = fields.length; i < n; i++) {\n\t\t\tmultipliers.push(fields[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tfields_count = fields.length;\n\t\tif (!fields_count) {\n\t\t\treturn null;\n\t\t} else if (fields_count === 1) {\n\t\t\tfield = fields[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(field, a),\n\t\t\t\t\tget_field(field, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, a_value, b_value, field;\n\t\t\t\tfor (i = 0; i < fields_count; i++) {\n\t\t\t\t\tfield = fields[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t * @param {string} query\n\t * @param {object} options\n\t * @returns {object}\n\t */\n\tSifter.prototype.prepareSearch = function(query, options) {\n\t\tif (typeof query === 'object') return query;\n\n\t\toptions = extend({}, options);\n\n\t\tvar option_fields     = options.fields;\n\t\tvar option_sort       = options.sort;\n\t\tvar option_sort_empty = options.sort_empty;\n\n\t\tif (option_fields && !is_array(option_fields)) options.fields = [option_fields];\n\t\tif (option_sort && !is_array(option_sort)) options.sort = [option_sort];\n\t\tif (option_sort_empty && !is_array(option_sort_empty)) options.sort_empty = [option_sort_empty];\n\n\t\treturn {\n\t\t\toptions : options,\n\t\t\tquery   : String(query || '').toLowerCase(),\n\t\t\ttokens  : this.tokenize(query),\n\t\t\ttotal   : 0,\n\t\t\titems   : []\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t * The `options` parameter can contain:\n\t *\n\t *   - fields {string|array}\n\t *   - sort {array}\n\t *   - score {function}\n\t *   - filter {bool}\n\t *   - limit {integer}\n\t *\n\t * Returns an object containing:\n\t *\n\t *   - options {object}\n\t *   - query {string}\n\t *   - tokens {array}\n\t *   - total {int}\n\t *   - items {array}\n\t *\n\t * @param {string} query\n\t * @param {object} options\n\t * @returns {object}\n\t */\n\tSifter.prototype.search = function(query, options) {\n\t\tvar self = this, value, score, search, calculateScore;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch  = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery   = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self.getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\tself.iterator(self.items, function(item, id) {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tself.iterator(self.items, function(item, id) {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self.getSortFunction(search, options);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n\n\t// utilities\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n\tvar cmp = function(a, b) {\n\t\tif (typeof a === 'number' && typeof b === 'number') {\n\t\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t\t}\n\t\ta = asciifold(String(a || ''));\n\t\tb = asciifold(String(b || ''));\n\t\tif (a > b) return 1;\n\t\tif (b > a) return -1;\n\t\treturn 0;\n\t};\n\n\tvar extend = function(a, b) {\n\t\tvar i, n, k, object;\n\t\tfor (i = 1, n = arguments.length; i < n; i++) {\n\t\t\tobject = arguments[i];\n\t\t\tif (!object) continue;\n\t\t\tfor (k in object) {\n\t\t\t\tif (object.hasOwnProperty(k)) {\n\t\t\t\t\ta[k] = object[k];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn a;\n\t};\n\n\t/**\n\t * A property getter resolving dot-notation\n\t * @param  {Object}  obj     The root object to fetch property on\n\t * @param  {String}  name    The optionally dotted property name to fetch\n\t * @param  {Boolean} nesting Handle nesting or not\n\t * @return {Object}          The resolved property value\n\t */\n\tvar getattr = function(obj, name, nesting) {\n\t    if (!obj || !name) return;\n\t    if (!nesting) return obj[name];\n\t    var names = name.split(\".\");\n\t    while(names.length && (obj = obj[names.shift()]));\n\t    return obj;\n\t};\n\n\tvar trim = function(str) {\n\t\treturn (str + '').replace(/^\\s+|\\s+$|/g, '');\n\t};\n\n\tvar escape_regex = function(str) {\n\t\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n\t};\n\n\tvar is_array = Array.isArray || (typeof $ !== 'undefined' && $.isArray) || function(object) {\n\t\treturn Object.prototype.toString.call(object) === '[object Array]';\n\t};\n\n\tvar DIACRITICS = {\n\t\t'a': '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]',\n\t\t'b': '[b␢βΒB฿𐌁ᛒ]',\n\t\t'c': '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄＣｃ]',\n\t\t'd': '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅＤｄð]',\n\t\t'e': '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇＥｅɘǝƏƐε]',\n\t\t'f': '[fƑƒḞḟ]',\n\t\t'g': '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]',\n\t\t'h': '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]',\n\t\t'i': '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪＩｉ]',\n\t\t'j': '[jȷĴĵɈɉʝɟʲ]',\n\t\t'k': '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]',\n\t\t'l': '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟＬｌ]',\n\t\t'n': '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴＮｎŊŋ]',\n\t\t'o': '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]',\n\t\t'p': '[pṔṕṖṗⱣᵽƤƥᵱ]',\n\t\t'q': '[qꝖꝗʠɊɋꝘꝙq̃]',\n\t\t'r': '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]',\n\t\t's': '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]',\n\t\t't': '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]',\n\t\t'u': '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]',\n\t\t'v': '[vṼṽṾṿƲʋꝞꝟⱱʋ]',\n\t\t'w': '[wẂẃẀẁŴŵẄẅẆẇẈẉ]',\n\t\t'x': '[xẌẍẊẋχ]',\n\t\t'y': '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]',\n\t\t'z': '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]'\n\t};\n\n\tvar asciifold = (function() {\n\t\tvar i, n, k, chunk;\n\t\tvar foreignletters = '';\n\t\tvar lookup = {};\n\t\tfor (k in DIACRITICS) {\n\t\t\tif (DIACRITICS.hasOwnProperty(k)) {\n\t\t\t\tchunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1);\n\t\t\t\tforeignletters += chunk;\n\t\t\t\tfor (i = 0, n = chunk.length; i < n; i++) {\n\t\t\t\t\tlookup[chunk.charAt(i)] = k;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvar regexp = new RegExp('[' +  foreignletters + ']', 'g');\n\t\treturn function(str) {\n\t\t\treturn str.replace(regexp, function(foreignletter) {\n\t\t\t\treturn lookup[foreignletter];\n\t\t\t}).toLowerCase();\n\t\t};\n\t})();\n\n\n\t// export\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n\treturn Sifter;\n}));\n\n\n\n/**\n * microplugin.js\n * Copyright (c) 2013 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\n(function(root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine('microplugin', factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.MicroPlugin = factory();\n\t}\n}(this, function() {\n\tvar MicroPlugin = {};\n\n\tMicroPlugin.mixin = function(Interface) {\n\t\tInterface.plugins = {};\n\n\t\t/**\n\t\t * Initializes the listed plugins (with options).\n\t\t * Acceptable formats:\n\t\t *\n\t\t * List (without options):\n\t\t *   ['a', 'b', 'c']\n\t\t *\n\t\t * List (with options):\n\t\t *   [{'name': 'a', options: {}}, {'name': 'b', options: {}}]\n\t\t *\n\t\t * Hash (with options):\n\t\t *   {'a': { ... }, 'b': { ... }, 'c': { ... }}\n\t\t *\n\t\t * @param {mixed} plugins\n\t\t */\n\t\tInterface.prototype.initializePlugins = function(plugins) {\n\t\t\tvar i, n, key;\n\t\t\tvar self  = this;\n\t\t\tvar queue = [];\n\n\t\t\tself.plugins = {\n\t\t\t\tnames     : [],\n\t\t\t\tsettings  : {},\n\t\t\t\trequested : {},\n\t\t\t\tloaded    : {}\n\t\t\t};\n\n\t\t\tif (utils.isArray(plugins)) {\n\t\t\t\tfor (i = 0, n = plugins.length; i < n; i++) {\n\t\t\t\t\tif (typeof plugins[i] === 'string') {\n\t\t\t\t\t\tqueue.push(plugins[i]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.plugins.settings[plugins[i].name] = plugins[i].options;\n\t\t\t\t\t\tqueue.push(plugins[i].name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (plugins) {\n\t\t\t\tfor (key in plugins) {\n\t\t\t\t\tif (plugins.hasOwnProperty(key)) {\n\t\t\t\t\t\tself.plugins.settings[key] = plugins[key];\n\t\t\t\t\t\tqueue.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile (queue.length) {\n\t\t\t\tself.require(queue.shift());\n\t\t\t}\n\t\t};\n\n\t\tInterface.prototype.loadPlugin = function(name) {\n\t\t\tvar self    = this;\n\t\t\tvar plugins = self.plugins;\n\t\t\tvar plugin  = Interface.plugins[name];\n\n\t\t\tif (!Interface.plugins.hasOwnProperty(name)) {\n\t\t\t\tthrow new Error('Unable to find \"' +  name + '\" plugin');\n\t\t\t}\n\n\t\t\tplugins.requested[name] = true;\n\t\t\tplugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);\n\t\t\tplugins.names.push(name);\n\t\t};\n\n\t\t/**\n\t\t * Initializes a plugin.\n\t\t *\n\t\t * @param {string} name\n\t\t */\n\t\tInterface.prototype.require = function(name) {\n\t\t\tvar self = this;\n\t\t\tvar plugins = self.plugins;\n\n\t\t\tif (!self.plugins.loaded.hasOwnProperty(name)) {\n\t\t\t\tif (plugins.requested[name]) {\n\t\t\t\t\tthrow new Error('Plugin has circular dependency (\"' + name + '\")');\n\t\t\t\t}\n\t\t\t\tself.loadPlugin(name);\n\t\t\t}\n\n\t\t\treturn plugins.loaded[name];\n\t\t};\n\n\t\t/**\n\t\t * Registers a plugin.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {function} fn\n\t\t */\n\t\tInterface.define = function(name, fn) {\n\t\t\tInterface.plugins[name] = {\n\t\t\t\t'name' : name,\n\t\t\t\t'fn'   : fn\n\t\t\t};\n\t\t};\n\t};\n\n\tvar utils = {\n\t\tisArray: Array.isArray || function(vArg) {\n\t\t\treturn Object.prototype.toString.call(vArg) === '[object Array]';\n\t\t}\n\t};\n\n\treturn MicroPlugin;\n}));\n\n/**\n * selectize.js (v0.12.6)\n * Copyright (c) 2013–2015 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\n/*jshint curly:false */\n/*jshint browser:true */\n\n(function(root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine('selectize', ['jquery','sifter','microplugin'], factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory(require('jquery'), require('sifter'), require('microplugin'));\n\t} else {\n\t\troot.Selectize = factory(root.jQuery, root.Sifter, root.MicroPlugin);\n\t}\n}(this, function($, Sifter, MicroPlugin) {\n\t'use strict';\n\n\tvar highlight = function($element, pattern) {\n\t\tif (typeof pattern === 'string' && !pattern.length) return;\n\t\tvar regex = (typeof pattern === 'string') ? new RegExp(pattern, 'i') : pattern;\n\t\n\t\tvar highlight = function(node) {\n\t\t\tvar skip = 0;\n\t\t\t// Wrap matching part of text node with highlighting <span>, e.g.\n\t\t\t// Soccer  ->  <span class=\"highlight\">Soc</span>cer  for regex = /soc/i\n\t\t\tif (node.nodeType === 3) {\n\t\t\t\tvar pos = node.data.search(regex);\n\t\t\t\tif (pos >= 0 && node.data.length > 0) {\n\t\t\t\t\tvar match = node.data.match(regex);\n\t\t\t\t\tvar spannode = document.createElement('span');\n\t\t\t\t\tspannode.className = 'highlight';\n\t\t\t\t\tvar middlebit = node.splitText(pos);\n\t\t\t\t\tvar endbit = middlebit.splitText(match[0].length);\n\t\t\t\t\tvar middleclone = middlebit.cloneNode(true);\n\t\t\t\t\tspannode.appendChild(middleclone);\n\t\t\t\t\tmiddlebit.parentNode.replaceChild(spannode, middlebit);\n\t\t\t\t\tskip = 1;\n\t\t\t\t}\n\t\t\t} \n\t\t\t// Recurse element node, looking for child text nodes to highlight, unless element \n\t\t\t// is childless, <script>, <style>, or already highlighted: <span class=\"hightlight\">\n\t\t\telse if (node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName) && ( node.className !== 'highlight' || node.tagName !== 'SPAN' )) {\n\t\t\t\tfor (var i = 0; i < node.childNodes.length; ++i) {\n\t\t\t\t\ti += highlight(node.childNodes[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn skip;\n\t\t};\n\t\n\t\treturn $element.each(function() {\n\t\t\thighlight(this);\n\t\t});\n\t};\n\t\n\t/**\n\t * removeHighlight fn copied from highlight v5 and\n\t * edited to remove with() and pass js strict mode\n\t */\n\t$.fn.removeHighlight = function() {\n\t\treturn this.find(\"span.highlight\").each(function() {\n\t\t\tthis.parentNode.firstChild.nodeName;\n\t\t\tvar parent = this.parentNode;\n\t\t\tparent.replaceChild(this.firstChild, this);\n\t\t\tparent.normalize();\n\t\t}).end();\n\t};\n\t\n\t\n\tvar MicroEvent = function() {};\n\tMicroEvent.prototype = {\n\t\ton: function(event, fct){\n\t\t\tthis._events = this._events || {};\n\t\t\tthis._events[event] = this._events[event] || [];\n\t\t\tthis._events[event].push(fct);\n\t\t},\n\t\toff: function(event, fct){\n\t\t\tvar n = arguments.length;\n\t\t\tif (n === 0) return delete this._events;\n\t\t\tif (n === 1) return delete this._events[event];\n\t\n\t\t\tthis._events = this._events || {};\n\t\t\tif (event in this._events === false) return;\n\t\t\tthis._events[event].splice(this._events[event].indexOf(fct), 1);\n\t\t},\n\t\ttrigger: function(event /* , args... */){\n\t\t\tthis._events = this._events || {};\n\t\t\tif (event in this._events === false) return;\n\t\t\tfor (var i = 0; i < this._events[event].length; i++){\n\t\t\t\tthis._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t\t}\n\t\t}\n\t};\n\t\n\t/**\n\t * Mixin will delegate all MicroEvent.js function in the destination object.\n\t *\n\t * - MicroEvent.mixin(Foobar) will make Foobar able to use MicroEvent\n\t *\n\t * @param {object} the object which will support MicroEvent\n\t */\n\tMicroEvent.mixin = function(destObject){\n\t\tvar props = ['on', 'off', 'trigger'];\n\t\tfor (var i = 0; i < props.length; i++){\n\t\t\tdestObject.prototype[props[i]] = MicroEvent.prototype[props[i]];\n\t\t}\n\t};\n\t\n\tvar IS_MAC        = /Mac/.test(navigator.userAgent);\n\t\n\tvar KEY_A         = 65;\n\tvar KEY_COMMA     = 188;\n\tvar KEY_RETURN    = 13;\n\tvar KEY_ESC       = 27;\n\tvar KEY_LEFT      = 37;\n\tvar KEY_UP        = 38;\n\tvar KEY_P         = 80;\n\tvar KEY_RIGHT     = 39;\n\tvar KEY_DOWN      = 40;\n\tvar KEY_N         = 78;\n\tvar KEY_BACKSPACE = 8;\n\tvar KEY_DELETE    = 46;\n\tvar KEY_SHIFT     = 16;\n\tvar KEY_CMD       = IS_MAC ? 91 : 17;\n\tvar KEY_CTRL      = IS_MAC ? 18 : 17;\n\tvar KEY_TAB       = 9;\n\t\n\tvar TAG_SELECT    = 1;\n\tvar TAG_INPUT     = 2;\n\t\n\t// for now, android support in general is too spotty to support validity\n\tvar SUPPORTS_VALIDITY_API = !/android/i.test(window.navigator.userAgent) && !!document.createElement('input').validity;\n\t\n\t\n\tvar isset = function(object) {\n\t\treturn typeof object !== 'undefined';\n\t};\n\t\n\t/**\n\t * Converts a scalar to its best string representation\n\t * for hash keys and HTML attribute values.\n\t *\n\t * Transformations:\n\t *   'str'     -> 'str'\n\t *   null      -> ''\n\t *   undefined -> ''\n\t *   true      -> '1'\n\t *   false     -> '0'\n\t *   0         -> '0'\n\t *   1         -> '1'\n\t *\n\t * @param {string} value\n\t * @returns {string|null}\n\t */\n\tvar hash_key = function(value) {\n\t\tif (typeof value === 'undefined' || value === null) return null;\n\t\tif (typeof value === 'boolean') return value ? '1' : '0';\n\t\treturn value + '';\n\t};\n\t\n\t/**\n\t * Escapes a string for use within HTML.\n\t *\n\t * @param {string} str\n\t * @returns {string}\n\t */\n\tvar escape_html = function(str) {\n\t\treturn (str + '')\n\t\t\t.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;');\n\t};\n\t\n\t/**\n\t * Escapes \"$\" characters in replacement strings.\n\t *\n\t * @param {string} str\n\t * @returns {string}\n\t */\n\tvar escape_replace = function(str) {\n\t\treturn (str + '').replace(/\\$/g, '$$$$');\n\t};\n\t\n\tvar hook = {};\n\t\n\t/**\n\t * Wraps `method` on `self` so that `fn`\n\t * is invoked before the original method.\n\t *\n\t * @param {object} self\n\t * @param {string} method\n\t * @param {function} fn\n\t */\n\thook.before = function(self, method, fn) {\n\t\tvar original = self[method];\n\t\tself[method] = function() {\n\t\t\tfn.apply(self, arguments);\n\t\t\treturn original.apply(self, arguments);\n\t\t};\n\t};\n\t\n\t/**\n\t * Wraps `method` on `self` so that `fn`\n\t * is invoked after the original method.\n\t *\n\t * @param {object} self\n\t * @param {string} method\n\t * @param {function} fn\n\t */\n\thook.after = function(self, method, fn) {\n\t\tvar original = self[method];\n\t\tself[method] = function() {\n\t\t\tvar result = original.apply(self, arguments);\n\t\t\tfn.apply(self, arguments);\n\t\t\treturn result;\n\t\t};\n\t};\n\t\n\t/**\n\t * Wraps `fn` so that it can only be invoked once.\n\t *\n\t * @param {function} fn\n\t * @returns {function}\n\t */\n\tvar once = function(fn) {\n\t\tvar called = false;\n\t\treturn function() {\n\t\t\tif (called) return;\n\t\t\tcalled = true;\n\t\t\tfn.apply(this, arguments);\n\t\t};\n\t};\n\t\n\t/**\n\t * Wraps `fn` so that it can only be called once\n\t * every `delay` milliseconds (invoked on the falling edge).\n\t *\n\t * @param {function} fn\n\t * @param {int} delay\n\t * @returns {function}\n\t */\n\tvar debounce = function(fn, delay) {\n\t\tvar timeout;\n\t\treturn function() {\n\t\t\tvar self = this;\n\t\t\tvar args = arguments;\n\t\t\twindow.clearTimeout(timeout);\n\t\t\ttimeout = window.setTimeout(function() {\n\t\t\t\tfn.apply(self, args);\n\t\t\t}, delay);\n\t\t};\n\t};\n\t\n\t/**\n\t * Debounce all fired events types listed in `types`\n\t * while executing the provided `fn`.\n\t *\n\t * @param {object} self\n\t * @param {array} types\n\t * @param {function} fn\n\t */\n\tvar debounce_events = function(self, types, fn) {\n\t\tvar type;\n\t\tvar trigger = self.trigger;\n\t\tvar event_args = {};\n\t\n\t\t// override trigger method\n\t\tself.trigger = function() {\n\t\t\tvar type = arguments[0];\n\t\t\tif (types.indexOf(type) !== -1) {\n\t\t\t\tevent_args[type] = arguments;\n\t\t\t} else {\n\t\t\t\treturn trigger.apply(self, arguments);\n\t\t\t}\n\t\t};\n\t\n\t\t// invoke provided function\n\t\tfn.apply(self, []);\n\t\tself.trigger = trigger;\n\t\n\t\t// trigger queued events\n\t\tfor (type in event_args) {\n\t\t\tif (event_args.hasOwnProperty(type)) {\n\t\t\t\ttrigger.apply(self, event_args[type]);\n\t\t\t}\n\t\t}\n\t};\n\t\n\t/**\n\t * A workaround for http://bugs.jquery.com/ticket/6696\n\t *\n\t * @param {object} $parent - Parent element to listen on.\n\t * @param {string} event - Event name.\n\t * @param {string} selector - Descendant selector to filter by.\n\t * @param {function} fn - Event handler.\n\t */\n\tvar watchChildEvent = function($parent, event, selector, fn) {\n\t\t$parent.on(event, selector, function(e) {\n\t\t\tvar child = e.target;\n\t\t\twhile (child && child.parentNode !== $parent[0]) {\n\t\t\t\tchild = child.parentNode;\n\t\t\t}\n\t\t\te.currentTarget = child;\n\t\t\treturn fn.apply(this, [e]);\n\t\t});\n\t};\n\t\n\t/**\n\t * Determines the current selection within a text input control.\n\t * Returns an object containing:\n\t *   - start\n\t *   - length\n\t *\n\t * @param {object} input\n\t * @returns {object}\n\t */\n\tvar getSelection = function(input) {\n\t\tvar result = {};\n\t\tif ('selectionStart' in input) {\n\t\t\tresult.start = input.selectionStart;\n\t\t\tresult.length = input.selectionEnd - result.start;\n\t\t} else if (document.selection) {\n\t\t\tinput.focus();\n\t\t\tvar sel = document.selection.createRange();\n\t\t\tvar selLen = document.selection.createRange().text.length;\n\t\t\tsel.moveStart('character', -input.value.length);\n\t\t\tresult.start = sel.text.length - selLen;\n\t\t\tresult.length = selLen;\n\t\t}\n\t\treturn result;\n\t};\n\t\n\t/**\n\t * Copies CSS properties from one element to another.\n\t *\n\t * @param {object} $from\n\t * @param {object} $to\n\t * @param {array} properties\n\t */\n\tvar transferStyles = function($from, $to, properties) {\n\t\tvar i, n, styles = {};\n\t\tif (properties) {\n\t\t\tfor (i = 0, n = properties.length; i < n; i++) {\n\t\t\t\tstyles[properties[i]] = $from.css(properties[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tstyles = $from.css();\n\t\t}\n\t\t$to.css(styles);\n\t};\n\t\n\t/**\n\t * Measures the width of a string within a\n\t * parent element (in pixels).\n\t *\n\t * @param {string} str\n\t * @param {object} $parent\n\t * @returns {int}\n\t */\n\tvar measureString = function(str, $parent) {\n\t\tif (!str) {\n\t\t\treturn 0;\n\t\t}\n\t\n\t\tif (!Selectize.$testInput) {\n\t\t\tSelectize.$testInput = $('<span />').css({\n\t\t\t\tposition: 'absolute',\n\t\t\t\ttop: -99999,\n\t\t\t\tleft: -99999,\n\t\t\t\twidth: 'auto',\n\t\t\t\tpadding: 0,\n\t\t\t\twhiteSpace: 'pre'\n\t\t\t}).appendTo('body');\n\t\t}\n\t\n\t\tSelectize.$testInput.text(str);\n\t\n\t\ttransferStyles($parent, Selectize.$testInput, [\n\t\t\t'letterSpacing',\n\t\t\t'fontSize',\n\t\t\t'fontFamily',\n\t\t\t'fontWeight',\n\t\t\t'textTransform'\n\t\t]);\n\t\n\t\treturn Selectize.$testInput.width();\n\t};\n\t\n\t/**\n\t * Sets up an input to grow horizontally as the user\n\t * types. If the value is changed manually, you can\n\t * trigger the \"update\" handler to resize:\n\t *\n\t * $input.trigger('update');\n\t *\n\t * @param {object} $input\n\t */\n\tvar autoGrow = function($input) {\n\t\tvar currentWidth = null;\n\t\n\t\tvar update = function(e, options) {\n\t\t\tvar value, keyCode, printable, placeholder, width;\n\t\t\tvar shift, character, selection;\n\t\t\te = e || window.event || {};\n\t\t\toptions = options || {};\n\t\n\t\t\tif (e.metaKey || e.altKey) return;\n\t\t\tif (!options.force && $input.data('grow') === false) return;\n\t\n\t\t\tvalue = $input.val();\n\t\t\tif (e.type && e.type.toLowerCase() === 'keydown') {\n\t\t\t\tkeyCode = e.keyCode;\n\t\t\t\tprintable = (\n\t\t\t\t\t(keyCode >= 48 && keyCode <= 57)  || // 0-9\n\t\t\t\t\t(keyCode >= 65 && keyCode <= 90)   || // a-z\n\t\t\t\t\t(keyCode >= 96 && keyCode <= 111)  || // numpad 0-9, numeric operators\n\t\t\t\t\t(keyCode >= 186 && keyCode <= 222) || // semicolon, equal, comma, dash, etc.\n\t\t\t\t\tkeyCode === 32 // space\n\t\t\t\t);\n\t\n\t\t\t\tif (keyCode === KEY_DELETE || keyCode === KEY_BACKSPACE) {\n\t\t\t\t\tselection = getSelection($input[0]);\n\t\t\t\t\tif (selection.length) {\n\t\t\t\t\t\tvalue = value.substring(0, selection.start) + value.substring(selection.start + selection.length);\n\t\t\t\t\t} else if (keyCode === KEY_BACKSPACE && selection.start) {\n\t\t\t\t\t\tvalue = value.substring(0, selection.start - 1) + value.substring(selection.start + 1);\n\t\t\t\t\t} else if (keyCode === KEY_DELETE && typeof selection.start !== 'undefined') {\n\t\t\t\t\t\tvalue = value.substring(0, selection.start) + value.substring(selection.start + 1);\n\t\t\t\t\t}\n\t\t\t\t} else if (printable) {\n\t\t\t\t\tshift = e.shiftKey;\n\t\t\t\t\tcharacter = String.fromCharCode(e.keyCode);\n\t\t\t\t\tif (shift) character = character.toUpperCase();\n\t\t\t\t\telse character = character.toLowerCase();\n\t\t\t\t\tvalue += character;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tplaceholder = $input.attr('placeholder');\n\t\t\tif (!value && placeholder) {\n\t\t\t\tvalue = placeholder;\n\t\t\t}\n\t\n\t\t\twidth = measureString(value, $input) + 4;\n\t\t\tif (width !== currentWidth) {\n\t\t\t\tcurrentWidth = width;\n\t\t\t\t$input.width(width);\n\t\t\t\t$input.triggerHandler('resize');\n\t\t\t}\n\t\t};\n\t\n\t\t$input.on('keydown keyup update blur', update);\n\t\tupdate();\n\t};\n\t\n\tvar domToString = function(d) {\n\t\tvar tmp = document.createElement('div');\n\t\n\t\ttmp.appendChild(d.cloneNode(true));\n\t\n\t\treturn tmp.innerHTML;\n\t};\n\t\n\tvar logError = function(message, options){\n\t\tif(!options) options = {};\n\t\tvar component = \"Selectize\";\n\t\n\t\tconsole.error(component + \": \" + message)\n\t\n\t\tif(options.explanation){\n\t\t\t// console.group is undefined in <IE11\n\t\t\tif(console.group) console.group();\n\t\t\tconsole.error(options.explanation);\n\t\t\tif(console.group) console.groupEnd();\n\t\t}\n\t}\n\t\n\t\n\tvar Selectize = function($input, settings) {\n\t\tvar key, i, n, dir, input, self = this;\n\t\tinput = $input[0];\n\t\tinput.selectize = self;\n\t\n\t\t// detect rtl environment\n\t\tvar computedStyle = window.getComputedStyle && window.getComputedStyle(input, null);\n\t\tdir = computedStyle ? computedStyle.getPropertyValue('direction') : input.currentStyle && input.currentStyle.direction;\n\t\tdir = dir || $input.parents('[dir]:first').attr('dir') || '';\n\t\n\t\t// setup default state\n\t\t$.extend(self, {\n\t\t\torder            : 0,\n\t\t\tsettings         : settings,\n\t\t\t$input           : $input,\n\t\t\ttabIndex         : $input.attr('tabindex') || '',\n\t\t\ttagType          : input.tagName.toLowerCase() === 'select' ? TAG_SELECT : TAG_INPUT,\n\t\t\trtl              : /rtl/i.test(dir),\n\t\n\t\t\teventNS          : '.selectize' + (++Selectize.count),\n\t\t\thighlightedValue : null,\n\t\t\tisBlurring       : false,\n\t\t\tisOpen           : false,\n\t\t\tisDisabled       : false,\n\t\t\tisRequired       : $input.is('[required]'),\n\t\t\tisInvalid        : false,\n\t\t\tisLocked         : false,\n\t\t\tisFocused        : false,\n\t\t\tisInputHidden    : false,\n\t\t\tisSetup          : false,\n\t\t\tisShiftDown      : false,\n\t\t\tisCmdDown        : false,\n\t\t\tisCtrlDown       : false,\n\t\t\tignoreFocus      : false,\n\t\t\tignoreBlur       : false,\n\t\t\tignoreHover      : false,\n\t\t\thasOptions       : false,\n\t\t\tcurrentResults   : null,\n\t\t\tlastValue        : '',\n\t\t\tcaretPos         : 0,\n\t\t\tloading          : 0,\n\t\t\tloadedSearches   : {},\n\t\n\t\t\t$activeOption    : null,\n\t\t\t$activeItems     : [],\n\t\n\t\t\toptgroups        : {},\n\t\t\toptions          : {},\n\t\t\tuserOptions      : {},\n\t\t\titems            : [],\n\t\t\trenderCache      : {},\n\t\t\tonSearchChange   : settings.loadThrottle === null ? self.onSearchChange : debounce(self.onSearchChange, settings.loadThrottle)\n\t\t});\n\t\n\t\t// search system\n\t\tself.sifter = new Sifter(this.options, {diacritics: settings.diacritics});\n\t\n\t\t// build options table\n\t\tif (self.settings.options) {\n\t\t\tfor (i = 0, n = self.settings.options.length; i < n; i++) {\n\t\t\t\tself.registerOption(self.settings.options[i]);\n\t\t\t}\n\t\t\tdelete self.settings.options;\n\t\t}\n\t\n\t\t// build optgroup table\n\t\tif (self.settings.optgroups) {\n\t\t\tfor (i = 0, n = self.settings.optgroups.length; i < n; i++) {\n\t\t\t\tself.registerOptionGroup(self.settings.optgroups[i]);\n\t\t\t}\n\t\t\tdelete self.settings.optgroups;\n\t\t}\n\t\n\t\t// option-dependent defaults\n\t\tself.settings.mode = self.settings.mode || (self.settings.maxItems === 1 ? 'single' : 'multi');\n\t\tif (typeof self.settings.hideSelected !== 'boolean') {\n\t\t\tself.settings.hideSelected = self.settings.mode === 'multi';\n\t\t}\n\t\n\t\tself.initializePlugins(self.settings.plugins);\n\t\tself.setupCallbacks();\n\t\tself.setupTemplates();\n\t\tself.setup();\n\t};\n\t\n\t// mixins\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\t\n\tMicroEvent.mixin(Selectize);\n\t\n\tif(typeof MicroPlugin !== \"undefined\"){\n\t\tMicroPlugin.mixin(Selectize);\n\t}else{\n\t\tlogError(\"Dependency MicroPlugin is missing\",\n\t\t\t{explanation:\n\t\t\t\t\"Make sure you either: (1) are using the \\\"standalone\\\" \"+\n\t\t\t\t\"version of Selectize, or (2) require MicroPlugin before you \"+\n\t\t\t\t\"load Selectize.\"}\n\t\t);\n\t}\n\t\n\t\n\t// methods\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\t\n\t$.extend(Selectize.prototype, {\n\t\n\t\t/**\n\t\t * Creates all elements and sets up event bindings.\n\t\t */\n\t\tsetup: function() {\n\t\t\tvar self      = this;\n\t\t\tvar settings  = self.settings;\n\t\t\tvar eventNS   = self.eventNS;\n\t\t\tvar $window   = $(window);\n\t\t\tvar $document = $(document);\n\t\t\tvar $input    = self.$input;\n\t\n\t\t\tvar $wrapper;\n\t\t\tvar $control;\n\t\t\tvar $control_input;\n\t\t\tvar $dropdown;\n\t\t\tvar $dropdown_content;\n\t\t\tvar $dropdown_parent;\n\t\t\tvar inputMode;\n\t\t\tvar timeout_blur;\n\t\t\tvar timeout_focus;\n\t\t\tvar classes;\n\t\t\tvar classes_plugins;\n\t\t\tvar inputId;\n\t\n\t\t\tinputMode         = self.settings.mode;\n\t\t\tclasses           = $input.attr('class') || '';\n\t\n\t\t\t$wrapper          = $('<div>').addClass(settings.wrapperClass).addClass(classes).addClass(inputMode);\n\t\t\t$control          = $('<div>').addClass(settings.inputClass).addClass('items').appendTo($wrapper);\n\t\t\t$control_input    = $('<input type=\"text\" autocomplete=\"off\" />').appendTo($control).attr('tabindex', $input.is(':disabled') ? '-1' : self.tabIndex);\n\t\t\t$dropdown_parent  = $(settings.dropdownParent || $wrapper);\n\t\t\t$dropdown         = $('<div>').addClass(settings.dropdownClass).addClass(inputMode).hide().appendTo($dropdown_parent);\n\t\t\t$dropdown_content = $('<div>').addClass(settings.dropdownContentClass).appendTo($dropdown);\n\t\n\t\t\tif(inputId = $input.attr('id')) {\n\t\t\t\t$control_input.attr('id', inputId + '-selectized');\n\t\t\t\t$(\"label[for='\"+inputId+\"']\").attr('for', inputId + '-selectized');\n\t\t\t}\n\t\n\t\t\tif(self.settings.copyClassesToDropdown) {\n\t\t\t\t$dropdown.addClass(classes);\n\t\t\t}\n\t\n\t\t\t$wrapper.css({\n\t\t\t\twidth: $input[0].style.width\n\t\t\t});\n\t\n\t\t\tif (self.plugins.names.length) {\n\t\t\t\tclasses_plugins = 'plugin-' + self.plugins.names.join(' plugin-');\n\t\t\t\t$wrapper.addClass(classes_plugins);\n\t\t\t\t$dropdown.addClass(classes_plugins);\n\t\t\t}\n\t\n\t\t\tif ((settings.maxItems === null || settings.maxItems > 1) && self.tagType === TAG_SELECT) {\n\t\t\t\t$input.attr('multiple', 'multiple');\n\t\t\t}\n\t\n\t\t\tif (self.settings.placeholder) {\n\t\t\t\t$control_input.attr('placeholder', settings.placeholder);\n\t\t\t}\n\t\n\t\t\t// if splitOn was not passed in, construct it from the delimiter to allow pasting universally\n\t\t\tif (!self.settings.splitOn && self.settings.delimiter) {\n\t\t\t\tvar delimiterEscaped = self.settings.delimiter.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\t\tself.settings.splitOn = new RegExp('\\\\s*' + delimiterEscaped + '+\\\\s*');\n\t\t\t}\n\t\n\t\t\tif ($input.attr('autocorrect')) {\n\t\t\t\t$control_input.attr('autocorrect', $input.attr('autocorrect'));\n\t\t\t}\n\t\n\t\t\tif ($input.attr('autocapitalize')) {\n\t\t\t\t$control_input.attr('autocapitalize', $input.attr('autocapitalize'));\n\t\t\t}\n\t\t\t$control_input[0].type = $input[0].type;\n\t\n\t\t\tself.$wrapper          = $wrapper;\n\t\t\tself.$control          = $control;\n\t\t\tself.$control_input    = $control_input;\n\t\t\tself.$dropdown         = $dropdown;\n\t\t\tself.$dropdown_content = $dropdown_content;\n\t\n\t\t\t$dropdown.on('mouseenter mousedown click', '[data-disabled]>[data-selectable]', function(e) { e.stopImmediatePropagation(); });\n\t\t\t$dropdown.on('mouseenter', '[data-selectable]', function() { return self.onOptionHover.apply(self, arguments); });\n\t\t\t$dropdown.on('mousedown click', '[data-selectable]', function() { return self.onOptionSelect.apply(self, arguments); });\n\t\t\twatchChildEvent($control, 'mousedown', '*:not(input)', function() { return self.onItemSelect.apply(self, arguments); });\n\t\t\tautoGrow($control_input);\n\t\n\t\t\t$control.on({\n\t\t\t\tmousedown : function() { return self.onMouseDown.apply(self, arguments); },\n\t\t\t\tclick     : function() { return self.onClick.apply(self, arguments); }\n\t\t\t});\n\t\n\t\t\t$control_input.on({\n\t\t\t\tmousedown : function(e) { e.stopPropagation(); },\n\t\t\t\tkeydown   : function() { return self.onKeyDown.apply(self, arguments); },\n\t\t\t\tkeyup     : function() { return self.onKeyUp.apply(self, arguments); },\n\t\t\t\tkeypress  : function() { return self.onKeyPress.apply(self, arguments); },\n\t\t\t\tresize    : function() { self.positionDropdown.apply(self, []); },\n\t\t\t\tblur      : function() { return self.onBlur.apply(self, arguments); },\n\t\t\t\tfocus     : function() { self.ignoreBlur = false; return self.onFocus.apply(self, arguments); },\n\t\t\t\tpaste     : function() { return self.onPaste.apply(self, arguments); }\n\t\t\t});\n\t\n\t\t\t$document.on('keydown' + eventNS, function(e) {\n\t\t\t\tself.isCmdDown = e[IS_MAC ? 'metaKey' : 'ctrlKey'];\n\t\t\t\tself.isCtrlDown = e[IS_MAC ? 'altKey' : 'ctrlKey'];\n\t\t\t\tself.isShiftDown = e.shiftKey;\n\t\t\t});\n\t\n\t\t\t$document.on('keyup' + eventNS, function(e) {\n\t\t\t\tif (e.keyCode === KEY_CTRL) self.isCtrlDown = false;\n\t\t\t\tif (e.keyCode === KEY_SHIFT) self.isShiftDown = false;\n\t\t\t\tif (e.keyCode === KEY_CMD) self.isCmdDown = false;\n\t\t\t});\n\t\n\t\t\t$document.on('mousedown' + eventNS, function(e) {\n\t\t\t\tif (self.isFocused) {\n\t\t\t\t\t// prevent events on the dropdown scrollbar from causing the control to blur\n\t\t\t\t\tif (e.target === self.$dropdown[0] || e.target.parentNode === self.$dropdown[0]) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t// blur on click outside\n\t\t\t\t\tif (!self.$control.has(e.target).length && e.target !== self.$control[0]) {\n\t\t\t\t\t\tself.blur(e.target);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\t$window.on(['scroll' + eventNS, 'resize' + eventNS].join(' '), function() {\n\t\t\t\tif (self.isOpen) {\n\t\t\t\t\tself.positionDropdown.apply(self, arguments);\n\t\t\t\t}\n\t\t\t});\n\t\t\t$window.on('mousemove' + eventNS, function() {\n\t\t\t\tself.ignoreHover = false;\n\t\t\t});\n\t\n\t\t\t// store original children and tab index so that they can be\n\t\t\t// restored when the destroy() method is called.\n\t\t\tthis.revertSettings = {\n\t\t\t\t$children : $input.children().detach(),\n\t\t\t\ttabindex  : $input.attr('tabindex')\n\t\t\t};\n\t\n\t\t\t$input.attr('tabindex', -1).hide().after(self.$wrapper);\n\t\n\t\t\tif ($.isArray(settings.items)) {\n\t\t\t\tself.setValue(settings.items);\n\t\t\t\tdelete settings.items;\n\t\t\t}\n\t\n\t\t\t// feature detect for the validation API\n\t\t\tif (SUPPORTS_VALIDITY_API) {\n\t\t\t\t$input.on('invalid' + eventNS, function(e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tself.isInvalid = true;\n\t\t\t\t\tself.refreshState();\n\t\t\t\t});\n\t\t\t}\n\t\n\t\t\tself.updateOriginalInput();\n\t\t\tself.refreshItems();\n\t\t\tself.refreshState();\n\t\t\tself.updatePlaceholder();\n\t\t\tself.isSetup = true;\n\t\n\t\t\tif ($input.is(':disabled')) {\n\t\t\t\tself.disable();\n\t\t\t}\n\t\n\t\t\tself.on('change', this.onChange);\n\t\n\t\t\t$input.data('selectize', self);\n\t\t\t$input.addClass('selectized');\n\t\t\tself.trigger('initialize');\n\t\n\t\t\t// preload options\n\t\t\tif (settings.preload === true) {\n\t\t\t\tself.onSearchChange('');\n\t\t\t}\n\t\n\t\t},\n\t\n\t\t/**\n\t\t * Sets up default rendering functions.\n\t\t */\n\t\tsetupTemplates: function() {\n\t\t\tvar self = this;\n\t\t\tvar field_label = self.settings.labelField;\n\t\t\tvar field_optgroup = self.settings.optgroupLabelField;\n\t\n\t\t\tvar templates = {\n\t\t\t\t'optgroup': function(data) {\n\t\t\t\t\treturn '<div class=\"optgroup\">' + data.html + '</div>';\n\t\t\t\t},\n\t\t\t\t'optgroup_header': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"optgroup-header\">' + escape(data[field_optgroup]) + '</div>';\n\t\t\t\t},\n\t\t\t\t'option': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"option\">' + escape(data[field_label]) + '</div>';\n\t\t\t\t},\n\t\t\t\t'item': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"item\">' + escape(data[field_label]) + '</div>';\n\t\t\t\t},\n\t\t\t\t'option_create': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"create\">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>';\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\tself.settings.render = $.extend({}, templates, self.settings.render);\n\t\t},\n\t\n\t\t/**\n\t\t * Maps fired events to callbacks provided\n\t\t * in the settings used when creating the control.\n\t\t */\n\t\tsetupCallbacks: function() {\n\t\t\tvar key, fn, callbacks = {\n\t\t\t\t'initialize'      : 'onInitialize',\n\t\t\t\t'change'          : 'onChange',\n\t\t\t\t'item_add'        : 'onItemAdd',\n\t\t\t\t'item_remove'     : 'onItemRemove',\n\t\t\t\t'clear'           : 'onClear',\n\t\t\t\t'option_add'      : 'onOptionAdd',\n\t\t\t\t'option_remove'   : 'onOptionRemove',\n\t\t\t\t'option_clear'    : 'onOptionClear',\n\t\t\t\t'optgroup_add'    : 'onOptionGroupAdd',\n\t\t\t\t'optgroup_remove' : 'onOptionGroupRemove',\n\t\t\t\t'optgroup_clear'  : 'onOptionGroupClear',\n\t\t\t\t'dropdown_open'   : 'onDropdownOpen',\n\t\t\t\t'dropdown_close'  : 'onDropdownClose',\n\t\t\t\t'type'            : 'onType',\n\t\t\t\t'load'            : 'onLoad',\n\t\t\t\t'focus'           : 'onFocus',\n\t\t\t\t'blur'            : 'onBlur'\n\t\t\t};\n\t\n\t\t\tfor (key in callbacks) {\n\t\t\t\tif (callbacks.hasOwnProperty(key)) {\n\t\t\t\t\tfn = this.settings[callbacks[key]];\n\t\t\t\t\tif (fn) this.on(key, fn);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the main control element\n\t\t * has a click event.\n\t\t *\n\t\t * @param {object} e\n\t\t * @return {boolean}\n\t\t */\n\t\tonClick: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\t// necessary for mobile webkit devices (manual focus triggering\n\t\t\t// is ignored unless invoked within a click event)\n\t    // also necessary to reopen a dropdown that has been closed by\n\t    // closeAfterSelect\n\t\t\tif (!self.isFocused || !self.isOpen) {\n\t\t\t\tself.focus();\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the main control element\n\t\t * has a mouse down event.\n\t\t *\n\t\t * @param {object} e\n\t\t * @return {boolean}\n\t\t */\n\t\tonMouseDown: function(e) {\n\t\t\tvar self = this;\n\t\t\tvar defaultPrevented = e.isDefaultPrevented();\n\t\t\tvar $target = $(e.target);\n\t\n\t\t\tif (self.isFocused) {\n\t\t\t\t// retain focus by preventing native handling. if the\n\t\t\t\t// event target is the input it should not be modified.\n\t\t\t\t// otherwise, text selection within the input won't work.\n\t\t\t\tif (e.target !== self.$control_input[0]) {\n\t\t\t\t\tif (self.settings.mode === 'single') {\n\t\t\t\t\t\t// toggle dropdown\n\t\t\t\t\t\tself.isOpen ? self.close() : self.open();\n\t\t\t\t\t} else if (!defaultPrevented) {\n\t\t\t\t\t\tself.setActiveItem(null);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// give control focus\n\t\t\t\tif (!defaultPrevented) {\n\t\t\t\t\twindow.setTimeout(function() {\n\t\t\t\t\t\tself.focus();\n\t\t\t\t\t}, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the value of the control has been changed.\n\t\t * This should propagate the event to the original DOM\n\t\t * input / select element.\n\t\t */\n\t\tonChange: function() {\n\t\t\tthis.$input.trigger('change');\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> paste.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonPaste: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isFull() || self.isInputHidden || self.isLocked) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// If a regex or string is included, this will split the pasted\n\t\t\t// input and create Items for each separate value\n\t\t\tif (self.settings.splitOn) {\n\t\n\t\t\t\t// Wait for pasted text to be recognized in value\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tvar pastedText = self.$control_input.val();\n\t\t\t\t\tif(!pastedText.match(self.settings.splitOn)){ return }\n\t\n\t\t\t\t\tvar splitInput = $.trim(pastedText).split(self.settings.splitOn);\n\t\t\t\t\tfor (var i = 0, n = splitInput.length; i < n; i++) {\n\t\t\t\t\t\tself.createItem(splitInput[i]);\n\t\t\t\t\t}\n\t\t\t\t}, 0);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> keypress.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonKeyPress: function(e) {\n\t\t\tif (this.isLocked) return e && e.preventDefault();\n\t\t\tvar character = String.fromCharCode(e.keyCode || e.which);\n\t\t\tif (this.settings.create && this.settings.mode === 'multi' && character === this.settings.delimiter) {\n\t\t\t\tthis.createItem();\n\t\t\t\te.preventDefault();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> keydown.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonKeyDown: function(e) {\n\t\t\tvar isInput = e.target === this.$control_input[0];\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked) {\n\t\t\t\tif (e.keyCode !== KEY_TAB) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tswitch (e.keyCode) {\n\t\t\t\tcase KEY_A:\n\t\t\t\t\tif (self.isCmdDown) {\n\t\t\t\t\t\tself.selectAll();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase KEY_ESC:\n\t\t\t\t\tif (self.isOpen) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_N:\n\t\t\t\t\tif (!e.ctrlKey || e.altKey) break;\n\t\t\t\tcase KEY_DOWN:\n\t\t\t\t\tif (!self.isOpen && self.hasOptions) {\n\t\t\t\t\t\tself.open();\n\t\t\t\t\t} else if (self.$activeOption) {\n\t\t\t\t\t\tself.ignoreHover = true;\n\t\t\t\t\t\tvar $next = self.getAdjacentOption(self.$activeOption, 1);\n\t\t\t\t\t\tif ($next.length) self.setActiveOption($next, true, true);\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_P:\n\t\t\t\t\tif (!e.ctrlKey || e.altKey) break;\n\t\t\t\tcase KEY_UP:\n\t\t\t\t\tif (self.$activeOption) {\n\t\t\t\t\t\tself.ignoreHover = true;\n\t\t\t\t\t\tvar $prev = self.getAdjacentOption(self.$activeOption, -1);\n\t\t\t\t\t\tif ($prev.length) self.setActiveOption($prev, true, true);\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_RETURN:\n\t\t\t\t\tif (self.isOpen && self.$activeOption) {\n\t\t\t\t\t\tself.onOptionSelect({currentTarget: self.$activeOption});\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_LEFT:\n\t\t\t\t\tself.advanceSelection(-1, e);\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_RIGHT:\n\t\t\t\t\tself.advanceSelection(1, e);\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_TAB:\n\t\t\t\t\tif (self.settings.selectOnTab && self.isOpen && self.$activeOption) {\n\t\t\t\t\t\tself.onOptionSelect({currentTarget: self.$activeOption});\n\t\n\t\t\t\t\t\t// Default behaviour is to jump to the next field, we only want this\n\t\t\t\t\t\t// if the current field doesn't accept any more entries\n\t\t\t\t\t\tif (!self.isFull()) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (self.settings.create && self.createItem()) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_BACKSPACE:\n\t\t\t\tcase KEY_DELETE:\n\t\t\t\t\tself.deleteSelection(e);\n\t\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tif ((self.isFull() || self.isInputHidden) && !(IS_MAC ? e.metaKey : e.ctrlKey)) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> keyup.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonKeyUp: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked) return e && e.preventDefault();\n\t\t\tvar value = self.$control_input.val() || '';\n\t\t\tif (self.lastValue !== value) {\n\t\t\t\tself.lastValue = value;\n\t\t\t\tself.onSearchChange(value);\n\t\t\t\tself.refreshOptions();\n\t\t\t\tself.trigger('type', value);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Invokes the user-provide option provider / loader.\n\t\t *\n\t\t * Note: this function is debounced in the Selectize\n\t\t * constructor (by `settings.loadThrottle` milliseconds)\n\t\t *\n\t\t * @param {string} value\n\t\t */\n\t\tonSearchChange: function(value) {\n\t\t\tvar self = this;\n\t\t\tvar fn = self.settings.load;\n\t\t\tif (!fn) return;\n\t\t\tif (self.loadedSearches.hasOwnProperty(value)) return;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tself.load(function(callback) {\n\t\t\t\tfn.apply(self, [value, callback]);\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> focus.\n\t\t *\n\t\t * @param {object} e (optional)\n\t\t * @returns {boolean}\n\t\t */\n\t\tonFocus: function(e) {\n\t\t\tvar self = this;\n\t\t\tvar wasFocused = self.isFocused;\n\t\n\t\t\tif (self.isDisabled) {\n\t\t\t\tself.blur();\n\t\t\t\te && e.preventDefault();\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\tif (self.ignoreFocus) return;\n\t\t\tself.isFocused = true;\n\t\t\tif (self.settings.preload === 'focus') self.onSearchChange('');\n\t\n\t\t\tif (!wasFocused) self.trigger('focus');\n\t\n\t\t\tif (!self.$activeItems.length) {\n\t\t\t\tself.showInput();\n\t\t\t\tself.setActiveItem(null);\n\t\t\t\tself.refreshOptions(!!self.settings.openOnFocus);\n\t\t\t}\n\t\n\t\t\tself.refreshState();\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> blur.\n\t\t *\n\t\t * @param {object} e\n\t\t * @param {Element} dest\n\t\t */\n\t\tonBlur: function(e, dest) {\n\t\t\tvar self = this;\n\t\t\tif (!self.isFocused) return;\n\t\t\tself.isFocused = false;\n\t\n\t\t\tif (self.ignoreFocus) {\n\t\t\t\treturn;\n\t\t\t} else if (!self.ignoreBlur && document.activeElement === self.$dropdown_content[0]) {\n\t\t\t\t// necessary to prevent IE closing the dropdown when the scrollbar is clicked\n\t\t\t\tself.ignoreBlur = true;\n\t\t\t\tself.onFocus(e);\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tvar deactivate = function() {\n\t\t\t\tself.close();\n\t\t\t\tself.setTextboxValue('');\n\t\t\t\tself.setActiveItem(null);\n\t\t\t\tself.setActiveOption(null);\n\t\t\t\tself.setCaret(self.items.length);\n\t\t\t\tself.refreshState();\n\t\n\t\t\t\t// IE11 bug: element still marked as active\n\t\t\t\tdest && dest.focus && dest.focus();\n\t\n\t\t\t\tself.isBlurring = false;\n\t\t\t\tself.ignoreFocus = false;\n\t\t\t\tself.trigger('blur');\n\t\t\t};\n\t\n\t\t\tself.isBlurring = true;\n\t\t\tself.ignoreFocus = true;\n\t\t\tif (self.settings.create && self.settings.createOnBlur) {\n\t\t\t\tself.createItem(null, false, deactivate);\n\t\t\t} else {\n\t\t\t\tdeactivate();\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the user rolls over\n\t\t * an option in the autocomplete dropdown menu.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonOptionHover: function(e) {\n\t\t\tif (this.ignoreHover) return;\n\t\t\tthis.setActiveOption(e.currentTarget, false);\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the user clicks on an option\n\t\t * in the autocomplete dropdown menu.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonOptionSelect: function(e) {\n\t\t\tvar value, $target, $option, self = this;\n\t\n\t\t\tif (e.preventDefault) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\n\t\t\t$target = $(e.currentTarget);\n\t\t\tif ($target.hasClass('create')) {\n\t\t\t\tself.createItem(null, function() {\n\t\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvalue = $target.attr('data-value');\n\t\t\t\tif (typeof value !== 'undefined') {\n\t\t\t\t\tself.lastQuery = null;\n\t\t\t\t\tself.setTextboxValue('');\n\t\t\t\t\tself.addItem(value);\n\t\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t} else if (!self.settings.hideSelected && e.type && /mouse/.test(e.type)) {\n\t\t\t\t\t\tself.setActiveOption(self.getOption(value));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the user clicks on an item\n\t\t * that has been selected.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonItemSelect: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked) return;\n\t\t\tif (self.settings.mode === 'multi') {\n\t\t\t\te.preventDefault();\n\t\t\t\tself.setActiveItem(e.currentTarget, e);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Invokes the provided method that provides\n\t\t * results to a callback---which are then added\n\t\t * as options to the control.\n\t\t *\n\t\t * @param {function} fn\n\t\t */\n\t\tload: function(fn) {\n\t\t\tvar self = this;\n\t\t\tvar $wrapper = self.$wrapper.addClass(self.settings.loadingClass);\n\t\n\t\t\tself.loading++;\n\t\t\tfn.apply(self, [function(results) {\n\t\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\t\tif (results && results.length) {\n\t\t\t\t\tself.addOption(results);\n\t\t\t\t\tself.refreshOptions(self.isFocused && !self.isInputHidden);\n\t\t\t\t}\n\t\t\t\tif (!self.loading) {\n\t\t\t\t\t$wrapper.removeClass(self.settings.loadingClass);\n\t\t\t\t}\n\t\t\t\tself.trigger('load', results);\n\t\t\t}]);\n\t\t},\n\t\n\t\t/**\n\t\t * Sets the input field of the control to the specified value.\n\t\t *\n\t\t * @param {string} value\n\t\t */\n\t\tsetTextboxValue: function(value) {\n\t\t\tvar $input = this.$control_input;\n\t\t\tvar changed = $input.val() !== value;\n\t\t\tif (changed) {\n\t\t\t\t$input.val(value).triggerHandler('update');\n\t\t\t\tthis.lastValue = value;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the value of the control. If multiple items\n\t\t * can be selected (e.g. <select multiple>), this returns\n\t\t * an array. If only one item can be selected, this\n\t\t * returns a string.\n\t\t *\n\t\t * @returns {mixed}\n\t\t */\n\t\tgetValue: function() {\n\t\t\tif (this.tagType === TAG_SELECT && this.$input.attr('multiple')) {\n\t\t\t\treturn this.items;\n\t\t\t} else {\n\t\t\t\treturn this.items.join(this.settings.delimiter);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Resets the selected items to the given value.\n\t\t *\n\t\t * @param {mixed} value\n\t\t */\n\t\tsetValue: function(value, silent) {\n\t\t\tvar events = silent ? [] : ['change'];\n\t\n\t\t\tdebounce_events(this, events, function() {\n\t\t\t\tthis.clear(silent);\n\t\t\t\tthis.addItems(value, silent);\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Sets the selected item.\n\t\t *\n\t\t * @param {object} $item\n\t\t * @param {object} e (optional)\n\t\t */\n\t\tsetActiveItem: function($item, e) {\n\t\t\tvar self = this;\n\t\t\tvar eventName;\n\t\t\tvar i, idx, begin, end, item, swap;\n\t\t\tvar $last;\n\t\n\t\t\tif (self.settings.mode === 'single') return;\n\t\t\t$item = $($item);\n\t\n\t\t\t// clear the active selection\n\t\t\tif (!$item.length) {\n\t\t\t\t$(self.$activeItems).removeClass('active');\n\t\t\t\tself.$activeItems = [];\n\t\t\t\tif (self.isFocused) {\n\t\t\t\t\tself.showInput();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// modify selection\n\t\t\teventName = e && e.type.toLowerCase();\n\t\n\t\t\tif (eventName === 'mousedown' && self.isShiftDown && self.$activeItems.length) {\n\t\t\t\t$last = self.$control.children('.active:last');\n\t\t\t\tbegin = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$last[0]]);\n\t\t\t\tend   = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$item[0]]);\n\t\t\t\tif (begin > end) {\n\t\t\t\t\tswap  = begin;\n\t\t\t\t\tbegin = end;\n\t\t\t\t\tend   = swap;\n\t\t\t\t}\n\t\t\t\tfor (i = begin; i <= end; i++) {\n\t\t\t\t\titem = self.$control[0].childNodes[i];\n\t\t\t\t\tif (self.$activeItems.indexOf(item) === -1) {\n\t\t\t\t\t\t$(item).addClass('active');\n\t\t\t\t\t\tself.$activeItems.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\te.preventDefault();\n\t\t\t} else if ((eventName === 'mousedown' && self.isCtrlDown) || (eventName === 'keydown' && this.isShiftDown)) {\n\t\t\t\tif ($item.hasClass('active')) {\n\t\t\t\t\tidx = self.$activeItems.indexOf($item[0]);\n\t\t\t\t\tself.$activeItems.splice(idx, 1);\n\t\t\t\t\t$item.removeClass('active');\n\t\t\t\t} else {\n\t\t\t\t\tself.$activeItems.push($item.addClass('active')[0]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$(self.$activeItems).removeClass('active');\n\t\t\t\tself.$activeItems = [$item.addClass('active')[0]];\n\t\t\t}\n\t\n\t\t\t// ensure control has focus\n\t\t\tself.hideInput();\n\t\t\tif (!this.isFocused) {\n\t\t\t\tself.focus();\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Sets the selected item in the dropdown menu\n\t\t * of available options.\n\t\t *\n\t\t * @param {object} $object\n\t\t * @param {boolean} scroll\n\t\t * @param {boolean} animate\n\t\t */\n\t\tsetActiveOption: function($option, scroll, animate) {\n\t\t\tvar height_menu, height_item, y;\n\t\t\tvar scroll_top, scroll_bottom;\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.$activeOption) self.$activeOption.removeClass('active');\n\t\t\tself.$activeOption = null;\n\t\n\t\t\t$option = $($option);\n\t\t\tif (!$option.length) return;\n\t\n\t\t\tself.$activeOption = $option.addClass('active');\n\t\n\t\t\tif (scroll || !isset(scroll)) {\n\t\n\t\t\t\theight_menu   = self.$dropdown_content.height();\n\t\t\t\theight_item   = self.$activeOption.outerHeight(true);\n\t\t\t\tscroll        = self.$dropdown_content.scrollTop() || 0;\n\t\t\t\ty             = self.$activeOption.offset().top - self.$dropdown_content.offset().top + scroll;\n\t\t\t\tscroll_top    = y;\n\t\t\t\tscroll_bottom = y - height_menu + height_item;\n\t\n\t\t\t\tif (y + height_item > height_menu + scroll) {\n\t\t\t\t\tself.$dropdown_content.stop().animate({scrollTop: scroll_bottom}, animate ? self.settings.scrollDuration : 0);\n\t\t\t\t} else if (y < scroll) {\n\t\t\t\t\tself.$dropdown_content.stop().animate({scrollTop: scroll_top}, animate ? self.settings.scrollDuration : 0);\n\t\t\t\t}\n\t\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Selects all items (CTRL + A).\n\t\t */\n\t\tselectAll: function() {\n\t\t\tvar self = this;\n\t\t\tif (self.settings.mode === 'single') return;\n\t\n\t\t\tself.$activeItems = Array.prototype.slice.apply(self.$control.children(':not(input)').addClass('active'));\n\t\t\tif (self.$activeItems.length) {\n\t\t\t\tself.hideInput();\n\t\t\t\tself.close();\n\t\t\t}\n\t\t\tself.focus();\n\t\t},\n\t\n\t\t/**\n\t\t * Hides the input element out of view, while\n\t\t * retaining its focus.\n\t\t */\n\t\thideInput: function() {\n\t\t\tvar self = this;\n\t\n\t\t\tself.setTextboxValue('');\n\t\t\tself.$control_input.css({opacity: 0, position: 'absolute', left: self.rtl ? 10000 : -10000});\n\t\t\tself.isInputHidden = true;\n\t\t},\n\t\n\t\t/**\n\t\t * Restores input visibility.\n\t\t */\n\t\tshowInput: function() {\n\t\t\tthis.$control_input.css({opacity: 1, position: 'relative', left: 0});\n\t\t\tthis.isInputHidden = false;\n\t\t},\n\t\n\t\t/**\n\t\t * Gives the control focus.\n\t\t */\n\t\tfocus: function() {\n\t\t\tvar self = this;\n\t\t\tif (self.isDisabled) return;\n\t\n\t\t\tself.ignoreFocus = true;\n\t\t\tself.$control_input[0].focus();\n\t\t\twindow.setTimeout(function() {\n\t\t\t\tself.ignoreFocus = false;\n\t\t\t\tself.onFocus();\n\t\t\t}, 0);\n\t\t},\n\t\n\t\t/**\n\t\t * Forces the control out of focus.\n\t\t *\n\t\t * @param {Element} dest\n\t\t */\n\t\tblur: function(dest) {\n\t\t\tthis.$control_input[0].blur();\n\t\t\tthis.onBlur(null, dest);\n\t\t},\n\t\n\t\t/**\n\t\t * Returns a function that scores an object\n\t\t * to show how good of a match it is to the\n\t\t * provided query.\n\t\t *\n\t\t * @param {string} query\n\t\t * @param {object} options\n\t\t * @return {function}\n\t\t */\n\t\tgetScoreFunction: function(query) {\n\t\t\treturn this.sifter.getScoreFunction(query, this.getSearchOptions());\n\t\t},\n\t\n\t\t/**\n\t\t * Returns search options for sifter (the system\n\t\t * for scoring and sorting results).\n\t\t *\n\t\t * @see https://github.com/brianreavis/sifter.js\n\t\t * @return {object}\n\t\t */\n\t\tgetSearchOptions: function() {\n\t\t\tvar settings = this.settings;\n\t\t\tvar sort = settings.sortField;\n\t\t\tif (typeof sort === 'string') {\n\t\t\t\tsort = [{field: sort}];\n\t\t\t}\n\t\n\t\t\treturn {\n\t\t\t\tfields      : settings.searchField,\n\t\t\t\tconjunction : settings.searchConjunction,\n\t\t\t\tsort        : sort,\n\t\t\t\tnesting     : settings.nesting\n\t\t\t};\n\t\t},\n\t\n\t\t/**\n\t\t * Searches through available options and returns\n\t\t * a sorted array of matches.\n\t\t *\n\t\t * Returns an object containing:\n\t\t *\n\t\t *   - query {string}\n\t\t *   - tokens {array}\n\t\t *   - total {int}\n\t\t *   - items {array}\n\t\t *\n\t\t * @param {string} query\n\t\t * @returns {object}\n\t\t */\n\t\tsearch: function(query) {\n\t\t\tvar i, value, score, result, calculateScore;\n\t\t\tvar self     = this;\n\t\t\tvar settings = self.settings;\n\t\t\tvar options  = this.getSearchOptions();\n\t\n\t\t\t// validate user-provided result scoring function\n\t\t\tif (settings.score) {\n\t\t\t\tcalculateScore = self.settings.score.apply(this, [query]);\n\t\t\t\tif (typeof calculateScore !== 'function') {\n\t\t\t\t\tthrow new Error('Selectize \"score\" setting must be a function that returns a function');\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// perform search\n\t\t\tif (query !== self.lastQuery) {\n\t\t\t\tself.lastQuery = query;\n\t\t\t\tresult = self.sifter.search(query, $.extend(options, {score: calculateScore}));\n\t\t\t\tself.currentResults = result;\n\t\t\t} else {\n\t\t\t\tresult = $.extend(true, {}, self.currentResults);\n\t\t\t}\n\t\n\t\t\t// filter out selected items\n\t\t\tif (settings.hideSelected) {\n\t\t\t\tfor (i = result.items.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (self.items.indexOf(hash_key(result.items[i].id)) !== -1) {\n\t\t\t\t\t\tresult.items.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn result;\n\t\t},\n\t\n\t\t/**\n\t\t * Refreshes the list of available options shown\n\t\t * in the autocomplete dropdown menu.\n\t\t *\n\t\t * @param {boolean} triggerDropdown\n\t\t */\n\t\trefreshOptions: function(triggerDropdown) {\n\t\t\tvar i, j, k, n, groups, groups_order, option, option_html, optgroup, optgroups, html, html_children, has_create_option;\n\t\t\tvar $active, $active_before, $create;\n\t\n\t\t\tif (typeof triggerDropdown === 'undefined') {\n\t\t\t\ttriggerDropdown = true;\n\t\t\t}\n\t\n\t\t\tvar self              = this;\n\t\t\tvar query             = $.trim(self.$control_input.val());\n\t\t\tvar results           = self.search(query);\n\t\t\tvar $dropdown_content = self.$dropdown_content;\n\t\t\tvar active_before     = self.$activeOption && hash_key(self.$activeOption.attr('data-value'));\n\t\n\t\t\t// build markup\n\t\t\tn = results.items.length;\n\t\t\tif (typeof self.settings.maxOptions === 'number') {\n\t\t\t\tn = Math.min(n, self.settings.maxOptions);\n\t\t\t}\n\t\n\t\t\t// render and group available options individually\n\t\t\tgroups = {};\n\t\t\tgroups_order = [];\n\t\n\t\t\tfor (i = 0; i < n; i++) {\n\t\t\t\toption      = self.options[results.items[i].id];\n\t\t\t\toption_html = self.render('option', option);\n\t\t\t\toptgroup    = option[self.settings.optgroupField] || '';\n\t\t\t\toptgroups   = $.isArray(optgroup) ? optgroup : [optgroup];\n\t\n\t\t\t\tfor (j = 0, k = optgroups && optgroups.length; j < k; j++) {\n\t\t\t\t\toptgroup = optgroups[j];\n\t\t\t\t\tif (!self.optgroups.hasOwnProperty(optgroup)) {\n\t\t\t\t\t\toptgroup = '';\n\t\t\t\t\t}\n\t\t\t\t\tif (!groups.hasOwnProperty(optgroup)) {\n\t\t\t\t\t\tgroups[optgroup] = document.createDocumentFragment();\n\t\t\t\t\t\tgroups_order.push(optgroup);\n\t\t\t\t\t}\n\t\t\t\t\tgroups[optgroup].appendChild(option_html);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// sort optgroups\n\t\t\tif (this.settings.lockOptgroupOrder) {\n\t\t\t\tgroups_order.sort(function(a, b) {\n\t\t\t\t\tvar a_order = self.optgroups[a].$order || 0;\n\t\t\t\t\tvar b_order = self.optgroups[b].$order || 0;\n\t\t\t\t\treturn a_order - b_order;\n\t\t\t\t});\n\t\t\t}\n\t\n\t\t\t// render optgroup headers & join groups\n\t\t\thtml = document.createDocumentFragment();\n\t\t\tfor (i = 0, n = groups_order.length; i < n; i++) {\n\t\t\t\toptgroup = groups_order[i];\n\t\t\t\tif (self.optgroups.hasOwnProperty(optgroup) && groups[optgroup].childNodes.length) {\n\t\t\t\t\t// render the optgroup header and options within it,\n\t\t\t\t\t// then pass it to the wrapper template\n\t\t\t\t\thtml_children = document.createDocumentFragment();\n\t\t\t\t\thtml_children.appendChild(self.render('optgroup_header', self.optgroups[optgroup]));\n\t\t\t\t\thtml_children.appendChild(groups[optgroup]);\n\t\n\t\t\t\t\thtml.appendChild(self.render('optgroup', $.extend({}, self.optgroups[optgroup], {\n\t\t\t\t\t\thtml: domToString(html_children),\n\t\t\t\t\t\tdom:  html_children\n\t\t\t\t\t})));\n\t\t\t\t} else {\n\t\t\t\t\thtml.appendChild(groups[optgroup]);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t$dropdown_content.html(html);\n\t\n\t\t\t// highlight matching terms inline\n\t\t\tif (self.settings.highlight) {\n\t\t\t\t$dropdown_content.removeHighlight();\n\t\t\t\tif (results.query.length && results.tokens.length) {\n\t\t\t\t\tfor (i = 0, n = results.tokens.length; i < n; i++) {\n\t\t\t\t\t\thighlight($dropdown_content, results.tokens[i].regex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// add \"selected\" class to selected options\n\t\t\tif (!self.settings.hideSelected) {\n\t\t\t\tfor (i = 0, n = self.items.length; i < n; i++) {\n\t\t\t\t\tself.getOption(self.items[i]).addClass('selected');\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// add create option\n\t\t\thas_create_option = self.canCreate(query);\n\t\t\tif (has_create_option) {\n\t\t\t\t$dropdown_content.prepend(self.render('option_create', {input: query}));\n\t\t\t\t$create = $($dropdown_content[0].childNodes[0]);\n\t\t\t}\n\t\n\t\t\t// activate\n\t\t\tself.hasOptions = results.items.length > 0 || has_create_option;\n\t\t\tif (self.hasOptions) {\n\t\t\t\tif (results.items.length > 0) {\n\t\t\t\t\t$active_before = active_before && self.getOption(active_before);\n\t\t\t\t\tif ($active_before && $active_before.length) {\n\t\t\t\t\t\t$active = $active_before;\n\t\t\t\t\t} else if (self.settings.mode === 'single' && self.items.length) {\n\t\t\t\t\t\t$active = self.getOption(self.items[0]);\n\t\t\t\t\t}\n\t\t\t\t\tif (!$active || !$active.length) {\n\t\t\t\t\t\tif ($create && !self.settings.addPrecedence) {\n\t\t\t\t\t\t\t$active = self.getAdjacentOption($create, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$active = $dropdown_content.find('[data-selectable]:first');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$active = $create;\n\t\t\t\t}\n\t\t\t\tself.setActiveOption($active);\n\t\t\t\tif (triggerDropdown && !self.isOpen) { self.open(); }\n\t\t\t} else {\n\t\t\t\tself.setActiveOption(null);\n\t\t\t\tif (triggerDropdown && self.isOpen) { self.close(); }\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Adds an available option. If it already exists,\n\t\t * nothing will happen. Note: this does not refresh\n\t\t * the options list dropdown (use `refreshOptions`\n\t\t * for that).\n\t\t *\n\t\t * Usage:\n\t\t *\n\t\t *   this.addOption(data)\n\t\t *\n\t\t * @param {object|array} data\n\t\t */\n\t\taddOption: function(data) {\n\t\t\tvar i, n, value, self = this;\n\t\n\t\t\tif ($.isArray(data)) {\n\t\t\t\tfor (i = 0, n = data.length; i < n; i++) {\n\t\t\t\t\tself.addOption(data[i]);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tif (value = self.registerOption(data)) {\n\t\t\t\tself.userOptions[value] = true;\n\t\t\t\tself.lastQuery = null;\n\t\t\t\tself.trigger('option_add', value, data);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Registers an option to the pool of options.\n\t\t *\n\t\t * @param {object} data\n\t\t * @return {boolean|string}\n\t\t */\n\t\tregisterOption: function(data) {\n\t\t\tvar key = hash_key(data[this.settings.valueField]);\n\t\t\tif (typeof key === 'undefined' || key === null || this.options.hasOwnProperty(key)) return false;\n\t\t\tdata.$order = data.$order || ++this.order;\n\t\t\tthis.options[key] = data;\n\t\t\treturn key;\n\t\t},\n\t\n\t\t/**\n\t\t * Registers an option group to the pool of option groups.\n\t\t *\n\t\t * @param {object} data\n\t\t * @return {boolean|string}\n\t\t */\n\t\tregisterOptionGroup: function(data) {\n\t\t\tvar key = hash_key(data[this.settings.optgroupValueField]);\n\t\t\tif (!key) return false;\n\t\n\t\t\tdata.$order = data.$order || ++this.order;\n\t\t\tthis.optgroups[key] = data;\n\t\t\treturn key;\n\t\t},\n\t\n\t\t/**\n\t\t * Registers a new optgroup for options\n\t\t * to be bucketed into.\n\t\t *\n\t\t * @param {string} id\n\t\t * @param {object} data\n\t\t */\n\t\taddOptionGroup: function(id, data) {\n\t\t\tdata[this.settings.optgroupValueField] = id;\n\t\t\tif (id = this.registerOptionGroup(data)) {\n\t\t\t\tthis.trigger('optgroup_add', id, data);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Removes an existing option group.\n\t\t *\n\t\t * @param {string} id\n\t\t */\n\t\tremoveOptionGroup: function(id) {\n\t\t\tif (this.optgroups.hasOwnProperty(id)) {\n\t\t\t\tdelete this.optgroups[id];\n\t\t\t\tthis.renderCache = {};\n\t\t\t\tthis.trigger('optgroup_remove', id);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Clears all existing option groups.\n\t\t */\n\t\tclearOptionGroups: function() {\n\t\t\tthis.optgroups = {};\n\t\t\tthis.renderCache = {};\n\t\t\tthis.trigger('optgroup_clear');\n\t\t},\n\t\n\t\t/**\n\t\t * Updates an option available for selection. If\n\t\t * it is visible in the selected items or options\n\t\t * dropdown, it will be re-rendered automatically.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {object} data\n\t\t */\n\t\tupdateOption: function(value, data) {\n\t\t\tvar self = this;\n\t\t\tvar $item, $item_new;\n\t\t\tvar value_new, index_item, cache_items, cache_options, order_old;\n\t\n\t\t\tvalue     = hash_key(value);\n\t\t\tvalue_new = hash_key(data[self.settings.valueField]);\n\t\n\t\t\t// sanity checks\n\t\t\tif (value === null) return;\n\t\t\tif (!self.options.hasOwnProperty(value)) return;\n\t\t\tif (typeof value_new !== 'string') throw new Error('Value must be set in option data');\n\t\n\t\t\torder_old = self.options[value].$order;\n\t\n\t\t\t// update references\n\t\t\tif (value_new !== value) {\n\t\t\t\tdelete self.options[value];\n\t\t\t\tindex_item = self.items.indexOf(value);\n\t\t\t\tif (index_item !== -1) {\n\t\t\t\t\tself.items.splice(index_item, 1, value_new);\n\t\t\t\t}\n\t\t\t}\n\t\t\tdata.$order = data.$order || order_old;\n\t\t\tself.options[value_new] = data;\n\t\n\t\t\t// invalidate render cache\n\t\t\tcache_items = self.renderCache['item'];\n\t\t\tcache_options = self.renderCache['option'];\n\t\n\t\t\tif (cache_items) {\n\t\t\t\tdelete cache_items[value];\n\t\t\t\tdelete cache_items[value_new];\n\t\t\t}\n\t\t\tif (cache_options) {\n\t\t\t\tdelete cache_options[value];\n\t\t\t\tdelete cache_options[value_new];\n\t\t\t}\n\t\n\t\t\t// update the item if it's selected\n\t\t\tif (self.items.indexOf(value_new) !== -1) {\n\t\t\t\t$item = self.getItem(value);\n\t\t\t\t$item_new = $(self.render('item', data));\n\t\t\t\tif ($item.hasClass('active')) $item_new.addClass('active');\n\t\t\t\t$item.replaceWith($item_new);\n\t\t\t}\n\t\n\t\t\t// invalidate last query because we might have updated the sortField\n\t\t\tself.lastQuery = null;\n\t\n\t\t\t// update dropdown contents\n\t\t\tif (self.isOpen) {\n\t\t\t\tself.refreshOptions(false);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Removes a single option.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} silent\n\t\t */\n\t\tremoveOption: function(value, silent) {\n\t\t\tvar self = this;\n\t\t\tvalue = hash_key(value);\n\t\n\t\t\tvar cache_items = self.renderCache['item'];\n\t\t\tvar cache_options = self.renderCache['option'];\n\t\t\tif (cache_items) delete cache_items[value];\n\t\t\tif (cache_options) delete cache_options[value];\n\t\n\t\t\tdelete self.userOptions[value];\n\t\t\tdelete self.options[value];\n\t\t\tself.lastQuery = null;\n\t\t\tself.trigger('option_remove', value);\n\t\t\tself.removeItem(value, silent);\n\t\t},\n\t\n\t\t/**\n\t\t * Clears all options.\n\t\t */\n\t\tclearOptions: function() {\n\t\t\tvar self = this;\n\t\n\t\t\tself.loadedSearches = {};\n\t\t\tself.userOptions = {};\n\t\t\tself.renderCache = {};\n\t\t\tvar options = self.options;\n\t\t\t$.each(self.options, function(key, value) {\n\t\t\t\tif(self.items.indexOf(key) == -1) {\n\t\t\t\t\tdelete options[key];\n\t\t\t\t}\n\t\t\t});\n\t\t\tself.options = self.sifter.items = options;\n\t\t\tself.lastQuery = null;\n\t\t\tself.trigger('option_clear');\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the jQuery element of the option\n\t\t * matching the given value.\n\t\t *\n\t\t * @param {string} value\n\t\t * @returns {object}\n\t\t */\n\t\tgetOption: function(value) {\n\t\t\treturn this.getElementWithValue(value, this.$dropdown_content.find('[data-selectable]'));\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the jQuery element of the next or\n\t\t * previous selectable option.\n\t\t *\n\t\t * @param {object} $option\n\t\t * @param {int} direction  can be 1 for next or -1 for previous\n\t\t * @return {object}\n\t\t */\n\t\tgetAdjacentOption: function($option, direction) {\n\t\t\tvar $options = this.$dropdown.find('[data-selectable]');\n\t\t\tvar index    = $options.index($option) + direction;\n\t\n\t\t\treturn index >= 0 && index < $options.length ? $options.eq(index) : $();\n\t\t},\n\t\n\t\t/**\n\t\t * Finds the first element with a \"data-value\" attribute\n\t\t * that matches the given value.\n\t\t *\n\t\t * @param {mixed} value\n\t\t * @param {object} $els\n\t\t * @return {object}\n\t\t */\n\t\tgetElementWithValue: function(value, $els) {\n\t\t\tvalue = hash_key(value);\n\t\n\t\t\tif (typeof value !== 'undefined' && value !== null) {\n\t\t\t\tfor (var i = 0, n = $els.length; i < n; i++) {\n\t\t\t\t\tif ($els[i].getAttribute('data-value') === value) {\n\t\t\t\t\t\treturn $($els[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn $();\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the jQuery element of the item\n\t\t * matching the given value.\n\t\t *\n\t\t * @param {string} value\n\t\t * @returns {object}\n\t\t */\n\t\tgetItem: function(value) {\n\t\t\treturn this.getElementWithValue(value, this.$control.children());\n\t\t},\n\t\n\t\t/**\n\t\t * \"Selects\" multiple items at once. Adds them to the list\n\t\t * at the current caret position.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} silent\n\t\t */\n\t\taddItems: function(values, silent) {\n\t\t\tthis.buffer = document.createDocumentFragment();\n\t\n\t\t\tvar childNodes = this.$control[0].childNodes;\n\t\t\tfor (var i = 0; i < childNodes.length; i++) {\n\t\t\t\tthis.buffer.appendChild(childNodes[i]);\n\t\t\t}\n\t\n\t\t\tvar items = $.isArray(values) ? values : [values];\n\t\t\tfor (var i = 0, n = items.length; i < n; i++) {\n\t\t\t\tthis.isPending = (i < n - 1);\n\t\t\t\tthis.addItem(items[i], silent);\n\t\t\t}\n\t\n\t\t\tvar control = this.$control[0];\n\t\t\tcontrol.insertBefore(this.buffer, control.firstChild);\n\t\n\t\t\tthis.buffer = null;\n\t\t},\n\t\n\t\t/**\n\t\t * \"Selects\" an item. Adds it to the list\n\t\t * at the current caret position.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} silent\n\t\t */\n\t\taddItem: function(value, silent) {\n\t\t\tvar events = silent ? [] : ['change'];\n\t\n\t\t\tdebounce_events(this, events, function() {\n\t\t\t\tvar $item, $option, $options;\n\t\t\t\tvar self = this;\n\t\t\t\tvar inputMode = self.settings.mode;\n\t\t\t\tvar i, active, value_next, wasFull;\n\t\t\t\tvalue = hash_key(value);\n\t\n\t\t\t\tif (self.items.indexOf(value) !== -1) {\n\t\t\t\t\tif (inputMode === 'single') self.close();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tif (!self.options.hasOwnProperty(value)) return;\n\t\t\t\tif (inputMode === 'single') self.clear(silent);\n\t\t\t\tif (inputMode === 'multi' && self.isFull()) return;\n\t\n\t\t\t\t$item = $(self.render('item', self.options[value]));\n\t\t\t\twasFull = self.isFull();\n\t\t\t\tself.items.splice(self.caretPos, 0, value);\n\t\t\t\tself.insertAtCaret($item);\n\t\t\t\tif (!self.isPending || (!wasFull && self.isFull())) {\n\t\t\t\t\tself.refreshState();\n\t\t\t\t}\n\t\n\t\t\t\tif (self.isSetup) {\n\t\t\t\t\t$options = self.$dropdown_content.find('[data-selectable]');\n\t\n\t\t\t\t\t// update menu / remove the option (if this is not one item being added as part of series)\n\t\t\t\t\tif (!self.isPending) {\n\t\t\t\t\t\t$option = self.getOption(value);\n\t\t\t\t\t\tvalue_next = self.getAdjacentOption($option, 1).attr('data-value');\n\t\t\t\t\t\tself.refreshOptions(self.isFocused && inputMode !== 'single');\n\t\t\t\t\t\tif (value_next) {\n\t\t\t\t\t\t\tself.setActiveOption(self.getOption(value_next));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// hide the menu if the maximum number of items have been selected or no options are left\n\t\t\t\t\tif (!$options.length || self.isFull()) {\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t} else if (!self.isPending) {\n\t\t\t\t\t\tself.positionDropdown();\n\t\t\t\t\t}\n\t\n\t\t\t\t\tself.updatePlaceholder();\n\t\t\t\t\tself.trigger('item_add', value, $item);\n\t\n\t\t\t\t\tif (!self.isPending) {\n\t\t\t\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Removes the selected item matching\n\t\t * the provided value.\n\t\t *\n\t\t * @param {string} value\n\t\t */\n\t\tremoveItem: function(value, silent) {\n\t\t\tvar self = this;\n\t\t\tvar $item, i, idx;\n\t\n\t\t\t$item = (value instanceof $) ? value : self.getItem(value);\n\t\t\tvalue = hash_key($item.attr('data-value'));\n\t\t\ti = self.items.indexOf(value);\n\t\n\t\t\tif (i !== -1) {\n\t\t\t\t$item.remove();\n\t\t\t\tif ($item.hasClass('active')) {\n\t\t\t\t\tidx = self.$activeItems.indexOf($item[0]);\n\t\t\t\t\tself.$activeItems.splice(idx, 1);\n\t\t\t\t}\n\t\n\t\t\t\tself.items.splice(i, 1);\n\t\t\t\tself.lastQuery = null;\n\t\t\t\tif (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {\n\t\t\t\t\tself.removeOption(value, silent);\n\t\t\t\t}\n\t\n\t\t\t\tif (i < self.caretPos) {\n\t\t\t\t\tself.setCaret(self.caretPos - 1);\n\t\t\t\t}\n\t\n\t\t\t\tself.refreshState();\n\t\t\t\tself.updatePlaceholder();\n\t\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\t\tself.positionDropdown();\n\t\t\t\tself.trigger('item_remove', value, $item);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Invokes the `create` method provided in the\n\t\t * selectize options that should provide the data\n\t\t * for the new item, given the user input.\n\t\t *\n\t\t * Once this completes, it will be added\n\t\t * to the item list.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} [triggerDropdown]\n\t\t * @param {function} [callback]\n\t\t * @return {boolean}\n\t\t */\n\t\tcreateItem: function(input, triggerDropdown) {\n\t\t\tvar self  = this;\n\t\t\tvar caret = self.caretPos;\n\t\t\tinput = input || $.trim(self.$control_input.val() || '');\n\t\n\t\t\tvar callback = arguments[arguments.length - 1];\n\t\t\tif (typeof callback !== 'function') callback = function() {};\n\t\n\t\t\tif (typeof triggerDropdown !== 'boolean') {\n\t\t\t\ttriggerDropdown = true;\n\t\t\t}\n\t\n\t\t\tif (!self.canCreate(input)) {\n\t\t\t\tcallback();\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\tself.lock();\n\t\n\t\t\tvar setup = (typeof self.settings.create === 'function') ? this.settings.create : function(input) {\n\t\t\t\tvar data = {};\n\t\t\t\tdata[self.settings.labelField] = input;\n\t\t\t\tdata[self.settings.valueField] = input;\n\t\t\t\treturn data;\n\t\t\t};\n\t\n\t\t\tvar create = once(function(data) {\n\t\t\t\tself.unlock();\n\t\n\t\t\t\tif (!data || typeof data !== 'object') return callback();\n\t\t\t\tvar value = hash_key(data[self.settings.valueField]);\n\t\t\t\tif (typeof value !== 'string') return callback();\n\t\n\t\t\t\tself.setTextboxValue('');\n\t\t\t\tself.addOption(data);\n\t\t\t\tself.setCaret(caret);\n\t\t\t\tself.addItem(value);\n\t\t\t\tself.refreshOptions(triggerDropdown && self.settings.mode !== 'single');\n\t\t\t\tcallback(data);\n\t\t\t});\n\t\n\t\t\tvar output = setup.apply(this, [input, create]);\n\t\t\tif (typeof output !== 'undefined') {\n\t\t\t\tcreate(output);\n\t\t\t}\n\t\n\t\t\treturn true;\n\t\t},\n\t\n\t\t/**\n\t\t * Re-renders the selected item lists.\n\t\t */\n\t\trefreshItems: function() {\n\t\t\tthis.lastQuery = null;\n\t\n\t\t\tif (this.isSetup) {\n\t\t\t\tthis.addItem(this.items);\n\t\t\t}\n\t\n\t\t\tthis.refreshState();\n\t\t\tthis.updateOriginalInput();\n\t\t},\n\t\n\t\t/**\n\t\t * Updates all state-dependent attributes\n\t\t * and CSS classes.\n\t\t */\n\t\trefreshState: function() {\n\t\t\tthis.refreshValidityState();\n\t\t\tthis.refreshClasses();\n\t\t},\n\t\n\t\t/**\n\t\t * Update the `required` attribute of both input and control input.\n\t\t *\n\t\t * The `required` property needs to be activated on the control input\n\t\t * for the error to be displayed at the right place. `required` also\n\t\t * needs to be temporarily deactivated on the input since the input is\n\t\t * hidden and can't show errors.\n\t\t */\n\t\trefreshValidityState: function() {\n\t\t\tif (!this.isRequired) return false;\n\t\n\t\t\tvar invalid = !this.items.length;\n\t\n\t\t\tthis.isInvalid = invalid;\n\t\t\tthis.$control_input.prop('required', invalid);\n\t\t\tthis.$input.prop('required', !invalid);\n\t\t},\n\t\n\t\t/**\n\t\t * Updates all state-dependent CSS classes.\n\t\t */\n\t\trefreshClasses: function() {\n\t\t\tvar self     = this;\n\t\t\tvar isFull   = self.isFull();\n\t\t\tvar isLocked = self.isLocked;\n\t\n\t\t\tself.$wrapper\n\t\t\t\t.toggleClass('rtl', self.rtl);\n\t\n\t\t\tself.$control\n\t\t\t\t.toggleClass('focus', self.isFocused)\n\t\t\t\t.toggleClass('disabled', self.isDisabled)\n\t\t\t\t.toggleClass('required', self.isRequired)\n\t\t\t\t.toggleClass('invalid', self.isInvalid)\n\t\t\t\t.toggleClass('locked', isLocked)\n\t\t\t\t.toggleClass('full', isFull).toggleClass('not-full', !isFull)\n\t\t\t\t.toggleClass('input-active', self.isFocused && !self.isInputHidden)\n\t\t\t\t.toggleClass('dropdown-active', self.isOpen)\n\t\t\t\t.toggleClass('has-options', !$.isEmptyObject(self.options))\n\t\t\t\t.toggleClass('has-items', self.items.length > 0);\n\t\n\t\t\tself.$control_input.data('grow', !isFull && !isLocked);\n\t\t},\n\t\n\t\t/**\n\t\t * Determines whether or not more items can be added\n\t\t * to the control without exceeding the user-defined maximum.\n\t\t *\n\t\t * @returns {boolean}\n\t\t */\n\t\tisFull: function() {\n\t\t\treturn this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;\n\t\t},\n\t\n\t\t/**\n\t\t * Refreshes the original <select> or <input>\n\t\t * element to reflect the current state.\n\t\t */\n\t\tupdateOriginalInput: function(opts) {\n\t\t\tvar i, n, options, label, self = this;\n\t\t\topts = opts || {};\n\t\n\t\t\tif (self.tagType === TAG_SELECT) {\n\t\t\t\toptions = [];\n\t\t\t\tfor (i = 0, n = self.items.length; i < n; i++) {\n\t\t\t\t\tlabel = self.options[self.items[i]][self.settings.labelField] || '';\n\t\t\t\t\toptions.push('<option value=\"' + escape_html(self.items[i]) + '\" selected=\"selected\">' + escape_html(label) + '</option>');\n\t\t\t\t}\n\t\t\t\tif (!options.length && !this.$input.attr('multiple')) {\n\t\t\t\t\toptions.push('<option value=\"\" selected=\"selected\"></option>');\n\t\t\t\t}\n\t\t\t\tself.$input.html(options.join(''));\n\t\t\t} else {\n\t\t\t\tself.$input.val(self.getValue());\n\t\t\t\tself.$input.attr('value',self.$input.val());\n\t\t\t}\n\t\n\t\t\tif (self.isSetup) {\n\t\t\t\tif (!opts.silent) {\n\t\t\t\t\tself.trigger('change', self.$input.val());\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Shows/hide the input placeholder depending\n\t\t * on if there items in the list already.\n\t\t */\n\t\tupdatePlaceholder: function() {\n\t\t\tif (!this.settings.placeholder) return;\n\t\t\tvar $input = this.$control_input;\n\t\n\t\t\tif (this.items.length) {\n\t\t\t\t$input.removeAttr('placeholder');\n\t\t\t} else {\n\t\t\t\t$input.attr('placeholder', this.settings.placeholder);\n\t\t\t}\n\t\t\t$input.triggerHandler('update', {force: true});\n\t\t},\n\t\n\t\t/**\n\t\t * Shows the autocomplete dropdown containing\n\t\t * the available options.\n\t\t */\n\t\topen: function() {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked || self.isOpen || (self.settings.mode === 'multi' && self.isFull())) return;\n\t\t\tself.focus();\n\t\t\tself.isOpen = true;\n\t\t\tself.refreshState();\n\t\t\tself.$dropdown.css({visibility: 'hidden', display: 'block'});\n\t\t\tself.positionDropdown();\n\t\t\tself.$dropdown.css({visibility: 'visible'});\n\t\t\tself.trigger('dropdown_open', self.$dropdown);\n\t\t},\n\t\n\t\t/**\n\t\t * Closes the autocomplete dropdown menu.\n\t\t */\n\t\tclose: function() {\n\t\t\tvar self = this;\n\t\t\tvar trigger = self.isOpen;\n\t\n\t\t\tif (self.settings.mode === 'single' && self.items.length) {\n\t\t\t\tself.hideInput();\n\t\n\t\t\t\t// Do not trigger blur while inside a blur event,\n\t\t\t\t// this fixes some weird tabbing behavior in FF and IE.\n\t\t\t\t// See #1164\n\t\t\t\tif (!self.isBlurring) {\n\t\t\t\t\tself.$control_input.blur(); // close keyboard on iOS\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tself.isOpen = false;\n\t\t\tself.$dropdown.hide();\n\t\t\tself.setActiveOption(null);\n\t\t\tself.refreshState();\n\t\n\t\t\tif (trigger) self.trigger('dropdown_close', self.$dropdown);\n\t\t},\n\t\n\t\t/**\n\t\t * Calculates and applies the appropriate\n\t\t * position of the dropdown.\n\t\t */\n\t\tpositionDropdown: function() {\n\t\t\tvar $control = this.$control;\n\t\t\tvar offset = this.settings.dropdownParent === 'body' ? $control.offset() : $control.position();\n\t\t\toffset.top += $control.outerHeight(true);\n\t\n\t\t\tthis.$dropdown.css({\n\t\t\t\twidth : $control[0].getBoundingClientRect().width,\n\t\t\t\ttop   : offset.top,\n\t\t\t\tleft  : offset.left\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Resets / clears all selected items\n\t\t * from the control.\n\t\t *\n\t\t * @param {boolean} silent\n\t\t */\n\t\tclear: function(silent) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (!self.items.length) return;\n\t\t\tself.$control.children(':not(input)').remove();\n\t\t\tself.items = [];\n\t\t\tself.lastQuery = null;\n\t\t\tself.setCaret(0);\n\t\t\tself.setActiveItem(null);\n\t\t\tself.updatePlaceholder();\n\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\tself.refreshState();\n\t\t\tself.showInput();\n\t\t\tself.trigger('clear');\n\t\t},\n\t\n\t\t/**\n\t\t * A helper method for inserting an element\n\t\t * at the current caret position.\n\t\t *\n\t\t * @param {object} $el\n\t\t */\n\t\tinsertAtCaret: function($el) {\n\t\t\tvar caret = Math.min(this.caretPos, this.items.length);\n\t\t\tvar el = $el[0];\n\t\t\tvar target = this.buffer || this.$control[0];\n\t\n\t\t\tif (caret === 0) {\n\t\t\t\ttarget.insertBefore(el, target.firstChild);\n\t\t\t} else {\n\t\t\t\ttarget.insertBefore(el, target.childNodes[caret]);\n\t\t\t}\n\t\n\t\t\tthis.setCaret(caret + 1);\n\t\t},\n\t\n\t\t/**\n\t\t * Removes the current selected item(s).\n\t\t *\n\t\t * @param {object} e (optional)\n\t\t * @returns {boolean}\n\t\t */\n\t\tdeleteSelection: function(e) {\n\t\t\tvar i, n, direction, selection, values, caret, option_select, $option_select, $tail;\n\t\t\tvar self = this;\n\t\n\t\t\tdirection = (e && e.keyCode === KEY_BACKSPACE) ? -1 : 1;\n\t\t\tselection = getSelection(self.$control_input[0]);\n\t\n\t\t\tif (self.$activeOption && !self.settings.hideSelected) {\n\t\t\t\toption_select = self.getAdjacentOption(self.$activeOption, -1).attr('data-value');\n\t\t\t}\n\t\n\t\t\t// determine items that will be removed\n\t\t\tvalues = [];\n\t\n\t\t\tif (self.$activeItems.length) {\n\t\t\t\t$tail = self.$control.children('.active:' + (direction > 0 ? 'last' : 'first'));\n\t\t\t\tcaret = self.$control.children(':not(input)').index($tail);\n\t\t\t\tif (direction > 0) { caret++; }\n\t\n\t\t\t\tfor (i = 0, n = self.$activeItems.length; i < n; i++) {\n\t\t\t\t\tvalues.push($(self.$activeItems[i]).attr('data-value'));\n\t\t\t\t}\n\t\t\t\tif (e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t} else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {\n\t\t\t\tif (direction < 0 && selection.start === 0 && selection.length === 0) {\n\t\t\t\t\tvalues.push(self.items[self.caretPos - 1]);\n\t\t\t\t} else if (direction > 0 && selection.start === self.$control_input.val().length) {\n\t\t\t\t\tvalues.push(self.items[self.caretPos]);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// allow the callback to abort\n\t\t\tif (!values.length || (typeof self.settings.onDelete === 'function' && self.settings.onDelete.apply(self, [values]) === false)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\t// perform removal\n\t\t\tif (typeof caret !== 'undefined') {\n\t\t\t\tself.setCaret(caret);\n\t\t\t}\n\t\t\twhile (values.length) {\n\t\t\t\tself.removeItem(values.pop());\n\t\t\t}\n\t\n\t\t\tself.showInput();\n\t\t\tself.positionDropdown();\n\t\t\tself.refreshOptions(true);\n\t\n\t\t\t// select previous option\n\t\t\tif (option_select) {\n\t\t\t\t$option_select = self.getOption(option_select);\n\t\t\t\tif ($option_select.length) {\n\t\t\t\t\tself.setActiveOption($option_select);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn true;\n\t\t},\n\t\n\t\t/**\n\t\t * Selects the previous / next item (depending\n\t\t * on the `direction` argument).\n\t\t *\n\t\t * > 0 - right\n\t\t * < 0 - left\n\t\t *\n\t\t * @param {int} direction\n\t\t * @param {object} e (optional)\n\t\t */\n\t\tadvanceSelection: function(direction, e) {\n\t\t\tvar tail, selection, idx, valueLength, cursorAtEdge, $tail;\n\t\t\tvar self = this;\n\t\n\t\t\tif (direction === 0) return;\n\t\t\tif (self.rtl) direction *= -1;\n\t\n\t\t\ttail = direction > 0 ? 'last' : 'first';\n\t\t\tselection = getSelection(self.$control_input[0]);\n\t\n\t\t\tif (self.isFocused && !self.isInputHidden) {\n\t\t\t\tvalueLength = self.$control_input.val().length;\n\t\t\t\tcursorAtEdge = direction < 0\n\t\t\t\t\t? selection.start === 0 && selection.length === 0\n\t\t\t\t\t: selection.start === valueLength;\n\t\n\t\t\t\tif (cursorAtEdge && !valueLength) {\n\t\t\t\t\tself.advanceCaret(direction, e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$tail = self.$control.children('.active:' + tail);\n\t\t\t\tif ($tail.length) {\n\t\t\t\t\tidx = self.$control.children(':not(input)').index($tail);\n\t\t\t\t\tself.setActiveItem(null);\n\t\t\t\t\tself.setCaret(direction > 0 ? idx + 1 : idx);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Moves the caret left / right.\n\t\t *\n\t\t * @param {int} direction\n\t\t * @param {object} e (optional)\n\t\t */\n\t\tadvanceCaret: function(direction, e) {\n\t\t\tvar self = this, fn, $adj;\n\t\n\t\t\tif (direction === 0) return;\n\t\n\t\t\tfn = direction > 0 ? 'next' : 'prev';\n\t\t\tif (self.isShiftDown) {\n\t\t\t\t$adj = self.$control_input[fn]();\n\t\t\t\tif ($adj.length) {\n\t\t\t\t\tself.hideInput();\n\t\t\t\t\tself.setActiveItem($adj);\n\t\t\t\t\te && e.preventDefault();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.setCaret(self.caretPos + direction);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Moves the caret to the specified index.\n\t\t *\n\t\t * @param {int} i\n\t\t */\n\t\tsetCaret: function(i) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.settings.mode === 'single') {\n\t\t\t\ti = self.items.length;\n\t\t\t} else {\n\t\t\t\ti = Math.max(0, Math.min(self.items.length, i));\n\t\t\t}\n\t\n\t\t\tif(!self.isPending) {\n\t\t\t\t// the input must be moved by leaving it in place and moving the\n\t\t\t\t// siblings, due to the fact that focus cannot be restored once lost\n\t\t\t\t// on mobile webkit devices\n\t\t\t\tvar j, n, fn, $children, $child;\n\t\t\t\t$children = self.$control.children(':not(input)');\n\t\t\t\tfor (j = 0, n = $children.length; j < n; j++) {\n\t\t\t\t\t$child = $($children[j]).detach();\n\t\t\t\t\tif (j <  i) {\n\t\t\t\t\t\tself.$control_input.before($child);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.$control.append($child);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tself.caretPos = i;\n\t\t},\n\t\n\t\t/**\n\t\t * Disables user input on the control. Used while\n\t\t * items are being asynchronously created.\n\t\t */\n\t\tlock: function() {\n\t\t\tthis.close();\n\t\t\tthis.isLocked = true;\n\t\t\tthis.refreshState();\n\t\t},\n\t\n\t\t/**\n\t\t * Re-enables user input on the control.\n\t\t */\n\t\tunlock: function() {\n\t\t\tthis.isLocked = false;\n\t\t\tthis.refreshState();\n\t\t},\n\t\n\t\t/**\n\t\t * Disables user input on the control completely.\n\t\t * While disabled, it cannot receive focus.\n\t\t */\n\t\tdisable: function() {\n\t\t\tvar self = this;\n\t\t\tself.$input.prop('disabled', true);\n\t\t\tself.$control_input.prop('disabled', true).prop('tabindex', -1);\n\t\t\tself.isDisabled = true;\n\t\t\tself.lock();\n\t\t},\n\t\n\t\t/**\n\t\t * Enables the control so that it can respond\n\t\t * to focus and user input.\n\t\t */\n\t\tenable: function() {\n\t\t\tvar self = this;\n\t\t\tself.$input.prop('disabled', false);\n\t\t\tself.$control_input.prop('disabled', false).prop('tabindex', self.tabIndex);\n\t\t\tself.isDisabled = false;\n\t\t\tself.unlock();\n\t\t},\n\t\n\t\t/**\n\t\t * Completely destroys the control and\n\t\t * unbinds all event listeners so that it can\n\t\t * be garbage collected.\n\t\t */\n\t\tdestroy: function() {\n\t\t\tvar self = this;\n\t\t\tvar eventNS = self.eventNS;\n\t\t\tvar revertSettings = self.revertSettings;\n\t\n\t\t\tself.trigger('destroy');\n\t\t\tself.off();\n\t\t\tself.$wrapper.remove();\n\t\t\tself.$dropdown.remove();\n\t\n\t\t\tself.$input\n\t\t\t\t.html('')\n\t\t\t\t.append(revertSettings.$children)\n\t\t\t\t.removeAttr('tabindex')\n\t\t\t\t.removeClass('selectized')\n\t\t\t\t.attr({tabindex: revertSettings.tabindex})\n\t\t\t\t.show();\n\t\n\t\t\tself.$control_input.removeData('grow');\n\t\t\tself.$input.removeData('selectize');\n\t\n\t\t\tif (--Selectize.count == 0 && Selectize.$testInput) {\n\t\t\t\tSelectize.$testInput.remove();\n\t\t\t\tSelectize.$testInput = undefined;\n\t\t\t}\n\t\n\t\t\t$(window).off(eventNS);\n\t\t\t$(document).off(eventNS);\n\t\t\t$(document.body).off(eventNS);\n\t\n\t\t\tdelete self.$input[0].selectize;\n\t\t},\n\t\n\t\t/**\n\t\t * A helper method for rendering \"item\" and\n\t\t * \"option\" templates, given the data.\n\t\t *\n\t\t * @param {string} templateName\n\t\t * @param {object} data\n\t\t * @returns {string}\n\t\t */\n\t\trender: function(templateName, data) {\n\t\t\tvar value, id, label;\n\t\t\tvar html = '';\n\t\t\tvar cache = false;\n\t\t\tvar self = this;\n\t\t\tvar regex_tag = /^[\\t \\r\\n]*<([a-z][a-z0-9\\-_]*(?:\\:[a-z][a-z0-9\\-_]*)?)/i;\n\t\n\t\t\tif (templateName === 'option' || templateName === 'item') {\n\t\t\t\tvalue = hash_key(data[self.settings.valueField]);\n\t\t\t\tcache = !!value;\n\t\t\t}\n\t\n\t\t\t// pull markup from cache if it exists\n\t\t\tif (cache) {\n\t\t\t\tif (!isset(self.renderCache[templateName])) {\n\t\t\t\t\tself.renderCache[templateName] = {};\n\t\t\t\t}\n\t\t\t\tif (self.renderCache[templateName].hasOwnProperty(value)) {\n\t\t\t\t\treturn self.renderCache[templateName][value];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// render markup\n\t\t\thtml = $(self.settings.render[templateName].apply(this, [data, escape_html]));\n\t\n\t\t\t// add mandatory attributes\n\t\t\tif (templateName === 'option' || templateName === 'option_create') {\n\t\t\t\tif (!data[self.settings.disabledField]) {\n\t\t\t\t\thtml.attr('data-selectable', '');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (templateName === 'optgroup') {\n\t\t\t\tid = data[self.settings.optgroupValueField] || '';\n\t\t\t\thtml.attr('data-group', id);\n\t\t\t\tif(data[self.settings.disabledField]) {\n\t\t\t\t\thtml.attr('data-disabled', '');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (templateName === 'option' || templateName === 'item') {\n\t\t\t\thtml.attr('data-value', value || '');\n\t\t\t}\n\t\n\t\t\t// update cache\n\t\t\tif (cache) {\n\t\t\t\tself.renderCache[templateName][value] = html[0];\n\t\t\t}\n\t\n\t\t\treturn html[0];\n\t\t},\n\t\n\t\t/**\n\t\t * Clears the render cache for a template. If\n\t\t * no template is given, clears all render\n\t\t * caches.\n\t\t *\n\t\t * @param {string} templateName\n\t\t */\n\t\tclearCache: function(templateName) {\n\t\t\tvar self = this;\n\t\t\tif (typeof templateName === 'undefined') {\n\t\t\t\tself.renderCache = {};\n\t\t\t} else {\n\t\t\t\tdelete self.renderCache[templateName];\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Determines whether or not to display the\n\t\t * create item prompt, given a user input.\n\t\t *\n\t\t * @param {string} input\n\t\t * @return {boolean}\n\t\t */\n\t\tcanCreate: function(input) {\n\t\t\tvar self = this;\n\t\t\tif (!self.settings.create) return false;\n\t\t\tvar filter = self.settings.createFilter;\n\t\t\treturn input.length\n\t\t\t\t&& (typeof filter !== 'function' || filter.apply(self, [input]))\n\t\t\t\t&& (typeof filter !== 'string' || new RegExp(filter).test(input))\n\t\t\t\t&& (!(filter instanceof RegExp) || filter.test(input));\n\t\t}\n\t\n\t});\n\t\n\t\n\tSelectize.count = 0;\n\tSelectize.defaults = {\n\t\toptions: [],\n\t\toptgroups: [],\n\t\n\t\tplugins: [],\n\t\tdelimiter: ',',\n\t\tsplitOn: null, // regexp or string for splitting up values from a paste command\n\t\tpersist: true,\n\t\tdiacritics: true,\n\t\tcreate: false,\n\t\tcreateOnBlur: false,\n\t\tcreateFilter: null,\n\t\thighlight: true,\n\t\topenOnFocus: true,\n\t\tmaxOptions: 1000,\n\t\tmaxItems: null,\n\t\thideSelected: null,\n\t\taddPrecedence: false,\n\t\tselectOnTab: false,\n\t\tpreload: false,\n\t\tallowEmptyOption: false,\n\t\tcloseAfterSelect: false,\n\t\n\t\tscrollDuration: 60,\n\t\tloadThrottle: 300,\n\t\tloadingClass: 'loading',\n\t\n\t\tdataAttr: 'data-data',\n\t\toptgroupField: 'optgroup',\n\t\tvalueField: 'value',\n\t\tlabelField: 'text',\n\t\tdisabledField: 'disabled',\n\t\toptgroupLabelField: 'label',\n\t\toptgroupValueField: 'value',\n\t\tlockOptgroupOrder: false,\n\t\n\t\tsortField: '$order',\n\t\tsearchField: ['text'],\n\t\tsearchConjunction: 'and',\n\t\n\t\tmode: null,\n\t\twrapperClass: 'selectize-control',\n\t\tinputClass: 'selectize-input',\n\t\tdropdownClass: 'selectize-dropdown',\n\t\tdropdownContentClass: 'selectize-dropdown-content',\n\t\n\t\tdropdownParent: null,\n\t\n\t\tcopyClassesToDropdown: true,\n\t\n\t\t/*\n\t\tload                 : null, // function(query, callback) { ... }\n\t\tscore                : null, // function(search) { ... }\n\t\tonInitialize         : null, // function() { ... }\n\t\tonChange             : null, // function(value) { ... }\n\t\tonItemAdd            : null, // function(value, $item) { ... }\n\t\tonItemRemove         : null, // function(value) { ... }\n\t\tonClear              : null, // function() { ... }\n\t\tonOptionAdd          : null, // function(value, data) { ... }\n\t\tonOptionRemove       : null, // function(value) { ... }\n\t\tonOptionClear        : null, // function() { ... }\n\t\tonOptionGroupAdd     : null, // function(id, data) { ... }\n\t\tonOptionGroupRemove  : null, // function(id) { ... }\n\t\tonOptionGroupClear   : null, // function() { ... }\n\t\tonDropdownOpen       : null, // function($dropdown) { ... }\n\t\tonDropdownClose      : null, // function($dropdown) { ... }\n\t\tonType               : null, // function(str) { ... }\n\t\tonDelete             : null, // function(values) { ... }\n\t\t*/\n\t\n\t\trender: {\n\t\t\t/*\n\t\t\titem: null,\n\t\t\toptgroup: null,\n\t\t\toptgroup_header: null,\n\t\t\toption: null,\n\t\t\toption_create: null\n\t\t\t*/\n\t\t}\n\t};\n\t\n\t\n\t$.fn.selectize = function(settings_user) {\n\t\tvar defaults             = $.fn.selectize.defaults;\n\t\tvar settings             = $.extend({}, defaults, settings_user);\n\t\tvar attr_data            = settings.dataAttr;\n\t\tvar field_label          = settings.labelField;\n\t\tvar field_value          = settings.valueField;\n\t\tvar field_disabled       = settings.disabledField;\n\t\tvar field_optgroup       = settings.optgroupField;\n\t\tvar field_optgroup_label = settings.optgroupLabelField;\n\t\tvar field_optgroup_value = settings.optgroupValueField;\n\t\n\t\t/**\n\t\t * Initializes selectize from a <input type=\"text\"> element.\n\t\t *\n\t\t * @param {object} $input\n\t\t * @param {object} settings_element\n\t\t */\n\t\tvar init_textbox = function($input, settings_element) {\n\t\t\tvar i, n, values, option;\n\t\n\t\t\tvar data_raw = $input.attr(attr_data);\n\t\n\t\t\tif (!data_raw) {\n\t\t\t\tvar value = $.trim($input.val() || '');\n\t\t\t\tif (!settings.allowEmptyOption && !value.length) return;\n\t\t\t\tvalues = value.split(settings.delimiter);\n\t\t\t\tfor (i = 0, n = values.length; i < n; i++) {\n\t\t\t\t\toption = {};\n\t\t\t\t\toption[field_label] = values[i];\n\t\t\t\t\toption[field_value] = values[i];\n\t\t\t\t\tsettings_element.options.push(option);\n\t\t\t\t}\n\t\t\t\tsettings_element.items = values;\n\t\t\t} else {\n\t\t\t\tsettings_element.options = JSON.parse(data_raw);\n\t\t\t\tfor (i = 0, n = settings_element.options.length; i < n; i++) {\n\t\t\t\t\tsettings_element.items.push(settings_element.options[i][field_value]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\t/**\n\t\t * Initializes selectize from a <select> element.\n\t\t *\n\t\t * @param {object} $input\n\t\t * @param {object} settings_element\n\t\t */\n\t\tvar init_select = function($input, settings_element) {\n\t\t\tvar i, n, tagName, $children, order = 0;\n\t\t\tvar options = settings_element.options;\n\t\t\tvar optionsMap = {};\n\t\n\t\t\tvar readData = function($el) {\n\t\t\t\tvar data = attr_data && $el.attr(attr_data);\n\t\t\t\tif (typeof data === 'string' && data.length) {\n\t\t\t\t\treturn JSON.parse(data);\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t};\n\t\n\t\t\tvar addOption = function($option, group) {\n\t\t\t\t$option = $($option);\n\t\n\t\t\t\tvar value = hash_key($option.val());\n\t\t\t\tif (!value && !settings.allowEmptyOption) return;\n\t\n\t\t\t\t// if the option already exists, it's probably been\n\t\t\t\t// duplicated in another optgroup. in this case, push\n\t\t\t\t// the current group to the \"optgroup\" property on the\n\t\t\t\t// existing option so that it's rendered in both places.\n\t\t\t\tif (optionsMap.hasOwnProperty(value)) {\n\t\t\t\t\tif (group) {\n\t\t\t\t\t\tvar arr = optionsMap[value][field_optgroup];\n\t\t\t\t\t\tif (!arr) {\n\t\t\t\t\t\t\toptionsMap[value][field_optgroup] = group;\n\t\t\t\t\t\t} else if (!$.isArray(arr)) {\n\t\t\t\t\t\t\toptionsMap[value][field_optgroup] = [arr, group];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tarr.push(group);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tvar option             = readData($option) || {};\n\t\t\t\toption[field_label]    = option[field_label] || $option.text();\n\t\t\t\toption[field_value]    = option[field_value] || value;\n\t\t\t\toption[field_disabled] = option[field_disabled] || $option.prop('disabled');\n\t\t\t\toption[field_optgroup] = option[field_optgroup] || group;\n\t\n\t\t\t\toptionsMap[value] = option;\n\t\t\t\toptions.push(option);\n\t\n\t\t\t\tif ($option.is(':selected')) {\n\t\t\t\t\tsettings_element.items.push(value);\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\tvar addGroup = function($optgroup) {\n\t\t\t\tvar i, n, id, optgroup, $options;\n\t\n\t\t\t\t$optgroup = $($optgroup);\n\t\t\t\tid = $optgroup.attr('label');\n\t\n\t\t\t\tif (id) {\n\t\t\t\t\toptgroup = readData($optgroup) || {};\n\t\t\t\t\toptgroup[field_optgroup_label] = id;\n\t\t\t\t\toptgroup[field_optgroup_value] = id;\n\t\t\t\t\toptgroup[field_disabled] = $optgroup.prop('disabled');\n\t\t\t\t\tsettings_element.optgroups.push(optgroup);\n\t\t\t\t}\n\t\n\t\t\t\t$options = $('option', $optgroup);\n\t\t\t\tfor (i = 0, n = $options.length; i < n; i++) {\n\t\t\t\t\taddOption($options[i], id);\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\tsettings_element.maxItems = $input.attr('multiple') ? null : 1;\n\t\n\t\t\t$children = $input.children();\n\t\t\tfor (i = 0, n = $children.length; i < n; i++) {\n\t\t\t\ttagName = $children[i].tagName.toLowerCase();\n\t\t\t\tif (tagName === 'optgroup') {\n\t\t\t\t\taddGroup($children[i]);\n\t\t\t\t} else if (tagName === 'option') {\n\t\t\t\t\taddOption($children[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\treturn this.each(function() {\n\t\t\tif (this.selectize) return;\n\t\n\t\t\tvar instance;\n\t\t\tvar $input = $(this);\n\t\t\tvar tag_name = this.tagName.toLowerCase();\n\t\t\tvar placeholder = $input.attr('placeholder') || $input.attr('data-placeholder');\n\t\t\tif (!placeholder && !settings.allowEmptyOption) {\n\t\t\t\tplaceholder = $input.children('option[value=\"\"]').text();\n\t\t\t}\n\t\n\t\t\tvar settings_element = {\n\t\t\t\t'placeholder' : placeholder,\n\t\t\t\t'options'     : [],\n\t\t\t\t'optgroups'   : [],\n\t\t\t\t'items'       : []\n\t\t\t};\n\t\n\t\t\tif (tag_name === 'select') {\n\t\t\t\tinit_select($input, settings_element);\n\t\t\t} else {\n\t\t\t\tinit_textbox($input, settings_element);\n\t\t\t}\n\t\n\t\t\tinstance = new Selectize($input, $.extend(true, {}, defaults, settings_element, settings_user));\n\t\t});\n\t};\n\t\n\t$.fn.selectize.defaults = Selectize.defaults;\n\t$.fn.selectize.support = {\n\t\tvalidity: SUPPORTS_VALIDITY_API\n\t};\n\t\n\t\n\tSelectize.define('drag_drop', function(options) {\n\t\tif (!$.fn.sortable) throw new Error('The \"drag_drop\" plugin requires jQuery UI \"sortable\".');\n\t\tif (this.settings.mode !== 'multi') return;\n\t\tvar self = this;\n\t\n\t\tself.lock = (function() {\n\t\t\tvar original = self.lock;\n\t\t\treturn function() {\n\t\t\t\tvar sortable = self.$control.data('sortable');\n\t\t\t\tif (sortable) sortable.disable();\n\t\t\t\treturn original.apply(self, arguments);\n\t\t\t};\n\t\t})();\n\t\n\t\tself.unlock = (function() {\n\t\t\tvar original = self.unlock;\n\t\t\treturn function() {\n\t\t\t\tvar sortable = self.$control.data('sortable');\n\t\t\t\tif (sortable) sortable.enable();\n\t\t\t\treturn original.apply(self, arguments);\n\t\t\t};\n\t\t})();\n\t\n\t\tself.setup = (function() {\n\t\t\tvar original = self.setup;\n\t\t\treturn function() {\n\t\t\t\toriginal.apply(this, arguments);\n\t\n\t\t\t\tvar $control = self.$control.sortable({\n\t\t\t\t\titems: '[data-value]',\n\t\t\t\t\tforcePlaceholderSize: true,\n\t\t\t\t\tdisabled: self.isLocked,\n\t\t\t\t\tstart: function(e, ui) {\n\t\t\t\t\t\tui.placeholder.css('width', ui.helper.css('width'));\n\t\t\t\t\t\t$control.css({overflow: 'visible'});\n\t\t\t\t\t},\n\t\t\t\t\tstop: function() {\n\t\t\t\t\t\t$control.css({overflow: 'hidden'});\n\t\t\t\t\t\tvar active = self.$activeItems ? self.$activeItems.slice() : null;\n\t\t\t\t\t\tvar values = [];\n\t\t\t\t\t\t$control.children('[data-value]').each(function() {\n\t\t\t\t\t\t\tvalues.push($(this).attr('data-value'));\n\t\t\t\t\t\t});\n\t\t\t\t\t\tself.setValue(values);\n\t\t\t\t\t\tself.setActiveItem(active);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t})();\n\t\n\t});\n\t\n\tSelectize.define('dropdown_header', function(options) {\n\t\tvar self = this;\n\t\n\t\toptions = $.extend({\n\t\t\ttitle         : 'Untitled',\n\t\t\theaderClass   : 'selectize-dropdown-header',\n\t\t\ttitleRowClass : 'selectize-dropdown-header-title',\n\t\t\tlabelClass    : 'selectize-dropdown-header-label',\n\t\t\tcloseClass    : 'selectize-dropdown-header-close',\n\t\n\t\t\thtml: function(data) {\n\t\t\t\treturn (\n\t\t\t\t\t'<div class=\"' + data.headerClass + '\">' +\n\t\t\t\t\t\t'<div class=\"' + data.titleRowClass + '\">' +\n\t\t\t\t\t\t\t'<span class=\"' + data.labelClass + '\">' + data.title + '</span>' +\n\t\t\t\t\t\t\t'<a href=\"javascript:void(0)\" class=\"' + data.closeClass + '\">&times;</a>' +\n\t\t\t\t\t\t'</div>' +\n\t\t\t\t\t'</div>'\n\t\t\t\t);\n\t\t\t}\n\t\t}, options);\n\t\n\t\tself.setup = (function() {\n\t\t\tvar original = self.setup;\n\t\t\treturn function() {\n\t\t\t\toriginal.apply(self, arguments);\n\t\t\t\tself.$dropdown_header = $(options.html(options));\n\t\t\t\tself.$dropdown.prepend(self.$dropdown_header);\n\t\t\t};\n\t\t})();\n\t\n\t});\n\t\n\tSelectize.define('optgroup_columns', function(options) {\n\t\tvar self = this;\n\t\n\t\toptions = $.extend({\n\t\t\tequalizeWidth  : true,\n\t\t\tequalizeHeight : true\n\t\t}, options);\n\t\n\t\tthis.getAdjacentOption = function($option, direction) {\n\t\t\tvar $options = $option.closest('[data-group]').find('[data-selectable]');\n\t\t\tvar index    = $options.index($option) + direction;\n\t\n\t\t\treturn index >= 0 && index < $options.length ? $options.eq(index) : $();\n\t\t};\n\t\n\t\tthis.onKeyDown = (function() {\n\t\t\tvar original = self.onKeyDown;\n\t\t\treturn function(e) {\n\t\t\t\tvar index, $option, $options, $optgroup;\n\t\n\t\t\t\tif (this.isOpen && (e.keyCode === KEY_LEFT || e.keyCode === KEY_RIGHT)) {\n\t\t\t\t\tself.ignoreHover = true;\n\t\t\t\t\t$optgroup = this.$activeOption.closest('[data-group]');\n\t\t\t\t\tindex = $optgroup.find('[data-selectable]').index(this.$activeOption);\n\t\n\t\t\t\t\tif(e.keyCode === KEY_LEFT) {\n\t\t\t\t\t\t$optgroup = $optgroup.prev('[data-group]');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$optgroup = $optgroup.next('[data-group]');\n\t\t\t\t\t}\n\t\n\t\t\t\t\t$options = $optgroup.find('[data-selectable]');\n\t\t\t\t\t$option  = $options.eq(Math.min($options.length - 1, index));\n\t\t\t\t\tif ($option.length) {\n\t\t\t\t\t\tthis.setActiveOption($option);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\treturn original.apply(this, arguments);\n\t\t\t};\n\t\t})();\n\t\n\t\tvar getScrollbarWidth = function() {\n\t\t\tvar div;\n\t\t\tvar width = getScrollbarWidth.width;\n\t\t\tvar doc = document;\n\t\n\t\t\tif (typeof width === 'undefined') {\n\t\t\t\tdiv = doc.createElement('div');\n\t\t\t\tdiv.innerHTML = '<div style=\"width:50px;height:50px;position:absolute;left:-50px;top:-50px;overflow:auto;\"><div style=\"width:1px;height:100px;\"></div></div>';\n\t\t\t\tdiv = div.firstChild;\n\t\t\t\tdoc.body.appendChild(div);\n\t\t\t\twidth = getScrollbarWidth.width = div.offsetWidth - div.clientWidth;\n\t\t\t\tdoc.body.removeChild(div);\n\t\t\t}\n\t\t\treturn width;\n\t\t};\n\t\n\t\tvar equalizeSizes = function() {\n\t\t\tvar i, n, height_max, width, width_last, width_parent, $optgroups;\n\t\n\t\t\t$optgroups = $('[data-group]', self.$dropdown_content);\n\t\t\tn = $optgroups.length;\n\t\t\tif (!n || !self.$dropdown_content.width()) return;\n\t\n\t\t\tif (options.equalizeHeight) {\n\t\t\t\theight_max = 0;\n\t\t\t\tfor (i = 0; i < n; i++) {\n\t\t\t\t\theight_max = Math.max(height_max, $optgroups.eq(i).height());\n\t\t\t\t}\n\t\t\t\t$optgroups.css({height: height_max});\n\t\t\t}\n\t\n\t\t\tif (options.equalizeWidth) {\n\t\t\t\twidth_parent = self.$dropdown_content.innerWidth() - getScrollbarWidth();\n\t\t\t\twidth = Math.round(width_parent / n);\n\t\t\t\t$optgroups.css({width: width});\n\t\t\t\tif (n > 1) {\n\t\t\t\t\twidth_last = width_parent - width * (n - 1);\n\t\t\t\t\t$optgroups.eq(n - 1).css({width: width_last});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\tif (options.equalizeHeight || options.equalizeWidth) {\n\t\t\thook.after(this, 'positionDropdown', equalizeSizes);\n\t\t\thook.after(this, 'refreshOptions', equalizeSizes);\n\t\t}\n\t\n\t\n\t});\n\t\n\tSelectize.define('remove_button', function(options) {\n\t\toptions = $.extend({\n\t\t\t\tlabel     : '&times;',\n\t\t\t\ttitle     : 'Remove',\n\t\t\t\tclassName : 'remove',\n\t\t\t\tappend    : true\n\t\t\t}, options);\n\t\n\t\t\tvar singleClose = function(thisRef, options) {\n\t\n\t\t\t\toptions.className = 'remove-single';\n\t\n\t\t\t\tvar self = thisRef;\n\t\t\t\tvar html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n\t\n\t\t\t\t/**\n\t\t\t\t * Appends an element as a child (with raw HTML).\n\t\t\t\t *\n\t\t\t\t * @param {string} html_container\n\t\t\t\t * @param {string} html_element\n\t\t\t\t * @return {string}\n\t\t\t\t */\n\t\t\t\tvar append = function(html_container, html_element) {\n\t\t\t\t\treturn $('<span>').append(html_container)\n\t\t\t\t\t\t.append(html_element);\n\t\t\t\t};\n\t\n\t\t\t\tthisRef.setup = (function() {\n\t\t\t\t\tvar original = self.setup;\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\t// override the item rendering method to add the button to each\n\t\t\t\t\t\tif (options.append) {\n\t\t\t\t\t\t\tvar id = $(self.$input.context).attr('id');\n\t\t\t\t\t\t\tvar selectizer = $('#'+id);\n\t\n\t\t\t\t\t\t\tvar render_item = self.settings.render.item;\n\t\t\t\t\t\t\tself.settings.render.item = function(data) {\n\t\t\t\t\t\t\t\treturn append(render_item.apply(thisRef, arguments), html);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\toriginal.apply(thisRef, arguments);\n\t\n\t\t\t\t\t\t// add event listener\n\t\t\t\t\t\tthisRef.$control.on('click', '.' + options.className, function(e) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tif (self.isLocked) return;\n\t\n\t\t\t\t\t\t\tself.clear();\n\t\t\t\t\t\t});\n\t\n\t\t\t\t\t};\n\t\t\t\t})();\n\t\t\t};\n\t\n\t\t\tvar multiClose = function(thisRef, options) {\n\t\n\t\t\t\tvar self = thisRef;\n\t\t\t\tvar html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n\t\n\t\t\t\t/**\n\t\t\t\t * Appends an element as a child (with raw HTML).\n\t\t\t\t *\n\t\t\t\t * @param {string} html_container\n\t\t\t\t * @param {string} html_element\n\t\t\t\t * @return {string}\n\t\t\t\t */\n\t\t\t\tvar append = function(html_container, html_element) {\n\t\t\t\t\tvar pos = html_container.search(/(<\\/[^>]+>\\s*)$/);\n\t\t\t\t\treturn html_container.substring(0, pos) + html_element + html_container.substring(pos);\n\t\t\t\t};\n\t\n\t\t\t\tthisRef.setup = (function() {\n\t\t\t\t\tvar original = self.setup;\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\t// override the item rendering method to add the button to each\n\t\t\t\t\t\tif (options.append) {\n\t\t\t\t\t\t\tvar render_item = self.settings.render.item;\n\t\t\t\t\t\t\tself.settings.render.item = function(data) {\n\t\t\t\t\t\t\t\treturn append(render_item.apply(thisRef, arguments), html);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\toriginal.apply(thisRef, arguments);\n\t\n\t\t\t\t\t\t// add event listener\n\t\t\t\t\t\tthisRef.$control.on('click', '.' + options.className, function(e) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tif (self.isLocked) return;\n\t\n\t\t\t\t\t\t\tvar $item = $(e.currentTarget).parent();\n\t\t\t\t\t\t\tself.setActiveItem($item);\n\t\t\t\t\t\t\tif (self.deleteSelection()) {\n\t\t\t\t\t\t\t\tself.setCaret(self.items.length);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\n\t\t\t\t\t};\n\t\t\t\t})();\n\t\t\t};\n\t\n\t\t\tif (this.settings.mode === 'single') {\n\t\t\t\tsingleClose(this, options);\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tmultiClose(this, options);\n\t\t\t}\n\t});\n\t\n\t\n\tSelectize.define('restore_on_backspace', function(options) {\n\t\tvar self = this;\n\t\n\t\toptions.text = options.text || function(option) {\n\t\t\treturn option[this.settings.labelField];\n\t\t};\n\t\n\t\tthis.onKeyDown = (function() {\n\t\t\tvar original = self.onKeyDown;\n\t\t\treturn function(e) {\n\t\t\t\tvar index, option;\n\t\t\t\tif (e.keyCode === KEY_BACKSPACE && this.$control_input.val() === '' && !this.$activeItems.length) {\n\t\t\t\t\tindex = this.caretPos - 1;\n\t\t\t\t\tif (index >= 0 && index < this.items.length) {\n\t\t\t\t\t\toption = this.options[this.items[index]];\n\t\t\t\t\t\tif (this.deleteSelection(e)) {\n\t\t\t\t\t\t\tthis.setTextboxValue(options.text.apply(this, [option]));\n\t\t\t\t\t\t\tthis.refreshOptions(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn original.apply(this, arguments);\n\t\t\t};\n\t\t})();\n\t});\n\t\n\n\treturn Selectize;\n}));\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"scrollLock\"] = factory();\n\telse\n\t\troot[\"scrollLock\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { 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 = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./src/tools.js\nvar argumentAsArray = function argumentAsArray(argument) {\n  return Array.isArray(argument) ? argument : [argument];\n};\nvar isElement = function isElement(target) {\n  return target instanceof Node;\n};\nvar isElementList = function isElementList(nodeList) {\n  return nodeList instanceof NodeList;\n};\nvar eachNode = function eachNode(nodeList, callback) {\n  if (nodeList && callback) {\n    nodeList = isElementList(nodeList) ? nodeList : [nodeList];\n\n    for (var i = 0; i < nodeList.length; i++) {\n      if (callback(nodeList[i], i, nodeList.length) === true) {\n        break;\n      }\n    }\n  }\n};\nvar throwError = function throwError(message) {\n  return console.error(\"[scroll-lock] \".concat(message));\n};\nvar arrayAsSelector = function arrayAsSelector(array) {\n  if (Array.isArray(array)) {\n    var selector = array.join(', ');\n    return selector;\n  }\n};\nvar nodeListAsArray = function nodeListAsArray(nodeList) {\n  var nodes = [];\n  eachNode(nodeList, function (node) {\n    return nodes.push(node);\n  });\n  return nodes;\n};\nvar findParentBySelector = function findParentBySelector($el, selector) {\n  var self = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n  var $root = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : document;\n\n  if (self && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1) {\n    return $el;\n  }\n\n  while (($el = $el.parentElement) && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) === -1) {\n    ;\n  }\n\n  return $el;\n};\nvar elementHasSelector = function elementHasSelector($el, selector) {\n  var $root = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document;\n  var has = nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1;\n  return has;\n};\nvar elementHasOverflowHidden = function elementHasOverflowHidden($el) {\n  if ($el) {\n    var computedStyle = getComputedStyle($el);\n    var overflowIsHidden = computedStyle.overflow === 'hidden';\n    return overflowIsHidden;\n  }\n};\nvar elementScrollTopOnStart = function elementScrollTopOnStart($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollTop = $el.scrollTop;\n    return scrollTop <= 0;\n  }\n};\nvar elementScrollTopOnEnd = function elementScrollTopOnEnd($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollTop = $el.scrollTop;\n    var scrollHeight = $el.scrollHeight;\n    var scrollTopWithHeight = scrollTop + $el.offsetHeight;\n    return scrollTopWithHeight >= scrollHeight;\n  }\n};\nvar elementScrollLeftOnStart = function elementScrollLeftOnStart($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollLeft = $el.scrollLeft;\n    return scrollLeft <= 0;\n  }\n};\nvar elementScrollLeftOnEnd = function elementScrollLeftOnEnd($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollLeft = $el.scrollLeft;\n    var scrollWidth = $el.scrollWidth;\n    var scrollLeftWithWidth = scrollLeft + $el.offsetWidth;\n    return scrollLeftWithWidth >= scrollWidth;\n  }\n};\nvar elementIsScrollableField = function elementIsScrollableField($el) {\n  var selector = 'textarea, [contenteditable=\"true\"]';\n  return elementHasSelector($el, selector);\n};\nvar elementIsInputRange = function elementIsInputRange($el) {\n  var selector = 'input[type=\"range\"]';\n  return elementHasSelector($el, selector);\n};\n// CONCATENATED MODULE: ./src/scroll-lock.js\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"disablePageScroll\", function() { return disablePageScroll; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"enablePageScroll\", function() { return enablePageScroll; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getScrollState\", function() { return getScrollState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clearQueueScrollLocks\", function() { return clearQueueScrollLocks; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getTargetScrollBarWidth\", function() { return scroll_lock_getTargetScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCurrentTargetScrollBarWidth\", function() { return scroll_lock_getCurrentTargetScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getPageScrollBarWidth\", function() { return getPageScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCurrentPageScrollBarWidth\", function() { return getCurrentPageScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addScrollableTarget\", function() { return scroll_lock_addScrollableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeScrollableTarget\", function() { return scroll_lock_removeScrollableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addScrollableSelector\", function() { return scroll_lock_addScrollableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeScrollableSelector\", function() { return scroll_lock_removeScrollableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addLockableTarget\", function() { return scroll_lock_addLockableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addLockableSelector\", function() { return scroll_lock_addLockableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"setFillGapMethod\", function() { return scroll_lock_setFillGapMethod; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addFillGapTarget\", function() { return scroll_lock_addFillGapTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeFillGapTarget\", function() { return scroll_lock_removeFillGapTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addFillGapSelector\", function() { return scroll_lock_addFillGapSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeFillGapSelector\", function() { return scroll_lock_removeFillGapSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"refillGaps\", function() { return refillGaps; });\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\nvar FILL_GAP_AVAILABLE_METHODS = ['padding', 'margin', 'width', 'max-width', 'none'];\nvar TOUCH_DIRECTION_DETECT_OFFSET = 3;\nvar state = {\n  scroll: true,\n  queue: 0,\n  scrollableSelectors: ['[data-scroll-lock-scrollable]'],\n  lockableSelectors: ['body', '[data-scroll-lock-lockable]'],\n  fillGapSelectors: ['body', '[data-scroll-lock-fill-gap]', '[data-scroll-lock-lockable]'],\n  fillGapMethod: FILL_GAP_AVAILABLE_METHODS[0],\n  //\n  startTouchY: 0,\n  startTouchX: 0\n};\nvar disablePageScroll = function disablePageScroll(target) {\n  if (state.queue <= 0) {\n    state.scroll = false;\n    scroll_lock_hideLockableOverflow();\n    fillGaps();\n  }\n\n  scroll_lock_addScrollableTarget(target);\n  state.queue++;\n};\nvar enablePageScroll = function enablePageScroll(target) {\n  state.queue > 0 && state.queue--;\n\n  if (state.queue <= 0) {\n    state.scroll = true;\n    scroll_lock_showLockableOverflow();\n    unfillGaps();\n  }\n\n  scroll_lock_removeScrollableTarget(target);\n};\nvar getScrollState = function getScrollState() {\n  return state.scroll;\n};\nvar clearQueueScrollLocks = function clearQueueScrollLocks() {\n  state.queue = 0;\n};\nvar scroll_lock_getTargetScrollBarWidth = function getTargetScrollBarWidth($target) {\n  var onlyExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (isElement($target)) {\n    var currentOverflowYProperty = $target.style.overflowY;\n\n    if (onlyExists) {\n      if (!getScrollState()) {\n        $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-overflow-y-property');\n      }\n    } else {\n      $target.style.overflowY = 'scroll';\n    }\n\n    var width = scroll_lock_getCurrentTargetScrollBarWidth($target);\n    $target.style.overflowY = currentOverflowYProperty;\n    return width;\n  } else {\n    return 0;\n  }\n};\nvar scroll_lock_getCurrentTargetScrollBarWidth = function getCurrentTargetScrollBarWidth($target) {\n  if (isElement($target)) {\n    if ($target === document.body) {\n      var documentWidth = document.documentElement.clientWidth;\n      var windowWidth = window.innerWidth;\n      var currentWidth = windowWidth - documentWidth;\n      return currentWidth;\n    } else {\n      var borderLeftWidthCurrentProperty = $target.style.borderLeftWidth;\n      var borderRightWidthCurrentProperty = $target.style.borderRightWidth;\n      $target.style.borderLeftWidth = '0px';\n      $target.style.borderRightWidth = '0px';\n\n      var _currentWidth = $target.offsetWidth - $target.clientWidth;\n\n      $target.style.borderLeftWidth = borderLeftWidthCurrentProperty;\n      $target.style.borderRightWidth = borderRightWidthCurrentProperty;\n      return _currentWidth;\n    }\n  } else {\n    return 0;\n  }\n};\nvar getPageScrollBarWidth = function getPageScrollBarWidth() {\n  var onlyExists = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n  return scroll_lock_getTargetScrollBarWidth(document.body, onlyExists);\n};\nvar getCurrentPageScrollBarWidth = function getCurrentPageScrollBarWidth() {\n  return scroll_lock_getCurrentTargetScrollBarWidth(document.body);\n};\nvar scroll_lock_addScrollableTarget = function addScrollableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-scrollable', '');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_removeScrollableTarget = function removeScrollableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.removeAttribute('data-scroll-lock-scrollable');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_addScrollableSelector = function addScrollableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.scrollableSelectors.push(selector);\n    });\n  }\n};\nvar scroll_lock_removeScrollableSelector = function removeScrollableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.scrollableSelectors = state.scrollableSelectors.filter(function (sSelector) {\n        return sSelector !== selector;\n      });\n    });\n  }\n};\nvar scroll_lock_addLockableTarget = function addLockableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-lockable', '');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n\n    if (!getScrollState()) {\n      scroll_lock_hideLockableOverflow();\n    }\n  }\n};\nvar scroll_lock_addLockableSelector = function addLockableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.lockableSelectors.push(selector);\n    });\n\n    if (!getScrollState()) {\n      scroll_lock_hideLockableOverflow();\n    }\n\n    scroll_lock_addFillGapSelector(selector);\n  }\n};\nvar scroll_lock_setFillGapMethod = function setFillGapMethod(method) {\n  if (method) {\n    if (FILL_GAP_AVAILABLE_METHODS.indexOf(method) !== -1) {\n      state.fillGapMethod = method;\n      refillGaps();\n    } else {\n      var methods = FILL_GAP_AVAILABLE_METHODS.join(', ');\n      throwError(\"\\\"\".concat(method, \"\\\" method is not available!\\nAvailable fill gap methods: \").concat(methods, \".\"));\n    }\n  }\n};\nvar scroll_lock_addFillGapTarget = function addFillGapTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-fill-gap', '');\n\n          if (!state.scroll) {\n            scroll_lock_fillGapTarget($target);\n          }\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_removeFillGapTarget = function removeFillGapTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.removeAttribute('data-scroll-lock-fill-gap');\n\n          if (!state.scroll) {\n            scroll_lock_unfillGapTarget($target);\n          }\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_addFillGapSelector = function addFillGapSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      if (state.fillGapSelectors.indexOf(selector) === -1) {\n        state.fillGapSelectors.push(selector);\n\n        if (!state.scroll) {\n          scroll_lock_fillGapSelector(selector);\n        }\n      }\n    });\n  }\n};\nvar scroll_lock_removeFillGapSelector = function removeFillGapSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.fillGapSelectors = state.fillGapSelectors.filter(function (fSelector) {\n        return fSelector !== selector;\n      });\n\n      if (!state.scroll) {\n        scroll_lock_unfillGapSelector(selector);\n      }\n    });\n  }\n};\nvar refillGaps = function refillGaps() {\n  if (!state.scroll) {\n    fillGaps();\n  }\n};\n\nvar scroll_lock_hideLockableOverflow = function hideLockableOverflow() {\n  var selector = arrayAsSelector(state.lockableSelectors);\n  scroll_lock_hideLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_showLockableOverflow = function showLockableOverflow() {\n  var selector = arrayAsSelector(state.lockableSelectors);\n  scroll_lock_showLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_hideLockableOverflowSelector = function hideLockableOverflowSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_hideLockableOverflowTarget($target);\n  });\n};\n\nvar scroll_lock_showLockableOverflowSelector = function showLockableOverflowSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_showLockableOverflowTarget($target);\n  });\n};\n\nvar scroll_lock_hideLockableOverflowTarget = function hideLockableOverflowTarget($target) {\n  if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') !== 'true') {\n    var computedStyle = window.getComputedStyle($target);\n    $target.setAttribute('data-scroll-lock-saved-overflow-y-property', computedStyle.overflowY);\n    $target.setAttribute('data-scroll-lock-saved-inline-overflow-property', $target.style.overflow);\n    $target.setAttribute('data-scroll-lock-saved-inline-overflow-y-property', $target.style.overflowY);\n    $target.style.overflow = 'hidden';\n    $target.setAttribute('data-scroll-lock-locked', 'true');\n  }\n};\n\nvar scroll_lock_showLockableOverflowTarget = function showLockableOverflowTarget($target) {\n  if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') === 'true') {\n    $target.style.overflow = $target.getAttribute('data-scroll-lock-saved-inline-overflow-property');\n    $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n    $target.removeAttribute('data-scroll-lock-saved-overflow-property');\n    $target.removeAttribute('data-scroll-lock-saved-inline-overflow-property');\n    $target.removeAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n    $target.removeAttribute('data-scroll-lock-locked');\n  }\n};\n\nvar fillGaps = function fillGaps() {\n  state.fillGapSelectors.map(function (selector) {\n    scroll_lock_fillGapSelector(selector);\n  });\n};\n\nvar unfillGaps = function unfillGaps() {\n  state.fillGapSelectors.map(function (selector) {\n    scroll_lock_unfillGapSelector(selector);\n  });\n};\n\nvar scroll_lock_fillGapSelector = function fillGapSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  var isLockable = state.lockableSelectors.indexOf(selector) !== -1;\n  eachNode($targets, function ($target) {\n    scroll_lock_fillGapTarget($target, isLockable);\n  });\n};\n\nvar scroll_lock_fillGapTarget = function fillGapTarget($target) {\n  var isLockable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (isElement($target)) {\n    var scrollBarWidth;\n\n    if ($target.getAttribute('data-scroll-lock-lockable') === '' || isLockable) {\n      scrollBarWidth = scroll_lock_getTargetScrollBarWidth($target, true);\n    } else {\n      var $lockableParent = findParentBySelector($target, arrayAsSelector(state.lockableSelectors));\n      scrollBarWidth = scroll_lock_getTargetScrollBarWidth($lockableParent, true);\n    }\n\n    if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n      scroll_lock_unfillGapTarget($target);\n    }\n\n    var computedStyle = window.getComputedStyle($target);\n    $target.setAttribute('data-scroll-lock-filled-gap', 'true');\n    $target.setAttribute('data-scroll-lock-current-fill-gap-method', state.fillGapMethod);\n\n    if (state.fillGapMethod === 'margin') {\n      var currentMargin = parseFloat(computedStyle.marginRight);\n      $target.style.marginRight = \"\".concat(currentMargin + scrollBarWidth, \"px\");\n    } else if (state.fillGapMethod === 'width') {\n      $target.style.width = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n    } else if (state.fillGapMethod === 'max-width') {\n      $target.style.maxWidth = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n    } else if (state.fillGapMethod === 'padding') {\n      var currentPadding = parseFloat(computedStyle.paddingRight);\n      $target.style.paddingRight = \"\".concat(currentPadding + scrollBarWidth, \"px\");\n    }\n  }\n};\n\nvar scroll_lock_unfillGapSelector = function unfillGapSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_unfillGapTarget($target);\n  });\n};\n\nvar scroll_lock_unfillGapTarget = function unfillGapTarget($target) {\n  if (isElement($target)) {\n    if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n      var currentFillGapMethod = $target.getAttribute('data-scroll-lock-current-fill-gap-method');\n      $target.removeAttribute('data-scroll-lock-filled-gap');\n      $target.removeAttribute('data-scroll-lock-current-fill-gap-method');\n\n      if (currentFillGapMethod === 'margin') {\n        $target.style.marginRight = \"\";\n      } else if (currentFillGapMethod === 'width') {\n        $target.style.width = \"\";\n      } else if (currentFillGapMethod === 'max-width') {\n        $target.style.maxWidth = \"\";\n      } else if (currentFillGapMethod === 'padding') {\n        $target.style.paddingRight = \"\";\n      }\n    }\n  }\n};\n\nvar onResize = function onResize(e) {\n  refillGaps();\n};\n\nvar onTouchStart = function onTouchStart(e) {\n  if (!state.scroll) {\n    state.startTouchY = e.touches[0].clientY;\n    state.startTouchX = e.touches[0].clientX;\n  }\n};\n\nvar scroll_lock_onTouchMove = function onTouchMove(e) {\n  if (!state.scroll) {\n    var startTouchY = state.startTouchY,\n        startTouchX = state.startTouchX;\n    var currentClientY = e.touches[0].clientY;\n    var currentClientX = e.touches[0].clientX;\n\n    if (e.touches.length < 2) {\n      var selector = arrayAsSelector(state.scrollableSelectors);\n      var direction = {\n        up: startTouchY < currentClientY,\n        down: startTouchY > currentClientY,\n        left: startTouchX < currentClientX,\n        right: startTouchX > currentClientX\n      };\n      var directionWithOffset = {\n        up: startTouchY + TOUCH_DIRECTION_DETECT_OFFSET < currentClientY,\n        down: startTouchY - TOUCH_DIRECTION_DETECT_OFFSET > currentClientY,\n        left: startTouchX + TOUCH_DIRECTION_DETECT_OFFSET < currentClientX,\n        right: startTouchX - TOUCH_DIRECTION_DETECT_OFFSET > currentClientX\n      };\n\n      var handle = function handle($el) {\n        var skip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n        if ($el) {\n          var parentScrollableEl = findParentBySelector($el, selector, false);\n\n          if (elementIsInputRange($el)) {\n            return false;\n          }\n\n          if (skip || elementIsScrollableField($el) && findParentBySelector($el, selector) || elementHasSelector($el, selector)) {\n            var prevent = false;\n\n            if (elementScrollLeftOnStart($el) && elementScrollLeftOnEnd($el)) {\n              if (direction.up && elementScrollTopOnStart($el) || direction.down && elementScrollTopOnEnd($el)) {\n                prevent = true;\n              }\n            } else if (elementScrollTopOnStart($el) && elementScrollTopOnEnd($el)) {\n              if (direction.left && elementScrollLeftOnStart($el) || direction.right && elementScrollLeftOnEnd($el)) {\n                prevent = true;\n              }\n            } else if (directionWithOffset.up && elementScrollTopOnStart($el) || directionWithOffset.down && elementScrollTopOnEnd($el) || directionWithOffset.left && elementScrollLeftOnStart($el) || directionWithOffset.right && elementScrollLeftOnEnd($el)) {\n              prevent = true;\n            }\n\n            if (prevent) {\n              if (parentScrollableEl) {\n                handle(parentScrollableEl, true);\n              } else {\n                if (e.cancelable) {\n                  e.preventDefault();\n                }\n              }\n            }\n          } else {\n            handle(parentScrollableEl);\n          }\n        } else {\n          if (e.cancelable) {\n            e.preventDefault();\n          }\n        }\n      };\n\n      handle(e.target);\n    }\n  }\n};\n\nvar onTouchEnd = function onTouchEnd(e) {\n  if (!state.scroll) {\n    state.startTouchY = 0;\n    state.startTouchX = 0;\n  }\n};\n\nif (typeof window !== 'undefined') {\n  window.addEventListener('resize', onResize);\n}\n\nif (typeof document !== 'undefined') {\n  document.addEventListener('touchstart', onTouchStart);\n  document.addEventListener('touchmove', scroll_lock_onTouchMove, {\n    passive: false\n  });\n  document.addEventListener('touchend', onTouchEnd);\n}\n\nvar deprecatedMethods = {\n  hide: function hide(target) {\n    throwError('\"hide\" is deprecated! Use \"disablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#disablepagescrollscrollabletarget');\n    disablePageScroll(target);\n  },\n  show: function show(target) {\n    throwError('\"show\" is deprecated! Use \"enablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#enablepagescrollscrollabletarget');\n    enablePageScroll(target);\n  },\n  toggle: function toggle(target) {\n    throwError('\"toggle\" is deprecated! Do not use it.');\n\n    if (getScrollState()) {\n      disablePageScroll();\n    } else {\n      enablePageScroll(target);\n    }\n  },\n  getState: function getState() {\n    throwError('\"getState\" is deprecated! Use \"getScrollState\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getscrollstate');\n    return getScrollState();\n  },\n  getWidth: function getWidth() {\n    throwError('\"getWidth\" is deprecated! Use \"getPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getpagescrollbarwidth');\n    return getPageScrollBarWidth();\n  },\n  getCurrentWidth: function getCurrentWidth() {\n    throwError('\"getCurrentWidth\" is deprecated! Use \"getCurrentPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getcurrentpagescrollbarwidth');\n    return getCurrentPageScrollBarWidth();\n  },\n  setScrollableTargets: function setScrollableTargets(target) {\n    throwError('\"setScrollableTargets\" is deprecated! Use \"addScrollableTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addscrollabletargetscrollabletarget');\n    scroll_lock_addScrollableTarget(target);\n  },\n  setFillGapSelectors: function setFillGapSelectors(selector) {\n    throwError('\"setFillGapSelectors\" is deprecated! Use \"addFillGapSelector\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgapselectorfillgapselector');\n    scroll_lock_addFillGapSelector(selector);\n  },\n  setFillGapTargets: function setFillGapTargets(target) {\n    throwError('\"setFillGapTargets\" is deprecated! Use \"addFillGapTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgaptargetfillgaptarget');\n    scroll_lock_addFillGapTarget(target);\n  },\n  clearQueue: function clearQueue() {\n    throwError('\"clearQueue\" is deprecated! Use \"clearQueueScrollLocks\" instead. \\n https://github.com/FL3NKEY/scroll-lock#clearqueuescrolllocks');\n    clearQueueScrollLocks();\n  }\n};\n\nvar scrollLock = _objectSpread({\n  disablePageScroll: disablePageScroll,\n  enablePageScroll: enablePageScroll,\n  getScrollState: getScrollState,\n  clearQueueScrollLocks: clearQueueScrollLocks,\n  getTargetScrollBarWidth: scroll_lock_getTargetScrollBarWidth,\n  getCurrentTargetScrollBarWidth: scroll_lock_getCurrentTargetScrollBarWidth,\n  getPageScrollBarWidth: getPageScrollBarWidth,\n  getCurrentPageScrollBarWidth: getCurrentPageScrollBarWidth,\n  addScrollableSelector: scroll_lock_addScrollableSelector,\n  removeScrollableSelector: scroll_lock_removeScrollableSelector,\n  addScrollableTarget: scroll_lock_addScrollableTarget,\n  removeScrollableTarget: scroll_lock_removeScrollableTarget,\n  addLockableSelector: scroll_lock_addLockableSelector,\n  addLockableTarget: scroll_lock_addLockableTarget,\n  addFillGapSelector: scroll_lock_addFillGapSelector,\n  removeFillGapSelector: scroll_lock_removeFillGapSelector,\n  addFillGapTarget: scroll_lock_addFillGapTarget,\n  removeFillGapTarget: scroll_lock_removeFillGapTarget,\n  setFillGapMethod: scroll_lock_setFillGapMethod,\n  refillGaps: refillGaps,\n  _state: state\n}, deprecatedMethods);\n\n/* harmony default export */ var scroll_lock = __webpack_exports__[\"default\"] = (scrollLock);\n\n/***/ })\n/******/ ])[\"default\"];\n});\n/*!\n  * PhotoSwipe 5.4.4 - https://photoswipe.com\n  * (c) 2024 Dmytro Semenov\n  */\n!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).PhotoSwipe=i()}(this,(function(){\"use strict\";function t(t,i,s){const h=document.createElement(i);return t&&(h.className=t),s&&s.appendChild(h),h}function i(t,i){return t.x=i.x,t.y=i.y,void 0!==i.id&&(t.id=i.id),t}function s(t){t.x=Math.round(t.x),t.y=Math.round(t.y)}function h(t,i){const s=Math.abs(t.x-i.x),h=Math.abs(t.y-i.y);return Math.sqrt(s*s+h*h)}function e(t,i){return t.x===i.x&&t.y===i.y}function n(t,i,s){return Math.min(Math.max(t,i),s)}function o(t,i,s){let h=`translate3d(${t}px,${i||0}px,0)`;return void 0!==s&&(h+=` scale3d(${s},${s},1)`),h}function r(t,i,s,h){t.style.transform=o(i,s,h)}function a(t,i,s,h){t.style.transition=i?`${i} ${s}ms ${h||\"cubic-bezier(.4,0,.22,1)\"}`:\"none\"}function l(t,i,s){t.style.width=\"number\"==typeof i?`${i}px`:i,t.style.height=\"number\"==typeof s?`${s}px`:s}const c=\"idle\",d=\"loading\",u=\"loaded\",p=\"error\";function m(){return!(!navigator.vendor||!navigator.vendor.match(/apple/i))}let v=!1;try{window.addEventListener(\"test\",null,Object.defineProperty({},\"passive\",{get:()=>{v=!0}}))}catch(t){}class f{constructor(){this.t=[]}add(t,i,s,h){this.i(t,i,s,h)}remove(t,i,s,h){this.i(t,i,s,h,!0)}removeAll(){this.t.forEach((t=>{this.i(t.target,t.type,t.listener,t.passive,!0,!0)})),this.t=[]}i(t,i,s,h,e,n){if(!t)return;const o=e?\"removeEventListener\":\"addEventListener\";i.split(\" \").forEach((i=>{if(i){n||(e?this.t=this.t.filter((h=>h.type!==i||h.listener!==s||h.target!==t)):this.t.push({target:t,type:i,listener:s,passive:h}));const r=!!v&&{passive:h||!1};t[o](i,s,r)}}))}}function w(t,i){if(t.getViewportSizeFn){const s=t.getViewportSizeFn(t,i);if(s)return s}return{x:document.documentElement.clientWidth,y:window.innerHeight}}function g(t,i,s,h,e){let n=0;if(i.paddingFn)n=i.paddingFn(s,h,e)[t];else if(i.padding)n=i.padding[t];else{const s=\"padding\"+t[0].toUpperCase()+t.slice(1);i[s]&&(n=i[s])}return Number(n)||0}function y(t,i,s,h){return{x:i.x-g(\"left\",t,i,s,h)-g(\"right\",t,i,s,h),y:i.y-g(\"top\",t,i,s,h)-g(\"bottom\",t,i,s,h)}}class _{constructor(t){this.slide=t,this.currZoomLevel=1,this.center={x:0,y:0},this.max={x:0,y:0},this.min={x:0,y:0}}update(t){this.currZoomLevel=t,this.slide.width?(this.o(\"x\"),this.o(\"y\"),this.slide.pswp.dispatch(\"calcBounds\",{slide:this.slide})):this.reset()}o(t){const{pswp:i}=this.slide,s=this.slide[\"x\"===t?\"width\":\"height\"]*this.currZoomLevel,h=g(\"x\"===t?\"left\":\"top\",i.options,i.viewportSize,this.slide.data,this.slide.index),e=this.slide.panAreaSize[t];this.center[t]=Math.round((e-s)/2)+h,this.max[t]=s>e?Math.round(e-s)+h:this.center[t],this.min[t]=s>e?h:this.center[t]}reset(){this.center.x=0,this.center.y=0,this.max.x=0,this.max.y=0,this.min.x=0,this.min.y=0}correctPan(t,i){return n(i,this.max[t],this.min[t])}}class x{constructor(t,i,s,h){this.pswp=h,this.options=t,this.itemData=i,this.index=s,this.panAreaSize=null,this.elementSize=null,this.fit=1,this.fill=1,this.vFill=1,this.initial=1,this.secondary=1,this.max=1,this.min=1}update(t,i,s){const h={x:t,y:i};this.elementSize=h,this.panAreaSize=s;const e=s.x/h.x,n=s.y/h.y;this.fit=Math.min(1,e<n?e:n),this.fill=Math.min(1,e>n?e:n),this.vFill=Math.min(1,n),this.initial=this.l(),this.secondary=this.u(),this.max=Math.max(this.initial,this.secondary,this.p()),this.min=Math.min(this.fit,this.initial,this.secondary),this.pswp&&this.pswp.dispatch(\"zoomLevelsUpdate\",{zoomLevels:this,slideData:this.itemData})}m(t){const i=t+\"ZoomLevel\",s=this.options[i];if(s)return\"function\"==typeof s?s(this):\"fill\"===s?this.fill:\"fit\"===s?this.fit:Number(s)}u(){let t=this.m(\"secondary\");return t||(t=Math.min(1,3*this.fit),this.elementSize&&t*this.elementSize.x>4e3&&(t=4e3/this.elementSize.x),t)}l(){return this.m(\"initial\")||this.fit}p(){return this.m(\"max\")||Math.max(1,4*this.fit)}}class b{constructor(i,s,h){this.data=i,this.index=s,this.pswp=h,this.isActive=s===h.currIndex,this.currentResolution=0,this.panAreaSize={x:0,y:0},this.pan={x:0,y:0},this.isFirstSlide=this.isActive&&!h.opener.isOpen,this.zoomLevels=new x(h.options,i,s,h),this.pswp.dispatch(\"gettingData\",{slide:this,data:this.data,index:s}),this.content=this.pswp.contentLoader.getContentBySlide(this),this.container=t(\"pswp__zoom-wrap\",\"div\"),this.holderElement=null,this.currZoomLevel=1,this.width=this.content.width,this.height=this.content.height,this.heavyAppended=!1,this.bounds=new _(this),this.prevDisplayedWidth=-1,this.prevDisplayedHeight=-1,this.pswp.dispatch(\"slideInit\",{slide:this})}setIsActive(t){t&&!this.isActive?this.activate():!t&&this.isActive&&this.deactivate()}append(t){this.holderElement=t,this.container.style.transformOrigin=\"0 0\",this.data&&(this.calculateSize(),this.load(),this.updateContentSize(),this.appendHeavy(),this.holderElement.appendChild(this.container),this.zoomAndPanToInitial(),this.pswp.dispatch(\"firstZoomPan\",{slide:this}),this.applyCurrentZoomPan(),this.pswp.dispatch(\"afterSetContent\",{slide:this}),this.isActive&&this.activate())}load(){this.content.load(!1),this.pswp.dispatch(\"slideLoad\",{slide:this})}appendHeavy(){const{pswp:t}=this;!this.heavyAppended&&t.opener.isOpen&&!t.mainScroll.isShifted()&&(this.isActive,1)&&(this.pswp.dispatch(\"appendHeavy\",{slide:this}).defaultPrevented||(this.heavyAppended=!0,this.content.append(),this.pswp.dispatch(\"appendHeavyContent\",{slide:this})))}activate(){this.isActive=!0,this.appendHeavy(),this.content.activate(),this.pswp.dispatch(\"slideActivate\",{slide:this})}deactivate(){this.isActive=!1,this.content.deactivate(),this.currZoomLevel!==this.zoomLevels.initial&&this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize(),this.pswp.dispatch(\"slideDeactivate\",{slide:this})}destroy(){this.content.hasSlide=!1,this.content.remove(),this.container.remove(),this.pswp.dispatch(\"slideDestroy\",{slide:this})}resize(){this.currZoomLevel!==this.zoomLevels.initial&&this.isActive?(this.calculateSize(),this.bounds.update(this.currZoomLevel),this.panTo(this.pan.x,this.pan.y)):(this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize())}updateContentSize(t){const i=this.currentResolution||this.zoomLevels.initial;if(!i)return;const s=Math.round(this.width*i)||this.pswp.viewportSize.x,h=Math.round(this.height*i)||this.pswp.viewportSize.y;(this.sizeChanged(s,h)||t)&&this.content.setDisplayedSize(s,h)}sizeChanged(t,i){return(t!==this.prevDisplayedWidth||i!==this.prevDisplayedHeight)&&(this.prevDisplayedWidth=t,this.prevDisplayedHeight=i,!0)}getPlaceholderElement(){var t;return null===(t=this.content.placeholder)||void 0===t?void 0:t.element}zoomTo(t,i,h,e){const{pswp:o}=this;if(!this.isZoomable()||o.mainScroll.isShifted())return;o.dispatch(\"beforeZoomTo\",{destZoomLevel:t,centerPoint:i,transitionDuration:h}),o.animations.stopAllPan();const r=this.currZoomLevel;e||(t=n(t,this.zoomLevels.min,this.zoomLevels.max)),this.setZoomLevel(t),this.pan.x=this.calculateZoomToPanOffset(\"x\",i,r),this.pan.y=this.calculateZoomToPanOffset(\"y\",i,r),s(this.pan);const a=()=>{this.v(t),this.applyCurrentZoomPan()};h?o.animations.startTransition({isPan:!0,name:\"zoomTo\",target:this.container,transform:this.getCurrentTransform(),onComplete:a,duration:h,easing:o.options.easing}):a()}toggleZoom(t){this.zoomTo(this.currZoomLevel===this.zoomLevels.initial?this.zoomLevels.secondary:this.zoomLevels.initial,t,this.pswp.options.zoomAnimationDuration)}setZoomLevel(t){this.currZoomLevel=t,this.bounds.update(this.currZoomLevel)}calculateZoomToPanOffset(t,i,s){if(0===this.bounds.max[t]-this.bounds.min[t])return this.bounds.center[t];i||(i=this.pswp.getViewportCenterPoint()),s||(s=this.zoomLevels.initial);const h=this.currZoomLevel/s;return this.bounds.correctPan(t,(this.pan[t]-i[t])*h+i[t])}panTo(t,i){this.pan.x=this.bounds.correctPan(\"x\",t),this.pan.y=this.bounds.correctPan(\"y\",i),this.applyCurrentZoomPan()}isPannable(){return Boolean(this.width)&&this.currZoomLevel>this.zoomLevels.fit}isZoomable(){return Boolean(this.width)&&this.content.isZoomable()}applyCurrentZoomPan(){this.g(this.pan.x,this.pan.y,this.currZoomLevel),this===this.pswp.currSlide&&this.pswp.dispatch(\"zoomPanUpdate\",{slide:this})}zoomAndPanToInitial(){this.currZoomLevel=this.zoomLevels.initial,this.bounds.update(this.currZoomLevel),i(this.pan,this.bounds.center),this.pswp.dispatch(\"initialZoomPan\",{slide:this})}g(t,i,s){s/=this.currentResolution||this.zoomLevels.initial,r(this.container,t,i,s)}calculateSize(){const{pswp:t}=this;i(this.panAreaSize,y(t.options,t.viewportSize,this.data,this.index)),this.zoomLevels.update(this.width,this.height,this.panAreaSize),t.dispatch(\"calcSlideSize\",{slide:this})}getCurrentTransform(){const t=this.currZoomLevel/(this.currentResolution||this.zoomLevels.initial);return o(this.pan.x,this.pan.y,t)}v(t){t!==this.currentResolution&&(this.currentResolution=t,this.updateContentSize(),this.pswp.dispatch(\"resolutionChanged\"))}}class S{constructor(t){this.gestures=t,this.pswp=t.pswp,this.startPan={x:0,y:0}}start(){this.pswp.currSlide&&i(this.startPan,this.pswp.currSlide.pan),this.pswp.animations.stopAll()}change(){const{p1:t,prevP1:i,dragAxis:h}=this.gestures,{currSlide:e}=this.pswp;if(\"y\"===h&&this.pswp.options.closeOnVerticalDrag&&e&&e.currZoomLevel<=e.zoomLevels.fit&&!this.gestures.isMultitouch){const s=e.pan.y+(t.y-i.y);if(!this.pswp.dispatch(\"verticalDrag\",{panY:s}).defaultPrevented){this._(\"y\",s,.6);const t=1-Math.abs(this.S(e.pan.y));this.pswp.applyBgOpacity(t),e.applyCurrentZoomPan()}}else{this.M(\"x\")||(this.M(\"y\"),e&&(s(e.pan),e.applyCurrentZoomPan()))}}end(){const{velocity:t}=this.gestures,{mainScroll:i,currSlide:s}=this.pswp;let h=0;if(this.pswp.animations.stopAll(),i.isShifted()){const s=(i.x-i.getCurrSlideX())/this.pswp.viewportSize.x;t.x<-.5&&s<0||t.x<.1&&s<-.5?(h=1,t.x=Math.min(t.x,0)):(t.x>.5&&s>0||t.x>-.1&&s>.5)&&(h=-1,t.x=Math.max(t.x,0)),i.moveIndexBy(h,!0,t.x)}s&&s.currZoomLevel>s.zoomLevels.max||this.gestures.isMultitouch?this.gestures.zoomLevels.correctZoomPan(!0):(this.P(\"x\"),this.P(\"y\"))}P(t){const{velocity:i}=this.gestures,{currSlide:s}=this.pswp;if(!s)return;const{pan:h,bounds:e}=s,o=h[t],r=this.pswp.bgOpacity<1&&\"y\"===t,a=o+function(t,i){return t*i/(1-i)}(i[t],.995);if(r){const t=this.S(o),i=this.S(a);if(t<0&&i<-.4||t>0&&i>.4)return void this.pswp.close()}const l=e.correctPan(t,a);if(o===l)return;const c=l===a?1:.82,d=this.pswp.bgOpacity,u=l-o;this.pswp.animations.startSpring({name:\"panGesture\"+t,isPan:!0,start:o,end:l,velocity:i[t],dampingRatio:c,onUpdate:i=>{if(r&&this.pswp.bgOpacity<1){const t=1-(l-i)/u;this.pswp.applyBgOpacity(n(d+(1-d)*t,0,1))}h[t]=Math.floor(i),s.applyCurrentZoomPan()}})}M(t){const{p1:i,dragAxis:s,prevP1:h,isMultitouch:e}=this.gestures,{currSlide:n,mainScroll:o}=this.pswp,r=i[t]-h[t],a=o.x+r;if(!r||!n)return!1;if(\"x\"===t&&!n.isPannable()&&!e)return o.moveTo(a,!0),!0;const{bounds:l}=n,c=n.pan[t]+r;if(this.pswp.options.allowPanToNext&&\"x\"===s&&\"x\"===t&&!e){const i=o.getCurrSlideX(),s=o.x-i,h=r>0,e=!h;if(c>l.min[t]&&h){if(l.min[t]<=this.startPan[t])return o.moveTo(a,!0),!0;this._(t,c)}else if(c<l.max[t]&&e){if(this.startPan[t]<=l.max[t])return o.moveTo(a,!0),!0;this._(t,c)}else if(0!==s){if(s>0)return o.moveTo(Math.max(a,i),!0),!0;if(s<0)return o.moveTo(Math.min(a,i),!0),!0}else this._(t,c)}else\"y\"===t&&(o.isShifted()||l.min.y===l.max.y)||this._(t,c);return!1}S(t){var i,s;return(t-(null!==(i=null===(s=this.pswp.currSlide)||void 0===s?void 0:s.bounds.center.y)&&void 0!==i?i:0))/(this.pswp.viewportSize.y/3)}_(t,i,s){const{currSlide:h}=this.pswp;if(!h)return;const{pan:e,bounds:n}=h;if(n.correctPan(t,i)!==i||s){const h=Math.round(i-e[t]);e[t]+=h*(s||.35)}else e[t]=i}}function z(t,i,s){return t.x=(i.x+s.x)/2,t.y=(i.y+s.y)/2,t}class M{constructor(t){this.gestures=t,this.C={x:0,y:0},this.T={x:0,y:0},this.A={x:0,y:0},this.D=!1,this.I=1}start(){const{currSlide:t}=this.gestures.pswp;t&&(this.I=t.currZoomLevel,i(this.C,t.pan)),this.gestures.pswp.animations.stopAllPan(),this.D=!1}change(){const{p1:t,startP1:i,p2:s,startP2:e,pswp:n}=this.gestures,{currSlide:o}=n;if(!o)return;const r=o.zoomLevels.min,a=o.zoomLevels.max;if(!o.isZoomable()||n.mainScroll.isShifted())return;z(this.T,i,e),z(this.A,t,s);let l=1/h(i,e)*h(t,s)*this.I;if(l>o.zoomLevels.initial+o.zoomLevels.initial/15&&(this.D=!0),l<r)if(n.options.pinchToClose&&!this.D&&this.I<=o.zoomLevels.initial){const t=1-(r-l)/(r/1.2);n.dispatch(\"pinchClose\",{bgOpacity:t}).defaultPrevented||n.applyBgOpacity(t)}else l=r-.15*(r-l);else l>a&&(l=a+.05*(l-a));o.pan.x=this.L(\"x\",l),o.pan.y=this.L(\"y\",l),o.setZoomLevel(l),o.applyCurrentZoomPan()}end(){const{pswp:t}=this.gestures,{currSlide:i}=t;(!i||i.currZoomLevel<i.zoomLevels.initial)&&!this.D&&t.options.pinchToClose?t.close():this.correctZoomPan()}L(t,i){const s=i/this.I;return this.A[t]-(this.T[t]-this.C[t])*s}correctZoomPan(t){const{pswp:s}=this.gestures,{currSlide:h}=s;if(null==h||!h.isZoomable())return;0===this.A.x&&(t=!0);const o=h.currZoomLevel;let r,a=!0;o<h.zoomLevels.initial?r=h.zoomLevels.initial:o>h.zoomLevels.max?r=h.zoomLevels.max:(a=!1,r=o);const l=s.bgOpacity,c=s.bgOpacity<1,d=i({x:0,y:0},h.pan);let u=i({x:0,y:0},d);t&&(this.A.x=0,this.A.y=0,this.T.x=0,this.T.y=0,this.I=o,i(this.C,d)),a&&(u={x:this.L(\"x\",r),y:this.L(\"y\",r)}),h.setZoomLevel(r),u={x:h.bounds.correctPan(\"x\",u.x),y:h.bounds.correctPan(\"y\",u.y)},h.setZoomLevel(o);const p=!e(u,d);if(!p&&!a&&!c)return h.v(r),void h.applyCurrentZoomPan();s.animations.stopAllPan(),s.animations.startSpring({isPan:!0,start:0,end:1e3,velocity:0,dampingRatio:1,naturalFrequency:40,onUpdate:t=>{if(t/=1e3,p||a){if(p&&(h.pan.x=d.x+(u.x-d.x)*t,h.pan.y=d.y+(u.y-d.y)*t),a){const i=o+(r-o)*t;h.setZoomLevel(i)}h.applyCurrentZoomPan()}c&&s.bgOpacity<1&&s.applyBgOpacity(n(l+(1-l)*t,0,1))},onComplete:()=>{h.v(r),h.applyCurrentZoomPan()}})}}function P(t){return!!t.target.closest(\".pswp__container\")}class C{constructor(t){this.gestures=t}click(t,i){const s=i.target.classList,h=s.contains(\"pswp__img\"),e=s.contains(\"pswp__item\")||s.contains(\"pswp__zoom-wrap\");h?this.k(\"imageClick\",t,i):e&&this.k(\"bgClick\",t,i)}tap(t,i){P(i)&&this.k(\"tap\",t,i)}doubleTap(t,i){P(i)&&this.k(\"doubleTap\",t,i)}k(t,i,s){var h;const{pswp:e}=this.gestures,{currSlide:n}=e,o=t+\"Action\",r=e.options[o];if(!e.dispatch(o,{point:i,originalEvent:s}).defaultPrevented)if(\"function\"!=typeof r)switch(r){case\"close\":case\"next\":e[r]();break;case\"zoom\":null==n||n.toggleZoom(i);break;case\"zoom-or-close\":null!=n&&n.isZoomable()&&n.zoomLevels.secondary!==n.zoomLevels.initial?n.toggleZoom(i):e.options.clickToCloseNonZoomable&&e.close();break;case\"toggle-controls\":null===(h=this.gestures.pswp.element)||void 0===h||h.classList.toggle(\"pswp--ui-visible\")}else r.call(e,i,s)}}class T{constructor(t){this.pswp=t,this.dragAxis=null,this.p1={x:0,y:0},this.p2={x:0,y:0},this.prevP1={x:0,y:0},this.prevP2={x:0,y:0},this.startP1={x:0,y:0},this.startP2={x:0,y:0},this.velocity={x:0,y:0},this.Z={x:0,y:0},this.B={x:0,y:0},this.F=0,this.O=[],this.R=\"ontouchstart\"in window,this.N=!!window.PointerEvent,this.supportsTouch=this.R||this.N&&navigator.maxTouchPoints>1,this.F=0,this.U=0,this.V=!1,this.isMultitouch=!1,this.isDragging=!1,this.isZooming=!1,this.raf=null,this.G=null,this.supportsTouch||(t.options.allowPanToNext=!1),this.drag=new S(this),this.zoomLevels=new M(this),this.tapHandler=new C(this),t.on(\"bindEvents\",(()=>{t.events.add(t.scrollWrap,\"click\",this.$.bind(this)),this.N?this.q(\"pointer\",\"down\",\"up\",\"cancel\"):this.R?(this.q(\"touch\",\"start\",\"end\",\"cancel\"),t.scrollWrap&&(t.scrollWrap.ontouchmove=()=>{},t.scrollWrap.ontouchend=()=>{})):this.q(\"mouse\",\"down\",\"up\")}))}q(t,i,s,h){const{pswp:e}=this,{events:n}=e,o=h?t+h:\"\";n.add(e.scrollWrap,t+i,this.onPointerDown.bind(this)),n.add(window,t+\"move\",this.onPointerMove.bind(this)),n.add(window,t+s,this.onPointerUp.bind(this)),o&&n.add(e.scrollWrap,o,this.onPointerUp.bind(this))}onPointerDown(t){const s=\"mousedown\"===t.type||\"mouse\"===t.pointerType;if(s&&t.button>0)return;const{pswp:h}=this;h.opener.isOpen?h.dispatch(\"pointerDown\",{originalEvent:t}).defaultPrevented||(s&&(h.mouseDetected(),this.H(t,\"down\")),h.animations.stopAll(),this.K(t,\"down\"),1===this.F&&(this.dragAxis=null,i(this.startP1,this.p1)),this.F>1?(this.W(),this.isMultitouch=!0):this.isMultitouch=!1):t.preventDefault()}onPointerMove(t){this.H(t,\"move\"),this.F&&(this.K(t,\"move\"),this.pswp.dispatch(\"pointerMove\",{originalEvent:t}).defaultPrevented||(1!==this.F||this.isDragging?this.F>1&&!this.isZooming&&(this.j(),this.isZooming=!0,this.X(),this.zoomLevels.start(),this.Y(),this.J()):(this.dragAxis||this.tt(),this.dragAxis&&!this.isDragging&&(this.isZooming&&(this.isZooming=!1,this.zoomLevels.end()),this.isDragging=!0,this.W(),this.X(),this.U=Date.now(),this.V=!1,i(this.B,this.p1),this.velocity.x=0,this.velocity.y=0,this.drag.start(),this.Y(),this.J()))))}j(){this.isDragging&&(this.isDragging=!1,this.V||this.it(!0),this.drag.end(),this.dragAxis=null)}onPointerUp(t){this.F&&(this.K(t,\"up\"),this.pswp.dispatch(\"pointerUp\",{originalEvent:t}).defaultPrevented||(0===this.F&&(this.Y(),this.isDragging?this.j():this.isZooming||this.isMultitouch||this.st(t)),this.F<2&&this.isZooming&&(this.isZooming=!1,this.zoomLevels.end(),1===this.F&&(this.dragAxis=null,this.X()))))}J(){(this.isDragging||this.isZooming)&&(this.it(),this.isDragging?e(this.p1,this.prevP1)||this.drag.change():e(this.p1,this.prevP1)&&e(this.p2,this.prevP2)||this.zoomLevels.change(),this.ht(),this.raf=requestAnimationFrame(this.J.bind(this)))}it(t){const s=Date.now(),h=s-this.U;h<50&&!t||(this.velocity.x=this.et(\"x\",h),this.velocity.y=this.et(\"y\",h),this.U=s,i(this.B,this.p1),this.V=!0)}st(t){const{mainScroll:s}=this.pswp;if(s.isShifted())return void s.moveIndexBy(0,!0);if(t.type.indexOf(\"cancel\")>0)return;if(\"mouseup\"===t.type||\"mouse\"===t.pointerType)return void this.tapHandler.click(this.startP1,t);const e=this.pswp.options.doubleTapAction?300:0;this.G?(this.W(),h(this.Z,this.startP1)<25&&this.tapHandler.doubleTap(this.startP1,t)):(i(this.Z,this.startP1),this.G=setTimeout((()=>{this.tapHandler.tap(this.startP1,t),this.W()}),e))}W(){this.G&&(clearTimeout(this.G),this.G=null)}et(t,i){const s=this.p1[t]-this.B[t];return Math.abs(s)>1&&i>5?s/i:0}Y(){this.raf&&(cancelAnimationFrame(this.raf),this.raf=null)}H(t,i){this.pswp.applyFilters(\"preventPointerEvent\",!0,t,i)&&t.preventDefault()}K(t,s){if(this.N){const h=t,e=this.O.findIndex((t=>t.id===h.pointerId));\"up\"===s&&e>-1?this.O.splice(e,1):\"down\"===s&&-1===e?this.O.push(this.nt(h,{x:0,y:0})):e>-1&&this.nt(h,this.O[e]),this.F=this.O.length,this.F>0&&i(this.p1,this.O[0]),this.F>1&&i(this.p2,this.O[1])}else{const i=t;this.F=0,i.type.indexOf(\"touch\")>-1?i.touches&&i.touches.length>0&&(this.nt(i.touches[0],this.p1),this.F++,i.touches.length>1&&(this.nt(i.touches[1],this.p2),this.F++)):(this.nt(t,this.p1),\"up\"===s?this.F=0:this.F++)}}ht(){i(this.prevP1,this.p1),i(this.prevP2,this.p2)}X(){i(this.startP1,this.p1),i(this.startP2,this.p2),this.ht()}tt(){if(this.pswp.mainScroll.isShifted())this.dragAxis=\"x\";else{const t=Math.abs(this.p1.x-this.startP1.x)-Math.abs(this.p1.y-this.startP1.y);if(0!==t){const i=t>0?\"x\":\"y\";Math.abs(this.p1[i]-this.startP1[i])>=10&&(this.dragAxis=i)}}}nt(t,i){return i.x=t.pageX-this.pswp.offset.x,i.y=t.pageY-this.pswp.offset.y,\"pointerId\"in t?i.id=t.pointerId:void 0!==t.identifier&&(i.id=t.identifier),i}$(t){this.pswp.mainScroll.isShifted()&&(t.preventDefault(),t.stopPropagation())}}class A{constructor(t){this.pswp=t,this.x=0,this.slideWidth=0,this.ot=0,this.rt=0,this.lt=-1,this.itemHolders=[]}resize(t){const{pswp:i}=this,s=Math.round(i.viewportSize.x+i.viewportSize.x*i.options.spacing),h=s!==this.slideWidth;h&&(this.slideWidth=s,this.moveTo(this.getCurrSlideX())),this.itemHolders.forEach(((i,s)=>{h&&r(i.el,(s+this.lt)*this.slideWidth),t&&i.slide&&i.slide.resize()}))}resetPosition(){this.ot=0,this.rt=0,this.slideWidth=0,this.lt=-1}appendHolders(){this.itemHolders=[];for(let i=0;i<3;i++){const s=t(\"pswp__item\",\"div\",this.pswp.container);s.setAttribute(\"role\",\"group\"),s.setAttribute(\"aria-roledescription\",\"slide\"),s.setAttribute(\"aria-hidden\",\"true\"),s.style.display=1===i?\"block\":\"none\",this.itemHolders.push({el:s})}}canBeSwiped(){return this.pswp.getNumItems()>1}moveIndexBy(t,i,s){const{pswp:h}=this;let e=h.potentialIndex+t;const n=h.getNumItems();if(h.canLoop()){e=h.getLoopedIndex(e);const i=(t+n)%n;t=i<=n/2?i:i-n}else e<0?e=0:e>=n&&(e=n-1),t=e-h.potentialIndex;h.potentialIndex=e,this.ot-=t,h.animations.stopMainScroll();const o=this.getCurrSlideX();if(i){h.animations.startSpring({isMainScroll:!0,start:this.x,end:o,velocity:s||0,naturalFrequency:30,dampingRatio:1,onUpdate:t=>{this.moveTo(t)},onComplete:()=>{this.updateCurrItem(),h.appendHeavy()}});let t=h.potentialIndex-h.currIndex;if(h.canLoop()){const i=(t+n)%n;t=i<=n/2?i:i-n}Math.abs(t)>1&&this.updateCurrItem()}else this.moveTo(o),this.updateCurrItem();return Boolean(t)}getCurrSlideX(){return this.slideWidth*this.ot}isShifted(){return this.x!==this.getCurrSlideX()}updateCurrItem(){var t;const{pswp:i}=this,s=this.rt-this.ot;if(!s)return;this.rt=this.ot,i.currIndex=i.potentialIndex;let h,e=Math.abs(s);e>=3&&(this.lt+=s+(s>0?-3:3),e=3,this.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.destroy(),t.slide=void 0})));for(let t=0;t<e;t++)s>0?(h=this.itemHolders.shift(),h&&(this.itemHolders[2]=h,this.lt++,r(h.el,(this.lt+2)*this.slideWidth),i.setContent(h,i.currIndex-e+t+2))):(h=this.itemHolders.pop(),h&&(this.itemHolders.unshift(h),this.lt--,r(h.el,this.lt*this.slideWidth),i.setContent(h,i.currIndex+e-t-2)));Math.abs(this.lt)>50&&!this.isShifted()&&(this.resetPosition(),this.resize()),i.animations.stopAllPan(),this.itemHolders.forEach(((t,i)=>{t.slide&&t.slide.setIsActive(1===i)})),i.currSlide=null===(t=this.itemHolders[1])||void 0===t?void 0:t.slide,i.contentLoader.updateLazy(s),i.currSlide&&i.currSlide.applyCurrentZoomPan(),i.dispatch(\"change\")}moveTo(t,i){if(!this.pswp.canLoop()&&i){let i=(this.slideWidth*this.ot-t)/this.slideWidth;i+=this.pswp.currIndex;const s=Math.round(t-this.x);(i<0&&s>0||i>=this.pswp.getNumItems()-1&&s<0)&&(t=this.x+.35*s)}this.x=t,this.pswp.container&&r(this.pswp.container,t),this.pswp.dispatch(\"moveMainScroll\",{x:t,dragging:null!=i&&i})}}const D={Escape:27,z:90,ArrowLeft:37,ArrowUp:38,ArrowRight:39,ArrowDown:40,Tab:9},I=(t,i)=>i?t:D[t];class E{constructor(t){this.pswp=t,this.ct=!1,t.on(\"bindEvents\",(()=>{t.options.trapFocus&&(t.options.initialPointerPos||this.dt(),t.events.add(document,\"focusin\",this.ut.bind(this))),t.events.add(document,\"keydown\",this.vt.bind(this))}));const i=document.activeElement;t.on(\"destroy\",(()=>{t.options.returnFocus&&i&&this.ct&&i.focus()}))}dt(){!this.ct&&this.pswp.element&&(this.pswp.element.focus(),this.ct=!0)}vt(t){const{pswp:i}=this;if(i.dispatch(\"keydown\",{originalEvent:t}).defaultPrevented)return;if(function(t){return\"button\"in t&&1===t.button||t.ctrlKey||t.metaKey||t.altKey||t.shiftKey}(t))return;let s,h,e=!1;const n=\"key\"in t;switch(n?t.key:t.keyCode){case I(\"Escape\",n):i.options.escKey&&(s=\"close\");break;case I(\"z\",n):s=\"toggleZoom\";break;case I(\"ArrowLeft\",n):h=\"x\";break;case I(\"ArrowUp\",n):h=\"y\";break;case I(\"ArrowRight\",n):h=\"x\",e=!0;break;case I(\"ArrowDown\",n):e=!0,h=\"y\";break;case I(\"Tab\",n):this.dt()}if(h){t.preventDefault();const{currSlide:n}=i;i.options.arrowKeys&&\"x\"===h&&i.getNumItems()>1?s=e?\"next\":\"prev\":n&&n.currZoomLevel>n.zoomLevels.fit&&(n.pan[h]+=e?-80:80,n.panTo(n.pan.x,n.pan.y))}s&&(t.preventDefault(),i[s]())}ut(t){const{template:i}=this.pswp;i&&document!==t.target&&i!==t.target&&!i.contains(t.target)&&i.focus()}}const L=\"cubic-bezier(.4,0,.22,1)\";class k{constructor(t){var i;this.props=t;const{target:s,onComplete:h,transform:e,onFinish:n=(()=>{}),duration:o=333,easing:r=L}=t;this.onFinish=n;const l=e?\"transform\":\"opacity\",c=null!==(i=t[l])&&void 0!==i?i:\"\";this.ft=s,this.wt=h,this.gt=!1,this.yt=this.yt.bind(this),this._t=setTimeout((()=>{a(s,l,o,r),this._t=setTimeout((()=>{s.addEventListener(\"transitionend\",this.yt,!1),s.addEventListener(\"transitioncancel\",this.yt,!1),this._t=setTimeout((()=>{this.xt()}),o+500),s.style[l]=c}),30)}),0)}yt(t){t.target===this.ft&&this.xt()}xt(){this.gt||(this.gt=!0,this.onFinish(),this.wt&&this.wt())}destroy(){this._t&&clearTimeout(this._t),a(this.ft),this.ft.removeEventListener(\"transitionend\",this.yt,!1),this.ft.removeEventListener(\"transitioncancel\",this.yt,!1),this.gt||this.xt()}}class Z{constructor(t,i,s){this.velocity=1e3*t,this.bt=i||.75,this.St=s||12,this.zt=this.St,this.bt<1&&(this.zt*=Math.sqrt(1-this.bt*this.bt))}easeFrame(t,i){let s,h=0;i/=1e3;const e=Math.E**(-this.bt*this.St*i);if(1===this.bt)s=this.velocity+this.St*t,h=(t+s*i)*e,this.velocity=h*-this.St+s*e;else if(this.bt<1){s=1/this.zt*(this.bt*this.St*t+this.velocity);const n=Math.cos(this.zt*i),o=Math.sin(this.zt*i);h=e*(t*n+s*o),this.velocity=h*-this.St*this.bt+e*(-this.zt*t*o+this.zt*s*n)}return h}}class B{constructor(t){this.props=t,this.Mt=0;const{start:i,end:s,velocity:h,onUpdate:e,onComplete:n,onFinish:o=(()=>{}),dampingRatio:r,naturalFrequency:a}=t;this.onFinish=o;const l=new Z(h,r,a);let c=Date.now(),d=i-s;const u=()=>{this.Mt&&(d=l.easeFrame(d,Date.now()-c),Math.abs(d)<1&&Math.abs(l.velocity)<50?(e(s),n&&n(),this.onFinish()):(c=Date.now(),e(d+s),this.Mt=requestAnimationFrame(u)))};this.Mt=requestAnimationFrame(u)}destroy(){this.Mt>=0&&cancelAnimationFrame(this.Mt),this.Mt=0}}class F{constructor(){this.activeAnimations=[]}startSpring(t){this.Pt(t,!0)}startTransition(t){this.Pt(t)}Pt(t,i){const s=i?new B(t):new k(t);return this.activeAnimations.push(s),s.onFinish=()=>this.stop(s),s}stop(t){t.destroy();const i=this.activeAnimations.indexOf(t);i>-1&&this.activeAnimations.splice(i,1)}stopAll(){this.activeAnimations.forEach((t=>{t.destroy()})),this.activeAnimations=[]}stopAllPan(){this.activeAnimations=this.activeAnimations.filter((t=>!t.props.isPan||(t.destroy(),!1)))}stopMainScroll(){this.activeAnimations=this.activeAnimations.filter((t=>!t.props.isMainScroll||(t.destroy(),!1)))}isPanRunning(){return this.activeAnimations.some((t=>t.props.isPan))}}class O{constructor(t){this.pswp=t,t.events.add(t.element,\"wheel\",this.Ct.bind(this))}Ct(t){t.preventDefault();const{currSlide:i}=this.pswp;let{deltaX:s,deltaY:h}=t;if(i&&!this.pswp.dispatch(\"wheel\",{originalEvent:t}).defaultPrevented)if(t.ctrlKey||this.pswp.options.wheelToZoom){if(i.isZoomable()){let s=-h;1===t.deltaMode?s*=.05:s*=t.deltaMode?1:.002,s=2**s;const e=i.currZoomLevel*s;i.zoomTo(e,{x:t.clientX,y:t.clientY})}}else i.isPannable()&&(1===t.deltaMode&&(s*=18,h*=18),i.panTo(i.pan.x-s,i.pan.y-h))}}class R{constructor(i,s){var h;const e=s.name||s.className;let n=s.html;if(!1===i.options[e])return;\"string\"==typeof i.options[e+\"SVG\"]&&(n=i.options[e+\"SVG\"]),i.dispatch(\"uiElementCreate\",{data:s});let o=\"\";s.isButton?(o+=\"pswp__button \",o+=s.className||`pswp__button--${s.name}`):o+=s.className||`pswp__${s.name}`;let r=s.isButton?s.tagName||\"button\":s.tagName||\"div\";r=r.toLowerCase();const a=t(o,r);if(s.isButton){\"button\"===r&&(a.type=\"button\");let{title:t}=s;const{ariaLabel:h}=s;\"string\"==typeof i.options[e+\"Title\"]&&(t=i.options[e+\"Title\"]),t&&(a.title=t);const n=h||t;n&&a.setAttribute(\"aria-label\",n)}a.innerHTML=function(t){if(\"string\"==typeof t)return t;if(!t||!t.isCustomSVG)return\"\";const i=t;let s='<svg aria-hidden=\"true\" class=\"pswp__icn\" viewBox=\"0 0 %d %d\" width=\"%d\" height=\"%d\">';return s=s.split(\"%d\").join(i.size||32),i.outlineID&&(s+='<use class=\"pswp__icn-shadow\" xlink:href=\"#'+i.outlineID+'\"/>'),s+=i.inner,s+=\"</svg>\",s}(n),s.onInit&&s.onInit(a,i),s.onClick&&(a.onclick=t=>{\"string\"==typeof s.onClick?i[s.onClick]():\"function\"==typeof s.onClick&&s.onClick(t,a,i)});const l=s.appendTo||\"bar\";let c=i.element;\"bar\"===l?(i.topBar||(i.topBar=t(\"pswp__top-bar pswp__hide-on-close\",\"div\",i.scrollWrap)),c=i.topBar):(a.classList.add(\"pswp__hide-on-close\"),\"wrapper\"===l&&(c=i.scrollWrap)),null===(h=c)||void 0===h||h.appendChild(i.applyFilters(\"uiElement\",a,s))}}function N(t,i,s){t.classList.add(\"pswp__button--arrow\"),t.setAttribute(\"aria-controls\",\"pswp__items\"),i.on(\"change\",(()=>{i.options.loop||(t.disabled=s?!(i.currIndex<i.getNumItems()-1):!(i.currIndex>0))}))}const U={name:\"arrowPrev\",className:\"pswp__button--arrow--prev\",title:\"Previous\",order:10,isButton:!0,appendTo:\"wrapper\",html:{isCustomSVG:!0,size:60,inner:'<path d=\"M29 43l-3 3-16-16 16-16 3 3-13 13 13 13z\" id=\"pswp__icn-arrow\"/>',outlineID:\"pswp__icn-arrow\"},onClick:\"prev\",onInit:N},V={name:\"arrowNext\",className:\"pswp__button--arrow--next\",title:\"Next\",order:11,isButton:!0,appendTo:\"wrapper\",html:{isCustomSVG:!0,size:60,inner:'<use xlink:href=\"#pswp__icn-arrow\"/>',outlineID:\"pswp__icn-arrow\"},onClick:\"next\",onInit:(t,i)=>{N(t,i,!0)}},G={name:\"close\",title:\"Close\",order:20,isButton:!0,html:{isCustomSVG:!0,inner:'<path d=\"M24 10l-2-2-6 6-6-6-2 2 6 6-6 6 2 2 6-6 6 6 2-2-6-6z\" id=\"pswp__icn-close\"/>',outlineID:\"pswp__icn-close\"},onClick:\"close\"},$={name:\"zoom\",title:\"Zoom\",order:10,isButton:!0,html:{isCustomSVG:!0,inner:'<path d=\"M17.426 19.926a6 6 0 1 1 1.5-1.5L23 22.5 21.5 24l-4.074-4.074z\" id=\"pswp__icn-zoom\"/><path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-h\" d=\"M11 16v-2h6v2z\"/><path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-v\" d=\"M13 12h2v6h-2z\"/>',outlineID:\"pswp__icn-zoom\"},onClick:\"toggleZoom\"},q={name:\"preloader\",appendTo:\"bar\",order:7,html:{isCustomSVG:!0,inner:'<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M21.2 16a5.2 5.2 0 1 1-5.2-5.2V8a8 8 0 1 0 8 8h-2.8Z\" id=\"pswp__icn-loading\"/>',outlineID:\"pswp__icn-loading\"},onInit:(t,i)=>{let s,h=null;const e=i=>{var h,e;s!==i&&(s=i,h=\"active\",e=i,t.classList.toggle(\"pswp__preloader--\"+h,e))},n=()=>{var t;if(null===(t=i.currSlide)||void 0===t||!t.content.isLoading())return e(!1),void(h&&(clearTimeout(h),h=null));h||(h=setTimeout((()=>{var t;e(Boolean(null===(t=i.currSlide)||void 0===t?void 0:t.content.isLoading())),h=null}),i.options.preloaderDelay))};i.on(\"change\",n),i.on(\"loadComplete\",(t=>{i.currSlide===t.slide&&n()})),i.ui&&(i.ui.updatePreloaderVisibility=n)}},H={name:\"counter\",order:5,onInit:(t,i)=>{i.on(\"change\",(()=>{t.innerText=i.currIndex+1+i.options.indexIndicatorSep+i.getNumItems()}))}};function K(t,i){t.classList.toggle(\"pswp--zoomed-in\",i)}class W{constructor(t){this.pswp=t,this.isRegistered=!1,this.uiElementsData=[],this.items=[],this.updatePreloaderVisibility=()=>{},this.Tt=void 0}init(){const{pswp:t}=this;this.isRegistered=!1,this.uiElementsData=[G,U,V,$,q,H],t.dispatch(\"uiRegister\"),this.uiElementsData.sort(((t,i)=>(t.order||0)-(i.order||0))),this.items=[],this.isRegistered=!0,this.uiElementsData.forEach((t=>{this.registerElement(t)})),t.on(\"change\",(()=>{var i;null===(i=t.element)||void 0===i||i.classList.toggle(\"pswp--one-slide\",1===t.getNumItems())})),t.on(\"zoomPanUpdate\",(()=>this.At()))}registerElement(t){this.isRegistered?this.items.push(new R(this.pswp,t)):this.uiElementsData.push(t)}At(){const{template:t,currSlide:i,options:s}=this.pswp;if(this.pswp.opener.isClosing||!t||!i)return;let{currZoomLevel:h}=i;if(this.pswp.opener.isOpen||(h=i.zoomLevels.initial),h===this.Tt)return;this.Tt=h;const e=i.zoomLevels.initial-i.zoomLevels.secondary;if(Math.abs(e)<.01||!i.isZoomable())return K(t,!1),void t.classList.remove(\"pswp--zoom-allowed\");t.classList.add(\"pswp--zoom-allowed\");K(t,(h===i.zoomLevels.initial?i.zoomLevels.secondary:i.zoomLevels.initial)<=h),\"zoom\"!==s.imageClickAction&&\"zoom-or-close\"!==s.imageClickAction||t.classList.add(\"pswp--click-to-zoom\")}}class j{constructor(t,i){this.type=t,this.defaultPrevented=!1,i&&Object.assign(this,i)}preventDefault(){this.defaultPrevented=!0}}class X{constructor(i,s){if(this.element=t(\"pswp__img pswp__img--placeholder\",i?\"img\":\"div\",s),i){const t=this.element;t.decoding=\"async\",t.alt=\"\",t.src=i,t.setAttribute(\"role\",\"presentation\")}this.element.setAttribute(\"aria-hidden\",\"true\")}setDisplayedSize(t,i){this.element&&(\"IMG\"===this.element.tagName?(l(this.element,250,\"auto\"),this.element.style.transformOrigin=\"0 0\",this.element.style.transform=o(0,0,t/250)):l(this.element,t,i))}destroy(){var t;null!==(t=this.element)&&void 0!==t&&t.parentNode&&this.element.remove(),this.element=null}}class Y{constructor(t,i,s){this.instance=i,this.data=t,this.index=s,this.element=void 0,this.placeholder=void 0,this.slide=void 0,this.displayedImageWidth=0,this.displayedImageHeight=0,this.width=Number(this.data.w)||Number(this.data.width)||0,this.height=Number(this.data.h)||Number(this.data.height)||0,this.isAttached=!1,this.hasSlide=!1,this.isDecoding=!1,this.state=c,this.data.type?this.type=this.data.type:this.data.src?this.type=\"image\":this.type=\"html\",this.instance.dispatch(\"contentInit\",{content:this})}removePlaceholder(){this.placeholder&&!this.keepPlaceholder()&&setTimeout((()=>{this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0)}),1e3)}load(i,s){if(this.slide&&this.usePlaceholder())if(this.placeholder){const t=this.placeholder.element;t&&!t.parentElement&&this.slide.container.prepend(t)}else{const t=this.instance.applyFilters(\"placeholderSrc\",!(!this.data.msrc||!this.slide.isFirstSlide)&&this.data.msrc,this);this.placeholder=new X(t,this.slide.container)}this.element&&!s||this.instance.dispatch(\"contentLoad\",{content:this,isLazy:i}).defaultPrevented||(this.isImageContent()?(this.element=t(\"pswp__img\",\"img\"),this.displayedImageWidth&&this.loadImage(i)):(this.element=t(\"pswp__content\",\"div\"),this.element.innerHTML=this.data.html||\"\"),s&&this.slide&&this.slide.updateContentSize(!0))}loadImage(t){var i,s;if(!this.isImageContent()||!this.element||this.instance.dispatch(\"contentLoadImage\",{content:this,isLazy:t}).defaultPrevented)return;const h=this.element;this.updateSrcsetSizes(),this.data.srcset&&(h.srcset=this.data.srcset),h.src=null!==(i=this.data.src)&&void 0!==i?i:\"\",h.alt=null!==(s=this.data.alt)&&void 0!==s?s:\"\",this.state=d,h.complete?this.onLoaded():(h.onload=()=>{this.onLoaded()},h.onerror=()=>{this.onError()})}setSlide(t){this.slide=t,this.hasSlide=!0,this.instance=t.pswp}onLoaded(){this.state=u,this.slide&&this.element&&(this.instance.dispatch(\"loadComplete\",{slide:this.slide,content:this}),this.slide.isActive&&this.slide.heavyAppended&&!this.element.parentNode&&(this.append(),this.slide.updateContentSize(!0)),this.state!==u&&this.state!==p||this.removePlaceholder())}onError(){this.state=p,this.slide&&(this.displayError(),this.instance.dispatch(\"loadComplete\",{slide:this.slide,isError:!0,content:this}),this.instance.dispatch(\"loadError\",{slide:this.slide,content:this}))}isLoading(){return this.instance.applyFilters(\"isContentLoading\",this.state===d,this)}isError(){return this.state===p}isImageContent(){return\"image\"===this.type}setDisplayedSize(t,i){if(this.element&&(this.placeholder&&this.placeholder.setDisplayedSize(t,i),!this.instance.dispatch(\"contentResize\",{content:this,width:t,height:i}).defaultPrevented&&(l(this.element,t,i),this.isImageContent()&&!this.isError()))){const s=!this.displayedImageWidth&&t;this.displayedImageWidth=t,this.displayedImageHeight=i,s?this.loadImage(!1):this.updateSrcsetSizes(),this.slide&&this.instance.dispatch(\"imageSizeChange\",{slide:this.slide,width:t,height:i,content:this})}}isZoomable(){return this.instance.applyFilters(\"isContentZoomable\",this.isImageContent()&&this.state!==p,this)}updateSrcsetSizes(){if(!this.isImageContent()||!this.element||!this.data.srcset)return;const t=this.element,i=this.instance.applyFilters(\"srcsetSizesWidth\",this.displayedImageWidth,this);(!t.dataset.largestUsedSize||i>parseInt(t.dataset.largestUsedSize,10))&&(t.sizes=i+\"px\",t.dataset.largestUsedSize=String(i))}usePlaceholder(){return this.instance.applyFilters(\"useContentPlaceholder\",this.isImageContent(),this)}lazyLoad(){this.instance.dispatch(\"contentLazyLoad\",{content:this}).defaultPrevented||this.load(!0)}keepPlaceholder(){return this.instance.applyFilters(\"isKeepingPlaceholder\",this.isLoading(),this)}destroy(){this.hasSlide=!1,this.slide=void 0,this.instance.dispatch(\"contentDestroy\",{content:this}).defaultPrevented||(this.remove(),this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0),this.isImageContent()&&this.element&&(this.element.onload=null,this.element.onerror=null,this.element=void 0))}displayError(){if(this.slide){var i,s;let h=t(\"pswp__error-msg\",\"div\");h.innerText=null!==(i=null===(s=this.instance.options)||void 0===s?void 0:s.errorMsg)&&void 0!==i?i:\"\",h=this.instance.applyFilters(\"contentErrorElement\",h,this),this.element=t(\"pswp__content pswp__error-msg-container\",\"div\"),this.element.appendChild(h),this.slide.container.innerText=\"\",this.slide.container.appendChild(this.element),this.slide.updateContentSize(!0),this.removePlaceholder()}}append(){if(this.isAttached||!this.element)return;if(this.isAttached=!0,this.state===p)return void this.displayError();if(this.instance.dispatch(\"contentAppend\",{content:this}).defaultPrevented)return;const t=\"decode\"in this.element;this.isImageContent()?t&&this.slide&&(!this.slide.isActive||m())?(this.isDecoding=!0,this.element.decode().catch((()=>{})).finally((()=>{this.isDecoding=!1,this.appendImage()}))):this.appendImage():this.slide&&!this.element.parentNode&&this.slide.container.appendChild(this.element)}activate(){!this.instance.dispatch(\"contentActivate\",{content:this}).defaultPrevented&&this.slide&&(this.isImageContent()&&this.isDecoding&&!m()?this.appendImage():this.isError()&&this.load(!1,!0),this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"false\"))}deactivate(){this.instance.dispatch(\"contentDeactivate\",{content:this}),this.slide&&this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"true\")}remove(){this.isAttached=!1,this.instance.dispatch(\"contentRemove\",{content:this}).defaultPrevented||(this.element&&this.element.parentNode&&this.element.remove(),this.placeholder&&this.placeholder.element&&this.placeholder.element.remove())}appendImage(){this.isAttached&&(this.instance.dispatch(\"contentAppendImage\",{content:this}).defaultPrevented||(this.slide&&this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element),this.state!==u&&this.state!==p||this.removePlaceholder()))}}function J(t,i,s){const h=i.createContentFromData(t,s);let e;const{options:n}=i;if(n){let o;e=new x(n,t,-1),o=i.pswp?i.pswp.viewportSize:w(n,i);const r=y(n,o,t,s);e.update(h.width,h.height,r)}return h.lazyLoad(),e&&h.setDisplayedSize(Math.ceil(h.width*e.initial),Math.ceil(h.height*e.initial)),h}class Q{constructor(t){this.pswp=t,this.limit=Math.max(t.options.preload[0]+t.options.preload[1]+1,5),this.Dt=[]}updateLazy(t){const{pswp:i}=this;if(i.dispatch(\"lazyLoad\").defaultPrevented)return;const{preload:s}=i.options,h=void 0===t||t>=0;let e;for(e=0;e<=s[1];e++)this.loadSlideByIndex(i.currIndex+(h?e:-e));for(e=1;e<=s[0];e++)this.loadSlideByIndex(i.currIndex+(h?-e:e))}loadSlideByIndex(t){const i=this.pswp.getLoopedIndex(t);let s=this.getContentByIndex(i);s||(s=function(t,i){const s=i.getItemData(t);if(!i.dispatch(\"lazyLoadSlide\",{index:t,itemData:s}).defaultPrevented)return J(s,i,t)}(i,this.pswp),s&&this.addToCache(s))}getContentBySlide(t){let i=this.getContentByIndex(t.index);return i||(i=this.pswp.createContentFromData(t.data,t.index),this.addToCache(i)),i.setSlide(t),i}addToCache(t){if(this.removeByIndex(t.index),this.Dt.push(t),this.Dt.length>this.limit){const t=this.Dt.findIndex((t=>!t.isAttached&&!t.hasSlide));if(-1!==t){this.Dt.splice(t,1)[0].destroy()}}}removeByIndex(t){const i=this.Dt.findIndex((i=>i.index===t));-1!==i&&this.Dt.splice(i,1)}getContentByIndex(t){return this.Dt.find((i=>i.index===t))}destroy(){this.Dt.forEach((t=>t.destroy())),this.Dt=[]}}const tt=.003;class it{constructor(t){this.pswp=t,this.isClosed=!0,this.isOpen=!1,this.isClosing=!1,this.isOpening=!1,this.It=void 0,this.Et=!1,this.Lt=!1,this.kt=!1,this.Zt=!1,this.Bt=void 0,this.Ft=void 0,this.Ot=void 0,this.Rt=void 0,this.Nt=void 0,this.Ut=this.Ut.bind(this),t.on(\"firstZoomPan\",this.Ut)}open(){this.Ut(),this.Pt()}close(){if(this.isClosed||this.isClosing||this.isOpening)return;const t=this.pswp.currSlide;this.isOpen=!1,this.isOpening=!1,this.isClosing=!0,this.It=this.pswp.options.hideAnimationDuration,t&&t.currZoomLevel*t.width>=this.pswp.options.maxWidthToAnimate&&(this.It=0),this.Vt(),setTimeout((()=>{this.Pt()}),this.Lt?30:0)}Ut(){if(this.pswp.off(\"firstZoomPan\",this.Ut),!this.isOpening){const t=this.pswp.currSlide;this.isOpening=!0,this.isClosing=!1,this.It=this.pswp.options.showAnimationDuration,t&&t.zoomLevels.initial*t.width>=this.pswp.options.maxWidthToAnimate&&(this.It=0),this.Vt()}}Vt(){const{pswp:t}=this,i=this.pswp.currSlide,{options:s}=t;var h,e;(\"fade\"===s.showHideAnimationType?(s.showHideOpacity=!0,this.Nt=void 0):\"none\"===s.showHideAnimationType?(s.showHideOpacity=!1,this.It=0,this.Nt=void 0):this.isOpening&&t.Gt?this.Nt=t.Gt:this.Nt=this.pswp.getThumbBounds(),this.Bt=null==i?void 0:i.getPlaceholderElement(),t.animations.stopAll(),this.Et=Boolean(this.It&&this.It>50),this.$t=Boolean(this.Nt)&&(null==i?void 0:i.content.usePlaceholder())&&(!this.isClosing||!t.mainScroll.isShifted()),this.$t)?this.kt=null!==(h=s.showHideOpacity)&&void 0!==h&&h:(this.kt=!0,this.isOpening&&i&&(i.zoomAndPanToInitial(),i.applyCurrentZoomPan()));if(this.Zt=!this.kt&&this.pswp.options.bgOpacity>tt,this.Ft=this.kt?t.element:t.bg,!this.Et)return this.It=0,this.$t=!1,this.Zt=!1,this.kt=!0,void(this.isOpening&&(t.element&&(t.element.style.opacity=String(tt)),t.applyBgOpacity(1)));this.$t&&this.Nt&&this.Nt.innerRect?(this.Lt=!0,this.Ot=this.pswp.container,this.Rt=null===(e=this.pswp.currSlide)||void 0===e?void 0:e.holderElement,t.container&&(t.container.style.overflow=\"hidden\",t.container.style.width=t.viewportSize.x+\"px\")):this.Lt=!1;this.isOpening?(this.kt?(t.element&&(t.element.style.opacity=String(tt)),t.applyBgOpacity(1)):(this.Zt&&t.bg&&(t.bg.style.opacity=String(tt)),t.element&&(t.element.style.opacity=\"1\")),this.$t&&(this.qt(),this.Bt&&(this.Bt.style.willChange=\"transform\",this.Bt.style.opacity=String(tt)))):this.isClosing&&(t.mainScroll.itemHolders[0]&&(t.mainScroll.itemHolders[0].el.style.display=\"none\"),t.mainScroll.itemHolders[2]&&(t.mainScroll.itemHolders[2].el.style.display=\"none\"),this.Lt&&0!==t.mainScroll.x&&(t.mainScroll.resetPosition(),t.mainScroll.resize()))}Pt(){this.isOpening&&this.Et&&this.Bt&&\"IMG\"===this.Bt.tagName?new Promise((t=>{let i=!1,s=!0;var h;(h=this.Bt,\"decode\"in h?h.decode().catch((()=>{})):h.complete?Promise.resolve(h):new Promise(((t,i)=>{h.onload=()=>t(h),h.onerror=i}))).finally((()=>{i=!0,s||t(!0)})),setTimeout((()=>{s=!1,i&&t(!0)}),50),setTimeout(t,250)})).finally((()=>this.Ht())):this.Ht()}Ht(){var t,i;null===(t=this.pswp.element)||void 0===t||t.style.setProperty(\"--pswp-transition-duration\",this.It+\"ms\"),this.pswp.dispatch(this.isOpening?\"openingAnimationStart\":\"closingAnimationStart\"),this.pswp.dispatch(\"initialZoom\"+(this.isOpening?\"In\":\"Out\")),null===(i=this.pswp.element)||void 0===i||i.classList.toggle(\"pswp--ui-visible\",this.isOpening),this.isOpening?(this.Bt&&(this.Bt.style.opacity=\"1\"),this.Kt()):this.isClosing&&this.Wt(),this.Et||this.jt()}jt(){const{pswp:t}=this;if(this.isOpen=this.isOpening,this.isClosed=this.isClosing,this.isOpening=!1,this.isClosing=!1,t.dispatch(this.isOpen?\"openingAnimationEnd\":\"closingAnimationEnd\"),t.dispatch(\"initialZoom\"+(this.isOpen?\"InEnd\":\"OutEnd\")),this.isClosed)t.destroy();else if(this.isOpen){var i;this.$t&&t.container&&(t.container.style.overflow=\"visible\",t.container.style.width=\"100%\"),null===(i=t.currSlide)||void 0===i||i.applyCurrentZoomPan()}}Kt(){const{pswp:t}=this;this.$t&&(this.Lt&&this.Ot&&this.Rt&&(this.Xt(this.Ot,\"transform\",\"translate3d(0,0,0)\"),this.Xt(this.Rt,\"transform\",\"none\")),t.currSlide&&(t.currSlide.zoomAndPanToInitial(),this.Xt(t.currSlide.container,\"transform\",t.currSlide.getCurrentTransform()))),this.Zt&&t.bg&&this.Xt(t.bg,\"opacity\",String(t.options.bgOpacity)),this.kt&&t.element&&this.Xt(t.element,\"opacity\",\"1\")}Wt(){const{pswp:t}=this;this.$t&&this.qt(!0),this.Zt&&t.bgOpacity>.01&&t.bg&&this.Xt(t.bg,\"opacity\",\"0\"),this.kt&&t.element&&this.Xt(t.element,\"opacity\",\"0\")}qt(t){if(!this.Nt)return;const{pswp:s}=this,{innerRect:h}=this.Nt,{currSlide:e,viewportSize:n}=s;if(this.Lt&&h&&this.Ot&&this.Rt){const i=-n.x+(this.Nt.x-h.x)+h.w,s=-n.y+(this.Nt.y-h.y)+h.h,e=n.x-h.w,a=n.y-h.h;t?(this.Xt(this.Ot,\"transform\",o(i,s)),this.Xt(this.Rt,\"transform\",o(e,a))):(r(this.Ot,i,s),r(this.Rt,e,a))}e&&(i(e.pan,h||this.Nt),e.currZoomLevel=this.Nt.w/e.width,t?this.Xt(e.container,\"transform\",e.getCurrentTransform()):e.applyCurrentZoomPan())}Xt(t,i,s){if(!this.It)return void(t.style[i]=s);const{animations:h}=this.pswp,e={duration:this.It,easing:this.pswp.options.easing,onComplete:()=>{h.activeAnimations.length||this.jt()},target:t};e[i]=s,h.startTransition(e)}}const st={allowPanToNext:!0,spacing:.1,loop:!0,pinchToClose:!0,closeOnVerticalDrag:!0,hideAnimationDuration:333,showAnimationDuration:333,zoomAnimationDuration:333,escKey:!0,arrowKeys:!0,trapFocus:!0,returnFocus:!0,maxWidthToAnimate:4e3,clickToCloseNonZoomable:!0,imageClickAction:\"zoom-or-close\",bgClickAction:\"close\",tapAction:\"toggle-controls\",doubleTapAction:\"zoom\",indexIndicatorSep:\" / \",preloaderDelay:2e3,bgOpacity:.8,index:0,errorMsg:\"The image cannot be loaded\",preload:[1,2],easing:\"cubic-bezier(.4,0,.22,1)\"};return class extends class extends class{constructor(){this.Yt={},this.Jt={},this.pswp=void 0,this.options=void 0}addFilter(t,i,s=100){var h,e,n;this.Jt[t]||(this.Jt[t]=[]),null===(h=this.Jt[t])||void 0===h||h.push({fn:i,priority:s}),null===(e=this.Jt[t])||void 0===e||e.sort(((t,i)=>t.priority-i.priority)),null===(n=this.pswp)||void 0===n||n.addFilter(t,i,s)}removeFilter(t,i){this.Jt[t]&&(this.Jt[t]=this.Jt[t].filter((t=>t.fn!==i))),this.pswp&&this.pswp.removeFilter(t,i)}applyFilters(t,...i){var s;return null===(s=this.Jt[t])||void 0===s||s.forEach((t=>{i[0]=t.fn.apply(this,i)})),i[0]}on(t,i){var s,h;this.Yt[t]||(this.Yt[t]=[]),null===(s=this.Yt[t])||void 0===s||s.push(i),null===(h=this.pswp)||void 0===h||h.on(t,i)}off(t,i){var s;this.Yt[t]&&(this.Yt[t]=this.Yt[t].filter((t=>i!==t))),null===(s=this.pswp)||void 0===s||s.off(t,i)}dispatch(t,i){var s;if(this.pswp)return this.pswp.dispatch(t,i);const h=new j(t,i);return null===(s=this.Yt[t])||void 0===s||s.forEach((t=>{t.call(this,h)})),h}}{getNumItems(){var t;let i=0;const s=null===(t=this.options)||void 0===t?void 0:t.dataSource;s&&\"length\"in s?i=s.length:s&&\"gallery\"in s&&(s.items||(s.items=this.Qt(s.gallery)),s.items&&(i=s.items.length));const h=this.dispatch(\"numItems\",{dataSource:s,numItems:i});return this.applyFilters(\"numItems\",h.numItems,s)}createContentFromData(t,i){return new Y(t,this,i)}getItemData(t){var i;const s=null===(i=this.options)||void 0===i?void 0:i.dataSource;let h={};Array.isArray(s)?h=s[t]:s&&\"gallery\"in s&&(s.items||(s.items=this.Qt(s.gallery)),h=s.items[t]);let e=h;e instanceof Element&&(e=this.ti(e));const n=this.dispatch(\"itemData\",{itemData:e||{},index:t});return this.applyFilters(\"itemData\",n.itemData,t)}Qt(t){var i,s;return null!==(i=this.options)&&void 0!==i&&i.children||null!==(s=this.options)&&void 0!==s&&s.childSelector?function(t,i,s=document){let h=[];if(t instanceof Element)h=[t];else if(t instanceof NodeList||Array.isArray(t))h=Array.from(t);else{const e=\"string\"==typeof t?t:i;e&&(h=Array.from(s.querySelectorAll(e)))}return h}(this.options.children,this.options.childSelector,t)||[]:[t]}ti(t){const i={element:t},s=\"A\"===t.tagName?t:t.querySelector(\"a\");if(s){i.src=s.dataset.pswpSrc||s.href,s.dataset.pswpSrcset&&(i.srcset=s.dataset.pswpSrcset),i.width=s.dataset.pswpWidth?parseInt(s.dataset.pswpWidth,10):0,i.height=s.dataset.pswpHeight?parseInt(s.dataset.pswpHeight,10):0,i.w=i.width,i.h=i.height,s.dataset.pswpType&&(i.type=s.dataset.pswpType);const e=t.querySelector(\"img\");var h;if(e)i.msrc=e.currentSrc||e.src,i.alt=null!==(h=e.getAttribute(\"alt\"))&&void 0!==h?h:\"\";(s.dataset.pswpCropped||s.dataset.cropped)&&(i.thumbCropped=!0)}return this.applyFilters(\"domItemData\",i,t,s)}lazyLoadData(t,i){return J(t,this,i)}}{constructor(t){super(),this.options=this.ii(t||{}),this.offset={x:0,y:0},this.si={x:0,y:0},this.viewportSize={x:0,y:0},this.bgOpacity=1,this.currIndex=0,this.potentialIndex=0,this.isOpen=!1,this.isDestroying=!1,this.hasMouse=!1,this.hi={},this.Gt=void 0,this.topBar=void 0,this.element=void 0,this.template=void 0,this.container=void 0,this.scrollWrap=void 0,this.currSlide=void 0,this.events=new f,this.animations=new F,this.mainScroll=new A(this),this.gestures=new T(this),this.opener=new it(this),this.keyboard=new E(this),this.contentLoader=new Q(this)}init(){if(this.isOpen||this.isDestroying)return!1;this.isOpen=!0,this.dispatch(\"init\"),this.dispatch(\"beforeOpen\"),this.ei();let t=\"pswp--open\";return this.gestures.supportsTouch&&(t+=\" pswp--touch\"),this.options.mainClass&&(t+=\" \"+this.options.mainClass),this.element&&(this.element.className+=\" \"+t),this.currIndex=this.options.index||0,this.potentialIndex=this.currIndex,this.dispatch(\"firstUpdate\"),this.scrollWheel=new O(this),(Number.isNaN(this.currIndex)||this.currIndex<0||this.currIndex>=this.getNumItems())&&(this.currIndex=0),this.gestures.supportsTouch||this.mouseDetected(),this.updateSize(),this.offset.y=window.pageYOffset,this.hi=this.getItemData(this.currIndex),this.dispatch(\"gettingData\",{index:this.currIndex,data:this.hi,slide:void 0}),this.Gt=this.getThumbBounds(),this.dispatch(\"initialLayout\"),this.on(\"openingAnimationEnd\",(()=>{const{itemHolders:t}=this.mainScroll;t[0]&&(t[0].el.style.display=\"block\",this.setContent(t[0],this.currIndex-1)),t[2]&&(t[2].el.style.display=\"block\",this.setContent(t[2],this.currIndex+1)),this.appendHeavy(),this.contentLoader.updateLazy(),this.events.add(window,\"resize\",this.ni.bind(this)),this.events.add(window,\"scroll\",this.oi.bind(this)),this.dispatch(\"bindEvents\")})),this.mainScroll.itemHolders[1]&&this.setContent(this.mainScroll.itemHolders[1],this.currIndex),this.dispatch(\"change\"),this.opener.open(),this.dispatch(\"afterInit\"),!0}getLoopedIndex(t){const i=this.getNumItems();return this.options.loop&&(t>i-1&&(t-=i),t<0&&(t+=i)),n(t,0,i-1)}appendHeavy(){this.mainScroll.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.appendHeavy()}))}goTo(t){this.mainScroll.moveIndexBy(this.getLoopedIndex(t)-this.potentialIndex)}next(){this.goTo(this.potentialIndex+1)}prev(){this.goTo(this.potentialIndex-1)}zoomTo(...t){var i;null===(i=this.currSlide)||void 0===i||i.zoomTo(...t)}toggleZoom(){var t;null===(t=this.currSlide)||void 0===t||t.toggleZoom()}close(){this.opener.isOpen&&!this.isDestroying&&(this.isDestroying=!0,this.dispatch(\"close\"),this.events.removeAll(),this.opener.close())}destroy(){var t;if(!this.isDestroying)return this.options.showHideAnimationType=\"none\",void this.close();this.dispatch(\"destroy\"),this.Yt={},this.scrollWrap&&(this.scrollWrap.ontouchmove=null,this.scrollWrap.ontouchend=null),null===(t=this.element)||void 0===t||t.remove(),this.mainScroll.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.destroy()})),this.contentLoader.destroy(),this.events.removeAll()}refreshSlideContent(t){this.contentLoader.removeByIndex(t),this.mainScroll.itemHolders.forEach(((i,s)=>{var h,e;let n=(null!==(h=null===(e=this.currSlide)||void 0===e?void 0:e.index)&&void 0!==h?h:0)-1+s;var o;(this.canLoop()&&(n=this.getLoopedIndex(n)),n===t)&&(this.setContent(i,t,!0),1===s&&(this.currSlide=i.slide,null===(o=i.slide)||void 0===o||o.setIsActive(!0)))})),this.dispatch(\"change\")}setContent(t,i,s){if(this.canLoop()&&(i=this.getLoopedIndex(i)),t.slide){if(t.slide.index===i&&!s)return;t.slide.destroy(),t.slide=void 0}if(!this.canLoop()&&(i<0||i>=this.getNumItems()))return;const h=this.getItemData(i);t.slide=new b(h,i,this),i===this.currIndex&&(this.currSlide=t.slide),t.slide.append(t.el)}getViewportCenterPoint(){return{x:this.viewportSize.x/2,y:this.viewportSize.y/2}}updateSize(t){if(this.isDestroying)return;const s=w(this.options,this);!t&&e(s,this.si)||(i(this.si,s),this.dispatch(\"beforeResize\"),i(this.viewportSize,this.si),this.oi(),this.dispatch(\"viewportSize\"),this.mainScroll.resize(this.opener.isOpen),!this.hasMouse&&window.matchMedia(\"(any-hover: hover)\").matches&&this.mouseDetected(),this.dispatch(\"resize\"))}applyBgOpacity(t){this.bgOpacity=Math.max(t,0),this.bg&&(this.bg.style.opacity=String(this.bgOpacity*this.options.bgOpacity))}mouseDetected(){var t;this.hasMouse||(this.hasMouse=!0,null===(t=this.element)||void 0===t||t.classList.add(\"pswp--has_mouse\"))}ni(){this.updateSize(),/iPhone|iPad|iPod/i.test(window.navigator.userAgent)&&setTimeout((()=>{this.updateSize()}),500)}oi(){this.setScrollOffset(0,window.pageYOffset)}setScrollOffset(t,i){this.offset.x=t,this.offset.y=i,this.dispatch(\"updateScrollOffset\")}ei(){this.element=t(\"pswp\",\"div\"),this.element.setAttribute(\"tabindex\",\"-1\"),this.element.setAttribute(\"role\",\"dialog\"),this.template=this.element,this.bg=t(\"pswp__bg\",\"div\",this.element),this.scrollWrap=t(\"pswp__scroll-wrap\",\"section\",this.element),this.container=t(\"pswp__container\",\"div\",this.scrollWrap),this.scrollWrap.setAttribute(\"aria-roledescription\",\"carousel\"),this.container.setAttribute(\"aria-live\",\"off\"),this.container.setAttribute(\"id\",\"pswp__items\"),this.mainScroll.appendHolders(),this.ui=new W(this),this.ui.init(),(this.options.appendToEl||document.body).appendChild(this.element)}getThumbBounds(){return function(t,i,s){const h=s.dispatch(\"thumbBounds\",{index:t,itemData:i,instance:s});if(h.thumbBounds)return h.thumbBounds;const{element:e}=i;let n,o;if(e&&!1!==s.options.thumbSelector){const t=s.options.thumbSelector||\"img\";o=e.matches(t)?e:e.querySelector(t)}return o=s.applyFilters(\"thumbEl\",o,i,t),o&&(n=i.thumbCropped?function(t,i,s){const h=t.getBoundingClientRect(),e=h.width/i,n=h.height/s,o=e>n?e:n,r=(h.width-i*o)/2,a=(h.height-s*o)/2,l={x:h.left+r,y:h.top+a,w:i*o};return l.innerRect={w:h.width,h:h.height,x:r,y:a},l}(o,i.width||i.w||0,i.height||i.h||0):function(t){const i=t.getBoundingClientRect();return{x:i.left,y:i.top,w:i.width}}(o)),s.applyFilters(\"thumbBounds\",n,i,t)}(this.currIndex,this.currSlide?this.currSlide.data:this.hi,this)}canLoop(){return this.options.loop&&this.getNumItems()>2}ii(t){return window.matchMedia(\"(prefers-reduced-motion), (update: slow)\").matches&&(t.showHideAnimationType=\"none\",t.zoomAnimationDuration=0),{...st,...t}}}}));\n\n/*!\n  * PhotoSwipe Lightbox 5.4.4 - https://photoswipe.com\n  * (c) 2024 Dmytro Semenov\n  */\n!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).PhotoSwipeLightbox=i()}(this,(function(){\"use strict\";function t(t,i,s){const h=document.createElement(i);return t&&(h.className=t),s&&s.appendChild(h),h}function i(t,i,s){t.style.width=\"number\"==typeof i?`${i}px`:i,t.style.height=\"number\"==typeof s?`${s}px`:s}const s=\"idle\",h=\"loading\",e=\"loaded\",n=\"error\";function o(t,i,s=document){let h=[];if(t instanceof Element)h=[t];else if(t instanceof NodeList||Array.isArray(t))h=Array.from(t);else{const e=\"string\"==typeof t?t:i;e&&(h=Array.from(s.querySelectorAll(e)))}return h}function r(){return!(!navigator.vendor||!navigator.vendor.match(/apple/i))}class l{constructor(t,i){this.type=t,this.defaultPrevented=!1,i&&Object.assign(this,i)}preventDefault(){this.defaultPrevented=!0}}class a{constructor(i,s){if(this.element=t(\"pswp__img pswp__img--placeholder\",i?\"img\":\"div\",s),i){const t=this.element;t.decoding=\"async\",t.alt=\"\",t.src=i,t.setAttribute(\"role\",\"presentation\")}this.element.setAttribute(\"aria-hidden\",\"true\")}setDisplayedSize(t,s){this.element&&(\"IMG\"===this.element.tagName?(i(this.element,250,\"auto\"),this.element.style.transformOrigin=\"0 0\",this.element.style.transform=function(t,i,s){let h=`translate3d(${t}px,${i||0}px,0)`;return void 0!==s&&(h+=` scale3d(${s},${s},1)`),h}(0,0,t/250)):i(this.element,t,s))}destroy(){var t;null!==(t=this.element)&&void 0!==t&&t.parentNode&&this.element.remove(),this.element=null}}class d{constructor(t,i,h){this.instance=i,this.data=t,this.index=h,this.element=void 0,this.placeholder=void 0,this.slide=void 0,this.displayedImageWidth=0,this.displayedImageHeight=0,this.width=Number(this.data.w)||Number(this.data.width)||0,this.height=Number(this.data.h)||Number(this.data.height)||0,this.isAttached=!1,this.hasSlide=!1,this.isDecoding=!1,this.state=s,this.data.type?this.type=this.data.type:this.data.src?this.type=\"image\":this.type=\"html\",this.instance.dispatch(\"contentInit\",{content:this})}removePlaceholder(){this.placeholder&&!this.keepPlaceholder()&&setTimeout((()=>{this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0)}),1e3)}load(i,s){if(this.slide&&this.usePlaceholder())if(this.placeholder){const t=this.placeholder.element;t&&!t.parentElement&&this.slide.container.prepend(t)}else{const t=this.instance.applyFilters(\"placeholderSrc\",!(!this.data.msrc||!this.slide.isFirstSlide)&&this.data.msrc,this);this.placeholder=new a(t,this.slide.container)}this.element&&!s||this.instance.dispatch(\"contentLoad\",{content:this,isLazy:i}).defaultPrevented||(this.isImageContent()?(this.element=t(\"pswp__img\",\"img\"),this.displayedImageWidth&&this.loadImage(i)):(this.element=t(\"pswp__content\",\"div\"),this.element.innerHTML=this.data.html||\"\"),s&&this.slide&&this.slide.updateContentSize(!0))}loadImage(t){var i,s;if(!this.isImageContent()||!this.element||this.instance.dispatch(\"contentLoadImage\",{content:this,isLazy:t}).defaultPrevented)return;const e=this.element;this.updateSrcsetSizes(),this.data.srcset&&(e.srcset=this.data.srcset),e.src=null!==(i=this.data.src)&&void 0!==i?i:\"\",e.alt=null!==(s=this.data.alt)&&void 0!==s?s:\"\",this.state=h,e.complete?this.onLoaded():(e.onload=()=>{this.onLoaded()},e.onerror=()=>{this.onError()})}setSlide(t){this.slide=t,this.hasSlide=!0,this.instance=t.pswp}onLoaded(){this.state=e,this.slide&&this.element&&(this.instance.dispatch(\"loadComplete\",{slide:this.slide,content:this}),this.slide.isActive&&this.slide.heavyAppended&&!this.element.parentNode&&(this.append(),this.slide.updateContentSize(!0)),this.state!==e&&this.state!==n||this.removePlaceholder())}onError(){this.state=n,this.slide&&(this.displayError(),this.instance.dispatch(\"loadComplete\",{slide:this.slide,isError:!0,content:this}),this.instance.dispatch(\"loadError\",{slide:this.slide,content:this}))}isLoading(){return this.instance.applyFilters(\"isContentLoading\",this.state===h,this)}isError(){return this.state===n}isImageContent(){return\"image\"===this.type}setDisplayedSize(t,s){if(this.element&&(this.placeholder&&this.placeholder.setDisplayedSize(t,s),!this.instance.dispatch(\"contentResize\",{content:this,width:t,height:s}).defaultPrevented&&(i(this.element,t,s),this.isImageContent()&&!this.isError()))){const i=!this.displayedImageWidth&&t;this.displayedImageWidth=t,this.displayedImageHeight=s,i?this.loadImage(!1):this.updateSrcsetSizes(),this.slide&&this.instance.dispatch(\"imageSizeChange\",{slide:this.slide,width:t,height:s,content:this})}}isZoomable(){return this.instance.applyFilters(\"isContentZoomable\",this.isImageContent()&&this.state!==n,this)}updateSrcsetSizes(){if(!this.isImageContent()||!this.element||!this.data.srcset)return;const t=this.element,i=this.instance.applyFilters(\"srcsetSizesWidth\",this.displayedImageWidth,this);(!t.dataset.largestUsedSize||i>parseInt(t.dataset.largestUsedSize,10))&&(t.sizes=i+\"px\",t.dataset.largestUsedSize=String(i))}usePlaceholder(){return this.instance.applyFilters(\"useContentPlaceholder\",this.isImageContent(),this)}lazyLoad(){this.instance.dispatch(\"contentLazyLoad\",{content:this}).defaultPrevented||this.load(!0)}keepPlaceholder(){return this.instance.applyFilters(\"isKeepingPlaceholder\",this.isLoading(),this)}destroy(){this.hasSlide=!1,this.slide=void 0,this.instance.dispatch(\"contentDestroy\",{content:this}).defaultPrevented||(this.remove(),this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0),this.isImageContent()&&this.element&&(this.element.onload=null,this.element.onerror=null,this.element=void 0))}displayError(){if(this.slide){var i,s;let h=t(\"pswp__error-msg\",\"div\");h.innerText=null!==(i=null===(s=this.instance.options)||void 0===s?void 0:s.errorMsg)&&void 0!==i?i:\"\",h=this.instance.applyFilters(\"contentErrorElement\",h,this),this.element=t(\"pswp__content pswp__error-msg-container\",\"div\"),this.element.appendChild(h),this.slide.container.innerText=\"\",this.slide.container.appendChild(this.element),this.slide.updateContentSize(!0),this.removePlaceholder()}}append(){if(this.isAttached||!this.element)return;if(this.isAttached=!0,this.state===n)return void this.displayError();if(this.instance.dispatch(\"contentAppend\",{content:this}).defaultPrevented)return;const t=\"decode\"in this.element;this.isImageContent()?t&&this.slide&&(!this.slide.isActive||r())?(this.isDecoding=!0,this.element.decode().catch((()=>{})).finally((()=>{this.isDecoding=!1,this.appendImage()}))):this.appendImage():this.slide&&!this.element.parentNode&&this.slide.container.appendChild(this.element)}activate(){!this.instance.dispatch(\"contentActivate\",{content:this}).defaultPrevented&&this.slide&&(this.isImageContent()&&this.isDecoding&&!r()?this.appendImage():this.isError()&&this.load(!1,!0),this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"false\"))}deactivate(){this.instance.dispatch(\"contentDeactivate\",{content:this}),this.slide&&this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"true\")}remove(){this.isAttached=!1,this.instance.dispatch(\"contentRemove\",{content:this}).defaultPrevented||(this.element&&this.element.parentNode&&this.element.remove(),this.placeholder&&this.placeholder.element&&this.placeholder.element.remove())}appendImage(){this.isAttached&&(this.instance.dispatch(\"contentAppendImage\",{content:this}).defaultPrevented||(this.slide&&this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element),this.state!==e&&this.state!==n||this.removePlaceholder()))}}function c(t,i,s,h,e){let n=0;if(i.paddingFn)n=i.paddingFn(s,h,e)[t];else if(i.padding)n=i.padding[t];else{const s=\"padding\"+t[0].toUpperCase()+t.slice(1);i[s]&&(n=i[s])}return Number(n)||0}class u{constructor(t,i,s,h){this.pswp=h,this.options=t,this.itemData=i,this.index=s,this.panAreaSize=null,this.elementSize=null,this.fit=1,this.fill=1,this.vFill=1,this.initial=1,this.secondary=1,this.max=1,this.min=1}update(t,i,s){const h={x:t,y:i};this.elementSize=h,this.panAreaSize=s;const e=s.x/h.x,n=s.y/h.y;this.fit=Math.min(1,e<n?e:n),this.fill=Math.min(1,e>n?e:n),this.vFill=Math.min(1,n),this.initial=this.t(),this.secondary=this.i(),this.max=Math.max(this.initial,this.secondary,this.o()),this.min=Math.min(this.fit,this.initial,this.secondary),this.pswp&&this.pswp.dispatch(\"zoomLevelsUpdate\",{zoomLevels:this,slideData:this.itemData})}l(t){const i=t+\"ZoomLevel\",s=this.options[i];if(s)return\"function\"==typeof s?s(this):\"fill\"===s?this.fill:\"fit\"===s?this.fit:Number(s)}i(){let t=this.l(\"secondary\");return t||(t=Math.min(1,3*this.fit),this.elementSize&&t*this.elementSize.x>4e3&&(t=4e3/this.elementSize.x),t)}t(){return this.l(\"initial\")||this.fit}o(){return this.l(\"max\")||Math.max(1,4*this.fit)}}function p(t,i,s){const h=i.createContentFromData(t,s);let e;const{options:n}=i;if(n){let o;e=new u(n,t,-1),o=i.pswp?i.pswp.viewportSize:function(t,i){if(t.getViewportSizeFn){const s=t.getViewportSizeFn(t,i);if(s)return s}return{x:document.documentElement.clientWidth,y:window.innerHeight}}(n,i);const r=function(t,i,s,h){return{x:i.x-c(\"left\",t,i,s,h)-c(\"right\",t,i,s,h),y:i.y-c(\"top\",t,i,s,h)-c(\"bottom\",t,i,s,h)}}(n,o,t,s);e.update(h.width,h.height,r)}return h.lazyLoad(),e&&h.setDisplayedSize(Math.ceil(h.width*e.initial),Math.ceil(h.height*e.initial)),h}return class extends class extends class{constructor(){this.u={},this.p={},this.pswp=void 0,this.options=void 0}addFilter(t,i,s=100){var h,e,n;this.p[t]||(this.p[t]=[]),null===(h=this.p[t])||void 0===h||h.push({fn:i,priority:s}),null===(e=this.p[t])||void 0===e||e.sort(((t,i)=>t.priority-i.priority)),null===(n=this.pswp)||void 0===n||n.addFilter(t,i,s)}removeFilter(t,i){this.p[t]&&(this.p[t]=this.p[t].filter((t=>t.fn!==i))),this.pswp&&this.pswp.removeFilter(t,i)}applyFilters(t,...i){var s;return null===(s=this.p[t])||void 0===s||s.forEach((t=>{i[0]=t.fn.apply(this,i)})),i[0]}on(t,i){var s,h;this.u[t]||(this.u[t]=[]),null===(s=this.u[t])||void 0===s||s.push(i),null===(h=this.pswp)||void 0===h||h.on(t,i)}off(t,i){var s;this.u[t]&&(this.u[t]=this.u[t].filter((t=>i!==t))),null===(s=this.pswp)||void 0===s||s.off(t,i)}dispatch(t,i){var s;if(this.pswp)return this.pswp.dispatch(t,i);const h=new l(t,i);return null===(s=this.u[t])||void 0===s||s.forEach((t=>{t.call(this,h)})),h}}{getNumItems(){var t;let i=0;const s=null===(t=this.options)||void 0===t?void 0:t.dataSource;s&&\"length\"in s?i=s.length:s&&\"gallery\"in s&&(s.items||(s.items=this.v(s.gallery)),s.items&&(i=s.items.length));const h=this.dispatch(\"numItems\",{dataSource:s,numItems:i});return this.applyFilters(\"numItems\",h.numItems,s)}createContentFromData(t,i){return new d(t,this,i)}getItemData(t){var i;const s=null===(i=this.options)||void 0===i?void 0:i.dataSource;let h={};Array.isArray(s)?h=s[t]:s&&\"gallery\"in s&&(s.items||(s.items=this.v(s.gallery)),h=s.items[t]);let e=h;e instanceof Element&&(e=this.m(e));const n=this.dispatch(\"itemData\",{itemData:e||{},index:t});return this.applyFilters(\"itemData\",n.itemData,t)}v(t){var i,s;return null!==(i=this.options)&&void 0!==i&&i.children||null!==(s=this.options)&&void 0!==s&&s.childSelector?o(this.options.children,this.options.childSelector,t)||[]:[t]}m(t){const i={element:t},s=\"A\"===t.tagName?t:t.querySelector(\"a\");if(s){i.src=s.dataset.pswpSrc||s.href,s.dataset.pswpSrcset&&(i.srcset=s.dataset.pswpSrcset),i.width=s.dataset.pswpWidth?parseInt(s.dataset.pswpWidth,10):0,i.height=s.dataset.pswpHeight?parseInt(s.dataset.pswpHeight,10):0,i.w=i.width,i.h=i.height,s.dataset.pswpType&&(i.type=s.dataset.pswpType);const e=t.querySelector(\"img\");var h;if(e)i.msrc=e.currentSrc||e.src,i.alt=null!==(h=e.getAttribute(\"alt\"))&&void 0!==h?h:\"\";(s.dataset.pswpCropped||s.dataset.cropped)&&(i.thumbCropped=!0)}return this.applyFilters(\"domItemData\",i,t,s)}lazyLoadData(t,i){return p(t,this,i)}}{constructor(t){super(),this.options=t||{},this.g=0,this.shouldOpen=!1,this._=void 0,this.onThumbnailsClick=this.onThumbnailsClick.bind(this)}init(){o(this.options.gallery,this.options.gallerySelector).forEach((t=>{t.addEventListener(\"click\",this.onThumbnailsClick,!1)}))}onThumbnailsClick(t){if(function(t){return\"button\"in t&&1===t.button||t.ctrlKey||t.metaKey||t.altKey||t.shiftKey}(t)||window.pswp)return;let i={x:t.clientX,y:t.clientY};i.x||i.y||(i=null);let s=this.getClickedIndex(t);s=this.applyFilters(\"clickedIndex\",s,t,this);const h={gallery:t.currentTarget};s>=0&&(t.preventDefault(),this.loadAndOpen(s,h,i))}getClickedIndex(t){if(this.options.getClickedIndexFn)return this.options.getClickedIndexFn.call(this,t);const i=t.target,s=o(this.options.children,this.options.childSelector,t.currentTarget).findIndex((t=>t===i||t.contains(i)));return-1!==s?s:this.options.children||this.options.childSelector?-1:0}loadAndOpen(t,i,s){if(window.pswp||!this.options)return!1;if(!i&&this.options.gallery&&this.options.children){const t=o(this.options.gallery);t[0]&&(i={gallery:t[0]})}return this.options.index=t,this.options.initialPointerPos=s,this.shouldOpen=!0,this.preload(t,i),!0}preload(t,i){const{options:s}=this;i&&(s.dataSource=i);const h=[],e=typeof s.pswpModule;if(\"function\"==typeof(n=s.pswpModule)&&n.prototype&&n.prototype.goTo)h.push(Promise.resolve(s.pswpModule));else{if(\"string\"===e)throw new Error(\"pswpModule as string is no longer supported\");if(\"function\"!==e)throw new Error(\"pswpModule is not valid\");h.push(s.pswpModule())}var n;\"function\"==typeof s.openPromise&&h.push(s.openPromise()),!1!==s.preloadFirstSlide&&t>=0&&(this._=function(t,i){const s=i.getItemData(t);if(!i.dispatch(\"lazyLoadSlide\",{index:t,itemData:s}).defaultPrevented)return p(s,i,t)}(t,this));const o=++this.g;Promise.all(h).then((t=>{if(this.shouldOpen){const i=t[0];this.I(i,o)}}))}I(t,i){if(i!==this.g&&this.shouldOpen)return;if(this.shouldOpen=!1,window.pswp)return;const s=\"object\"==typeof t?new t.default(this.options):new t(this.options);this.pswp=s,window.pswp=s,Object.keys(this.u).forEach((t=>{var i;null===(i=this.u[t])||void 0===i||i.forEach((i=>{s.on(t,i)}))})),Object.keys(this.p).forEach((t=>{var i;null===(i=this.p[t])||void 0===i||i.forEach((i=>{s.addFilter(t,i.fn,i.priority)}))})),this._&&(s.contentLoader.addToCache(this._),this._=void 0),s.on(\"destroy\",(()=>{this.pswp=void 0,delete window.pswp})),s.init()}destroy(){var t;null===(t=this.pswp)||void 0===t||t.destroy(),this.shouldOpen=!1,this.u={},o(this.options.gallery,this.options.gallerySelector).forEach((t=>{t.removeEventListener(\"click\",this.onThumbnailsClick,!1)}))}}}));\n\n\n/*! jQuery UI - v1.14.1 - 2025-12-15\n* https://jqueryui.com\n* Includes: widget.js\n* Copyright OpenJS Foundation and other contributors; Licensed MIT */\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n$.ui = $.ui || {};\n\nvar version = $.ui.version = \"1.14.1\";\n\n\n/*!\n * jQuery UI Widget 1.14.1\n * https://jqueryui.com\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license.\n * https://jquery.org/license\n */\n\n//>>label: Widget\n//>>group: Core\n//>>description: Provides a factory for creating stateful widgets with a common API.\n//>>docs: https://api.jqueryui.com/jQuery.widget/\n//>>demos: https://jqueryui.com/widget/\n\n\nvar widgetUuid = 0;\nvar widgetHasOwnProperty = Array.prototype.hasOwnProperty;\nvar widgetSlice = Array.prototype.slice;\n\n$.cleanData = ( function( orig ) {\n\treturn function( elems ) {\n\t\tvar events, elem, i;\n\t\tfor ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {\n\n\t\t\t// Only trigger remove when necessary to save time\n\t\t\tevents = $._data( elem, \"events\" );\n\t\t\tif ( events && events.remove ) {\n\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t}\n\t\t}\n\t\torig( elems );\n\t};\n} )( $.cleanData );\n\n$.widget = function( name, base, prototype ) {\n\tvar existingConstructor, constructor, basePrototype;\n\n\t// ProxiedPrototype allows the provided prototype to remain unmodified\n\t// so that it can be used as a mixin for multiple widgets (#8876)\n\tvar proxiedPrototype = {};\n\n\tvar namespace = name.split( \".\" )[ 0 ];\n\tname = name.split( \".\" )[ 1 ];\n\tif ( name === \"__proto__\" || name === \"constructor\" ) {\n\t\treturn $.error( \"Invalid widget name: \" + name );\n\t}\n\tvar fullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\tif ( Array.isArray( prototype ) ) {\n\t\tprototype = $.extend.apply( null, [ {} ].concat( prototype ) );\n\t}\n\n\t// Create selector for plugin\n\t$.expr.pseudos[ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\n\t\t// Allow instantiation without \"new\" keyword\n\t\tif ( !this || !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// Allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\n\t// Extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\n\t\t// Copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\n\t\t// Track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t} );\n\n\tbasePrototype = new base();\n\n\t// We need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( typeof value !== \"function\" ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = ( function() {\n\t\t\tfunction _super() {\n\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t}\n\n\t\t\tfunction _superApply( args ) {\n\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t}\n\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super;\n\t\t\t\tvar __superApply = this._superApply;\n\t\t\t\tvar returnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t} )();\n\t} );\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t} );\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// Redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor,\n\t\t\t\tchild._proto );\n\t\t} );\n\n\t\t// Remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n\n\treturn constructor;\n};\n\n$.widget.extend = function( target ) {\n\tvar input = widgetSlice.call( arguments, 1 );\n\tvar inputIndex = 0;\n\tvar inputLength = input.length;\n\tvar key;\n\tvar value;\n\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( widgetHasOwnProperty.call( input[ inputIndex ], key ) && value !== undefined ) {\n\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\";\n\t\tvar args = widgetSlice.call( arguments, 1 );\n\t\tvar returnValue = this;\n\n\t\tif ( isMethodCall ) {\n\n\t\t\t// If this is an empty collection, we need to have the instance method\n\t\t\t// return undefined instead of the jQuery instance\n\t\t\tif ( !this.length && options === \"instance\" ) {\n\t\t\t\treturnValue = undefined;\n\t\t\t} else {\n\t\t\t\tthis.each( function() {\n\t\t\t\t\tvar methodValue;\n\t\t\t\t\tvar instance = $.data( this, fullName );\n\n\t\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\t\treturnValue = instance;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !instance ) {\n\t\t\t\t\t\treturn $.error( \"cannot call methods on \" + name +\n\t\t\t\t\t\t\t\" prior to initialization; \" +\n\t\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( typeof instance[ options ] !== \"function\" ||\n\t\t\t\t\t\toptions.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name +\n\t\t\t\t\t\t\t\" widget instance\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\n\t\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\t\tmethodValue;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// Allow multiple hashes to be passed on init\n\t\t\tif ( args.length ) {\n\t\t\t\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\n\t\t\t}\n\n\t\t\tthis.each( function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} );\n\t\t\t\t\tif ( instance._init ) {\n\t\t\t\t\t\tinstance._init();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\n\toptions: {\n\t\tclasses: {},\n\t\tdisabled: false,\n\n\t\t// Callbacks\n\t\tcreate: null\n\t},\n\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = widgetUuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\t\tthis.classesElementLookup = {};\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t\tthis.document = $( element.style ?\n\n\t\t\t\t// Element within the document\n\t\t\t\telement.ownerDocument :\n\n\t\t\t\t// Element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );\n\t\t}\n\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis._create();\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis._setOptionDisabled( this.options.disabled );\n\t\t}\n\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\n\t_getCreateOptions: function() {\n\t\treturn {};\n\t},\n\n\t_getCreateEventData: $.noop,\n\n\t_create: $.noop,\n\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tvar that = this;\n\n\t\tthis._destroy();\n\t\t$.each( this.classesElementLookup, function( key, value ) {\n\t\t\tthat._removeClass( value, key );\n\t\t} );\n\n\t\t// We can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeData( this.widgetFullName );\n\t\tthis.widget()\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" );\n\n\t\t// Clean up events and states\n\t\tthis.bindings.off( this.eventNamespace );\n\t},\n\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key;\n\t\tvar parts;\n\t\tvar curOption;\n\t\tvar i;\n\n\t\tif ( arguments.length === 0 ) {\n\n\t\t\t// Don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\n\t\t\t// Handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"classes\" ) {\n\t\t\tthis._setOptionClasses( value );\n\t\t}\n\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._setOptionDisabled( value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOptionClasses: function( value ) {\n\t\tvar classKey, elements, currentElements;\n\n\t\tfor ( classKey in value ) {\n\t\t\tcurrentElements = this.classesElementLookup[ classKey ];\n\t\t\tif ( value[ classKey ] === this.options.classes[ classKey ] ||\n\t\t\t\t\t!currentElements ||\n\t\t\t\t\t!currentElements.length ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// We are doing this to create a new jQuery object because the _removeClass() call\n\t\t\t// on the next line is going to destroy the reference to the current elements being\n\t\t\t// tracked. We need to save a copy of this collection so that we can add the new classes\n\t\t\t// below.\n\t\t\telements = $( currentElements.get() );\n\t\t\tthis._removeClass( currentElements, classKey );\n\n\t\t\t// We don't use _addClass() here, because that uses this.options.classes\n\t\t\t// for generating the string of classes. We want to use the value passed in from\n\t\t\t// _setOption(), this is the new value of the classes option which was passed to\n\t\t\t// _setOption(). We pass this value directly to _classes().\n\t\t\telements.addClass( this._classes( {\n\t\t\t\telement: elements,\n\t\t\t\tkeys: classKey,\n\t\t\t\tclasses: value,\n\t\t\t\tadd: true\n\t\t\t} ) );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null, !!value );\n\n\t\t// If the widget is becoming disabled, then nothing is interactive\n\t\tif ( value ) {\n\t\t\tthis._removeClass( this.hoverable, null, \"ui-state-hover\" );\n\t\t\tthis._removeClass( this.focusable, null, \"ui-state-focus\" );\n\t\t}\n\t},\n\n\tenable: function() {\n\t\treturn this._setOptions( { disabled: false } );\n\t},\n\n\tdisable: function() {\n\t\treturn this._setOptions( { disabled: true } );\n\t},\n\n\t_classes: function( options ) {\n\t\tvar full = [];\n\t\tvar that = this;\n\n\t\toptions = $.extend( {\n\t\t\telement: this.element,\n\t\t\tclasses: this.options.classes || {}\n\t\t}, options );\n\n\t\tfunction bindRemoveEvent() {\n\t\t\tvar nodesToBind = [];\n\n\t\t\toptions.element.each( function( _, element ) {\n\t\t\t\tvar isTracked = $.map( that.classesElementLookup, function( elements ) {\n\t\t\t\t\treturn elements;\n\t\t\t\t} )\n\t\t\t\t\t.some( function( elements ) {\n\t\t\t\t\t\treturn elements.is( element );\n\t\t\t\t\t} );\n\n\t\t\t\tif ( !isTracked ) {\n\t\t\t\t\tnodesToBind.push( element );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthat._on( $( nodesToBind ), {\n\t\t\t\tremove: \"_untrackClassesElement\"\n\t\t\t} );\n\t\t}\n\n\t\tfunction processClassString( classes, checkOption ) {\n\t\t\tvar current, i;\n\t\t\tfor ( i = 0; i < classes.length; i++ ) {\n\t\t\t\tcurrent = that.classesElementLookup[ classes[ i ] ] || $();\n\t\t\t\tif ( options.add ) {\n\t\t\t\t\tbindRemoveEvent();\n\t\t\t\t\tcurrent = $( $.uniqueSort( current.get().concat( options.element.get() ) ) );\n\t\t\t\t} else {\n\t\t\t\t\tcurrent = $( current.not( options.element ).get() );\n\t\t\t\t}\n\t\t\t\tthat.classesElementLookup[ classes[ i ] ] = current;\n\t\t\t\tfull.push( classes[ i ] );\n\t\t\t\tif ( checkOption && options.classes[ classes[ i ] ] ) {\n\t\t\t\t\tfull.push( options.classes[ classes[ i ] ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( options.keys ) {\n\t\t\tprocessClassString( options.keys.match( /\\S+/g ) || [], true );\n\t\t}\n\t\tif ( options.extra ) {\n\t\t\tprocessClassString( options.extra.match( /\\S+/g ) || [] );\n\t\t}\n\n\t\treturn full.join( \" \" );\n\t},\n\n\t_untrackClassesElement: function( event ) {\n\t\tvar that = this;\n\t\t$.each( that.classesElementLookup, function( key, value ) {\n\t\t\tif ( $.inArray( event.target, value ) !== -1 ) {\n\t\t\t\tthat.classesElementLookup[ key ] = $( value.not( event.target ).get() );\n\t\t\t}\n\t\t} );\n\n\t\tthis._off( $( event.target ) );\n\t},\n\n\t_removeClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, false );\n\t},\n\n\t_addClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, true );\n\t},\n\n\t_toggleClass: function( element, keys, extra, add ) {\n\t\tadd = ( typeof add === \"boolean\" ) ? add : extra;\n\t\tvar shift = ( typeof element === \"string\" || element === null ),\n\t\t\toptions = {\n\t\t\t\textra: shift ? keys : extra,\n\t\t\t\tkeys: shift ? element : keys,\n\t\t\t\telement: shift ? this.element : element,\n\t\t\t\tadd: add\n\t\t\t};\n\t\toptions.element.toggleClass( this._classes( options ), add );\n\t\treturn this;\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement;\n\t\tvar instance = this;\n\n\t\t// No suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// No element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\n\t\t\t\t// Allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// Copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^([\\w:-]*)\\s*(.*)$/ );\n\t\t\tvar eventName = match[ 1 ] + instance.eventNamespace;\n\t\t\tvar selector = match[ 2 ];\n\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.on( eventName, selector, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.on( eventName, handlerProxy );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = ( eventName || \"\" ).split( \" \" ).join( this.eventNamespace + \" \" ) +\n\t\t\tthis.eventNamespace;\n\t\telement.off( eventName );\n\n\t\t// Clear the stack to avoid memory leaks (#10056)\n\t\tthis.bindings = $( this.bindings.not( element ).get() );\n\t\tthis.focusable = $( this.focusable.not( element ).get() );\n\t\tthis.hoverable = $( this.hoverable.not( element ).get() );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig;\n\t\tvar callback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\n\t\t// The original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// Copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( typeof callback === \"function\" &&\n\t\t\tcallback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\n\t\tvar hasOptions;\n\t\tvar effectName = !options ?\n\t\t\tmethod :\n\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\tdefaultEffect :\n\t\t\t\toptions.effect || defaultEffect;\n\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t} else if ( options === true ) {\n\t\t\toptions = {};\n\t\t}\n\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue( function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t} );\n\t\t}\n\t};\n} );\n\nvar widget = $.widget;\n\n\n\n\n} );\n\n/**\n * Copyright D3R 2013\n * http://d3r.com\n * dom@d3r.com\n *\n * Dependencies: jQuery, jQuery Widget\n */\n(function($) {\n    var zoom = {\n        enabled: false,\n        options: {\n            image   : 'img',\n            canvas  : false,\n            backdrop: false,\n            trigger : false,\n            debug   : false\n        },\n        _init: function() {\n            this._debug('Zoom :: INIT', this.element.data('fullsize'));\n            if (!this.element.data('fullsize')) return;\n            this.image = this.element.find(this.options.image);\n            if (this.options.canvas) {\n                this._canvas = this._findElement(this.options.canvas);\n            } else {\n                this._canvas = this.element;\n            }\n            if (this.options.backdrop) {\n                this._backdrop = this._findElement(this.options.backdrop);\n                this._backdrop.on('click.zoom', this.toggle.bind(this));\n                this._debug('Zoom :: BACKDROP', 'enabled');\n            }\n            if (this.options.trigger) {\n                this._trigger = this._findElement(this.options.trigger);\n                this._debug('ZOOM :: Trigger', this._trigger);\n                this.element.on('click.zoom', this.toggle.bind(this));\n            } else {\n                this.element\n                    .on('mouseenter.zoom', this.enable.bind(this))\n                    .on('mouseleave.zoom', this.disable.bind(this));\n            }\n        },\n        destroy: function() {\n            this._debug('Zoom :: DESTROY');\n            this.element.off('.zoom');\n            if (this._backdrop) this._backdrop.off('.zoom');\n            if (this._trigger)  this._trigger.off('.zoom');\n        },\n        enable: function(e) {\n            this._debug('Zoom :: ENABLE');\n            this._canvas.css({\n                backgroundImage: `url('${this.element.data('fullsize')}')`,\n                backgroundRepeat: 'no-repeat'\n            });\n            this.element.addClass('zoom--enabled');\n            this._canvas.addClass('zoom__canvas--enabled');\n            this._backdrop.addClass('zoom__backdrop--enabled');\n            this._width = this.element.width();\n            this._height = this.element.height();\n            var offset = this.element.offset();\n            this._left = offset.left;\n            this._top = offset.top;\n            this.element.on('mousemove.zoom', this._updatePosition.bind(this));\n            this.enabled = true;\n            this._updatePositionFromCoords(e.pageX, e.pageY);\n        },\n        disable: function(e) {\n            this._debug('Zoom :: DISABLE');\n            this.element.removeClass('zoom--enabled');\n            this._canvas.removeClass('zoom__canvas--enabled');\n            this._backdrop.removeClass('zoom__backdrop--enabled');\n            this.element.off('mousemove.zoom');\n            this.enabled = false;\n        },\n        toggle: function(e) {\n            if (e.target.tagName != 'SPAN') {\n                if (this.enabled) {\n                    this.disable(e);\n                } else {\n                    this.enable(e);\n                }\n            }\n        },\n        _findElement: function(selector) {\n            if (selector[0] === '>') {\n                return this.element.find(selector.slice(1));\n            } else {\n                return $(selector);\n            }\n        },\n        _updatePosition: function(e) {\n            this._updatePositionFromCoords(e.pageX, e.pageY);\n        },\n        _updatePositionFromCoords: function(pageX, pageY) {\n            var left = 100 * (pageX - this._left) / this._width,\n                top = 100 * (pageY - this._top) / this._height;\n            this._canvas.css('backgroundPosition', left+\"% \"+top+\"%\");\n        },\n        _debug: function() {\n            if (true === this.options.debug && !!window.console && !!window.console.log){\n                window.console.log.apply(window.console, arguments);\n            }\n        }\n    };\n    $.widget('d3r.zoom', zoom);\n})(jQuery);\n\nvar AMURL = {\n    build: function(parts) {\n        var url = parts.path;\n\n        parts.querystring = parts.querystring.replace('?', '');\n        if (parts.querystring !== '') {\n            url += '?' + parts.querystring;\n        }\n\n        parts.hash = parts.hash.replace('#', '');\n        if (parts.hash !== '') {\n            url += '#' + parts.hash;\n        }\n\n        return url;\n    },\n\n    parts: function(url) {\n        var parts = url.toString().split('#');\n        url = parts[0];\n        var hash = parts.length > 1 ? '#' + parts[1] : '';\n\n        parts = url.split('?');\n        var path = parts[0];\n        var qs   = parts.length > 1 ? parts[1] : '';\n\n        return {'path': path, 'querystring': qs, 'hash': hash};\n    },\n\n    paramsToQueryString: function(params) {\n        var pairs = [];\n        for (var key in params) {\n            var val = params[key];\n\n            if (key != '' && val != null && val != undefined && val != '') {\n                pairs.push(key + '=' + params[key]);\n            }\n        }\n\n        if (pairs.length > 0) {\n            return '?' + pairs.join('&');\n        } else {\n            return '';\n        }\n    },\n\n\n    queryStringToParams: function(queryString) {\n        if (queryString.indexOf('?') > -1) {\n            var queryString = queryString.split('?')[1];\n        }\n\n        var pairs = queryString.split('&');\n\n        params = [];\n        for (var i=0; i<pairs.length; i++) {\n            var pair = pairs[i].split('=');\n            params[pair[0]] = pair[1];\n        }\n\n        return params;\n    },\n\n    setQueryStringParam: function(queryString, key, value) {\n        var params = this.queryStringToParams(queryString);\n        params[key] = value;\n        return this.paramsToQueryString(params);\n    }\n};\n\nvar STATE = {\n    params: null,\n    enabled: true,\n\n    disable: function() {\n        this.enabled = false;\n    },\n\n    enable: function() {\n        this.enabled = true;\n    },\n\n    getParams: function(force) {\n        if (this.params == null || force) {\n            var query = window.location.search.substring(1);\n            this.params = AMURL.queryStringToParams(query);\n        }\n\n        return this.params;\n    },\n\n    getChanged: function() {\n        var oldParams = this.params;\n        this.getParams(true);\n        var changed = [];\n\n        if (oldParams) {\n            for (var key in this.params) {\n                if (this.params[key] != oldParams[key]) {\n                    changed[key] = this.params[key];\n                }\n            }\n\n            for (var key in oldParams) {\n                if (this.params[key] != oldParams[key]) {\n                    changed[key] = this.params[key];\n                }\n            }\n        } else {\n            changed = this.params;\n        }\n\n        return changed;\n    },\n\n    setParam: function(key, val) {\n        this.getParams();\n\n        if (val == null) {\n            delete this.params[key];\n        } else {\n            this.params[key] = val;\n        }\n\n        return this;\n    },\n\n    setState: function(state) {\n        var pair = state.split('=');\n        var key = pair[0];\n        var val = pair[1];\n\n        this.setParam(key, val);\n\n        return this;\n    },\n\n    setHash: function(hash) {\n        if (hash.indexOf('#') == -1) {\n            hash = '#' + hash;\n        }\n\n        var url = window.location.protocol + '//' + window.location.hostname + window.location.pathname + window.location.search + hash;\n\n        if (window.location != url) {\n            history.pushState({}, null, url);\n        }\n    },\n\n    getUrl: function() {\n        var url = AMURL.parts(window.location);\n        this.getParams();\n        url.querystring = AMURL.paramsToQueryString(this.params);\n\n        return url.path + url.querystring + url.hash;\n    },\n\n    pushUrl: function(url) {\n        if (this.enabled) {\n            if (url == undefined) {\n                url = this.getUrl();\n            }\n\n            if (window.location != url) {\n                history.pushState({}, null, url);\n            }\n        }\n\n        return this;\n    },\n\n    replaceUrl: function(url) {\n        if (this.enabled) {\n            if (url == undefined) {\n                url = this.getUrl();\n            }\n\n            history.replaceState({}, null, url);\n        }\n\n        return this;\n    },\n\n    getStorage: function($option, name) {\n        if ($option.hasClass('js-store_state')) {\n            return localStorage[name];\n        } else {\n            return sessionStorage[name];\n        }\n    },\n\n    save: function($option) {\n        if (!this.enabled) {\n            return;\n        }\n\n        var name  = undefined;\n        var value = undefined;\n\n\n        if ($option.data('state')) {\n            var s = $option.data('state').split('=');\n            name  = s[0];\n            value = s[1];\n\n            if ($option.hasClass('js-toggle_active')) {\n                var activate_sel = $option.data('activate');\n                var $activate    = activate_sel ? $(activate_sel) : $option;\n\n                if (!$activate.hasClass('js-is_active')) {\n                    value = undefined;\n                }\n            }\n        } else {\n            name  = $option.prop('name');\n            value = $option.val();\n\n            if ($option.prop('tagName') == 'INPUT') {\n                var type  = $option.prop('type');\n\n                if ((type == 'checkbox' || type == 'radio') && $option.not(':checked')) {\n                    value = undefined;\n                }\n            }\n        }\n\n        if ($option.hasClass('js-history_state')) {\n            STATE.setParam(name, value);\n            STATE.pushUrl();\n        }\n\n        if ($option.hasClass('js-store_state')) {\n            localStorage.setItem(name, value);\n        }\n\n        if ($option.hasClass('js-session_state')) {\n            sessionStorage.setItem(name, value);\n        }\n    },\n\n    load: function(scope) {\n        var $scope = $(scope);\n\n        this.disable();\n\n        $scope.find('a.js-store_state, a.js-session_state, button.js-store_state, button.js-session_state').each(function() {\n            var $option = $(this);\n            var s = $option.data('state').split('=');\n            name  = s[0];\n            value = s[1];\n            var stored  = STATE.getStorage($option, name);\n\n            if (value == stored) {\n                $option.trigger('click');\n            }\n        });\n\n        $scope.find('input.js-store_state, input.js-session_state').each(function() {\n            var $option = $(this);\n            var name    = $option.prop('name');\n            var type    = $option.prop('type');\n            var value   = $option.val();\n            var stored  = STATE.getStorage($option, name);\n\n            if (stored != undefined) {\n                if (type == 'checkbox' || type == 'radio') {\n                    if (value == stored) {\n                        $option.trigger('click');\n                    }\n                } else {\n                    $option.val(stored).trigger('change');\n                }\n            }\n        });\n\n        $scope.find('select.js-store_state, select.js-session_state').each(function() {\n            var $option = $(this);\n            var name    = $option.prop('name');\n            var stored  = STATE.getStorage($option, name);\n\n            if (stored != undefined) {\n                $option.val(stored).trigger('change');\n            }\n        });\n\n        var changed = this.getChanged();\n\n        for (var key in changed) {\n            var val = changed[key];\n            if (val == null || val == undefined) {\n                val = '';\n            }\n            var kav = key + '=' + val;\n            var triggered = false;\n\n            $scope.find('a.js-history_state[data-state=\"' + kav + '\"]:first').each(function() {\n                triggered  = true;\n                $(this).trigger('click');\n            });\n\n            if (triggered) {\n                continue;\n            }\n\n            if (val == '') {\n                // no matches for no value, so maybe it's just the default option like house fabric\n                $scope.find('a.js-history_state[data-state^=\"' + kav + '\"]:first').each(function() {\n                    triggered  = true;\n                    $(this).trigger('click');\n                });\n\n                if (triggered) {\n                    continue;\n                }\n            }\n\n            $scope.find('input.js-history_state[name=\"' + key + '\"][value=\"' + val + '\"]').each(function() {\n                triggered  = true;\n                $(this).trigger('click');\n            });\n\n            if (triggered) {\n                continue;\n            }\n\n            $scope.find('select.js-history_state[name=\"' + key + '\"]:first').each(function() {\n                triggered  = true;\n                $(this).val(val).trigger('change');\n            });\n        }\n\n        this.enable();\n    },\n\n    loadHandlers: function(scope) {\n        var $scope = $(scope);\n\n        $scope.find('.js-history_state, .js-store_state, .js-session_state').each(function() {\n            var option  = this;\n            var $option = $(this);\n\n            if (option.tagName == 'A' || option.tagName == 'BUTTON') {\n                $option.on('click _update', function(e) {\n                    e.preventDefault();\n                    STATE.save($option);\n                });\n            }\n\n            if (option.tagName == 'INPUT') {\n                $option.on('change _update', function(e) {\n                    STATE.save($option);\n                });\n            }\n\n            if (option.tagName == 'SELECT') {\n                $option.on('change _update', function(e, initial) {\n                    if (initial) {\n                        // change is called by selectReplace on page load - not a real 'change' so ignore\n                        return;\n                    }\n                    STATE.save($option);\n                });\n            }\n        });\n\n        STATE.load(scope);\n    }\n};\n\n$(function () {\n    // eg $('#simplemodal-container').trigger('_loadHandlers');\n    $(document).on('_loadHandlers', function(e) {\n        STATE.loadHandlers(e.target);\n    });\n\n    STATE.loadHandlers(document);\n});\n\nfunction updateHeaderBasket(price, qty) {\n    $('.header__nav__item--basket, .header__basket').each(function() {\n        $('.tag', $(this)).html(qty);\n        $('.header__basket__price', $(this)).html(price);\n    });\n}\n\nfunction disableCheckoutButton(disable) {\n    $('.basket__checkout a').toggleClass('button--disabled', disable);\n}\n\nfunction checkMaxStock() {\n\n    var disableButton = false;\n\n    $('.basket__qty__input').each(function () {\n        var input = $(this);\n        var maximum = typeof input.data('max') !== 'undefined' ? input.data('max') : false;\n\n        if (maximum !== false) {\n            if (parseFloat(input.val()) > maximum) {\n                input.closest( \".basket__item\" ).find(\".basket__detail__stock-warning\").show()\n                disableButton = true;\n            } else {\n                input.closest( \".basket__item\" ).find(\".basket__detail__stock-warning\").hide()\n            }\n        }\n    })\n\n    if (disableButton === true) {\n        disableCheckoutButton(true);\n    } else {\n        disableCheckoutButton(false);\n    }\n}\n\nvar basketChange;\nvar basketChangeTimeout;\nvar updateBufferTime = 2000;\n\n$(document).on('change', '.basket__qty__input', function() {\n    clearTimeout(basketChangeTimeout);\n    basketChangeTimeout = setTimeout(function(){\n        if (basketChange != null) {\n            basketChange.abort();\n        }\n        basketChange = $.ajax('/basket/update', {\n            type: 'POST',\n            data: $('.basket__table input').serialize(),\n            success: function(data) {\n                if (data.result) {\n                    $('.basket__wrapper').html(data.payload.table);\n                }\n                updateHeaderBasket(data.payload.price, data.payload.qty);\n                checkMaxStock();\n            }\n        });\n    }, 1000)\n});\n\ncheckMaxStock();\n\nvar sliders = {};\nvar sliding = false;\nvar filterUrl = null;\n\nfunction updateAjax(url) {\n    $.ajax(url, {\n        success: function(data) {\n            window.history.pushState(null, null, url);\n            filterUrl = url;\n            var grid = $('#products_container');\n            grid.find('.product-listing').addClass('product-listing--to-load');\n\n            setTimeout(function(){\n                grid.replaceWith(data.payload.html);\n                if (typeof AndrewMartin.listingItem == 'undefined') {\n                    AndrewMartin.listingItem = new ListingItem();\n                }\n                AndrewMartin.listingItem.init();\n\n                $('#product_fromitemnum').text(data.payload.fromItemNum);\n                $('#product_toitemnum').text(data.payload.toItemNum);\n                $('.product_count').text(data.payload.productCount);\n                if ($('.filterable').hasClass('filterable--active')) {\n                    $('[hide-from-filters]').addClass('hide-from-filters');\n                }\n                $('.product-listing--to-load').removeClass('product-listing--to-load');\n                handlePaintLinks();\n            }, 300);\n        }\n    });\n}\n\nwindow.onpopstate = function(event) {\n    if (filterUrl && filterUrl !== document.location.pathname + document.location.search) {\n        document.location.reload();\n    }\n};\n\ncheckFilterCount();\n\n$(document).on('change', '.filterable :input:not(.filterable--ignore)', function () {\n\n    if (this.getAttribute('data-validation')) {\n        // If value is not a number, set it to the minimum value\n        if (isNaN(parseInt(this.value))) {\n            if (this.hasAttribute('min')) {\n                this.value = this.min;\n            } else {\n                this.value = 0;\n            }\n        }\n\n        // If value is lower than the minimum value, set it to the minimum value\n        if (this.hasAttribute('min')) {\n            if (parseInt(this.value) < parseInt(this.min)) {\n                this.value = this.min;\n            }\n        }\n\n        // If value is higher than the maximum value, set it to the maximum value\n        if (this.hasAttribute('max')) {\n            if (parseInt(this.value) > parseInt(this.max)) {\n                this.value = this.max;\n            }\n        }\n    }\n\n    if ($(this).parents('.js-filter-ranges').length > 0) {\n        new updateFilterRanges($(this).parents('.js-filter-ranges'));\n    }\n\n    var url = '';\n    var form = $('#filters_form');\n\n    $('.filterable .filterable__dimension :input:not(.filterable--ignore), .filterable .filterable__option :input:not(.filterable--ignore)').each(function() {\n        var key = this.name;\n        var value = $(this).val();\n        var tag = $(this).prop('tagName');\n        var type = $(this).prop('type');\n        var valid = false;\n\n        if (key && value) {\n            if (tag == 'SELECT') {\n                valid = true;\n            } else if (tag == 'INPUT') {\n                if (type == 'radio' || type == 'checkbox') {\n                    if ($(this).is(':checked')) {\n                        valid = true;\n                    }\n                } else {\n                    valid = true;\n                }\n            }\n\n            if (valid) {\n                if (Array.isArray(value)) {\n                    for (var i = 0; i < value.length; i++) {\n                        (function(i) {\n                            if (url == '') {\n                                url += '?';\n                            } else {\n                                url += '&';\n                            }\n                            url += key + '[]=' + encodeURIComponent(value[i]);\n                        })(i);\n                    }\n                } else {\n                    if (rangeIsDefault($(this))) {\n                        return;\n                    }\n                    if (url == '') {\n                        url += '?';\n                    } else {\n                        url += '&';\n                    }\n                    url += key + '=' + encodeURIComponent(value);\n                }\n            }\n        }\n    });\n\n    checkFilterCount();\n\n    url = window.location.pathname + url;\n\n    $('#products_container').addClass('product-listing--loading');\n\n    // If a related slider exists, then update it\n    if (this.getAttribute('data-field')) {\n        var field = this.getAttribute('data-field');//.split('---');\n        var slider = sliders[field];\n\n        if (slider) {\n            if (!sliding) {\n                var values = this.getAttribute('data-value') == 'min' ? [this.value, null] : [null, this.value];\n                slider.noUiSlider.set(values);\n            }\n            sliding = false;\n        }\n    }\n\n    clearTimeout(form.data('timer'));\n    form.data('timer', setTimeout(function() {\n        updateAjax(url);\n    }, 750));\n});\n\n$('.js-filter-ranges').each(function() {\n    new updateFilterRanges($(this));\n});\n\nfunction updateFilterRanges(el) {\n    this.selected = {};\n    this.allRanges = {};\n    this.el = el;\n\n    var self = this;\n\n    this.updateFilterRangesOverview = function() {\n       this.el.find(':input:not(.filterable--ignore)').each(function() {\n            var value = $(this).attr('data-value');\n            var column = $(this).attr('data-column');\n            if (!rangeIsDefault($(this))) {\n                if (!self.selected[column]) {\n                    self.selected[column] = {};\n                }\n                self.selected[column][value] = $(this).val();\n            }\n            if (!self.allRanges[column]) {\n                self.allRanges[column] = {};\n            }\n            self.allRanges[column][value] = $(this).val();\n        });\n\n        if (Object.keys(this.selected).length > 0) {\n            this.el.addClass('filter-ranges--selected');\n        } else {\n            this.el.removeClass('filter-ranges--selected');\n        }\n\n        var label = Object.keys(this.selected).length > 0 ? Object.keys(this.selected).length + ' selected' : 'Select&hellip;';\n\n        this.el.find('.js-filter-ranges__overview').html(label);\n    }\n\n    this.updateFilterRangesSelection = function() {\n        var keys = Object.keys(this.selected);\n        var label = '';\n\n        for (var i = 0; i < keys.length; i++) {\n            (function(i) {\n                var values = self.allRanges[keys[i]];\n                label += self.capitalize(keys[i]) + ': ' + values.min + '-' + values.max + 'cm';\n\n                if (i < keys.length - 1) {\n                    label += ', ';\n                }\n            })(i);\n        }\n\n        this.el.find('.js-filter-ranges__selection').html(label);\n        this.el.find('.js-filter-ranges__selection-mobile').html(keys.length);\n        this.el.find('.js-filterable__count').html(keys.length ? '(' + keys.length + ')' : '');\n\n        if (keys.length) {\n            this.el.parents('.filterable__dimension').addClass('filterable__dimension--has-selection');\n        } else {\n            this.el.parents('.filterable__dimension').removeClass('filterable__dimension--has-selection');\n        }\n    }\n\n    this.capitalize = function(string) {\n        return string.charAt(0).toUpperCase() + string.slice(1);\n    }\n\n    this.updateFilterRangesOverview();\n    this.updateFilterRangesSelection();\n\n    $(document).on('click', '.js-filter-ranges__clear', function(e) {\n        sliding = true;\n\n        self.el.find('.js-filter-range__slider').each(function() {\n            var range = this.noUiSlider.options.range;\n            this.noUiSlider.set([range.min, range.max]);\n        });\n    });\n}\n\n// Toggle visibility of the clicked filter range\n$(document).on('click', '.js-filter-ranges__top', function(e) {\n    var el = $(this).closest('.js-filter-ranges');\n    if (el.hasClass('filter-ranges--active')) {\n        deactivateFilterRanges(el);\n    } else {\n        activateFilterRanges(el);\n    }\n});\n\n$(document).on('click', '.js-filter-ranges__back', function(e) {\n    var el = $(this).closest('.js-filter-ranges');\n    deactivateFilterRanges(el);\n});\n\n$(document).on('click', '.js-filter-ranges label', function(e) {\n    var el = $(this).closest('.js-filter-ranges').find('.js-filter-ranges__top');\n    el.trigger('click');\n});\n\n// Deactivate any active filter ranges when document is clicked\n$(document).on('click', function(e) {\n    var el = e.target.closest('.js-filter-ranges');\n\n    if (!el && $('.filter-ranges--active').length) {\n        $('.js-filter-ranges').removeClass('filter-ranges--active');\n    }\n});\n\nfunction rangeIsDefault(el) {\n    return (el.attr('data-value') == 'min' && el.val() == el.attr('min')) || (el.attr('data-value') == 'max' && el.val() == el.attr('max'))\n}\n\n$(document).on('click', '.js-filterable-toggle', function(e) {\n    e.preventDefault();\n    $('.filterable').toggleClass('filterable--active');\n    $('#filters_form').toggleClass('filterable--absolute');\n    $('.footer').toggleClass('hide-from-filters');\n    if ($('.filterable').hasClass('filterable--active')) {\n        $('[hide-from-filters]').addClass('hide-from-filters');\n    } else {\n        $('[hide-from-filters]').removeClass('hide-from-filters');\n        deactivateFilterRanges($('.js-filter-ranges'));\n    }\n});\n\n$(document).on('click', function(e) {\n\n    if (!(e.target.closest('.js-filter-ranges'))) {\n        deactivateFilterRanges($('.js-filter-ranges'))\n    }\n})\n\nfunction activateFilterRanges(el) {\n    el.addClass('filter-ranges--active');\n    el.parents('.filterable__dimension').addClass('filterable__dimension--active');\n    el.parents('.filterable__content').addClass('filterable__content--active');\n}\n\nfunction deactivateFilterRanges(el) {\n    el.removeClass('filter-ranges--active');\n    el.parents('.filterable__dimension').removeClass('filterable__dimension--active');\n    el.parents('.filterable__content').removeClass('filterable__content--active');\n}\n\n// Check the number of filters that have been set\nfunction checkFilterCount() {\n    var filterCount = [];\n\n    $('.filterable .filterable__dimension :input:not(.filterable--ignore)').each(function() {\n        var key = this.name;\n        var value = $(this).val();\n        if (key && value) {\n            if (Array.isArray(value)) {\n                for (var i = 0; i < value.length; i++) {\n                    (function(i) {\n                        var filterType = key;\n\n                        if (filterCount.indexOf(filterType) == -1) {\n                            filterCount.push(filterType);\n                        }\n                    })(i);\n                }\n            } else {\n                if (rangeIsDefault($(this))) {\n                    return;\n                }\n\n                var filterType = $(this).attr('data-dimension');\n\n                if (filterCount.indexOf(filterType) == -1) {\n                    filterCount.push(filterType);\n                }\n            }\n        }\n    });\n\n    if (filterCount.length > 0) {\n        $('.filterable').addClass('filterable--has-filter-selected');\n    } else {\n        $('.filterable').removeClass('filterable--has-filter-selected');\n    }\n\n    $('.js-filterable__total-count').html(filterCount.length);\n}\n\n$(function() {\n    var windowResizing;\n    var mode;\n    var oldMode;\n\n    function moveElement() {\n        mode = window.matchMedia('(max-width: 580px)').matches ? 'mobile' : 'desktop';\n\n        if (mode != oldMode) {\n            var from = 'desktop';\n            var to = 'mobile';\n\n            if (mode == 'desktop') {\n                from = 'mobile';\n                to = 'desktop';\n            }\n\n            $('.js-moveable-content[data-visible=\"' + from + '\"]').children().eq(0).appendTo($('.js-moveable-content[data-visible=\"' + to + '\"]'));\n        }\n\n        oldMode = mode;\n    }\n\n    moveElement();\n\n    $(window).on('resize', function() {\n        clearTimeout(windowResizing);\n        windowResizing = setTimeout(function() {\n            moveElement();\n        }, 100);\n    });\n});\n\n$(function() {\n    var slider = document.querySelectorAll('.js-filter-range__slider');\n    var setBoth = document.querySelectorAll('.js-filter-range__set-both');\n    var input = document.querySelectorAll('.js-filter-range__input');\n    var allowed = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57] // 0-9\n    var range = {};\n\n    for (var i = 0; i < input.length; i++) {\n        (function(i) {\n            input[i].setAttribute('data-validation', 'number');\n            input[i].type = 'text';\n\n            input[i].onfocus = function() {\n                this.onkeypress = function(e) {\n                    // If the key is not in the array of allowed keys, then prevent it\n                    if (allowed.indexOf(e.charCode) == -1) {\n                        e.preventDefault();\n                    }\n                }\n            }\n\n            var dimension = input[i].getAttribute('data-dimension');\n            var column = input[i].getAttribute('data-column');\n            var min = input[i].getAttribute('min');\n            var max = input[i].getAttribute('max');\n\n            range[dimension + '-' + column] = {\n                'min': parseInt(min),\n                'max': parseInt(max)\n            };\n        })(i);\n    }\n\n    for (var i = 0; i < setBoth.length; i++) {\n        (function(i) {\n            var field = setBoth[i].getAttribute('data-field');\n            var minInput = document.querySelector('.js-filter-range__input[data-value=\"min\"][data-field=\"' + field + '\"]');\n            var maxInput = document.querySelector('.js-filter-range__input[data-value=\"max\"][data-field=\"' + field + '\"]');\n\n            setBoth[i].onchange = function() {\n                var range = this.value.split('-');\n                minInput.value = range[0];\n                maxInput.value = range[1];\n\n                $(minInput).trigger('change');\n                $(maxInput).trigger('change');\n            }\n        })(i);\n    }\n\n    for (var i = 0; i < slider.length; i++) {\n        (function(i) {\n            var field = slider[i].getAttribute('data-field');\n            var minInput = document.querySelector('input[data-value=\"min\"][data-field=\"' + field + '\"]');\n            var maxInput = document.querySelector('input[data-value=\"max\"][data-field=\"' + field + '\"]');\n            var params = {\n                start: [\n                    minInput.value,\n                    maxInput.value\n                ],\n                range: range[field],\n                format: wNumb({\n                    decimals: 0\n                }),\n                step: 1,\n                connect: true\n            }\n\n            noUiSlider.create(slider[i], params);\n\n            slider[i].noUiSlider.on('update', function(values, handle) {\n                var value = handle == 1 ? 'max' : 'min';\n                var input = document.querySelector('input[data-value=\"' + value + '\"][data-field=\"' + field + '\"]');\n\n                input.value = values[handle];\n\n                if (sliding) {\n                    $(input).trigger('change');\n                }\n            });\n\n            slider[i].noUiSlider.on('slide', function(values, handle) {\n                sliding = true;\n            });\n\n            sliders[slider[i].getAttribute('data-field')] = slider[i];\n        })(i);\n    }\n})\n\n$('.js-grid-load-more').on('click', function(e) {\n    e.preventDefault();\n\n    var grid = $(this).siblings('.wrap').find('.grid');\n    var current = $(this).addClass('load-more--loading');\n\n    $.ajax($(this).attr('href'), {\n        success: function(data) {\n            grid.children(':hidden').children('.product-listing').addClass('product-listing--to-load');\n\n            grid.children().removeClass('s-hidden-true m-hidden-true ph-hidden-true ml-hidden-true l-hidden-true');\n            grid.append(data.payload.html);\n\n            url = new URL(window.location.href);\n\n            load_more = url.searchParams.get('load_more');\n            if (!load_more) {\n                load_more = 1;\n            }\n            load_more++;\n            url.searchParams.set('load_more', load_more);\n\n            window.history.pushState({load_more: load_more}, document.title, url.toString());\n\n            if (data.payload.page && data.payload.more) {\n                current.attr('href', data.payload.more).removeClass('load-more--loading');\n            } else {\n                current.remove();\n            }\n            setTimeout(function(){\n                $('.product-listing--to-load').removeClass('product-listing--to-load');\n            }, 100);\n        }\n    });\n});\n\nvar initProductGallery = function() {\n    var gallery = $('.product__gallery .product__photo');\n    var videoContainer = $('.product__gallery .product__video');\n    var video = $('.product__gallery .product__video video');\n    var thumbnail = $('.product__thumbnail');\n    var className = 'product__thumbnail--active';\n\n    if (!gallery.length) {\n        return;\n    }\n\n    if (video.length > 0) {\n        var player = videojs(video[0].id);\n    }\n\n    function update(i) {\n        thumbnail.eq(i).addClass(className);\n    }\n\n    function watchVideo() {\n        if (video.length > 0) {\n            player.aspectRatio('1:1');\n            // Not using the `video` variable as slick removes the DocElement and re-adds so breaks this listener\n            gallery.on('touchend click', '.product__video video', function(e) {\n                if (player.paused()) {\n                    playVideo();\n                } else {\n                    pauseVideo()\n                }\n            });\n        }\n    }\n\n    function playVideo() {\n        player.play();\n        videoContainer.addClass('product__video--playing');\n    }\n\n    function pauseVideo() {\n        player.pause();\n        videoContainer.removeClass('product__video--playing');\n    }\n\n    gallery.on('init', function() {\n        update(0);\n        watchVideo();\n\n        if (window.matchMedia('(min-width: 999px)').matches) {\n            $('.zoom--pdp').zoom({\n                canvas: '.zoom__canvas--pdp',\n                trigger: '.zoom__trigger--pdp',\n                backdrop: '.zoom__backdrop--pdp',\n            });\n        }\n    });\n    gallery.on('afterChange', function() {\n        $('.' + className).removeClass(className);\n        update($(this).slick('slickCurrentSlide'));\n        if (player) {\n            if (!player.paused()) {\n                pauseVideo();\n            }\n        }\n    });\n    thumbnail.on('click', function() {\n        gallery.slick('slickGoTo', $(this).index());\n    });\n\n    gallery.slick({\n        nextArrow: '<button class=\"slick-arrow slick-next\">' +\n            '<svg class=\"icon-arrow-large-right\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-right\" />' +\n            '</svg>' +\n            '</button>',\n        prevArrow: '<button class=\"slick-arrow slick-prev\">' +\n            '<svg class=\"icon-arrow-large-left\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-left\" />' +\n            '</svg>' +\n            '</button>',\n        dots: true\n    });\n\n    $('button', gallery).on('click', function(e) {\n        e.preventDefault();\n    });\n};\n\ninitProductGallery();\n\nvar initGalery = function() {\n    var gallery = $('.carousel');\n    gallery.each(function() {\n        var el = $(this);\n        var infinite = el.data('noloop') == undefined;\n        var img = $('.carousel__item', el);\n\n        el.on('init', function(e, slick) {\n            updateArrows(slick.currentSlide + 1, slick.slideCount);\n        });\n\n        el.on('afterChange', function(e, slick) {\n            updateArrows(slick.currentSlide + 1, slick.slideCount);\n        });\n\n        el.slick({\n            nextArrow: '<button class=\"slick-arrow slick-next\">' +\n            '<svg class=\"icon-arrow-large-right\">' +\n            '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-right\" />' +\n            '</svg>' +\n            '</button>',\n            prevArrow: '<button class=\"slick-arrow slick-prev\">' +\n            '<svg class=\"icon-arrow-large-left\">' +\n            '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-left\" />' +\n            '</svg>' +\n            '</button>',\n            dots: true,\n            infinite: infinite\n        });\n\n        function updateArrows(current, total) {\n            if (current == 1) {\n                el.addClass('carousel--at-start');\n            } else {\n                el.removeClass('carousel--at-start');\n            }\n\n            if (current == total) {\n                el.addClass('carousel--at-end');\n            } else {\n                el.removeClass('carousel--at-end');\n            }\n        }\n    });\n};\n\ninitGalery();\n\n$(function () {\n    if (document.getElementById('js-haze_viewer') !== null) {\n        if (window.HAZE !== undefined) {\n            HAZE.instantiate('js-haze_viewer', 'gallery', window.hazeGallery);\n            console.log('HAZE', 'Haze gallery will initialize on page load');\n            return;\n        } else {\n            console.error('HAZE is not defined (gallery.js)');\n        }\n    } else if (window.matchMedia('(max-width: 999px)').matches) {\n        const popupScroll = document.querySelector('.js-haze-popup');\n        $(document).on('click', '.js-haze-open', function(e) {\n            e.preventDefault();\n\n            var $button = $(this);\n            var $popup = $($button.data('popup'));\n\n            /** Apparently the viewer is binned off from the DOM by slick :D */\n            // var $hazeLocation = document.getElementById('js-haze_viewer_location');\n            // var $haze = document.getElementById($button.data('haze'));\n            // $haze.appendTo($hazeLocation);\n\n            $popup.appendTo('body').fadeIn('fast');\n\n            if (document.getElementById('js-haze_mobile') !== null) {\n                if (window.HAZE !== undefined) {\n                    HAZE.instantiate('js-haze_mobile', 'gallery', window.hazeGallery);\n                }\n\n                if (window.matchMedia('(max-width: 999px)').matches) {\n                    scrollLock.disablePageScroll(popupScroll);\n                }\n            }\n        });\n\n        $(document).on('click', '.js-haze-close', function(e) {\n            e.preventDefault();\n\n            var $button = $(this);\n            var $popup = $button.closest('.js-haze-popup');\n            $popup.fadeOut('fast');\n\n            scrollLock.enablePageScroll(popupScroll);\n        });\n    }\n\n    if (window.CYLINDO !== undefined) {\n        const popupScroll = document.querySelector('.js-cylindo-popup');\n\n        if (window.matchMedia('(max-width: 999px)').matches) {\n            CYLINDO.instantiate('js-cylindo_mobile', 'mobile-popup', window.cylindoGallery);\n        } else {\n            CYLINDO.instantiate('js-cylindo_viewer', 'gallery', window.cylindoGallery);\n        }\n\n        $(document).on('click', '.js-cylindo-open', function(e) {\n            e.preventDefault();\n\n            var $button = $(this);\n            var $popup   = $($button.data('popup'));\n            var $cylindo = $($button.data('cylindo'));\n\n            $cylindo.appendTo($popup);\n\n            $popup.appendTo('body').fadeIn('fast');\n\n            if (window.matchMedia('(max-width: 999px)').matches) {\n                scrollLock.disablePageScroll(popupScroll);\n            }\n        });\n\n        $(document).on('click', '.js-cylindo-close', function(e) {\n            e.preventDefault();\n\n            // Add unzoom functionality to the back button for mobile\n\n            if (document.querySelector('html').classList.contains('cylindo-zoom')) {\n                var cylindo = $(this).data('cylindo-mobile');\n\n                CYLINDO.zoom(cylindo, false);\n            } else {\n                var $button = $(this);\n                var $popup = $button.closest('.js-cylindo-popup');\n                $popup.fadeOut('fast');\n\n                scrollLock.enablePageScroll(popupScroll);\n            }\n        });\n\n        $(document).on('click', '.js-cylindo-zoom', function(e) {\n            e.preventDefault();\n\n            var cylindo;\n\n            if (window.matchMedia('(max-width: 999px)').matches) {\n                cylindo = $(this).data('cylindo-mobile');\n            } else {\n                cylindo = $(this).data('cylindo');\n            }\n\n            CYLINDO.zoom(cylindo, true);\n        });\n\n        $(document).on('click', '.js-cylindo-unzoom', function(e) {\n            e.preventDefault();\n\n            var cylindo;\n\n            if (window.matchMedia('(max-width: 999px)').matches) {\n                cylindo = $(this).data('cylindo-mobile');\n            } else {\n                cylindo = $(this).data('cylindo');\n            }\n\n            CYLINDO.zoom(cylindo, false);\n        });\n    }\n});\n\n//=require magnific-popup/dist/jquery.magnific-popup.min.js\n\nvar className = 'sizing-calculator';\nfunction initPopups() {\n    // Control each popup\n    $.each($('.js-open-popup'), function() {\n        // Determine the link and the target\n        var link = $(this);\n        var target = $(link.data('mfp-src'));\n\n        // Hide the popup content\n        target.addClass('mfp-hide');\n\n        // Enable the popup\n        link.magnificPopup({\n            type :'inline',\n            showCloseBtn : false,\n            callbacks: {\n                close: function () {\n                    $('.' + className).removeClass(className + '--has-results');\n\n                    $('p.error', '#product-sizing-calculate').remove();\n                    $('.field', '#product-sizing-calculate').removeClass('field--error');\n                }\n            }\n        });\n    });\n\n    // Close a popup\n    $('.js-close-popup').on('click', function() {\n        $.magnificPopup.close();\n    });\n}\n\n$(function() {\n    initPopups();\n\n    $(document).on('submit', '#product-sizing-calculate', function(e) {\n        e.preventDefault();\n        var par = $(this).parents('.sizing-calculator');\n        var width = $('input[name=width]', $(this));\n        var height = $('input[name=height]', $(this));\n\n        $('p.error', $(this)).remove();\n        $('.field', $(this)).removeClass('field--error');\n\n        var error = false;\n\n        if (width.val() == '' || !width.val().match(/^\\d*\\.?\\d+/)) {\n            width.parent().addClass('field--error');\n            width.parent().append('<p class=\"error\">Please enter a width</p>')\n            error = true;\n        }\n\n        if (height.val() == '' || !height.val().match(/^\\d*\\.?\\d+/)) {\n            height.parent().addClass('field--error');\n            height.parent().append('<p class=\"error\">Please enter a height</p>')\n            error = true;\n        }\n\n        if (error) {\n            return false;\n        }\n\n        $.ajax('/products/wallpaper-price', {\n            type: 'post',\n            data: $(this).serialize(),\n            success: function(data) {\n                $('.sizing-calculator__height').html(data.payload.height + 'm');\n                $('.sizing-calculator__width').html(data.payload.width + 'm');\n                $('.sizing-calculator__price').html(data.payload.price_str);\n                $('.sizing-calculator__qty').val(data.payload.qty);\n\n                var rollsTxt = data.payload.rolls + ' roll' + ((data.payload.rolls > 1) ? 's' : '');\n\n                if (data.payload.rolls != data.payload.qty) {\n                    rollsTxt += ' (' + data.payload.qty +  ' packs)';\n                }\n\n                $('.sizing-calculator__rolls').html(rollsTxt);\n\n                $('.' + className).addClass(className + '--has-results');\n            }\n        });\n    });\n});\n\nvar newsletter;\n$(document).on('submit', '.signup-form', function(e) {\n    e.preventDefault();\n\n    var form = this;\n\n    if (newsletter != null) {\n        newsletter.abort();\n    }\n    newsletter = $.ajax($(this).attr('action'), {\n        type: $(this).attr('method'),\n        data: $(this).serialize(),\n        success: function(data) {\n            if (data.result) {\n                $(form).fadeTo(400, 0, function() {\n                    $(form).parent().append('<label class=\"signup-form__thanks\">Thank you</label>');\n                });\n            }\n        }\n    });\n});\n\n// $('.js-kit-price input').on('change', function() {\n//     var input = $(this);\n//     var sku = input.data('frame-sku');\n\n//     var form = $('#basket-add');\n//     form.find('button.product__button').prop('disabled', 'disabled');\n\n//     $.ajax('/products/kit-price', {\n//         type: 'post',\n//         data: $('.product-piece input').serialize(),\n//         success: function(data) {\n//             form.find(\"input.\" + sku).val(input.val());\n\n//             if (typeof(fdPrice) != 'undefined') {\n//                 fdPrice = parseFloat(data.payload.price_raw).toFixed(2);\n//                 updateFinancing();\n//                 initPopups();\n//             }\n\n//             $('.product__total-price span.value').html(data.payload.price);\n\n//             if (data.payload.price_raw > 0) {\n//                 form.find('button.product__button').prop('disabled', false).removeClass('button--disabled');\n//                 $('.product__total-price').show();\n//                 $('.product__finance-option').show();\n//             } else {\n//                 $('.product__total-price').hide();\n//                 $('.product__finance-option').hide();\n//             }\n//         }\n//     });\n// });\n\n\n$(function() {\n    $('.design-directory__filters').find('input, select').on('change', function() {\n        $(this).parents('form').trigger('submit');\n    });\n\n    $(document).on('click', '.js-design-directory-load-more', function(event) {\n        event.preventDefault();\n        $('.load-more').addClass('load-more--loading');\n        $.ajax(\n            $(this).attr('href')\n        ).done(function(payload) {\n            newItems = $(payload).find('.design-directory__list .grid > *').css('display', 'none').addClass('js-should-fade-in');\n            loadMore = $(payload).find('.design-directory__load-more');\n            $('.design-directory__list .grid').append(newItems);\n            $('.js-should-fade-in').fadeIn().removeClass('js-should-fade-in');\n            $('.design-directory__load-more').replaceWith(loadMore);\n        });\n    });\n\n});\n\n$(document).on('click', '.product__qty a, .product-piece__qty a, .product-piece__qty button', function(e){\n    e.preventDefault();\n    var input = $(this).siblings('.input');\n    var step = typeof input.data('step') !== 'undefined' ? input.data('step') : 1;\n    var decimal_places = typeof input.data('places') !== 'undefined' ? input.data('places') : 0;\n    var minimum = typeof input.data('min') !== 'undefined' ? input.data('min') : 1;\n    var maximum = typeof input.data('max') !== 'undefined' ? input.data('max') : false;\n\n    if ($('svg', $(this)).hasClass('icon-plus')) {\n        input.val((parseFloat(input.val()) + step).toFixed(decimal_places));\n    } else if (parseInt(input.val()) >= 0) {\n        input.val((parseFloat(input.val()) - step).toFixed(decimal_places));\n    }\n\n    if (maximum !== false && parseFloat(input.val()) > maximum) {\n        input.val(maximum);\n    }\n    if (minimum !== false && parseFloat(input.val()) < minimum) {\n        input.val(minimum);\n    }\n\n    input.trigger('change');\n});\n\n$(document).on('input change', '.product__qty input, .product-piece__qty input', function(e) {\n    if ($('.product__custom-qty').length > 0) {\n        const target = $('.js-customise-price-target');\n\n        var price = 0.00;\n        var qty = $(this).val();\n\n        price = target.data('price') * qty;\n\n        if (price.toFixed(2) % 1 > 0) {\n            price = price.toFixed(2);\n        } else {\n            price = price.toFixed(0);\n        }\n\n        target.find('.value').html(target.data('currency') + price.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\n    }\n\n    if ($('.product__multi__size__qty').length > 0) {\n        var price = 0.00;\n        var total_qty = 0;\n        const quantities = $('.product__multi__size__qty:visible');\n        let products = {};\n\n        quantities.each(function (index, element) {\n            let sku = $(element).data('sku');\n            const qty = parseInt($(element).find('input[name=qty]').val());\n            const product_price = parseFloat(parseFloat($(this).data('price')).toFixed(2));\n\n            if (qty > 0) {\n                price += (product_price * qty);\n                total_qty += qty;\n                products[sku] = qty;\n            }\n        });\n\n        const keys = Object.keys(products);\n        if (keys.length > 0) {\n            $('.js-wishlist-action').removeClass('product__wishlist--disabled');\n            $('.js-wishlist-action').attr('data-sku', keys.join(','));\n        } else {\n            $('.js-wishlist-action').addClass('product__wishlist--disabled');\n        }\n\n        if (price === 0) {\n            var fromPrice = null;\n\n            $('.product__multi__size').each(function() {\n                var sizePrice = parseFloat($(this).find('.product__multi__size__price').data('price'));\n\n                if (sizePrice < fromPrice || fromPrice === null) {\n                    fromPrice = sizePrice;\n                }\n            })\n\n            price = fromPrice;\n\n            $('.product__multi__total_label').html('From:');\n        } else {\n            $('.product__multi__total_label').html('Total Price:');\n        }\n\n        if (price.toFixed(2) % 1 > 0) {\n            price = price.toFixed(2);\n        } else {\n            price = price.toFixed(0);\n        }\n\n        $('.product__multi__total_value').html($('.product__multi__total_value').data('currency') + price.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\n\n        var disable = total_qty <= 0;\n        $('.product__button').toggleClass('button--disabled', disable);\n    }\n\n    if ($('.product__price__total_value').length > 0) {\n        var product_price = parseFloat($('.product__qty').data('price'));\n        var qty = parseFloat($(this).val());\n\n        var price = product_price * qty;\n\n        if (price.toFixed(2) % 1 > 0) {\n            price = price.toFixed(2);\n        } else {\n            price = price.toFixed(0);\n        }\n\n        $('.product__price__total_value').html($('.product__price__total_value').data('currency') + price.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\n    }\n\n    var maximum = typeof $(this).data('max') !== 'undefined' ? $(this).data('max') : false;\n    var minimum = typeof $(this).data('min') !== 'undefined' ? $(this).data('min') : 1;\n    if (maximum !== false && parseFloat($(this).val()) > maximum) {\n        $(this).val(maximum);\n    }\n    if (minimum !== false && parseFloat($(this).val()) < minimum && parseFloat($(this).val()) >= 0) {\n        $(this).val(minimum);\n    }\n    if ($('.batches__totals').length > 0) {\n        updateBatchPrices();\n    }\n})\n\nvar updateBatchPrices = function() {\n    var price = 0.00;\n    var total_qty = 0;\n    var quantities = $('.batches__piece-qty:visible');\n    var product_price = parseFloat(parseFloat($('.batches').attr('data-price')).toFixed(2));\n\n    quantities.each(function(){\n        var qty = parseFloat($(this).find('input[name=qty]').val());\n\n        if (qty > 0) {\n            price += product_price * qty;\n            total_qty += qty;\n        }\n    });\n\n    $('.batches__totals-main span').html($('.batches__totals-main').data('currency') + price.toFixed(2));\n    $('.batches__totals-info span').html(total_qty.toFixed(1));\n    $('.js-material-length').html(total_qty.toFixed(1));\n\n    if (total_qty > 0) {\n        $('.product__button').toggleClass('button--disabled', false);\n        $('.js-wishlist-action').toggleClass('product__wishlist--disabled', false);\n    } else {\n        $('.product__button').toggleClass('button--disabled', true);\n        $('.js-wishlist-action').toggleClass('product__wishlist--disabled', true);\n    }\n}\n\n;(function (app) {\n    app.plugins = app.plugins || {};\n\n    app.plugins.delegate = function delegate(\n        element,\n        eventType,\n        selector,\n        listener,\n        options\n    ) {\n        element.addEventListener(\n            eventType,\n            /**\n             * @param {Event} event\n             */\n            function callback(event) {\n                if (event.target instanceof HTMLElement || event.target instanceof SVGElement) {\n                    var closest = event.target.closest(selector);\n                    if (closest) {\n                        listener(event);\n                    }\n                }\n            },\n            options || null\n        );\n    };\n})(window.AndrewMartin = window.AndrewMartin || {});\n\n\n;(function (app) {\n    /**\n     * GTM datalayer functionality\n     */\n    class GTM {\n        /**\n         * Clear ecom data to prevent double events\n         *\n         * @param dataLayerName\n         */\n        clearEcommerce(dataLayerName) {\n            this.addData([{ecommerce: null}], dataLayerName);\n        }\n\n        /**\n         * Add some data to the data layer\n         *\n         * @param dataLayer An array of datalayer events to push in\n         * @param dataLayerName The name of the datalayer\n         */\n        addData(dataLayer, dataLayerName) {\n            if (!dataLayer || !dataLayerName) {\n                return;\n            }\n\n            if (typeof window[dataLayerName] === \"undefined\") {\n                window[dataLayerName] = [];\n            }\n\n            for (let i = 0; i < dataLayer.length; i++) {\n                window[dataLayerName].push(dataLayer[i]);\n            }\n        }\n    }\n\n    app.GTM = new GTM();\n\n    $(function () {\n        if (window.dataLayer) {\n            $(document).on('click', '.js-ee', function (e) {\n                const productData = JSON.parse(this.dataset.tracking);\n                const link = this.href;\n\n                let callback = function () {},\n                    hasRedirected = false;\n                let timeoutId;\n\n                if (window.google_tag_manager) {\n                    e.preventDefault();\n                    callback = function () {\n                        clearTimeout(timeoutId);\n                        if (!hasRedirected) {\n                            hasRedirected = true;\n                            setTimeout(function() {\n                                window.location.assign(link);\n                            }, 10)\n                        }\n                    };\n                    // If GTM gets in a real mess, step in.\n                    timeoutId = setTimeout(callback, 2500);\n                }\n\n                // Let GTM handle the redirect once it's done its thing.\n                window.dataLayer.push({\n                    'event': 'productClick',\n                    'ecommerce': {\n                        'currencyCode': 'GBP',\n                        'click': {\n                            'actionField': {\n                                'list': productData.list\n                            },\n                            'products': [productData]\n                        }\n                    },\n                    'eventCallback': callback,\n                    'eventTimeout': 2000\n                });\n            });\n        }\n\n        $(document).on('click', '.product-listing, .colourways__item a', function (e) {\n            Cookies.set('ANDREWMARTIN_TRACKING', $(this).data('tracking'));\n        });\n\n        // Legacy tracking of AJAX calls\n        $(document).on('ajaxSuccess', function (event, request, settings, data) {\n            const payload = data.payload;\n            if (payload !== undefined\n                && payload.dataLayer !== undefined\n                && payload.dataLayerName !== undefined\n            ) {\n                const dataLayerName = payload.dataLayerName;\n\n                app.GTM.clearEcommerce(dataLayerName);\n                app.GTM.addData(payload.dataLayer, dataLayerName);\n            }\n        });\n    });\n})(window.AndrewMartin = window.AndrewMartin || {});\n\nfunction getQueryParameters() {\n    var queryString = location.search.slice(1),\n        params = {};\n\n    queryString.replace(/([^=]*)=([^&]*)&*/g, function (_, key, value) {\n        params[key] = value;\n    });\n\n    return params;\n}\n\n\nfunction setQueryParameters(params) {\n    var query = [],\n        key, value;\n\n    for (key in params) {\n        if (!params.hasOwnProperty(key)) continue;\n        value = params[key];\n        query.push(key + \"=\" + value);\n    }\n\n    location.search = query.join(\"&\");\n}\n\nfunction showAllColours(e) {\n    e.preventDefault()\n    let active = 'filterable__unslick--active'\n\n    if (this.classList.contains(active)) {\n        this.classList.remove(active);\n        this.firstElementChild.textContent = 'show more colours'\n    } else {\n        this.classList.add(active)\n        this.firstElementChild.textContent = 'show fewer colours'\n    }\n}\n\nvar showMoreButton = document.querySelector('.js-unslick');\n\nif (showMoreButton) {\n    showMoreButton.addEventListener('click', showAllColours)\n}\n\n;(function (app) {\n    app.plugins = app.plugins || {};\n\n    app.plugins.delegate = function delegate(\n        element,\n        eventType,\n        selector,\n        listener,\n        options\n    ) {\n        element.addEventListener(\n            eventType,\n            /**\n             * @param {Event} event\n             */\n            function callback(event) {\n                if (event.target instanceof HTMLElement || event.target instanceof SVGElement) {\n                    var closest = event.target.closest(selector);\n                    if (closest) {\n                        listener(event);\n                    }\n                }\n            },\n            options || null\n        );\n    };\n})(window.AndrewMartin = window.AndrewMartin || {});\n\n\n;(app => {\n    /**\n     * Base class for jQuery plugins that handle adding products to the\n     * basket from the PDP\n     *\n     * Encapsulates a bit of the logic for sending the data to the basket\n     * and any common actions afterwards\n     */\n    class AddToBasketPlugin {\n        /**\n         * @param {jQuery} $element The product container\n         * @param {{}} options. Not used\n         */\n        constructor($element, options) {\n            this.bind();\n            /**\n             * @type {HTMLElement}\n             */\n            this.element = $element.get(0);\n        }\n\n        /**\n         * Update any global elements with the basket data\n         *\n         * @param {{}} data Returned from basket request\n         * @param {number} quantity The quantity added to the basket\n         */\n        refreshAfterAjax(data, quantity) {\n            if (data.hasOwnProperty('payload')) {\n                if (data.payload.hasOwnProperty('totalPrice')) {\n                    $('.js-total-price-insert').html(data.payload.totalPrice);\n                }\n                if (data.payload.hasOwnProperty('qty')) {\n                    $('.quick-links__notification__value').html(data.payload.qty)\n                }\n            }\n        }\n\n        /**\n         * Trigger the add to basket event, causing the flyout to open\n         *\n         * @param {{}} payload Payload from the basket request\n         */\n        openBasket(payload) {\n            app.flyout.load('/basket', {}, true);\n        }\n\n        openUpsellBasket(payload) {\n            window.Overlay.load('/basket/upsell', {\n                wait_for_scripts: true,\n                modifiers: ['sidebar', 'flyout'],\n                callback: () => {\n                    $('.basket').flyoutupsell();\n\n                    const upsellContainer = document.querySelector('[data-upsell-container]');\n                    const upsellContinueForm = document.querySelector('[data-upsell-continue]');\n                    const upsellsArray = Object.values(payload.upsells);\n                    const layoutClass = upsellsArray.length < 4 ? 'stacked' : 'compact';\n\n                    upsellContainer.setAttribute('data-layout', layoutClass);\n\n                    upsellsArray.forEach(upsell => {\n                        upsellContainer.innerHTML += this.returnUpsellElement(upsell, upsellsArray.length);\n                        upsellContinueForm.insertAdjacentHTML('beforeend', this.returnHiddenInput(upsell));\n                    })\n\n                    if (payload.hasOwnProperty('count')) {\n                        $('.js-basket-count').html(payload.count);\n                    }\n\n                    document.querySelectorAll('.basket-upsell__qty').forEach((qtyField, i) => {\n                        var quantityControl = new app.plugins.QuantityControl({\n                            el: qtyField,\n                            mode: qtyField.getAttribute('quantity-control'),\n                            id: 'quantity-control-' + i\n                        });\n                        quantityControl.init();\n                    });\n\n                    const upsellAddButtons = document.querySelectorAll('[data-upsell-add]');\n\n                    upsellAddButtons.forEach(upsellAddButton => {\n                        upsellAddButton.addEventListener('click', () => {\n                            const qtyContainer = upsellAddButton.previousElementSibling;\n                            let getCount = parseInt($('.js-basket-count').html());\n\n                            getCount += 1;\n                            $('.js-basket-count').html(getCount);\n\n                            qtyContainer.classList.add('basket-upsell__qty--active');\n                            qtyContainer.insertAdjacentHTML('beforeend', '<p data-basket-qty>1 in basket</p>');\n                            upsellAddButton.classList.add('button--hide');\n                            qtyContainer.querySelector('input').value = 1;\n                        })\n                    });\n                }\n            })\n        }\n\n        returnUpsellElement(upsell, upsellCount) {\n            const basketText = window.matchMedia(\n                '(max-width: 999px)'\n            ).matches ? 'add' : 'add to basket';\n            return `\n                <div class=\"basket-upsell\" data-layout=${upsellCount < 4 ? 'stacked' : 'compact'}>\n                  <figure class=\"basket-upsell__image\">\n                    ${upsell.thumbnail_alt}\n                    </figure>\n                    <p class=\"basket-upsell__title\">${upsell.title}</p>\n                    <p class=\"basket-upsell__detail\">${upsell.size}</p>\n                    <p class=\"basket-upsell__price\">${upsell.price}</p>\n                    <div\n                      class=\"basket-upsell__qty\"\n                      data-sku=\"${upsell.sku}\"\n                      data-qty\n                    >\n                      <input\n                        type=\"number\"\n                        data-sku=\"${upsell.sku}]\"\n                        name=\"qty\"\n                        data-step=\"1\"\n                        data-places=\"0\"\n                        value=\"0\"\n                        data-upsell-qty\n                      />\n                    </div>\n                    <button class=\"button button--refresh button--full\" data-upsell-add>\n                      <span>${basketText}</span>\n                    </button>\n                </div>\n            `\n        }\n\n        returnHiddenInput(upsell) {\n            return `<input type=\"hidden\" name=\"sku[${upsell.sku}]\" data-sku=\"${upsell.sku}\" value=\"\" data-hidden-input />`\n        }\n\n        /**\n         * Disable the basket button\n         *\n         * @param {boolean} disabled\n         */\n        disableBasketButton(disabled) {\n            $('.product__button').toggleClass('button--disabled', disabled);\n            $('.js-wishlist-action').toggleClass('product__wishlist--disabled', disabled);\n        }\n\n        /**\n         * Send some products to the basket and trigger common actions afterwards\n         *\n         * @param data\n         * @param quantity\n         * @param url\n         * @param method\n         * @return {*}\n         */\n        sendToBasket(data, quantity, url = '/basket/add', method = 'post') {\n            this.disableBasketButton(true);\n            return $.ajax(url, {\n                type: method,\n                data,\n            }).done(data => {\n                this.refreshAfterAjax(data, quantity);\n                if (Object.keys(data.payload.upsells).length) {\n                    this.openUpsellBasket(data.payload);\n                } else {\n                    this.openBasket(data.payload);\n                }\n                this.disableBasketButton(false);\n            }).fail(data => {\n                console.log(data);\n                this.disableBasketButton(false);\n            });\n        }\n\n        /**\n         * Interface to bind events\n         */\n        bind() {\n        }\n    }\n    window.AndrewMartin.AddToBasketPlugin = AddToBasketPlugin;\n\n})(window.AndrewMartin = window.AndrewMartin || {});\n\n\n/**\n * Multi-product add to cart jQuery plugin\n */\n\n// Define the MultiProduct class and plugin immediately when jQuery is available\nclass MultiProduct extends window.AndrewMartin.AddToBasketPlugin {\n        bind() {\n            const magnificPopup = $.magnificPopup.instance;\n\n            $('select.product__multi__sizes__select__finish').on('change', () => {\n                const selected = $('select.product__multi__sizes__select__finish').find(\":selected\");\n\n                $('.product__multi__finish-group:not([data-finish=\"' + selected.val() + '\"])').hide();\n                $('.product__multi__finish-group[data-finish=\"' + selected.val() + '\"]').show();\n\n                this.updatePrice();\n                this.updateWishlistAdd();\n            });\n\n            this.initMultiSizeSelect();\n\n            $('.product__form--addbasketmulti').on('submit', event => {\n                event.preventDefault();\n                const quantities = $('.product__multi__size__qty');\n                const pieces = $('.product-piece__qty');\n                const options = $('.product__custom-selection_option');\n                const single_qty = $('.product__custom-qty');\n                const form = $(event.target);\n                let products = {};\n                let quantity = 0;\n                let location = null;\n\n                if ($('.outdoor-radio__input').length > 0) {\n                    location = $('.outdoor-radio__input:checked').val();\n                }\n\n                products = this.getProducts();\n                pieces.each(function (index, element) {\n                    let sku = $(element).find('.js-piece-input').data('frame-sku');\n                    const qty = parseInt($(element).find('.js-piece-input').val());\n\n                    if (location) {\n                        sku = sku + '_' + location;\n                    }\n\n                    if (qty > 0) {\n                        products[sku] = qty;\n                    }\n\n                    quantity += qty;\n                });\n\n                const combination = $('.js-combination-key');\n                if (combination.length > 0) {\n                    let sku = combination.val();\n\n                    // if there's a combination SKU - ignore the other ones\n                    if (sku) {\n                        products = {};\n                        products[sku] =\n                            single_qty.length > 0 ? single_qty.val() : 1;\n                    }\n                }\n\n                const data = { sku: products };\n\n                this.sendToBasket(data, quantity).done(() => {\n                    this.zeroQuantities();\n                });\n            });\n\n            $('.product__form--addbasketajax').on('submit', event => {\n                event.preventDefault();\n                this.sendToBasket({}, 1, $(event.target).attr('action')).done(\n                    () => {\n                        this.updatePrice();\n                        magnificPopup.close();\n                    }\n                );\n            });\n\n            // trigger initial load\n            $('select.product__multi__sizes__select__finish').trigger('change');\n            this.updatePrice();\n            this.updateWishlistAdd();\n        }\n\n        initMultiSizeSelect() {\n            const productSizeSelect = document.querySelector('#product-size');\n\n            if (!productSizeSelect) {\n                return;\n            }\n\n            // Listen for changes on the new size selection dropdown\n            productSizeSelect.addEventListener('change', event => {\n                const quantityStep = document.querySelector(\n                    '.product__multi__size__qty'\n                );\n                const quantityPrice = document.querySelector(\n                    '.product__multi__size__price'\n                );\n                const selectedSize =\n                    event.currentTarget.querySelector('option:checked');\n                const selectedSizeSKU = selectedSize.value;\n                const selectedSizePrice = selectedSize.dataset.price;\n\n                $(quantityStep).data('price', selectedSizePrice);\n                $(quantityStep).data('sku', selectedSizeSKU);\n                $(quantityStep).attr('data-sku', selectedSizeSKU);\n                quantityPrice.setAttribute('data-price', selectedSizePrice);\n                $(quantityPrice).html(\n                    $(quantityPrice).data('currency') +\n                        selectedSizePrice\n                            .toString()\n                            .replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n                );\n\n                this.updatePrice();\n                this.updateWishlistAdd();\n            });\n\n            const event = new Event('change', {\n                bubbles: true,\n                cancelable: true,\n            });\n\n            // Dispatch the event on the select element to trigger any attached change event listeners\n            productSizeSelect.dispatchEvent(event);\n        }\n\n        getProducts() {\n            const quantities = $('.product__multi__size__qty:visible, .product-piece__qty:visible');\n            const selectElements = 'input[name=qty], .js-combination-piece-select, .js-piece-input';\n            let products = {};\n            let location = null;\n\n            if ($('.outdoor-radio__input').length > 0) {\n                location = $('.outdoor-radio__input:checked').val();\n            }\n\n            quantities.each(function (index, element) {\n                let sku = null;\n\n                if (typeof $(element).attr('data-sku') != 'undefined') {\n                    sku = $(element).attr('data-sku');\n                } else if (typeof $(element).find(selectElements).attr('data-frame-sku') != 'undefined')  {\n                    sku = $(element).find(selectElements).attr('data-frame-sku');\n                }\n\n                if (sku && location) {\n                    sku = sku + '_' + location;\n                }\n\n                const qty = parseInt($(element).find(selectElements).val());\n\n                if (sku && qty > 0) {\n                    products[sku] = qty;\n                }\n            });\n\n            return products;\n        }\n\n        updateWishlistAdd() {\n            const products = this.getProducts();\n            const keys = Object.keys(products);\n\n            if (keys.length > 0) {\n                $('.js-wishlist-action').removeClass('product__wishlist--disabled');\n                $('.js-wishlist-action').attr('data-sku', keys.join(','));\n            }\n        }\n\n        updatePrice() {\n            let price = 0.00;\n            let total_qty = 0;\n            const quantities = $('.product__multi__size__qty:visible, .product-piece__qty:visible');\n\n            quantities.each(function () {\n                const product_price = parseFloat($(this).data('price'));\n                const qty = parseInt($(this).find('input[name=qty], .js-combination-piece-select, .js-piece-input').val());\n\n                if (qty > 0) {\n                    price += (product_price * qty);\n                    total_qty += qty;\n                }\n            });\n\n            if (price === 0) {\n                let fromPrice = null;\n\n                $('.product__multi__size').each(function () {\n                    const sizePrice = parseFloat($(this).find('.product__multi__size__price').data('price'));\n\n                    if (sizePrice < fromPrice || fromPrice === null) {\n                        fromPrice = sizePrice;\n                    }\n                })\n\n                price = fromPrice;\n\n                $('.product__multi__total_label').html('From:');\n            } else {\n                $('.product__multi__total_label').html('Total Price:');\n            }\n\n            if (price) {\n                if (price.toFixed(2) % 1 > 0) {\n                    price = price.toFixed(2);\n                } else {\n                    price = price.toFixed(0);\n                }\n\n                $('.product__multi__total_value').html($('.product__multi__total_value').data('currency') + price.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\n            }\n\n            var selected = true;\n\n            $('.js-customise__show-content').each(function(i, element) {\n                if ($(element).data('required')) {\n                    selected = false;\n                }\n            });\n\n            if (total_qty > 0) {\n                this.disableBasketButton(false);\n            } else if (!selected) {\n                this.disableBasketButton(true);\n            }\n        }\n\n        zeroQuantities() {\n            const quantities = $('.product__multi__size__qty');\n\n            quantities.each(function () {\n                $(this).find('input[name=qty]').val(0);\n            });\n        }\n\n        disableBasketButton(disabled) {\n            $('.product__button').toggleClass('button--disabled', disabled);\n            $('.product__upsell__button').toggleClass('button--disabled', disabled);\n            $('.js-wishlist-action').toggleClass('product__wishlist--disabled', disabled);\n        }\n    }\n\n// Define the jQuery plugin\n$.fn.multiproduct = function (options) {\n    if (!$.data(this, \"plugin_multiproduct\")) {\n        $.data(this, \"plugin_multiproduct\", new MultiProduct(this, options));\n    }\n\n    return $.data(this, \"plugin_multiproduct\");\n};\n\n// Initialize when document is ready\n$(function () {\n    // Any document ready initialization can go here if needed\n});\n\n//=require components/add-to-basket.js\n\n/**\n * Single product add to cart jQuery plugin\n */\n ;$(function () {\n    class FlyoutUpsell extends window.AndrewMartin.AddToBasketPlugin {\n        bind() {            \n            $('.product__form--addbasketmulti').on('submit', event => {\n                event.preventDefault();\n\n                const hiddenInputs = document.querySelectorAll('[data-hidden-input]');\n                const quantities = document.querySelectorAll('[data-qty]');\n                const form = $(event.target);\n                const products = {};\n                let quantity = 0;\n\n                quantities.forEach(function(element) {\n                    const qty = parseInt(element.querySelector('input[name=qty]').value);\n                    let sku = element.dataset.sku;\n\n                    if (qty > 0) {\n                        products[sku] = qty;\n                    }\n\n                    hiddenInputs.forEach(input => {\n                        if (input.dataset.sku == sku) {\n                            input.value = qty;\n                        }\n                    })\n\n                    quantity += qty;\n                });\n\n                form.serializeArray().forEach(function (entry) {\n                    if (entry.name.match(/^sku\\[[^\\]]+]$/)) {\n                        products[entry.name.replace(/^sku\\[([^\\]]+)]/, '$1')] = entry.value;\n                    }\n                });\n\n                const data = {'sku': products};\n\n                if (quantity == 0) {\n                    this.openBasket(data.payload)\n                } else {\n                    this.sendToBasket(data, quantity);\n                }\n            }); \n        }\n    }\n\n    $.fn.flyoutupsell = function (options) {\n        if (!$.data(this, \"plugin_flyoutupsell\")) {\n            $.data(this, \"plugin_flyoutupsell\", new FlyoutUpsell(this, options));\n        }\n\n        return $.data(this, \"plugin_flyoutupsell\");\n    };\n});\n\n//=require components/add-to-basket.js\n\n/**\n * Trade Material prototype\n */\n$(() => {\n    class TradeMaterial extends window.AndrewMartin.AddToBasketPlugin {\n        bind() {\n            const magnificPopup = $.magnificPopup.instance;\n\n            $('#js-batches-form').on('submit', e => {\n                e.preventDefault();\n                const type = $('.js-purchase-type:checked').val();\n                const optionsArray = [];\n\n                switch (type) {\n                    case 'add':\n                        break;\n                    case 'reserve':\n                        optionsArray.push('RES');\n                        if ($('.js-reserve-cutting:visible') && $('.js-reserve-cutting').prop('checked')) {\n                            optionsArray.push('C');\n                        }\n                        break;\n                    case 'cutting':\n                        optionsArray.push('C');\n                        break;\n                    case 'returnable':\n                        optionsArray.push('R');\n                        break;\n                }\n\n                const optionsString = optionsArray.join('-');\n                const products = {};\n\n                // Generate and array of all visible SKUs that have quantities\n\n                const $visibleInputs = $('.batches__piece-qty:visible');\n                let quantity = 0;\n\n                $visibleInputs.each(function () {\n                    const $input = $(this).find('input[name=qty]');\n                    const sku = $input.attr('data-sku').replace('%options%', optionsString);\n                    const qty = parseFloat($input.val());\n\n                    if (qty > 0) {\n                        products[sku] = qty;\n                    }\n                    quantity += qty;\n                })\n\n                // If we are requesting a cutting or a returnable get the default SKU and set quantity to 1\n\n                if ($visibleInputs.length === 0) {\n                    const $input = $('.js-piece-input-any');\n                    const sku = $input.attr('data-sku').replace('%options%', optionsString);\n                    products[sku] = 1;\n                    quantity = 1;\n                }\n\n                this.sendToBasket({'sku': products}, quantity);\n            })\n\n            $('.js-reserve-cutting').on('change click', () => {\n                this.updateReserveText();\n            })\n\n            $('.js-purchase-type').on('change', (event) => {\n                this.hideReserveBlock(true)\n                switch (event.target.value) {\n                    case 'add':\n                        this.hideMaterialBlock(false);\n                        break;\n                    case 'reserve':\n                        this.hideMaterialBlock(false);\n                        this.hideReserveBlock(false);\n                        break;\n                    case 'cutting':\n                    case 'returnable':\n                        this.hideMaterialBlock(true);\n                        this.zeroQuantities();\n                        this.disableBasketButton(false);\n                        break;\n                }\n            });\n\n            $('.js-batches-dropdown').on('change', event => {\n                var batch_price = event.target[event.target.selectedIndex].getAttribute('data-price');\n                $('.batches').attr('data-price', batch_price);\n                $('.js-batch-price').text(batch_price);\n\n                if ($('.product__form--addbasket').length > 0) {\n                    const baseAction = $('.product__form--addbasket').attr('data-base-action');\n                    $('.product__form--addbasket').attr('action', baseAction + event.target.value);\n                } else {\n                    $('.js-batches-pieces').removeClass('batches__pieces-show');\n                    $('.js-batches-pieces[data-batch=\"' + event.target.value + '\"]').addClass('batches__pieces-show');\n\n                    this.updatePrice();\n                    this.zeroQuantities();\n                }\n            });\n        }\n\n        updateReserveText() {\n            if ($('.js-reserve-cutting').prop('checked')) {\n                $('.reserve-cutting__text-no-cutting').toggleClass('reserve-cutting__text-hidden', true);\n                $('.reserve-cutting__text-cutting').toggleClass('reserve-cutting__text-hidden', false);\n            } else {\n                $('.reserve-cutting__text-no-cutting').toggleClass('reserve-cutting__text-hidden', false);\n                $('.reserve-cutting__text-cutting').toggleClass('reserve-cutting__text-hidden', true);\n            }\n        }\n\n        hideReserveBlock(disabled) {\n            if (disabled === true) {\n                $('.js-reserve-cutting-hold').hide();\n            } else {\n                $('.js-reserve-cutting-hold').show();\n            }\n        }\n\n        hideMaterialBlock(disabled) {\n            if (disabled === true) {\n                $('.batches__main').hide();\n            } else {\n                $('.batches__main').show();\n            }\n        }\n\n        zeroQuantities() {\n            const quantities = $('.batches__piece-qty');\n\n            quantities.each(function () {\n                $(this).find('input[name=qty]').val(0);\n            });\n\n            this.disableBasketButton(true);\n            this.updatePrice();\n        }\n\n        updatePrice() {\n            let price = 0.00;\n            let total_qty = 0;\n            const quantities = $('.batches__piece-qty:visible');\n            const product_price = parseFloat(parseFloat($('.batches').attr('data-price')).toFixed(2));\n\n            quantities.each(function () {\n                const qty = parseFloat($(this).find('input[name=qty]').val());\n\n                if (qty > 0) {\n                    price += product_price * qty;\n                    total_qty += qty;\n                }\n            });\n\n            $('.batches__totals-main span').html($('.batches__totals-main').data('currency') + price.toFixed(2));\n            $('.batches__totals-info span').html(total_qty.toFixed(1));\n            $('.js-material-length').html(total_qty.toFixed(1));\n\n            this.disableBasketButton(total_qty <= 0);\n        }\n    }\n\n    $.fn.tradematerial = function (options) {\n        if (!$.data(this, \"plugin_tradematerial\")) {\n            $.data(this, \"plugin_tradematerial\", new TradeMaterial(this, options));\n        }\n\n        return $.data(this, \"plugin_tradematerial\");\n    };\n});\n\n//=require components/add-to-basket.js\n\n/**\n * Single product add to cart jQuery plugin\n */\n;$(function () {\n    class SingleProduct extends window.AndrewMartin.AddToBasketPlugin {\n        bind() {\n            const magnificPopup = $.magnificPopup.instance;\n\n            $('.product__form--addbasketajax').on('submit', event => {\n                event.preventDefault();\n                const form = $(event.target);\n                const formId = event.target.id;\n                let qty = 1;\n                if (formId) {\n                    // Input is outside form so grab the value\n                    qty = $(`input[name=\"qty\"][form=${formId}]`).val();\n                } else {\n                    qty = form.find(`input[name=\"qty\"]`).val();\n                }\n\n                let location = null;\n                let action = form.attr('action');\n\n                if ($('.outdoor-radio__input').length > 0) {\n                    location = $('.outdoor-radio__input:checked').val();\n                    action = action + '_' + location;\n                }\n\n                this.sendToBasket({qty: qty}, qty, action, 'get')\n                    .done(() => {\n                        magnificPopup.close();\n                    });\n            });\n        }\n\n        disableBasketButton(disabled) {\n            $('.product__button').toggleClass('button--disabled', disabled);\n            $('.product__upsell__button').toggleClass('button--disabled', disabled);\n            $('.js-wishlist-action').toggleClass('product__wishlist--disabled', disabled);\n        }\n    }\n\n    $.fn.singleproduct = function (options) {\n        if (!$.data(this, \"plugin_singleproduct\")) {\n            $.data(this, \"plugin_singleproduct\", new SingleProduct(this, options));\n        }\n\n        return $.data(this, \"plugin_singleproduct\");\n    };\n});\n\n//=require components/add-to-basket.js\n\n/**\n * Sample add to basket plugin\n */\n\nclass Sample extends window.AndrewMartin.AddToBasketPlugin {\n    bind() {\n        const magnificPopup = $.magnificPopup.instance;\n\n        $('.product__form--addbasketajax--sample').on('submit', event => {\n            event.preventDefault();\n            this.sendToBasket(\n                {},\n                1,\n                $(event.target).attr('action')\n            ).done(() => {\n                magnificPopup.close();\n            });\n        });\n\n    }\n}\n\n$.fn.sample = function (options) {\n    if (!$.data(this, \"plugin_sample\")) {\n        $.data(this, \"plugin_sample\", new Sample(this, options));\n    }\n\n    return $.data(this, \"plugin_sample\");\n};\n\n$('.product__sizes li.sizes__option').on('click', function() {\n    var selection = $(this);\n\n    // don't do anything if the size is already selected\n    if (selection.hasClass('sizes__option--active') && !selection.hasClass('sizes__option--active--first')) {\n        return;\n    }\n\n    $.ajax({\n        url: selection.data('url'),\n        type: 'GET',\n        success: function(data) {\n            if (data.payload.specification) {\n                $.each(data.payload.specification, function(index, value) {\n                    $('#spec_key--'+index).find('.spec_value').text(value.value)\n                });\n            }\n\n            var html = '';\n            if (data.payload.offer.has_offer) {\n                html = '<span class=\"product__price--was\">was '+data.payload.price+'</span> '\n                    + '<span class=\"product__price--discount\">now '+data.payload.offer.price+'</span>'\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.offer.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            } else {\n                html = data.payload.price\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            }\n\n            $('.product__price').html(html);\n            $('.product__form--addbasket').attr('action', data.payload.basket_url);\n            $('.product__availability__status').text(data.payload.stock_message.status);\n            $('.product__availability__information').text('- '+data.payload.stock_message.message);\n\n            // Update the financing calculations\n            if (typeof(fdPrice) != \"undefined\") {\n                fdPrice = parseFloat(data.payload.price_raw).toFixed(2);\n                updateFinancing();\n            }\n        }\n    });\n\n    $('.product__sizes .sizes__option').removeClass('sizes__option--active');\n    selection.addClass('sizes__option--active');\n    selection.removeClass('sizes__option--active--first');\n});\n\n$('.product__sizes .d3r-size-select').on('change', function() {\n    var select = $(this);\n\n    if (!select.find(':selected').data('url')) {\n        return;\n    }\n\n    $.ajax({\n        url: select.find(':selected').data('url'),\n        type: 'GET',\n        success: function(data) {\n            if (data.payload.specification) {\n                $.each(data.payload.specification, function(index, value) {\n                    $('#spec_key--'+index).find('.spec_value').text(value.value)\n                });\n            }\n\n            var html = '';\n            if (data.payload.offer.has_offer) {\n                html = '<span class=\"product__price--was\">was '+data.payload.price+'</span> '\n                    + '<span class=\"product__price--discount\">now '+data.payload.offer.price+'</span>'\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.offer.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            } else {\n                html = data.payload.price\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            }\n\n            $('.product__price').html(html);\n            $('.product__form--addbasket').attr('action', data.payload.basket_url);\n            $('.product__availability__status').text(data.payload.stock_message.status);\n            $('.product__availability__information').text('- '+data.payload.stock_message.message);\n            $('.product__delivery-information__text').html(data.payload.delivery_information);\n\n            // Update the financing calculations\n            if (typeof(fdPrice) != \"undefined\") {\n                fdPrice = parseFloat(data.payload.price_raw).toFixed(2);\n                updateFinancing();\n            }\n        }\n    });\n});\n\n$('.colourways__item').on('mouseover', function(){\n    $('.colourways__text').html('<span>Colour: </span>' + $(this).data('colour'));\n});\n\n$('.colourways__item').on('mouseout', function(){\n    $('.colourways__text').html('<span>Colour: </span>' + $('.colourways__text').data('colour'));\n});\n\nfunction updateFinancing() {\n    if ($('.product__financing').length == 0 || typeof(fdOptions) == \"undefined\") {\n        return;\n    }\n\n    var $finTable  = $('#finance-calculator table tbody'),\n        price      = parseFloat(fdPrice),\n        tdDetails  = [];\n\n    if (price < fdMinPrice) {\n        $('.product__financing').hide();\n        return;\n    }\n    $('.product__financing').show();\n\n    $('select', $finTable).empty();\n\n    var i = 0;\n    for (var fdOpt in fdOptions) {\n        var code        = fdOptions[fdOpt]['code'],\n            depositPerc = fdOptions[fdOpt]['deposit'],\n            depositVal  = depositPerc / 100,\n            depositAmt  = price * depositVal;\n\n        var opt = new FinanceDetails(code, price, depositPerc, depositAmt);\n        if (opt) {\n            tdDetails.push(opt);\n\n            // Only show the first option on the PDP directly\n            if (i == 0) {\n                $('.product__financing--message').html(\n                    '&pound;' + parseFloat(opt.m_inst).toFixed(2) +\n                    ' per month with a &pound;' + parseFloat(opt.d_amount).toFixed(2) +\n                    ' deposit (' + opt.apr + '% interest).'\n                );\n                $('.product__financing').fadeIn();\n            }\n\n            $('select', $finTable).append($('<option>', {\n                value: i,\n                text: opt.p_name\n            }));\n\n            ++i;\n        }\n    }\n\n    $('select', $finTable).on('change', function() {\n        var opt = tdDetails[$(this).prop('selectedIndex')],\n            cur = '&pound;';\n\n        $('#cost_of_goods', $finTable).html(cur + parseFloat(opt.goods_val).toFixed(2));\n        $('#deposit_percentage', $finTable).html(opt.d_pc + '%');\n        $('#deposit_amount', $finTable).html(cur + parseFloat(opt.d_amount).toFixed(2));\n        $('#credit_amount', $finTable).html(cur + parseFloat(opt.l_amount).toFixed(2));\n        $('#finance_term', $finTable).html(opt.term + ' months');\n        $('#apr', $finTable).html(opt.apr + '%');\n        $('#cost_per_month', $finTable).html(cur + parseFloat(opt.m_inst).toFixed(2));\n        $('#monthly_repayment', $finTable).html(cur + parseFloat(opt.l_repay).toFixed(2));\n        $('#total', $finTable).html(cur + parseFloat(opt.total).toFixed(2));\n    }).trigger('change');\n}\n$(updateFinancing);\n\n//=require magnific-popup/dist/jquery.magnific-popup.min.js\n//=require js-tools/svg.js\nfunction Loop() {\n\n    this.object = function(obj, callback) {\n        var keys = Object.keys(obj);\n        for (var i = 0; i < keys.length; i++) {\n            (function(i) {\n                callback(keys, i);\n            })(i);\n        }\n    }\n\n    this.array = function(array, callback, reverse) {\n        if (reverse) {\n            for (var i = array.length - 1; i > -1; i--) {\n                (function(i) {\n                    callback(array, i);\n                })(i);\n            }\n        } else {\n            for (var i = 0; i < array.length; i++) {\n                (function(i) {\n                    callback(array, i);\n                })(i);\n            }\n        }\n    }\n}\n\n\nfunction PaintQuantityCalculator() {\n    var self = this;\n    var loop = new Loop();\n    var svg = new Svg();\n\n    this.el = document.querySelector('.js-paint-quantity-calculator');\n    this.link = document.querySelector('.js-launch-paint-quantity-calculator');\n    this.submit = document.querySelector('.js-paint-quantity-calculator__submit');\n    this.confirm = document.querySelector('.js-paint-quantity-calculator__confirm');\n    this.reset = document.querySelector('.js-paint-quantity-calculator__reset');\n    this.width = document.querySelector('.js-paint-quantity-calculator__width');\n    this.height = document.querySelector('.js-paint-quantity-calculator__height');\n    this.dimension = {\n        width: document.querySelector('.js-paint-quantity-calculator__dimension-width'),\n        height: document.querySelector('.js-paint-quantity-calculator__dimension-height')\n    };\n    this.quantity = document.querySelector('.js-paint-quantity-calculator__quantity');\n    this.inputs = [\n        this.width,\n        this.height\n    ];\n    this.validCharacters = [46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57] // . and 0-9\n    this.error = [];\n    this.result = null;\n\n    this.exists = function() {\n        return this.el != undefined;\n    }\n\n    this.init = function() {\n        this.el.classList.add('mfp-hide');\n\n        this.link.onclick = this.activate.bind(this);\n        this.submit.onclick = this.calculate.bind(this);\n        this.reset.onclick = this.resetForm.bind(this);\n\n        if (this.confirm) {\n            this.confirm.onclick = this.confirmQuantity.bind(this);\n        }\n\n        this.validateInputs();\n    }\n\n    this.activate = function(e) {\n        e.preventDefault();\n\n        $.magnificPopup.open({\n            mainClass: 'mfp-flush mfp-fade',\n            removalDelay: 300,\n            items: {\n                src: '.paint-quantity-calculator'\n            },\n            closeMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close paint-quantity-calculator__close\">' + svg.render('close') + '</button>',\n            type: 'inline',\n        });\n    }\n\n    this.calculate = function(e) {\n        if (e) {\n            e.preventDefault();\n        }\n\n        this.error = [];\n        this.result = null;\n\n        loop.array(this.inputs, function(inputs, i) {\n            var input = inputs[i];\n            var value = self.checkValue(input.value);\n\n            if (self.result == null) {\n                self.result = value;\n            } else {\n                self.result = self.result * value;\n            }\n\n            if (value == 0) {\n                self.error.push(input.id);\n            }\n        });\n\n        // sqm/20 * 2 coats = litres\n        this.result = this.result / 20 * 2;\n\n        this.render();\n    }\n\n    this.resetForm = function(e) {\n        if (e) {\n            e.preventDefault();\n        }\n\n        this.error = [];\n        this.result = null;\n\n        loop.array(this.inputs, function(inputs, i) {\n            var input = inputs[i];\n\n            input.value = null;\n        });\n\n        this.render();\n    }\n\n    this.confirmQuantity = function() {\n        console.log('confirm!', this.result);\n        this.resetForm();\n        $.magnificPopup.close();\n    }\n\n    this.validateInputs = function() {\n        loop.array(this.inputs, function(inputs, i) {\n            var input = inputs[i];\n\n            input.onkeypress = self.validateInputKeypress.bind(this);\n            input.onblur = self.validateInputBlur.bind(this);\n        });\n    }\n\n    this.validateInputKeypress = function(e) {\n        if (self.validCharacters.indexOf(e.charCode) == -1) {\n            e.preventDefault();\n        }\n    }\n\n    this.validateInputBlur = function(e) {\n        if (isNaN(parseFloat(e.target.value))) {\n            e.target.value = null;\n        }\n    }\n\n    this.checkValue = function(value) {\n        return parseFloat(value).toFixed(1) || 0;\n    }\n\n    this.render = function() {\n        if (this.error.length > 0) {\n            this.el.classList.add('paint-quantity-calculator--has-error');\n        } else {\n            this.el.classList.remove('paint-quantity-calculator--has-error');\n        }\n        if (this.result) {\n            this.el.classList.add('paint-quantity-calculator--has-result');\n            loop.array(this.inputs, function(inputs, i) {\n                var input = inputs[i];\n\n                if (self.dimension[input.id]) {\n                    self.dimension[input.id].innerHTML = self.checkValue(input.value);\n                }\n            });\n            this.quantity.innerHTML = this.result.toFixed(2);\n        } else {\n            this.el.classList.remove('paint-quantity-calculator--has-result');\n        }\n    }\n}\n\nvar paintQuantityCalculator = new PaintQuantityCalculator();\n\nif (paintQuantityCalculator.exists()) {\n    paintQuantityCalculator.init();\n}\n\n//=require js-tools/svg.js\n//=require js-tools/loop.js\nfunction Viewport(breakpoints) {\n\n    // Get the breakpoint config\n    this.breakpoints = breakpoints;\n\n    // Constuct the breakpoint for the media query\n    this.mediaQuery = function(breakpoint) {\n        return '(' + this.breakpoints[breakpoint].type + ': ' + this.breakpoints[breakpoint].size + 'px)';\n    }\n\n    // Check if the media query matches\n    this.matchMedia = function(breakpoint) {\n        return window.matchMedia(this.mediaQuery(breakpoint));\n    }\n\n    // Check if the media query matches\n    this.matches = function(breakpoint) {\n        return window.matchMedia(this.mediaQuery(breakpoint)).matches;\n    }\n\n    // Construct the custom media query\n    this.customMediaQuery = function(breakpoint) {\n        return breakpoint;\n    }\n\n    // Check if the custom media query matches\n    this.customMatchMedia = function(breakpoint) {\n        return window.matchMedia(this.customMediaQuery(breakpoint));\n    }\n\n    // Check if the custom media query matches\n    this.customMatches = function(breakpoint) {\n        return window.matchMedia(this.customMediaQuery(breakpoint)).matches;\n    }\n\n    // Watch for viewport resize\n    this.resize = function(callback) {\n        var windowResizing;\n\n        window.addEventListener('resize', function() {\n            clearTimeout(windowResizing);\n            windowResizing = setTimeout(function() {\n                if (typeof callback == 'function') {\n                    callback();\n                }\n            }, 100);\n        });\n    }\n}\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define('underscore', factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () {\n    var current = global._;\n    var exports = global._ = factory();\n    exports.noConflict = function () { global._ = current; return exports; };\n  }()));\n}(this, (function () {\n  //     Underscore.js 1.13.8\n  //     https://underscorejs.org\n  //     (c) 2009-2026 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors\n  //     Underscore may be freely distributed under the MIT license.\n\n  // Current version.\n  var VERSION = '1.13.8';\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.\n  var 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:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype;\n  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var push = ArrayProto.push,\n      slice = ArrayProto.slice,\n      toString = ObjProto.toString,\n      hasOwnProperty = ObjProto.hasOwnProperty;\n\n  // Modern feature detection.\n  var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',\n      supportsDataView = typeof DataView !== 'undefined';\n\n  // All **ECMAScript 5+** native function implementations that we hope to use\n  // are declared here.\n  var nativeIsArray = Array.isArray,\n      nativeKeys = Object.keys,\n      nativeCreate = Object.create,\n      nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;\n\n  // Create references to these builtin functions because we override them.\n  var _isNaN = isNaN,\n      _isFinite = isFinite;\n\n  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\n  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\n  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n  // The largest integer that can be represented exactly.\n  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\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\".\n  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  // Is a given variable an object?\n  function isObject(obj) {\n    var type = typeof obj;\n    return type === 'function' || (type === 'object' && !!obj);\n  }\n\n  // Is a given value equal to null?\n  function isNull(obj) {\n    return obj === null;\n  }\n\n  // Is a given variable undefined?\n  function isUndefined(obj) {\n    return obj === void 0;\n  }\n\n  // Is a given value a boolean?\n  function isBoolean(obj) {\n    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n  }\n\n  // Is a given value a DOM element?\n  function isElement(obj) {\n    return !!(obj && obj.nodeType === 1);\n  }\n\n  // Internal function for creating a `toString`-based type tester.\n  function tagTester(name) {\n    var tag = '[object ' + name + ']';\n    return function(obj) {\n      return toString.call(obj) === tag;\n    };\n  }\n\n  var isString = tagTester('String');\n\n  var isNumber = tagTester('Number');\n\n  var isDate = tagTester('Date');\n\n  var isRegExp = tagTester('RegExp');\n\n  var isError = tagTester('Error');\n\n  var isSymbol = tagTester('Symbol');\n\n  var isArrayBuffer = tagTester('ArrayBuffer');\n\n  var isFunction = tagTester('Function');\n\n  // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old\n  // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).\n  var nodelist = root.document && root.document.childNodes;\n  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {\n    isFunction = function(obj) {\n      return typeof obj == 'function' || false;\n    };\n  }\n\n  var isFunction$1 = isFunction;\n\n  var hasObjectTag = tagTester('Object');\n\n  // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.\n  // In IE 11, the most common among them, this problem also applies to\n  // `Map`, `WeakMap` and `Set`.\n  // Also, there are cases where an application can override the native\n  // `DataView` object, in cases like that we can't use the constructor\n  // safely and should just rely on alternate `DataView` checks\n  var hasDataViewBug = (\n        supportsDataView && (!/\\[native code\\]/.test(String(DataView)) || hasObjectTag(new DataView(new ArrayBuffer(8))))\n      ),\n      isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));\n\n  var isDataView = tagTester('DataView');\n\n  // In IE 10 - Edge 13, we need a different heuristic\n  // to determine whether an object is a `DataView`.\n  // Also, in cases where the native `DataView` is\n  // overridden we can't rely on the tag itself.\n  function alternateIsDataView(obj) {\n    return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);\n  }\n\n  var isDataView$1 = (hasDataViewBug ? alternateIsDataView : isDataView);\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native `Array.isArray`.\n  var isArray = nativeIsArray || tagTester('Array');\n\n  // Internal function to check whether `key` is an own property name of `obj`.\n  function has$1(obj, key) {\n    return obj != null && hasOwnProperty.call(obj, key);\n  }\n\n  var isArguments = tagTester('Arguments');\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$1(obj, 'callee');\n      };\n    }\n  }());\n\n  var isArguments$1 = isArguments;\n\n  // Is a given object a finite number?\n  function isFinite$1(obj) {\n    return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));\n  }\n\n  // Is the given value `NaN`?\n  function isNaN$1(obj) {\n    return isNumber(obj) && _isNaN(obj);\n  }\n\n  // Predicate-generating function. Often useful outside of Underscore.\n  function constant(value) {\n    return function() {\n      return value;\n    };\n  }\n\n  // Common internal logic for `isArrayLike` and `isBufferLike`.\n  function createSizePropertyCheck(getSizeProperty) {\n    return function(collection) {\n      var sizeProperty = getSizeProperty(collection);\n      return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;\n    }\n  }\n\n  // Internal helper to generate a function to obtain property `key` from `obj`.\n  function shallowProperty(key) {\n    return function(obj) {\n      return obj == null ? void 0 : obj[key];\n    };\n  }\n\n  // Internal helper to obtain the `byteLength` property of an object.\n  var getByteLength = shallowProperty('byteLength');\n\n  // Internal helper to determine whether we should spend extensive checks against\n  // `ArrayBuffer` et al.\n  var isBufferLike = createSizePropertyCheck(getByteLength);\n\n  // Is a given value a typed array?\n  var typedArrayPattern = /\\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\\]/;\n  function isTypedArray(obj) {\n    // `ArrayBuffer.isView` is the most future-proof, so use it when available.\n    // Otherwise, fall back on the above regular expression.\n    return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :\n                  isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));\n  }\n\n  var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);\n\n  // Internal helper to obtain the `length` property of an object.\n  var getLength = shallowProperty('length');\n\n  // Internal helper to create a simple lookup structure.\n  // `collectNonEnumProps` used to depend on `_.contains`, but this led to\n  // circular imports. `emulatedSet` is a one-off solution that only works for\n  // arrays of strings.\n  function emulatedSet(keys) {\n    var hash = {};\n    for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;\n    return {\n      contains: function(key) { return hash[key] === true; },\n      push: function(key) {\n        hash[key] = true;\n        return keys.push(key);\n      }\n    };\n  }\n\n  // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't\n  // be iterated by `for key in ...` and thus missed. Extends `keys` in place if\n  // needed.\n  function collectNonEnumProps(obj, keys) {\n    keys = emulatedSet(keys);\n    var nonEnumIdx = nonEnumerableProps.length;\n    var constructor = obj.constructor;\n    var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto;\n\n    // Constructor is a special case.\n    var prop = 'constructor';\n    if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop);\n\n    while (nonEnumIdx--) {\n      prop = nonEnumerableProps[nonEnumIdx];\n      if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(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`.\n  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$1(obj, key)) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  }\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  function isEmpty(obj) {\n    if (obj == null) return true;\n    // Skip the more expensive `toString`-based type checks if `obj` has no\n    // `.length`.\n    var length = getLength(obj);\n    if (typeof length == 'number' && (\n      isArray(obj) || isString(obj) || isArguments$1(obj)\n    )) return length === 0;\n    return getLength(keys(obj)) === 0;\n  }\n\n  // Returns whether an object has a given set of `key:value` pairs.\n  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  // If Underscore is called as a function, it returns a wrapped object that can\n  // be used OO-style. This wrapper holds altered versions of all functions added\n  // through `_.mixin`. Wrapped objects may be chained.\n  function _$1(obj) {\n    if (obj instanceof _$1) return obj;\n    if (!(this instanceof _$1)) return new _$1(obj);\n    this._wrapped = obj;\n  }\n\n  _$1.VERSION = VERSION;\n\n  // Extracts the result from a wrapped and chained object.\n  _$1.prototype.value = function() {\n    return this._wrapped;\n  };\n\n  // Provide unwrapping proxies for some methods used in engine operations\n  // such as arithmetic and JSON stringification.\n  _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value;\n\n  _$1.prototype.toString = function() {\n    return String(this._wrapped);\n  };\n\n  // Internal function to wrap or shallow-copy an ArrayBuffer,\n  // typed array or DataView to a new view, reusing the buffer.\n  function toBufferView(bufferSource) {\n    return new Uint8Array(\n      bufferSource.buffer || bufferSource,\n      bufferSource.byteOffset || 0,\n      getByteLength(bufferSource)\n    );\n  }\n\n  // We use this string twice, so give it a name for minification.\n  var tagDataView = '[object DataView]';\n\n  // Perform a deep comparison to check if two objects are equal.\n  function isEqual(a, b) {\n    var todo = [{a: a, b: b}];\n    // Initializing stacks of traversed objects for cycle detection.\n    var aStack = [], bStack = [];\n\n    while (todo.length) {\n      var frame = todo.pop();\n      if (frame === true) {\n        // Remove the first object from the stack of traversed objects.\n        aStack.pop();\n        bStack.pop();\n        continue;\n      }\n      a = frame.a;\n      b = frame.b;\n\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) {\n        if (a !== 0 || 1 / a === 1 / b) continue;\n        return false;\n      }\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) {\n        if (b !== b) continue;\n        return false;\n      }\n      // Exhaust primitive checks\n      var type = typeof a;\n      if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;\n\n  // Internal recursive comparison function for `_.isEqual`.\n      // Unwrap any wrapped objects.\n      if (a instanceof _$1) a = a._wrapped;\n      if (b instanceof _$1) b = b._wrapped;\n      // Compare `[[Class]]` names.\n      var className = toString.call(a);\n      if (className !== toString.call(b)) return false;\n      // Work around a bug in IE 10 - Edge 13.\n      if (hasDataViewBug && className == '[object Object]' && isDataView$1(a)) {\n        if (!isDataView$1(b)) return false;\n        className = tagDataView;\n      }\n      switch (className) {\n        // These types 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        if ('' + a === '' + b) continue;\n        return false;\n      case '[object Number]':\n        todo.push({a: +a, b: +b});\n        continue;\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        if (+a === +b) continue;\n        return false;\n      case '[object Symbol]':\n        if (SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b)) continue;\n        return false;\n      case '[object ArrayBuffer]':\n      case tagDataView:\n        // Coerce to typed array so we can fall through.\n        todo.push({a: toBufferView(a), b: toBufferView(b)});\n        continue;\n      }\n\n      var areArrays = className === '[object Array]';\n      if (!areArrays && isTypedArray$1(a)) {\n        var byteLength = getByteLength(a);\n        if (byteLength !== getByteLength(b)) return false;\n        if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) continue;\n        areArrays = true;\n      }\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$1(aCtor) && aCtor instanceof aCtor &&\n                                 isFunction$1(bCtor) && bCtor instanceof bCtor)\n            && ('constructor' in a && 'constructor' in b)) {\n          return false;\n        }\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      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) {\n          if (bStack[length] === b) break;\n          return false;\n        }\n      }\n      if (length >= 0) continue;\n\n      // Add the first object to the stack of traversed objects.\n      aStack.push(a);\n      bStack.push(b);\n      todo.push(true);\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          todo.push({a: a[length], b: b[length]});\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$1(b, key)) return false;\n          todo.push({a: a[key], b: b[key]});\n        }\n      }\n    }\n    return true;\n  }\n\n  // Retrieve all the enumerable property names of an object.\n  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  // Since the regular `Object.prototype.toString` type tests don't work for\n  // some types in IE 11, we use a fingerprinting heuristic instead, based\n  // on the methods. It's not great, but it's the best we got.\n  // The fingerprint method lists are defined below.\n  function ie11fingerprint(methods) {\n    var length = getLength(methods);\n    return function(obj) {\n      if (obj == null) return false;\n      // `Map`, `WeakMap` and `Set` have no enumerable keys.\n      var keys = allKeys(obj);\n      if (getLength(keys)) return false;\n      for (var i = 0; i < length; i++) {\n        if (!isFunction$1(obj[methods[i]])) return false;\n      }\n      // If we are testing against `WeakMap`, we need to ensure that\n      // `obj` doesn't have a `forEach` method in order to distinguish\n      // it from a regular `Map`.\n      return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);\n    };\n  }\n\n  // In the interest of compact minification, we write\n  // each string in the fingerprints only once.\n  var forEachName = 'forEach',\n      hasName = 'has',\n      commonInit = ['clear', 'delete'],\n      mapTail = ['get', hasName, 'set'];\n\n  // `Map`, `WeakMap` and `Set` each have slightly different\n  // combinations of the above sublists.\n  var mapMethods = commonInit.concat(forEachName, mapTail),\n      weakMapMethods = commonInit.concat(mapTail),\n      setMethods = ['add'].concat(commonInit, forEachName, hasName);\n\n  var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');\n\n  var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');\n\n  var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');\n\n  var isWeakSet = tagTester('WeakSet');\n\n  // Retrieve the values of an object's properties.\n  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  // Convert an object into a list of `[key, value]` pairs.\n  // The opposite of `_.object` with one argument.\n  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.\n  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.\n  function functions(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (isFunction$1(obj[key])) names.push(key);\n    }\n    return names.sort();\n  }\n\n  // An internal function for creating assigner functions.\n  function 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).\n  var extend = createAssigner(allKeys);\n\n  // Assigns a given object with all the own properties in the passed-in\n  // object(s).\n  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\n  var extendOwn = createAssigner(keys);\n\n  // Fill in a given object with default properties.\n  var defaults = createAssigner(allKeys, true);\n\n  // Create a naked function reference for surrogate-prototype-swapping.\n  function ctor() {\n    return function(){};\n  }\n\n  // An internal function for creating a new object that inherits from another.\n  function baseCreate(prototype) {\n    if (!isObject(prototype)) return {};\n    if (nativeCreate) return nativeCreate(prototype);\n    var Ctor = ctor();\n    Ctor.prototype = prototype;\n    var result = new Ctor;\n    Ctor.prototype = null;\n    return result;\n  }\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.\n  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.\n  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.\n  function tap(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  }\n\n  // Normalize a (deep) property `path` to array.\n  // Like `_.iteratee`, this function can be customized.\n  function toPath$1(path) {\n    return isArray(path) ? path : [path];\n  }\n  _$1.toPath = toPath$1;\n\n  // Internal wrapper for `_.toPath` to enable minification.\n  // Similar to `cb` for `_.iteratee`.\n  function toPath(path) {\n    return _$1.toPath(path);\n  }\n\n  // Internal function to obtain a nested property in `obj` along `path`.\n  function 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  // Get the value of the (deep) property on `path` from `object`.\n  // If any property in `path` does not exist or if the value is\n  // `undefined`, return `defaultValue` instead.\n  // The `path` is normalized through `_.toPath`.\n  function get(object, path, defaultValue) {\n    var value = deepGet(object, toPath(path));\n    return isUndefined(value) ? defaultValue : value;\n  }\n\n  // Shortcut function for checking if an object has a given property directly on\n  // itself (in other words, not on a prototype). Unlike the internal `has`\n  // function, this public version can also traverse nested properties.\n  function has(obj, path) {\n    path = toPath(path);\n    var length = path.length;\n    for (var i = 0; i < length; i++) {\n      var key = path[i];\n      if (!has$1(obj, key)) return false;\n      obj = obj[key];\n    }\n    return !!length;\n  }\n\n  // Keep the identity function around for default iteratees.\n  function identity(value) {\n    return value;\n  }\n\n  // Returns a predicate for checking whether an object has a given set of\n  // `key:value` pairs.\n  function matcher(attrs) {\n    attrs = extendOwn({}, attrs);\n    return function(obj) {\n      return isMatch(obj, attrs);\n    };\n  }\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 indices.\n  function property(path) {\n    path = toPath(path);\n    return function(obj) {\n      return deepGet(obj, path);\n    };\n  }\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.\n  function 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.\n  function baseIteratee(value, context, argCount) {\n    if (value == null) return identity;\n    if (isFunction$1(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  function iteratee(value, context) {\n    return baseIteratee(value, context, Infinity);\n  }\n  _$1.iteratee = iteratee;\n\n  // The function we call internally to generate a callback. It invokes\n  // `_.iteratee` if overridden, otherwise `baseIteratee`.\n  function cb(value, context, argCount) {\n    if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context);\n    return baseIteratee(value, context, argCount);\n  }\n\n  // Returns the results of applying the `iteratee` to each element of `obj`.\n  // In contrast to `_.map` it returns an object.\n  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  // Predicate-generating function. Often useful outside of Underscore.\n  function noop(){}\n\n  // Generates a function for a given object that returns a given property.\n  function propertyOf(obj) {\n    if (obj == null) return noop;\n    return function(path) {\n      return get(obj, path);\n    };\n  }\n\n  // Run a function **n** times.\n  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).\n  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.\n  var now = Date.now || function() {\n    return new Date().getTime();\n  };\n\n  // Internal helper to generate functions for escaping and unescaping strings\n  // to/from HTML interpolation.\n  function 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  }\n\n  // Internal list of HTML entities for escaping.\n  var escapeMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;',\n    '`': '&#x60;'\n  };\n\n  // Function for escaping strings to HTML interpolation.\n  var _escape = createEscaper(escapeMap);\n\n  // Internal list of HTML entities for unescaping.\n  var unescapeMap = invert(escapeMap);\n\n  // Function for unescaping strings from HTML interpolation.\n  var _unescape = createEscaper(unescapeMap);\n\n  // By default, Underscore uses ERB-style template delimiters. Change the\n  // following template settings to use alternative delimiters.\n  var templateSettings = _$1.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.\n  var noMatch = /(.)^/;\n\n  // Certain characters need to be escaped so that they can be put into a\n  // string literal.\n  var escapes = {\n    \"'\": \"'\",\n    '\\\\': '\\\\',\n    '\\r': 'r',\n    '\\n': 'n',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escapeRegExp = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\n  function escapeChar(match) {\n    return '\\\\' + escapes[match];\n  }\n\n  // In order to prevent third-party code injection through\n  // `_.templateSettings.variable`, we test it against the following regular\n  // expression. It is intentionally a bit more liberal than just matching valid\n  // identifiers, but still prevents possible loopholes through defaults or\n  // destructuring assignment.\n  var bareIdentifier = /^\\s*(\\w|\\$)+\\s*$/;\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.\n  function template(text, settings, oldSettings) {\n    if (!settings && oldSettings) settings = oldSettings;\n    settings = defaults({}, settings, _$1.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    var argument = settings.variable;\n    if (argument) {\n      // Insure against third-party code injection. (CVE-2021-23358)\n      if (!bareIdentifier.test(argument)) throw new Error(\n        'variable is not a bare identifier: ' + argument\n      );\n    } else {\n      // If a variable is not specified, place data values in local scope.\n      source = 'with(obj||{}){\\n' + source + '}\\n';\n      argument = 'obj';\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(argument, '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    var template = function(data) {\n      return render.call(this, data, _$1);\n    };\n\n    // Provide the compiled source as a convenience for precompilation.\n    template.source = 'function(' + argument + '){\\n' + source + '}';\n\n    return template;\n  }\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.\n  function result(obj, path, fallback) {\n    path = toPath(path);\n    var length = path.length;\n    if (!length) {\n      return isFunction$1(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$1(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.\n  var idCounter = 0;\n  function uniqueId(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  }\n\n  // Start chaining a wrapped Underscore object.\n  function chain(obj) {\n    var instance = _$1(obj);\n    instance._chain = true;\n    return instance;\n  }\n\n  // Internal function to execute `sourceFunc` bound to `context` with optional\n  // `args`. Determines whether to execute a function as a constructor or as a\n  // normal function.\n  function 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  // 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.\n  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\n  partial.placeholder = _$1;\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally).\n  var bind = restArguments(function(func, context, args) {\n    if (!isFunction$1(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  // Internal 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\n  var isArrayLike = createSizePropertyCheck(getLength);\n\n  // Internal implementation of a recursive `flatten` function.\n  function flatten$1(input, depth, strict) {\n    if (!depth && depth !== 0) depth = Infinity;\n    var output = [], idx = 0, i = 0, length = getLength(input) || 0, stack = [];\n    while (true) {\n      if (i >= length) {\n        if (!stack.length) break;\n        var frame = stack.pop();\n        i = frame.i;\n        input = frame.v;\n        length = getLength(input);\n        continue;\n      }\n      var value = input[i++];\n      if (stack.length >= depth) {\n        output[idx++] = value;\n      } else if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {\n        // Flatten current level of array or arguments object.\n        stack.push({i: i, v: input});\n        i = 0;\n        input = value;\n        length = getLength(input);\n      } else if (!strict) {\n        output[idx++] = value;\n      }\n    }\n    return output;\n  }\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.\n  var bindAll = restArguments(function(obj, keys) {\n    keys = flatten$1(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    return obj;\n  });\n\n  // Memoize an expensive function by storing its results.\n  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$1(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.\n  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.\n  var defer = partial(delay, _$1, 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.\n  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  // When a sequence of calls of the returned function ends, the argument\n  // function is triggered. The end of a sequence is defined by the `wait`\n  // parameter. If `immediate` is passed, the argument function will be\n  // triggered at the beginning of the sequence instead of at the end.\n  function debounce(func, wait, immediate) {\n    var timeout, previous, args, result, context;\n\n    var later = function() {\n      var passed = now() - previous;\n      if (wait > passed) {\n        timeout = setTimeout(later, wait - passed);\n      } else {\n        timeout = null;\n        if (!immediate) result = func.apply(context, args);\n        // This check is needed because `func` can recursively invoke `debounced`.\n        if (!timeout) args = context = null;\n      }\n    };\n\n    var debounced = restArguments(function(_args) {\n      context = this;\n      args = _args;\n      previous = now();\n      if (!timeout) {\n        timeout = setTimeout(later, wait);\n        if (immediate) result = func.apply(context, args);\n      }\n      return result;\n    });\n\n    debounced.cancel = function() {\n      clearTimeout(timeout);\n      timeout = args = context = 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.\n  function wrap(func, wrapper) {\n    return partial(wrapper, func);\n  }\n\n  // Returns a negated version of the passed-in predicate.\n  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.\n  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.\n  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\n  // Nth call.\n  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.\n  var once = partial(before, 2);\n\n  // Returns the first key on an object that passes a truth test.\n  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 function to generate `_.findIndex` and `_.findLastIndex`.\n  function 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 truth test.\n  var findIndex = createPredicateIndexFinder(1);\n\n  // Returns the last index on an array-like that passes a truth test.\n  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.\n  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  // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.\n  function 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$1);\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.\n  var indexOf = createIndexFinder(1, findIndex, sortedIndex);\n\n  // Return the position of the last occurrence of an item in an array,\n  // or -1 if the item is not included in the array.\n  var lastIndexOf = createIndexFinder(-1, findLastIndex);\n\n  // Return the first value which passes a truth test.\n  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  }\n\n  // Convenience version of a common use case of `_.find`: getting the first\n  // object containing specific `key:value` pairs.\n  function findWhere(obj, attrs) {\n    return find(obj, matcher(attrs));\n  }\n\n  // The cornerstone for collection functions, an `each`\n  // implementation, aka `forEach`.\n  // Handles raw objects in addition to array-likes. Treats all\n  // sparse array-likes as if they were dense.\n  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  }\n\n  // Return the results of applying the iteratee to each element.\n  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  }\n\n  // Internal helper to create a reducing function, iterating left or right.\n  function 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`.\n  var reduce = createReduce(1);\n\n  // The right-associative version of reduce, also known as `foldr`.\n  var reduceRight = createReduce(-1);\n\n  // Return all the elements that pass a truth test.\n  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  }\n\n  // Return all the elements for which a truth test fails.\n  function reject(obj, predicate, context) {\n    return filter(obj, negate(cb(predicate)), context);\n  }\n\n  // Determine whether all of the elements pass a truth test.\n  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  }\n\n  // Determine if at least one element in the object passes a truth test.\n  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  }\n\n  // Determine if the array or object contains a given item (using `===`).\n  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  }\n\n  // Invoke a method (with arguments) on every item in a collection.\n  var invoke = restArguments(function(obj, path, args) {\n    var contextPath, func;\n    if (isFunction$1(path)) {\n      func = path;\n    } else {\n      path = toPath(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.\n  function pluck(obj, key) {\n    return map(obj, property(key));\n  }\n\n  // Convenience version of a common use case of `_.filter`: selecting only\n  // objects containing specific `key:value` pairs.\n  function where(obj, attrs) {\n    return filter(obj, matcher(attrs));\n  }\n\n  // Return the maximum element (or element-based computation).\n  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).\n  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  // Safely create a real, live array from anything iterable.\n  var reStrSymbol = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\n  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  // 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`.\n  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 = toArray(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  // Shuffle a collection.\n  function shuffle(obj) {\n    return sample(obj, Infinity);\n  }\n\n  // Sort the object's values by a criterion produced by an iteratee.\n  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.\n  function 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.\n  var groupBy = group(function(result, value, key) {\n    if (has$1(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.\n  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.\n  var countBy = group(function(result, value, key) {\n    if (has$1(result, key)) result[key]++; else result[key] = 1;\n  });\n\n  // Split a collection into two arrays: one whose elements all pass the given\n  // truth test, and one whose elements all do not pass the truth test.\n  var partition = group(function(result, value, pass) {\n    result[pass ? 0 : 1].push(value);\n  }, true);\n\n  // Return the number of elements in a collection.\n  function size(obj) {\n    if (obj == null) return 0;\n    return isArrayLike(obj) ? obj.length : keys(obj).length;\n  }\n\n  // Internal `_.pick` helper function to determine whether `key` is an enumerable\n  // property name of `obj`.\n  function keyInObj(value, key, obj) {\n    return key in obj;\n  }\n\n  // Return a copy of the object only containing the allowed properties.\n  var pick = restArguments(function(obj, keys) {\n    var result = {}, iteratee = keys[0];\n    if (obj == null) return result;\n    if (isFunction$1(iteratee)) {\n      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);\n      keys = allKeys(obj);\n    } else {\n      iteratee = keyInObj;\n      keys = flatten$1(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 disallowed properties.\n  var omit = restArguments(function(obj, keys) {\n    var iteratee = keys[0], context;\n    if (isFunction$1(iteratee)) {\n      iteratee = negate(iteratee);\n      if (keys.length > 1) context = keys[1];\n    } else {\n      keys = map(flatten$1(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  // 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.\n  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 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`.\n  function first(array, n, guard) {\n    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n    if (n == null || guard) return array[0];\n    return initial(array, 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`.\n  function rest(array, n, guard) {\n    return slice.call(array, 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.\n  function last(array, n, guard) {\n    if (array == null || array.length < 1) return n == null || guard ? 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  // Trim out all falsy values from an array.\n  function compact(array) {\n    return filter(array, Boolean);\n  }\n\n  // Flatten out an array, either recursively (by default), or up to `depth`.\n  // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.\n  function flatten(array, depth) {\n    return flatten$1(array, depth, false);\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.\n  var difference = restArguments(function(array, rest) {\n    rest = flatten$1(rest, true, true);\n    return filter(array, function(value){\n      return !contains(rest, value);\n    });\n  });\n\n  // Return a version of the array that does not contain the specified value(s).\n  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.\n  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  }\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  var union = restArguments(function(arrays) {\n    return uniq(flatten$1(arrays, true, true));\n  });\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays.\n  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  // Complement of zip. Unzip accepts an array of arrays and groups\n  // each array's elements on shared indices.\n  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.\n  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`.\n  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  // 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).\n  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.\n  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  // Helper function to continue chaining intermediate results.\n  function chainResult(instance, obj) {\n    return instance._chain ? _$1(obj).chain() : obj;\n  }\n\n  // Add your own custom functions to the Underscore object.\n  function mixin(obj) {\n    each(functions(obj), function(name) {\n      var func = _$1[name] = obj[name];\n      _$1.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return chainResult(this, func.apply(_$1, args));\n      };\n    });\n    return _$1;\n  }\n\n  // Add all mutator `Array` functions to the wrapper.\n  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _$1.prototype[name] = function() {\n      var obj = this._wrapped;\n      if (obj != null) {\n        method.apply(obj, arguments);\n        if ((name === 'shift' || name === 'splice') && obj.length === 0) {\n          delete obj[0];\n        }\n      }\n      return chainResult(this, obj);\n    };\n  });\n\n  // Add all accessor `Array` functions to the wrapper.\n  each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _$1.prototype[name] = function() {\n      var obj = this._wrapped;\n      if (obj != null) obj = method.apply(obj, arguments);\n      return chainResult(this, obj);\n    };\n  });\n\n  // Named Exports\n\n  var allExports = {\n    __proto__: null,\n    VERSION: VERSION,\n    restArguments: restArguments,\n    isObject: isObject,\n    isNull: isNull,\n    isUndefined: isUndefined,\n    isBoolean: isBoolean,\n    isElement: isElement,\n    isString: isString,\n    isNumber: isNumber,\n    isDate: isDate,\n    isRegExp: isRegExp,\n    isError: isError,\n    isSymbol: isSymbol,\n    isArrayBuffer: isArrayBuffer,\n    isDataView: isDataView$1,\n    isArray: isArray,\n    isFunction: isFunction$1,\n    isArguments: isArguments$1,\n    isFinite: isFinite$1,\n    isNaN: isNaN$1,\n    isTypedArray: isTypedArray$1,\n    isEmpty: isEmpty,\n    isMatch: isMatch,\n    isEqual: isEqual,\n    isMap: isMap,\n    isWeakMap: isWeakMap,\n    isSet: isSet,\n    isWeakSet: isWeakSet,\n    keys: keys,\n    allKeys: allKeys,\n    values: values,\n    pairs: pairs,\n    invert: invert,\n    functions: functions,\n    methods: functions,\n    extend: extend,\n    extendOwn: extendOwn,\n    assign: extendOwn,\n    defaults: defaults,\n    create: create,\n    clone: clone,\n    tap: tap,\n    get: get,\n    has: has,\n    mapObject: mapObject,\n    identity: identity,\n    constant: constant,\n    noop: noop,\n    toPath: toPath$1,\n    property: property,\n    propertyOf: propertyOf,\n    matcher: matcher,\n    matches: matcher,\n    times: times,\n    random: random,\n    now: now,\n    escape: _escape,\n    unescape: _unescape,\n    templateSettings: templateSettings,\n    template: template,\n    result: result,\n    uniqueId: uniqueId,\n    chain: chain,\n    iteratee: iteratee,\n    partial: partial,\n    bind: bind,\n    bindAll: bindAll,\n    memoize: memoize,\n    delay: delay,\n    defer: defer,\n    throttle: throttle,\n    debounce: debounce,\n    wrap: wrap,\n    negate: negate,\n    compose: compose,\n    after: after,\n    before: before,\n    once: once,\n    findKey: findKey,\n    findIndex: findIndex,\n    findLastIndex: findLastIndex,\n    sortedIndex: sortedIndex,\n    indexOf: indexOf,\n    lastIndexOf: lastIndexOf,\n    find: find,\n    detect: find,\n    findWhere: findWhere,\n    each: each,\n    forEach: each,\n    map: map,\n    collect: map,\n    reduce: reduce,\n    foldl: reduce,\n    inject: reduce,\n    reduceRight: reduceRight,\n    foldr: reduceRight,\n    filter: filter,\n    select: filter,\n    reject: reject,\n    every: every,\n    all: every,\n    some: some,\n    any: some,\n    contains: contains,\n    includes: contains,\n    include: contains,\n    invoke: invoke,\n    pluck: pluck,\n    where: where,\n    max: max,\n    min: min,\n    shuffle: shuffle,\n    sample: sample,\n    sortBy: sortBy,\n    groupBy: groupBy,\n    indexBy: indexBy,\n    countBy: countBy,\n    partition: partition,\n    toArray: toArray,\n    size: size,\n    pick: pick,\n    omit: omit,\n    first: first,\n    head: first,\n    take: first,\n    initial: initial,\n    last: last,\n    rest: rest,\n    tail: rest,\n    drop: rest,\n    compact: compact,\n    flatten: flatten,\n    without: without,\n    uniq: uniq,\n    unique: uniq,\n    union: union,\n    intersection: intersection,\n    difference: difference,\n    unzip: unzip,\n    transpose: unzip,\n    zip: zip,\n    object: object,\n    range: range,\n    chunk: chunk,\n    mixin: mixin,\n    'default': _$1\n  };\n\n  // Default Export\n\n  // Add all of the Underscore functions to the wrapper object.\n  var _ = mixin(allExports);\n  // Legacy Node.js API.\n  _._ = _;\n\n  return _;\n\n})));\n//# sourceMappingURL=underscore-umd.js.map\n\n\nfunction PaintMap() {\n    var self = this;\n    var loop = new Loop();\n    var viewport = new Viewport();\n\n    this.el = document.querySelector('.js-paint-map');\n    this.link = document.querySelectorAll('.js-paint-map__link');\n    this.item = document.querySelector('.js-paint-item');\n    this.itemData = {\n        title: document.querySelector('.paint-item__title'),\n        location: document.querySelector('.paint-item__location'),\n        text: document.querySelector('.paint-item__text'),\n        url: document.querySelector('.paint-item__url')\n    }\n\n    this.breakpoint = 860;\n\n    this.exists = function() {\n        return this.el != undefined;\n    }\n\n    this.init = function() {\n        loop.array(this.link, function(links, i) {\n            var link = links[i];\n\n            link.onclick = self.update.bind(self, link);\n        });\n\n        console.log(window.innerWidth);\n        if (window.innerWidth > this.breakpoint) {\n            this.link[Math.floor((Math.random() * this.link.length) + 1)].trigger('click');\n        }\n\n        this.el.onclick = this.deactivate.bind(this);\n        this.item.onclick = function(e) {\n            e.stopPropagation();\n        }\n    }\n\n    this.update = function(link, e) {\n        this.deactivate();\n        this.activate(link, e);\n    }\n\n    this.activate = function(link, e) {\n        if (e) {\n            e.preventDefault();\n            e.stopPropagation();\n        }\n\n        if (window.innerWidth > this.breakpoint) {\n            var xDirection = parseInt(link.style.left) > 50 ? 'right' : 'left' ;\n            var yDirection = parseInt(link.style.top) > 50 ? 'bottom' : 'top' ;\n\n            link.classList.add('paint-map__link--active');\n            this.item.classList.add('paint-item--active');\n            this.item.classList.add('paint-item--' + xDirection);\n            this.item.classList.add('paint-item--' + yDirection);\n\n            this.position(link.style.top, link.style.left);\n\n            var result = _.find(paintMapResults, function(result) {\n                return result.id == link.getAttribute('data-id')\n            });\n\n            loop.object(this.itemData, function(keys, i) {\n                if (keys[i] == 'url') {\n                    self.itemData[keys[i]].href = result[keys[i]];\n                    self.itemData[keys[i]].innerHTML = 'View ' + result.title;\n                } else {\n                    self.itemData[keys[i]].innerHTML = result[keys[i]];\n                }\n            });\n        }\n    }\n\n    this.deactivate = function() {\n        var link = document.querySelector('.paint-map__link--active');\n\n        if (link) {\n            link.classList.remove('paint-map__link--active');\n        }\n\n        this.item.classList.remove('paint-item--active');\n        this.item.classList.remove('paint-item--top');\n        this.item.classList.remove('paint-item--right');\n        this.item.classList.remove('paint-item--bottom');\n        this.item.classList.remove('paint-item--left');\n    }\n\n    this.position = function(top, left) {\n        this.item.style.top = top;\n        this.item.style.left = left;\n    }\n}\n\nvar paintMap = new PaintMap();\n\nif (paintMap.exists()) {\n    paintMap.init();\n}\n\nAndrewMartin.carousels = [];\n\nAndrewMartin.carousel = () => {\n\n    const activeButton = '<button class=\"slick-polygon-button\">' +\n                            '<svg width=\"30px\" height=\"30px\" viewBox=\"0 0 30 30\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">' +\n                                '<polygon id=\"path-1\" points=\"15 0 14.3169392 1.99095879 1.99095879 14.3162292 0 15 1.99095879 15.6834158 14.3169392 28.0090412 15 30 15.6834158 28.0090412 28.0090412 15.6834158 30 15 28.0090412 14.3162292 15.6834158 1.99095879\"></polygon>' +\n                            '</svg>' +\n                        '</button>';\n\n    // Hero carousel\n    document.querySelectorAll('.js-carousel--hero').forEach((el, i) => {\n        el.classList.add('js-carousel--hero-' + i);\n\n        var carousel = new Carousel({\n            dots: true,\n            customPaging: function() {\n                return activeButton;\n            },\n            swipe: true,\n            adaptiveHeight: true,\n            autoplay: true,\n            autoplaySpeed: 7000,\n            fade: true,\n            speed: 300,\n            pauseOnHover: false,\n            pauseOnFocus: false\n        }, 'hero-' + i);\n\n        $(el).on(('init reInit afterChange'), (event, slick, currentSlide) => {\n            const activeSlideIndex = typeof currentSlide === 'undefined' ? 0 : currentSlide;\n            const currentSlideElement = $(slick.$slides[activeSlideIndex]);\n            const heroItemRightExists = currentSlideElement.find('.hero__item--right').length > 0;\n            const slickDots = $(slick.$dots);\n\n            if (heroItemRightExists) {\n                slickDots.addClass('slick-dots--left');\n                slickDots.removeClass('slick-dots--right');\n            } else {\n                slickDots.addClass('slick-dots--right');\n                slickDots.removeClass('slick-dots--left');\n            }\n\n            const heroItem = currentSlideElement.get(0).querySelector('.hero__item');\n\n            if (heroItem && !heroItem.dataset.seen) {\n                const observer = new IntersectionObserver(([entry]) => {\n                    if (entry.isIntersecting) {\n                        heroItem.dataset.seen = true;\n\n                        window.dataLayer.push({\n                            event: 'hero_banner_view',\n                            hero_banner_id: heroItem.dataset.gaId,\n                            hero_banner: heroItem.dataset.gaLabel,\n                            hero_banner_position: activeSlideIndex,\n                        });\n\n                        observer.disconnect();\n                    }\n                });\n\n                observer.observe(currentSlideElement.get(0));\n            }\n        });\n\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Quote carousel\n    document.querySelectorAll('.js-carousel--quote').forEach((el, i) => {\n        el.classList.add('js-carousel--quote-' + i);\n\n        var carousel = new Carousel({\n            dots: true,\n            customPaging: function() {\n                return activeButton;\n            },\n            swipe: true,\n            autoplay: false,\n            fade: true,\n            speed: 1000\n        }, 'quote-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Review carousel\n    document.querySelectorAll('.js-carousel--reviews').forEach((el, i) => {\n        el.classList.add('js-carousel--reviews-' + i);\n\n        let carousel = new Carousel({\n            appendArrows: $('.overlay-reviews__controls'),\n            dots: false,\n            swipe: true,\n            arrows: true,\n            infinite: false,\n            slidesToShow: 4,\n            slidesToScroll: 4,\n            responsive: [\n                {\n                    breakpoint: 1200,\n                    settings: {\n                        slidesToShow: 3,\n                        slidesToScroll: 3\n                    }\n                },\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2,\n                        slidesToScroll: 2\n                    }\n                },\n                {\n                    breakpoint: 680,\n                    settings: {\n                        slidesToShow: 1.5,\n                        slidesToScroll: 1,\n                    }\n                }\n            ],\n            autoplay: false,\n            speed: 1000\n        }, 'reviews-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Design review carousel\n    document.querySelectorAll('.js-carousel--design-review').forEach((el, i) => {\n        el.classList.add('js-carousel--design-review-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 6,\n            responsive: [\n                {\n                    breakpoint: 1920,\n                    settings: {\n                        slidesToShow: 5,\n                        slidesToScroll: 1\n                    }\n                },\n                {\n                    breakpoint: 1680,\n                    settings: {\n                        slidesToShow: 4,\n                        slidesToScroll: 1\n                    }\n                },\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2,\n                        slidesToScroll: 1\n                    }\n                },\n            ],\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: false,\n            autoplay: false,\n            fade: false,\n            speed: 1000\n        }, 'design-review-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n\n    // Complete the look carousel (carbon copy of above)\n    document.querySelectorAll('.js-carousel--product-recommended').forEach((el, i) => {\n\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        el.classList.add('js-carousel--product-recommended-' + i);\n\n        const title = el.previousElementSibling;\n\n        let carousel = new Carousel({\n            appendArrows: $(title),\n            slidesToShow: 4,\n            swipeToSlide: true,\n            responsive: [\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2,\n                        slidesToScroll: 1,\n                        swipeToSlide: true,\n                    }\n                },\n                {\n                    breakpoint: 680,\n                    settings: 'unslick',\n                },\n            ],\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: true,\n            autoplay: false,\n            fade: false,\n            speed: 200\n        }, 'product-recommended-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n\n    // Get inspired carousel\n    document.querySelectorAll('.js-carousel--inspired').forEach((el, i) => {\n        el.classList.add('js-carousel--inspired-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: false,\n            autoplay: false,\n            fade: true,\n            speed: 1000\n        }, 'inspired-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n      // Split Feature block carousel\n      document.querySelectorAll('.js-carousel--split-feature').forEach((el, i) => {\n        el.classList.add('js-carousel--split-feature-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            dots: false,\n            swipe: true,\n            autoplay: true,\n            fade: true,\n            speed: 1000\n        }, 'split-feature-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n     // PDP callout carousel\n     document.querySelectorAll('.js-carousel--product').forEach((el, i) => {\n        el.classList.add('js-carousel--product-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: false,\n            autoplay: false,\n            fade: true,\n            speed: 300\n        }, 'product-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // PDP mobile gallery carousel\n    document.querySelectorAll('.js-carousel--product-gallery').forEach((el, i) => {\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        el.classList.add('js-carousel--product-gallery-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            slidesToScroll: 1,\n            dots: true,\n            filter: {\n                selector: function() { return $('.slick-show', this).length === 1; },\n                breakpoint: AndrewMartin.breakpoints.tablet.size\n            },\n            customPaging: function() {\n                return activeButton;\n            },\n            swipe: true,\n            infinite: true,\n            autoplay: false,\n            fade: true,\n            cssEase: 'linear',\n            speed: 100\n        }, 'product-gallery-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // PDP gallery carousel\n    document.querySelectorAll('.js-carousel--product-gallery-v2').forEach((el, i) => {\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        const prevButton = document.querySelector('[data-mobile-prev]');\n        const nextButton = document.querySelector('[data-mobile-next]');\n        const count = document.querySelector('[data-carousel-count]');\n\n        if (window.matchMedia('(max-width: 999px)').matches && (nextButton || prevButton)) {\n            prevButton.addEventListener('click', () => {\n                $(el).slick('slickPrev');\n            })\n\n            nextButton.addEventListener('click', () => {\n                $(el).slick('slickNext');\n            })\n\n            $(el).on('init reInit afterChange', (event, slick, currentSlide) => {\n                //currentSlide is undefined on init -- set it to 0 in this case (currentSlide is 0 based)\n                const i = (currentSlide ? currentSlide : 0) + 1;\n\n                count.innerText = `${i}/${slick.slideCount}`\n            });\n        }\n\n        el.classList.add('js-carousel--product-gallery-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            slidesToScroll: 1,\n            arrows: true,\n            swipe: true,\n            infinite: true,\n            autoplay: false,\n            mobileFirst: true,\n            dots: false,\n            fade: true,\n            cssEase: 'linear',\n            asNavFor: '.js-carousel--product-thumbnails',\n            speed: 100,\n            responsive: [\n                {\n                    breakpoint: 999,\n                    settings: {\n                        swipe: false,\n                    },\n                },\n            ],\n        }, 'product-gallery-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n\n        if (window.matchMedia('(max-width: 999px)').matches) {\n            $(el).slick('slickFilter', function() {\n                return $('.slick-show', this).length === 1;\n            });\n        }\n    });\n\n    // PDP thumbnails\n    document.querySelectorAll('.js-carousel--product-thumbnails').forEach((el, i) => {\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        el.classList.add('js-carousel--product-thumbnails-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 4.5,\n            asNavFor: '.js-carousel--product-gallery-v2',\n            focusOnSelect: true,\n            infinite: false,\n            dots: false,\n            responsive: [\n                {\n                    breakpoint: 999,\n                    settings: \"unslick\",\n                },\n            ],\n        }, 'product-thumbnails-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Categories Block Carousel\n    document.querySelectorAll('.js-carousel--categories').forEach((el, i) => {\n        el.classList.add('js-carousel--categories-' + i);\n\n        let carousel = new Carousel({\n            appendArrows: $('.categories-carousel__controls'),\n            dots: false,\n            swipe: true,\n            arrows: true,\n            infinite: false,\n            slidesToShow: 3.75,\n            slidesToScroll: 1,\n            responsive: [\n                {\n                    breakpoint: 1200,\n                    settings: {\n                        slidesToShow: 3.3,\n                        slidesToScroll: 3\n                    }\n                },\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2.3,\n                        slidesToScroll: 2\n                    }\n                },\n                {\n                    breakpoint: 680,\n                    settings: 'unslick'\n                }\n            ],\n            autoplay: false,\n            speed: 200\n        }, 'categories-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n}\n\n//=require js-tools/svg.js\n\nAndrewMartin.pswp = null;\n\nAndrewMartin.photoswipe = () => {\n    const photoswipeEl = document.querySelector('[data-photoswipe]');\n\n    if (!photoswipeEl) {\n        return;\n    }\n\n    const dataSourceImages = JSON.parse(photoswipeEl?.dataset.photoswipe);\n\n    const photoSwipeButtons = photoswipeEl.querySelectorAll(\n        'button.photoswipe-gallery'\n    );\n\n    const svg = new Svg();\n\n    const leftArrow = svg.render('icon-arrow-large-left');\n\n    const rightArrow = svg.render('icon-arrow-large-right');\n\n    const options = {\n        dataSource: dataSourceImages,\n        showHideAnimationType: 'none',\n        arrowPrevSVG: leftArrow,\n        arrowNextSVG: rightArrow,\n    };\n\n    const initButton = (e) => {\n        e.stopPropagation();\n\n        const button = e.currentTarget;\n\n        // Retrieve the index from the button's data attribute\n        const clickedIndex = parseInt(button.dataset.photoswipeId, 10);\n\n        if (!isNaN(clickedIndex) && dataSourceImages[clickedIndex]) {\n            options.index = clickedIndex; // Set the correct start slide index\n\n            if (AndrewMartin.pswp) {\n                AndrewMartin.pswp.destroy(); // Destroy the previous instance if it exists\n            }\n\n            AndrewMartin.pswp = new PhotoSwipe(options);\n            AndrewMartin.pswp.init(); // Initialize the PhotoSwipe instance\n        } else {\n            console.error(\n                'Invalid index or image not found in PhotoSwipe data source.'\n            );\n        }\n    };\n\n    for (const button of photoSwipeButtons) {\n        button.addEventListener('click', initButton);\n    }\n};\n\nAndrewMartin.siteNoticeMessages = [];\nAndrewMartin.siteNotice = () => {\n    AndrewMartin.siteNoticeMessages = document.querySelectorAll('.js-header-message');\n\n    function loopMessages(active)  {\n        if (AndrewMartin.siteNoticeMessages.length) {\n            AndrewMartin.siteNoticeMessages.forEach((m) => {\n                m.classList.add('notice__content--hidden');\n            })\n\n            AndrewMartin.siteNoticeMessages[active].classList.remove('notice__content--hidden')\n\n            if (++active >= AndrewMartin.siteNoticeMessages.length) {\n                active = 0;\n            }\n\n            setTimeout(() => {\n                loopMessages(active)\n            }, 7000)\n        }\n    }\n\n    if (AndrewMartin.siteNoticeMessages.length) {\n        loopMessages(0);\n    }\n}\n\nAndrewMartin.bloomreach = () => {\n    $('.js-bloomreach-identify').on('submit', function() {\n        if (typeof exponea === 'undefined') {\n            console.error('Bloomreach not initialised');\n            return true;\n        }\n\n        const email = $(this).find('input[name$=\"email\"]').val() || $(this).find('input[name$=\"email]\"]').val();\n\n        if (!email) {\n            console.error('No email address to send to bloomreach');\n            return true;\n        }\n\n        exponea.identify(\n            {\n              'email_id': email\n            },\n            {\n              'email': email\n            }\n        );\n\n        return true;\n    });\n}\n\nAndrewMartin.klaviyo = () => {\n    !function(){if(!window.klaviyo){window._klOnsite=window._klOnsite||[];try{window.klaviyo=new Proxy({},{get:function(n,i){return\"push\"===i?function(){var n;(n=window._klOnsite).push.apply(n,arguments)}:function(){for(var n=arguments.length,o=new Array(n),w=0;w<n;w++)o[w]=arguments[w];var t=\"function\"==typeof o[o.length-1]?o.pop():void 0,e=new Promise((function(n){window._klOnsite.push([i].concat(o,[function(i){t&&t(i),n(i)}]))}));return e}}})}catch(n){window.klaviyo=window.klaviyo||[],window.klaviyo.push=function(){var n;(n=window._klOnsite).push.apply(n,arguments)}}}}();\n\n    const form = document.querySelector('.js-klaviyo-identify');\n\n    if (!form) {\n        console.error('Klaviyo form not found');\n        return;\n    }\n\n    form.addEventListener('submit', (event) => {\n        if (typeof klaviyo === 'undefined') {\n            console.error('Klaviyo not initialised');\n            return true;\n        }\n\n        const email = event.currentTarget.querySelector('input[name$=\"email\"]').value || event.currentTarget.querySelector('input[name$=\"email]\"]').value;\n\n        if (!email) {\n            console.error('No email address to send to klaviyo');\n            return true;\n        }\n\n        klaviyo.identify({\n            'email': email\n        }).then(() => {\n            console.log('Klaviyo identify success');\n        });\n\n        return true;\n    });\n}\n\n\n/**\n * I would do this in CSS but we need to add in the SVG\n * symbol anyway and we only want to show the custom\n * checkbox if this code is run so better to do it here\n *\n * @author Neil Brayfield <neil@d3r.com>\n */\n$.fn.checkReplace = function() {\n    $(this).each(function() {\n        var current = $(this);\n        current.wrap('<div class=\"check-replace\"></div>').hide();\n\n        var wrap = $(this).parent();\n\n        wrap.append(\n            '<svg class=\"icon-tick\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-tick\" />' +\n            '</svg>'\n        );\n\n        current.on('change', function (e) {\n\n            if (current.prop('checked')) {\n                wrap.addClass('check-replace--active');\n            } else {\n                wrap.removeClass('check-replace--active');\n            }\n\n            return true;\n        });\n\n        $(this).trigger('change');\n    });\n};\n\n/**\n * I would do this in CSS but we need to add in the SVG\n * symbol anyway and we only want to show the custom\n * checkbox if this code is run so better to do it here\n *\n * @author Andy Hartley <andy.hartley@d3r.com>\n */\n$.fn.customCheckReplace = function() {\n    $(this).each(function() {\n        var current = $(this);\n        current.wrap('<div class=\"check-replace\"></div>').hide();\n\n        var wrap = $(this).parent();\n\n        wrap.append(\n            '<svg class=\"icon-tick\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-tick\" />' +\n            '</svg>'\n        );\n\n        current.on('change', function (e) {\n            if (current.prop('checked')) {\n                wrap.addClass('check-replace--active');\n            } else {\n                wrap.removeClass('check-replace--active');\n            }\n\n            if (e.isTrigger) {\n                return false;\n            }\n\n            return true;\n        });\n\n        $(this).trigger('change');\n    });\n};\n\n/*! nouislider - 10.0.0 - 2017-05-28 14:52:48 */\r\n\r\n(function (factory) {\r\n\r\n    if ( typeof define === 'function' && define.amd ) {\r\n\r\n        // AMD. Register as an anonymous module.\r\n        define([], factory);\r\n\r\n    } else if ( typeof exports === 'object' ) {\r\n\r\n        // Node/CommonJS\r\n        module.exports = factory();\r\n\r\n    } else {\r\n\r\n        // Browser globals\r\n        window.noUiSlider = factory();\r\n    }\r\n\r\n}(function( ){\r\n\r\n\t'use strict';\r\n\r\n\tvar VERSION = '10.0.0';\r\n\r\n\r\n\tfunction isValidFormatter ( entry ) {\r\n\t\treturn typeof entry === 'object' && typeof entry.to === 'function' && typeof entry.from === 'function';\r\n\t}\r\n\r\n\tfunction removeElement ( el ) {\r\n\t\tel.parentElement.removeChild(el);\r\n\t}\r\n\r\n\t// Bindable version\r\n\tfunction preventDefault ( e ) {\r\n\t\te.preventDefault();\r\n\t}\r\n\r\n\t// Removes duplicates from an array.\r\n\tfunction unique ( array ) {\r\n\t\treturn array.filter(function(a){\r\n\t\t\treturn !this[a] ? this[a] = true : false;\r\n\t\t}, {});\r\n\t}\r\n\r\n\t// Round a value to the closest 'to'.\r\n\tfunction closest ( value, to ) {\r\n\t\treturn Math.round(value / to) * to;\r\n\t}\r\n\r\n\t// Current position of an element relative to the document.\r\n\tfunction offset ( elem, orientation ) {\r\n\r\n\t\tvar rect = elem.getBoundingClientRect();\r\n\t\tvar doc = elem.ownerDocument;\r\n\t\tvar docElem = doc.documentElement;\r\n\t\tvar pageOffset = getPageOffset(doc);\r\n\r\n\t\t// getBoundingClientRect contains left scroll in Chrome on Android.\r\n\t\t// I haven't found a feature detection that proves this. Worst case\r\n\t\t// scenario on mis-match: the 'tap' feature on horizontal sliders breaks.\r\n\t\tif ( /webkit.*Chrome.*Mobile/i.test(navigator.userAgent) ) {\r\n\t\t\tpageOffset.x = 0;\r\n\t\t}\r\n\r\n\t\treturn orientation ? (rect.top + pageOffset.y - docElem.clientTop) : (rect.left + pageOffset.x - docElem.clientLeft);\r\n\t}\r\n\r\n\t// Checks whether a value is numerical.\r\n\tfunction isNumeric ( a ) {\r\n\t\treturn typeof a === 'number' && !isNaN( a ) && isFinite( a );\r\n\t}\r\n\r\n\t// Sets a class and removes it after [duration] ms.\r\n\tfunction addClassFor ( element, className, duration ) {\r\n\t\tif (duration > 0) {\r\n\t\taddClass(element, className);\r\n\t\t\tsetTimeout(function(){\r\n\t\t\t\tremoveClass(element, className);\r\n\t\t\t}, duration);\r\n\t\t}\r\n\t}\r\n\r\n\t// Limits a value to 0 - 100\r\n\tfunction limit ( a ) {\r\n\t\treturn Math.max(Math.min(a, 100), 0);\r\n\t}\r\n\r\n\t// Wraps a variable as an array, if it isn't one yet.\r\n\t// Note that an input array is returned by reference!\r\n\tfunction asArray ( a ) {\r\n\t\treturn Array.isArray(a) ? a : [a];\r\n\t}\r\n\r\n\t// Counts decimals\r\n\tfunction countDecimals ( numStr ) {\r\n\t\tnumStr = String(numStr);\r\n\t\tvar pieces = numStr.split(\".\");\r\n\t\treturn pieces.length > 1 ? pieces[1].length : 0;\r\n\t}\r\n\r\n\t// http://youmightnotneedjquery.com/#add_class\r\n\tfunction addClass ( el, className ) {\r\n\t\tif ( el.classList ) {\r\n\t\t\tel.classList.add(className);\r\n\t\t} else {\r\n\t\t\tel.className += ' ' + className;\r\n\t\t}\r\n\t}\r\n\r\n\t// http://youmightnotneedjquery.com/#remove_class\r\n\tfunction removeClass ( el, className ) {\r\n\t\tif ( el.classList ) {\r\n\t\t\tel.classList.remove(className);\r\n\t\t} else {\r\n\t\t\tel.className = el.className.replace(new RegExp('(^|\\\\b)' + className.split(' ').join('|') + '(\\\\b|$)', 'gi'), ' ');\r\n\t\t}\r\n\t}\r\n\r\n\t// https://plainjs.com/javascript/attributes/adding-removing-and-testing-for-classes-9/\r\n\tfunction hasClass ( el, className ) {\r\n\t\treturn el.classList ? el.classList.contains(className) : new RegExp('\\\\b' + className + '\\\\b').test(el.className);\r\n\t}\r\n\r\n\t// https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY#Notes\r\n\tfunction getPageOffset ( doc ) {\r\n\r\n\t\tvar supportPageOffset = window.pageXOffset !== undefined;\r\n\t\tvar isCSS1Compat = ((doc.compatMode || \"\") === \"CSS1Compat\");\r\n\t\tvar x = supportPageOffset ? window.pageXOffset : isCSS1Compat ? doc.documentElement.scrollLeft : doc.body.scrollLeft;\r\n\t\tvar y = supportPageOffset ? window.pageYOffset : isCSS1Compat ? doc.documentElement.scrollTop : doc.body.scrollTop;\r\n\r\n\t\treturn {\r\n\t\t\tx: x,\r\n\t\t\ty: y\r\n\t\t};\r\n\t}\r\n\r\n\t// we provide a function to compute constants instead\r\n\t// of accessing window.* as soon as the module needs it\r\n\t// so that we do not compute anything if not needed\r\n\tfunction getActions ( ) {\r\n\r\n\t\t// Determine the events to bind. IE11 implements pointerEvents without\r\n\t\t// a prefix, which breaks compatibility with the IE10 implementation.\r\n\t\treturn window.navigator.pointerEnabled ? {\r\n\t\t\tstart: 'pointerdown',\r\n\t\t\tmove: 'pointermove',\r\n\t\t\tend: 'pointerup'\r\n\t\t} : window.navigator.msPointerEnabled ? {\r\n\t\t\tstart: 'MSPointerDown',\r\n\t\t\tmove: 'MSPointerMove',\r\n\t\t\tend: 'MSPointerUp'\r\n\t\t} : {\r\n\t\t\tstart: 'mousedown touchstart',\r\n\t\t\tmove: 'mousemove touchmove',\r\n\t\t\tend: 'mouseup touchend'\r\n\t\t};\r\n\t}\r\n\r\n\t// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\r\n\t// Issue #785\r\n\tfunction getSupportsPassive ( ) {\r\n\r\n\t\tvar supportsPassive = false;\r\n\r\n\t\ttry {\r\n\r\n\t\t\tvar opts = Object.defineProperty({}, 'passive', {\r\n\t\t\t\tget: function() {\r\n\t\t\t\t\tsupportsPassive = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\twindow.addEventListener('test', null, opts);\r\n\r\n\t\t} catch (e) {}\r\n\r\n\t\treturn supportsPassive;\r\n\t}\r\n\r\n\tfunction getSupportsTouchActionNone ( ) {\r\n\t\treturn window.CSS && CSS.supports && CSS.supports('touch-action', 'none');\r\n\t}\r\n\r\n\r\n// Value calculation\r\n\r\n\t// Determine the size of a sub-range in relation to a full range.\r\n\tfunction subRangeRatio ( pa, pb ) {\r\n\t\treturn (100 / (pb - pa));\r\n\t}\r\n\r\n\t// (percentage) How many percent is this value of this range?\r\n\tfunction fromPercentage ( range, value ) {\r\n\t\treturn (value * 100) / ( range[1] - range[0] );\r\n\t}\r\n\r\n\t// (percentage) Where is this value on this range?\r\n\tfunction toPercentage ( range, value ) {\r\n\t\treturn fromPercentage( range, range[0] < 0 ?\r\n\t\t\tvalue + Math.abs(range[0]) :\r\n\t\t\t\tvalue - range[0] );\r\n\t}\r\n\r\n\t// (value) How much is this percentage on this range?\r\n\tfunction isPercentage ( range, value ) {\r\n\t\treturn ((value * ( range[1] - range[0] )) / 100) + range[0];\r\n\t}\r\n\r\n\r\n// Range conversion\r\n\r\n\tfunction getJ ( value, arr ) {\r\n\r\n\t\tvar j = 1;\r\n\r\n\t\twhile ( value >= arr[j] ){\r\n\t\t\tj += 1;\r\n\t\t}\r\n\r\n\t\treturn j;\r\n\t}\r\n\r\n\t// (percentage) Input a value, find where, on a scale of 0-100, it applies.\r\n\tfunction toStepping ( xVal, xPct, value ) {\r\n\r\n\t\tif ( value >= xVal.slice(-1)[0] ){\r\n\t\t\treturn 100;\r\n\t\t}\r\n\r\n\t\tvar j = getJ( value, xVal ), va, vb, pa, pb;\r\n\r\n\t\tva = xVal[j-1];\r\n\t\tvb = xVal[j];\r\n\t\tpa = xPct[j-1];\r\n\t\tpb = xPct[j];\r\n\r\n\t\treturn pa + (toPercentage([va, vb], value) / subRangeRatio (pa, pb));\r\n\t}\r\n\r\n\t// (value) Input a percentage, find where it is on the specified range.\r\n\tfunction fromStepping ( xVal, xPct, value ) {\r\n\r\n\t\t// There is no range group that fits 100\r\n\t\tif ( value >= 100 ){\r\n\t\t\treturn xVal.slice(-1)[0];\r\n\t\t}\r\n\r\n\t\tvar j = getJ( value, xPct ), va, vb, pa, pb;\r\n\r\n\t\tva = xVal[j-1];\r\n\t\tvb = xVal[j];\r\n\t\tpa = xPct[j-1];\r\n\t\tpb = xPct[j];\r\n\r\n\t\treturn isPercentage([va, vb], (value - pa) * subRangeRatio (pa, pb));\r\n\t}\r\n\r\n\t// (percentage) Get the step that applies at a certain value.\r\n\tfunction getStep ( xPct, xSteps, snap, value ) {\r\n\r\n\t\tif ( value === 100 ) {\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tvar j = getJ( value, xPct ), a, b;\r\n\r\n\t\t// If 'snap' is set, steps are used as fixed points on the slider.\r\n\t\tif ( snap ) {\r\n\r\n\t\t\ta = xPct[j-1];\r\n\t\t\tb = xPct[j];\r\n\r\n\t\t\t// Find the closest position, a or b.\r\n\t\t\tif ((value - a) > ((b-a)/2)){\r\n\t\t\t\treturn b;\r\n\t\t\t}\r\n\r\n\t\t\treturn a;\r\n\t\t}\r\n\r\n\t\tif ( !xSteps[j-1] ){\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\treturn xPct[j-1] + closest(\r\n\t\t\tvalue - xPct[j-1],\r\n\t\t\txSteps[j-1]\r\n\t\t);\r\n\t}\r\n\r\n\r\n// Entry parsing\r\n\r\n\tfunction handleEntryPoint ( index, value, that ) {\r\n\r\n\t\tvar percentage;\r\n\r\n\t\t// Wrap numerical input in an array.\r\n\t\tif ( typeof value === \"number\" ) {\r\n\t\t\tvalue = [value];\r\n\t\t}\r\n\r\n\t\t// Reject any invalid input, by testing whether value is an array.\r\n\t\tif ( Object.prototype.toString.call( value ) !== '[object Array]' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' contains invalid value.\");\r\n\t\t}\r\n\r\n\t\t// Covert min/max syntax to 0 and 100.\r\n\t\tif ( index === 'min' ) {\r\n\t\t\tpercentage = 0;\r\n\t\t} else if ( index === 'max' ) {\r\n\t\t\tpercentage = 100;\r\n\t\t} else {\r\n\t\t\tpercentage = parseFloat( index );\r\n\t\t}\r\n\r\n\t\t// Check for correct input.\r\n\t\tif ( !isNumeric( percentage ) || !isNumeric( value[0] ) ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' value isn't numeric.\");\r\n\t\t}\r\n\r\n\t\t// Store values.\r\n\t\tthat.xPct.push( percentage );\r\n\t\tthat.xVal.push( value[0] );\r\n\r\n\t\t// NaN will evaluate to false too, but to keep\r\n\t\t// logging clear, set step explicitly. Make sure\r\n\t\t// not to override the 'step' setting with false.\r\n\t\tif ( !percentage ) {\r\n\t\t\tif ( !isNaN( value[1] ) ) {\r\n\t\t\t\tthat.xSteps[0] = value[1];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthat.xSteps.push( isNaN(value[1]) ? false : value[1] );\r\n\t\t}\r\n\r\n\t\tthat.xHighestCompleteStep.push(0);\r\n\t}\r\n\r\n\tfunction handleStepPoint ( i, n, that ) {\r\n\r\n\t\t// Ignore 'false' stepping.\r\n\t\tif ( !n ) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// Factor to range ratio\r\n\t\tthat.xSteps[i] = fromPercentage([\r\n\t\t\t that.xVal[i]\r\n\t\t\t,that.xVal[i+1]\r\n\t\t], n) / subRangeRatio (\r\n\t\t\tthat.xPct[i],\r\n\t\t\tthat.xPct[i+1] );\r\n\r\n\t\tvar totalSteps = (that.xVal[i+1] - that.xVal[i]) / that.xNumSteps[i];\r\n\t\tvar highestStep = Math.ceil(Number(totalSteps.toFixed(3)) - 1);\r\n\t\tvar step = that.xVal[i] + (that.xNumSteps[i] * highestStep);\r\n\r\n\t\tthat.xHighestCompleteStep[i] = step;\r\n\t}\r\n\r\n\r\n// Interface\r\n\r\n\tfunction Spectrum ( entry, snap, singleStep ) {\r\n\r\n\t\tthis.xPct = [];\r\n\t\tthis.xVal = [];\r\n\t\tthis.xSteps = [ singleStep || false ];\r\n\t\tthis.xNumSteps = [ false ];\r\n\t\tthis.xHighestCompleteStep = [];\r\n\r\n\t\tthis.snap = snap;\r\n\r\n\t\tvar index, ordered = [ /* [0, 'min'], [1, '50%'], [2, 'max'] */ ];\r\n\r\n\t\t// Map the object keys to an array.\r\n\t\tfor ( index in entry ) {\r\n\t\t\tif ( entry.hasOwnProperty(index) ) {\r\n\t\t\t\tordered.push([entry[index], index]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Sort all entries by value (numeric sort).\r\n\t\tif ( ordered.length && typeof ordered[0][0] === \"object\" ) {\r\n\t\t\tordered.sort(function(a, b) { return a[0][0] - b[0][0]; });\r\n\t\t} else {\r\n\t\t\tordered.sort(function(a, b) { return a[0] - b[0]; });\r\n\t\t}\r\n\r\n\r\n\t\t// Convert all entries to subranges.\r\n\t\tfor ( index = 0; index < ordered.length; index++ ) {\r\n\t\t\thandleEntryPoint(ordered[index][1], ordered[index][0], this);\r\n\t\t}\r\n\r\n\t\t// Store the actual step values.\r\n\t\t// xSteps is sorted in the same order as xPct and xVal.\r\n\t\tthis.xNumSteps = this.xSteps.slice(0);\r\n\r\n\t\t// Convert all numeric steps to the percentage of the subrange they represent.\r\n\t\tfor ( index = 0; index < this.xNumSteps.length; index++ ) {\r\n\t\t\thandleStepPoint(index, this.xNumSteps[index], this);\r\n\t\t}\r\n\t}\r\n\r\n\tSpectrum.prototype.getMargin = function ( value ) {\r\n\r\n\t\tvar step = this.xNumSteps[0];\r\n\r\n\t\tif ( step && ((value / step) % 1) !== 0 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'limit', 'margin' and 'padding' must be divisible by step.\");\r\n\t\t}\r\n\r\n\t\treturn this.xPct.length === 2 ? fromPercentage(this.xVal, value) : false;\r\n\t};\r\n\r\n\tSpectrum.prototype.toStepping = function ( value ) {\r\n\r\n\t\tvalue = toStepping( this.xVal, this.xPct, value );\r\n\r\n\t\treturn value;\r\n\t};\r\n\r\n\tSpectrum.prototype.fromStepping = function ( value ) {\r\n\r\n\t\treturn fromStepping( this.xVal, this.xPct, value );\r\n\t};\r\n\r\n\tSpectrum.prototype.getStep = function ( value ) {\r\n\r\n\t\tvalue = getStep(this.xPct, this.xSteps, this.snap, value );\r\n\r\n\t\treturn value;\r\n\t};\r\n\r\n\tSpectrum.prototype.getNearbySteps = function ( value ) {\r\n\r\n\t\tvar j = getJ(value, this.xPct);\r\n\r\n\t\treturn {\r\n\t\t\tstepBefore: { startValue: this.xVal[j-2], step: this.xNumSteps[j-2], highestStep: this.xHighestCompleteStep[j-2] },\r\n\t\t\tthisStep: { startValue: this.xVal[j-1], step: this.xNumSteps[j-1], highestStep: this.xHighestCompleteStep[j-1] },\r\n\t\t\tstepAfter: { startValue: this.xVal[j-0], step: this.xNumSteps[j-0], highestStep: this.xHighestCompleteStep[j-0] }\r\n\t\t};\r\n\t};\r\n\r\n\tSpectrum.prototype.countStepDecimals = function () {\r\n\t\tvar stepDecimals = this.xNumSteps.map(countDecimals);\r\n\t\treturn Math.max.apply(null, stepDecimals);\r\n \t};\r\n\r\n\t// Outside testing\r\n\tSpectrum.prototype.convert = function ( value ) {\r\n\t\treturn this.getStep(this.toStepping(value));\r\n\t};\r\n\r\n/*\tEvery input option is tested and parsed. This'll prevent\r\n\tendless validation in internal methods. These tests are\r\n\tstructured with an item for every option available. An\r\n\toption can be marked as required by setting the 'r' flag.\r\n\tThe testing function is provided with three arguments:\r\n\t\t- The provided value for the option;\r\n\t\t- A reference to the options object;\r\n\t\t- The name for the option;\r\n\r\n\tThe testing function returns false when an error is detected,\r\n\tor true when everything is OK. It can also modify the option\r\n\tobject, to make sure all values can be correctly looped elsewhere. */\r\n\r\n\tvar defaultFormatter = { 'to': function( value ){\r\n\t\treturn value !== undefined && value.toFixed(2);\r\n\t}, 'from': Number };\r\n\r\n\tfunction validateFormat ( entry ) {\r\n\r\n\t\t// Any object with a to and from method is supported.\r\n\t\tif ( isValidFormatter(entry) ) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'format' requires 'to' and 'from' methods.\");\r\n\t}\r\n\r\n\tfunction testStep ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric( entry ) ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'step' is not numeric.\");\r\n\t\t}\r\n\r\n\t\t// The step option can still be used to set stepping\r\n\t\t// for linear sliders. Overwritten if set in 'range'.\r\n\t\tparsed.singleStep = entry;\r\n\t}\r\n\r\n\tfunction testRange ( parsed, entry ) {\r\n\r\n\t\t// Filter incorrect input.\r\n\t\tif ( typeof entry !== 'object' || Array.isArray(entry) ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' is not an object.\");\r\n\t\t}\r\n\r\n\t\t// Catch missing start or end.\r\n\t\tif ( entry.min === undefined || entry.max === undefined ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): Missing 'min' or 'max' in 'range'.\");\r\n\t\t}\r\n\r\n\t\t// Catch equal start or end.\r\n\t\tif ( entry.min === entry.max ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' 'min' and 'max' cannot be equal.\");\r\n\t\t}\r\n\r\n\t\tparsed.spectrum = new Spectrum(entry, parsed.snap, parsed.singleStep);\r\n\t}\r\n\r\n\tfunction testStart ( parsed, entry ) {\r\n\r\n\t\tentry = asArray(entry);\r\n\r\n\t\t// Validate input. Values aren't tested, as the public .val method\r\n\t\t// will always provide a valid location.\r\n\t\tif ( !Array.isArray( entry ) || !entry.length ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'start' option is incorrect.\");\r\n\t\t}\r\n\r\n\t\t// Store the number of handles.\r\n\t\tparsed.handles = entry.length;\r\n\r\n\t\t// When the slider is initialized, the .val method will\r\n\t\t// be called with the start options.\r\n\t\tparsed.start = entry;\r\n\t}\r\n\r\n\tfunction testSnap ( parsed, entry ) {\r\n\r\n\t\t// Enforce 100% stepping within subranges.\r\n\t\tparsed.snap = entry;\r\n\r\n\t\tif ( typeof entry !== 'boolean' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'snap' option must be a boolean.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testAnimate ( parsed, entry ) {\r\n\r\n\t\t// Enforce 100% stepping within subranges.\r\n\t\tparsed.animate = entry;\r\n\r\n\t\tif ( typeof entry !== 'boolean' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'animate' option must be a boolean.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testAnimationDuration ( parsed, entry ) {\r\n\r\n\t\tparsed.animationDuration = entry;\r\n\r\n\t\tif ( typeof entry !== 'number' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'animationDuration' option must be a number.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testConnect ( parsed, entry ) {\r\n\r\n\t\tvar connect = [false];\r\n\t\tvar i;\r\n\r\n\t\t// Map legacy options\r\n\t\tif ( entry === 'lower' ) {\r\n\t\t\tentry = [true, false];\r\n\t\t}\r\n\r\n\t\telse if ( entry === 'upper' ) {\r\n\t\t\tentry = [false, true];\r\n\t\t}\r\n\r\n\t\t// Handle boolean options\r\n\t\tif ( entry === true || entry === false ) {\r\n\r\n\t\t\tfor ( i = 1; i < parsed.handles; i++ ) {\r\n\t\t\t\tconnect.push(entry);\r\n\t\t\t}\r\n\r\n\t\t\tconnect.push(false);\r\n\t\t}\r\n\r\n\t\t// Reject invalid input\r\n\t\telse if ( !Array.isArray( entry ) || !entry.length || entry.length !== parsed.handles + 1 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'connect' option doesn't match handle count.\");\r\n\t\t}\r\n\r\n\t\telse {\r\n\t\t\tconnect = entry;\r\n\t\t}\r\n\r\n\t\tparsed.connect = connect;\r\n\t}\r\n\r\n\tfunction testOrientation ( parsed, entry ) {\r\n\r\n\t\t// Set orientation to an a numerical value for easy\r\n\t\t// array selection.\r\n\t\tswitch ( entry ){\r\n\t\t  case 'horizontal':\r\n\t\t\tparsed.ort = 0;\r\n\t\t\tbreak;\r\n\t\t  case 'vertical':\r\n\t\t\tparsed.ort = 1;\r\n\t\t\tbreak;\r\n\t\t  default:\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'orientation' option is invalid.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testMargin ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric(entry) ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'margin' option must be numeric.\");\r\n\t\t}\r\n\r\n\t\t// Issue #582\r\n\t\tif ( entry === 0 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tparsed.margin = parsed.spectrum.getMargin(entry);\r\n\r\n\t\tif ( !parsed.margin ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'margin' option is only supported on linear sliders.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testLimit ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric(entry) ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'limit' option must be numeric.\");\r\n\t\t}\r\n\r\n\t\tparsed.limit = parsed.spectrum.getMargin(entry);\r\n\r\n\t\tif ( !parsed.limit || parsed.handles < 2 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'limit' option is only supported on linear sliders with 2 or more handles.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testPadding ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric(entry) ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must be numeric.\");\r\n\t\t}\r\n\r\n\t\tif ( entry === 0 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tparsed.padding = parsed.spectrum.getMargin(entry);\r\n\r\n\t\tif ( !parsed.padding ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option is only supported on linear sliders.\");\r\n\t\t}\r\n\r\n\t\tif ( parsed.padding < 0 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must be a positive number.\");\r\n\t\t}\r\n\r\n\t\tif ( parsed.padding >= 50 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must be less than half the range.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testDirection ( parsed, entry ) {\r\n\r\n\t\t// Set direction as a numerical value for easy parsing.\r\n\t\t// Invert connection for RTL sliders, so that the proper\r\n\t\t// handles get the connect/background classes.\r\n\t\tswitch ( entry ) {\r\n\t\t  case 'ltr':\r\n\t\t\tparsed.dir = 0;\r\n\t\t\tbreak;\r\n\t\t  case 'rtl':\r\n\t\t\tparsed.dir = 1;\r\n\t\t\tbreak;\r\n\t\t  default:\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'direction' option was not recognized.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testBehaviour ( parsed, entry ) {\r\n\r\n\t\t// Make sure the input is a string.\r\n\t\tif ( typeof entry !== 'string' ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'behaviour' must be a string containing options.\");\r\n\t\t}\r\n\r\n\t\t// Check if the string contains any keywords.\r\n\t\t// None are required.\r\n\t\tvar tap = entry.indexOf('tap') >= 0;\r\n\t\tvar drag = entry.indexOf('drag') >= 0;\r\n\t\tvar fixed = entry.indexOf('fixed') >= 0;\r\n\t\tvar snap = entry.indexOf('snap') >= 0;\r\n\t\tvar hover = entry.indexOf('hover') >= 0;\r\n\r\n\t\tif ( fixed ) {\r\n\r\n\t\t\tif ( parsed.handles !== 2 ) {\r\n\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'fixed' behaviour must be used with 2 handles\");\r\n\t\t\t}\r\n\r\n\t\t\t// Use margin to enforce fixed state\r\n\t\t\ttestMargin(parsed, parsed.start[1] - parsed.start[0]);\r\n\t\t}\r\n\r\n\t\tparsed.events = {\r\n\t\t\ttap: tap || snap,\r\n\t\t\tdrag: drag,\r\n\t\t\tfixed: fixed,\r\n\t\t\tsnap: snap,\r\n\t\t\thover: hover\r\n\t\t};\r\n\t}\r\n\r\n\tfunction testTooltips ( parsed, entry ) {\r\n\r\n\t\tif ( entry === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\telse if ( entry === true ) {\r\n\r\n\t\t\tparsed.tooltips = [];\r\n\r\n\t\t\tfor ( var i = 0; i < parsed.handles; i++ ) {\r\n\t\t\t\tparsed.tooltips.push(true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\telse {\r\n\r\n\t\t\tparsed.tooltips = asArray(entry);\r\n\r\n\t\t\tif ( parsed.tooltips.length !== parsed.handles ) {\r\n\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): must pass a formatter for all handles.\");\r\n\t\t\t}\r\n\r\n\t\t\tparsed.tooltips.forEach(function(formatter){\r\n\t\t\t\tif ( typeof formatter !== 'boolean' && (typeof formatter !== 'object' || typeof formatter.to !== 'function') ) {\r\n\t\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'tooltips' must be passed a formatter or 'false'.\");\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testAriaFormat ( parsed, entry ) {\r\n\t\tparsed.ariaFormat = entry;\r\n\t\tvalidateFormat(entry);\r\n\t}\r\n\r\n\tfunction testFormat ( parsed, entry ) {\r\n\t\tparsed.format = entry;\r\n\t\tvalidateFormat(entry);\r\n\t}\r\n\r\n\tfunction testCssPrefix ( parsed, entry ) {\r\n\r\n\t\tif ( entry !== undefined && typeof entry !== 'string' && entry !== false ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'cssPrefix' must be a string or `false`.\");\r\n\t\t}\r\n\r\n\t\tparsed.cssPrefix = entry;\r\n\t}\r\n\r\n\tfunction testCssClasses ( parsed, entry ) {\r\n\r\n\t\tif ( entry !== undefined && typeof entry !== 'object' ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'cssClasses' must be an object.\");\r\n\t\t}\r\n\r\n\t\tif ( typeof parsed.cssPrefix === 'string' ) {\r\n\t\t\tparsed.cssClasses = {};\r\n\r\n\t\t\tfor ( var key in entry ) {\r\n\t\t\t\tif ( !entry.hasOwnProperty(key) ) { continue; }\r\n\r\n\t\t\t\tparsed.cssClasses[key] = parsed.cssPrefix + entry[key];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tparsed.cssClasses = entry;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testUseRaf ( parsed, entry ) {\r\n\t\tif ( entry === true || entry === false ) {\r\n\t\t\tparsed.useRequestAnimationFrame = entry;\r\n\t\t} else {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'useRequestAnimationFrame' option should be true (default) or false.\");\r\n\t\t}\r\n\t}\r\n\r\n\t// Test all developer settings and parse to assumption-safe values.\r\n\tfunction testOptions ( options ) {\r\n\r\n\t\t// To prove a fix for #537, freeze options here.\r\n\t\t// If the object is modified, an error will be thrown.\r\n\t\t// Object.freeze(options);\r\n\r\n\t\tvar parsed = {\r\n\t\t\tmargin: 0,\r\n\t\t\tlimit: 0,\r\n\t\t\tpadding: 0,\r\n\t\t\tanimate: true,\r\n\t\t\tanimationDuration: 300,\r\n\t\t\tariaFormat: defaultFormatter,\r\n\t\t\tformat: defaultFormatter\r\n\t\t};\r\n\r\n\t\t// Tests are executed in the order they are presented here.\r\n\t\tvar tests = {\r\n\t\t\t'step': { r: false, t: testStep },\r\n\t\t\t'start': { r: true, t: testStart },\r\n\t\t\t'connect': { r: true, t: testConnect },\r\n\t\t\t'direction': { r: true, t: testDirection },\r\n\t\t\t'snap': { r: false, t: testSnap },\r\n\t\t\t'animate': { r: false, t: testAnimate },\r\n\t\t\t'animationDuration': { r: false, t: testAnimationDuration },\r\n\t\t\t'range': { r: true, t: testRange },\r\n\t\t\t'orientation': { r: false, t: testOrientation },\r\n\t\t\t'margin': { r: false, t: testMargin },\r\n\t\t\t'limit': { r: false, t: testLimit },\r\n\t\t\t'padding': { r: false, t: testPadding },\r\n\t\t\t'behaviour': { r: true, t: testBehaviour },\r\n\t\t\t'ariaFormat': { r: false, t: testAriaFormat },\r\n\t\t\t'format': { r: false, t: testFormat },\r\n\t\t\t'tooltips': { r: false, t: testTooltips },\r\n\t\t\t'cssPrefix': { r: false, t: testCssPrefix },\r\n\t\t\t'cssClasses': { r: false, t: testCssClasses },\r\n\t\t\t'useRequestAnimationFrame': { r: false, t: testUseRaf }\r\n\t\t};\r\n\r\n\t\tvar defaults = {\r\n\t\t\t'connect': false,\r\n\t\t\t'direction': 'ltr',\r\n\t\t\t'behaviour': 'tap',\r\n\t\t\t'orientation': 'horizontal',\r\n\t\t\t'cssPrefix' : 'noUi-',\r\n\t\t\t'cssClasses': {\r\n\t\t\t\ttarget: 'target',\r\n\t\t\t\tbase: 'base',\r\n\t\t\t\torigin: 'origin',\r\n\t\t\t\thandle: 'handle',\r\n\t\t\t\thandleLower: 'handle-lower',\r\n\t\t\t\thandleUpper: 'handle-upper',\r\n\t\t\t\thorizontal: 'horizontal',\r\n\t\t\t\tvertical: 'vertical',\r\n\t\t\t\tbackground: 'background',\r\n\t\t\t\tconnect: 'connect',\r\n\t\t\t\tltr: 'ltr',\r\n\t\t\t\trtl: 'rtl',\r\n\t\t\t\tdraggable: 'draggable',\r\n\t\t\t\tdrag: 'state-drag',\r\n\t\t\t\ttap: 'state-tap',\r\n\t\t\t\tactive: 'active',\r\n\t\t\t\ttooltip: 'tooltip',\r\n\t\t\t\tpips: 'pips',\r\n\t\t\t\tpipsHorizontal: 'pips-horizontal',\r\n\t\t\t\tpipsVertical: 'pips-vertical',\r\n\t\t\t\tmarker: 'marker',\r\n\t\t\t\tmarkerHorizontal: 'marker-horizontal',\r\n\t\t\t\tmarkerVertical: 'marker-vertical',\r\n\t\t\t\tmarkerNormal: 'marker-normal',\r\n\t\t\t\tmarkerLarge: 'marker-large',\r\n\t\t\t\tmarkerSub: 'marker-sub',\r\n\t\t\t\tvalue: 'value',\r\n\t\t\t\tvalueHorizontal: 'value-horizontal',\r\n\t\t\t\tvalueVertical: 'value-vertical',\r\n\t\t\t\tvalueNormal: 'value-normal',\r\n\t\t\t\tvalueLarge: 'value-large',\r\n\t\t\t\tvalueSub: 'value-sub'\r\n\t\t\t},\r\n\t\t\t'useRequestAnimationFrame': true\r\n\t\t};\r\n\r\n\t\t// AriaFormat defaults to regular format, if any.\r\n\t\tif ( options.format && !options.ariaFormat ) {\r\n\t\t\toptions.ariaFormat = options.format;\r\n\t\t}\r\n\r\n\t\t// Run all options through a testing mechanism to ensure correct\r\n\t\t// input. It should be noted that options might get modified to\r\n\t\t// be handled properly. E.g. wrapping integers in arrays.\r\n\t\tObject.keys(tests).forEach(function( name ){\r\n\r\n\t\t\t// If the option isn't set, but it is required, throw an error.\r\n\t\t\tif ( options[name] === undefined && defaults[name] === undefined ) {\r\n\r\n\t\t\t\tif ( tests[name].r ) {\r\n\t\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): '\" + name + \"' is required.\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\ttests[name].t( parsed, options[name] === undefined ? defaults[name] : options[name] );\r\n\t\t});\r\n\r\n\t\t// Forward pips options\r\n\t\tparsed.pips = options.pips;\r\n\r\n\t\tvar styles = [['left', 'top'], ['right', 'bottom']];\r\n\r\n\t\t// Pre-define the styles.\r\n\t\tparsed.style = styles[parsed.dir][parsed.ort];\r\n\t\tparsed.styleOposite = styles[parsed.dir?0:1][parsed.ort];\r\n\r\n\t\treturn parsed;\r\n\t}\r\n\r\n\r\nfunction closure ( target, options, originalOptions ){\r\n\r\n\tvar actions = getActions();\r\n\tvar supportsTouchActionNone = getSupportsTouchActionNone();\r\n\tvar supportsPassive = supportsTouchActionNone && getSupportsPassive();\r\n\r\n\t// All variables local to 'closure' are prefixed with 'scope_'\r\n\tvar scope_Target = target;\r\n\tvar scope_Locations = [];\r\n\tvar scope_Base;\r\n\tvar scope_Handles;\r\n\tvar scope_HandleNumbers = [];\r\n\tvar scope_ActiveHandle = false;\r\n\tvar scope_Connects;\r\n\tvar scope_Spectrum = options.spectrum;\r\n\tvar scope_Values = [];\r\n\tvar scope_Events = {};\r\n\tvar scope_Self;\r\n\tvar scope_Pips;\r\n\tvar scope_Listeners = null;\r\n\tvar scope_Document = target.ownerDocument;\r\n\tvar scope_DocumentElement = scope_Document.documentElement;\r\n\tvar scope_Body = scope_Document.body;\r\n\r\n\r\n\t// Creates a node, adds it to target, returns the new node.\r\n\tfunction addNodeTo ( target, className ) {\r\n\r\n\t\tvar div = scope_Document.createElement('div');\r\n\r\n\t\tif ( className ) {\r\n\t\t\taddClass(div, className);\r\n\t\t}\r\n\r\n\t\ttarget.appendChild(div);\r\n\r\n\t\treturn div;\r\n\t}\r\n\r\n\t// Append a origin to the base\r\n\tfunction addOrigin ( base, handleNumber ) {\r\n\r\n\t\tvar origin = addNodeTo(base, options.cssClasses.origin);\r\n\t\tvar handle = addNodeTo(origin, options.cssClasses.handle);\r\n\r\n\t\thandle.setAttribute('data-handle', handleNumber);\r\n\r\n\t\t// https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex\r\n\t\t// 0 = focusable and reachable\r\n\t\thandle.setAttribute('tabindex', '0');\r\n\t\thandle.setAttribute('role', 'slider');\r\n\t\thandle.setAttribute('aria-orientation', options.ort ? 'vertical' : 'horizontal');\r\n\r\n\t\tif ( handleNumber === 0 ) {\r\n\t\t\taddClass(handle, options.cssClasses.handleLower);\r\n\t\t}\r\n\r\n\t\telse if ( handleNumber === options.handles - 1 ) {\r\n\t\t\taddClass(handle, options.cssClasses.handleUpper);\r\n\t\t}\r\n\r\n\t\treturn origin;\r\n\t}\r\n\r\n\t// Insert nodes for connect elements\r\n\tfunction addConnect ( base, add ) {\r\n\r\n\t\tif ( !add ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn addNodeTo(base, options.cssClasses.connect);\r\n\t}\r\n\r\n\t// Add handles to the slider base.\r\n\tfunction addElements ( connectOptions, base ) {\r\n\r\n\t\tscope_Handles = [];\r\n\t\tscope_Connects = [];\r\n\r\n\t\tscope_Connects.push(addConnect(base, connectOptions[0]));\r\n\r\n\t\t// [::::O====O====O====]\r\n\t\t// connectOptions = [0, 1, 1, 1]\r\n\r\n\t\tfor ( var i = 0; i < options.handles; i++ ) {\r\n\t\t\t// Keep a list of all added handles.\r\n\t\t\tscope_Handles.push(addOrigin(base, i));\r\n\t\t\tscope_HandleNumbers[i] = i;\r\n\t\t\tscope_Connects.push(addConnect(base, connectOptions[i + 1]));\r\n\t\t}\r\n\t}\r\n\r\n\t// Initialize a single slider.\r\n\tfunction addSlider ( target ) {\r\n\r\n\t\t// Apply classes and data to the target.\r\n\t\taddClass(target, options.cssClasses.target);\r\n\r\n\t\tif ( options.dir === 0 ) {\r\n\t\t\taddClass(target, options.cssClasses.ltr);\r\n\t\t} else {\r\n\t\t\taddClass(target, options.cssClasses.rtl);\r\n\t\t}\r\n\r\n\t\tif ( options.ort === 0 ) {\r\n\t\t\taddClass(target, options.cssClasses.horizontal);\r\n\t\t} else {\r\n\t\t\taddClass(target, options.cssClasses.vertical);\r\n\t\t}\r\n\r\n\t\tscope_Base = addNodeTo(target, options.cssClasses.base);\r\n\t}\r\n\r\n\r\n\tfunction addTooltip ( handle, handleNumber ) {\r\n\r\n\t\tif ( !options.tooltips[handleNumber] ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn addNodeTo(handle.firstChild, options.cssClasses.tooltip);\r\n\t}\r\n\r\n\t// The tooltips option is a shorthand for using the 'update' event.\r\n\tfunction tooltips ( ) {\r\n\r\n\t\t// Tooltips are added with options.tooltips in original order.\r\n\t\tvar tips = scope_Handles.map(addTooltip);\r\n\r\n\t\tbindEvent('update', function(values, handleNumber, unencoded) {\r\n\r\n\t\t\tif ( !tips[handleNumber] ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar formattedValue = values[handleNumber];\r\n\r\n\t\t\tif ( options.tooltips[handleNumber] !== true ) {\r\n\t\t\t\tformattedValue = options.tooltips[handleNumber].to(unencoded[handleNumber]);\r\n\t\t\t}\r\n\r\n\t\t\ttips[handleNumber].innerHTML = formattedValue;\r\n\t\t});\r\n\t}\r\n\r\n\r\n\tfunction aria ( ) {\r\n\r\n\t\tbindEvent('update', function ( values, handleNumber, unencoded, tap, positions ) {\r\n\r\n\t\t\t// Update Aria Values for all handles, as a change in one changes min and max values for the next.\r\n\t\t\tscope_HandleNumbers.forEach(function( handleNumber ){\r\n\r\n\t\t\t\tvar handle = scope_Handles[handleNumber];\r\n\r\n\t\t\t\tvar min = checkHandlePosition(scope_Locations, handleNumber, 0, true, true, true);\r\n\t\t\t\tvar max = checkHandlePosition(scope_Locations, handleNumber, 100, true, true, true);\r\n\r\n\t\t\t\tvar now = positions[handleNumber];\r\n\t\t\t\tvar text = options.ariaFormat.to(unencoded[handleNumber]);\r\n\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuemin', min.toFixed(1));\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuemax', max.toFixed(1));\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuenow', now.toFixed(1));\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuetext', text);\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\r\n\tfunction getGroup ( mode, values, stepped ) {\r\n\r\n\t\t// Use the range.\r\n\t\tif ( mode === 'range' || mode === 'steps' ) {\r\n\t\t\treturn scope_Spectrum.xVal;\r\n\t\t}\r\n\r\n\t\tif ( mode === 'count' ) {\r\n\r\n\t\t\tif ( !values ) {\r\n\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'values' required for mode 'count'.\");\r\n\t\t\t}\r\n\r\n\t\t\t// Divide 0 - 100 in 'count' parts.\r\n\t\t\tvar spread = ( 100 / (values - 1) );\r\n\t\t\tvar v;\r\n\t\t\tvar i = 0;\r\n\r\n\t\t\tvalues = [];\r\n\r\n\t\t\t// List these parts and have them handled as 'positions'.\r\n\t\t\twhile ( (v = i++ * spread) <= 100 ) {\r\n\t\t\t\tvalues.push(v);\r\n\t\t\t}\r\n\r\n\t\t\tmode = 'positions';\r\n\t\t}\r\n\r\n\t\tif ( mode === 'positions' ) {\r\n\r\n\t\t\t// Map all percentages to on-range values.\r\n\t\t\treturn values.map(function( value ){\r\n\t\t\t\treturn scope_Spectrum.fromStepping( stepped ? scope_Spectrum.getStep( value ) : value );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( mode === 'values' ) {\r\n\r\n\t\t\t// If the value must be stepped, it needs to be converted to a percentage first.\r\n\t\t\tif ( stepped ) {\r\n\r\n\t\t\t\treturn values.map(function( value ){\r\n\r\n\t\t\t\t\t// Convert to percentage, apply step, return to value.\r\n\t\t\t\t\treturn scope_Spectrum.fromStepping( scope_Spectrum.getStep( scope_Spectrum.toStepping( value ) ) );\r\n\t\t\t\t});\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Otherwise, we can simply use the values.\r\n\t\t\treturn values;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction generateSpread ( density, mode, group ) {\r\n\r\n\t\tfunction safeIncrement(value, increment) {\r\n\t\t\t// Avoid floating point variance by dropping the smallest decimal places.\r\n\t\t\treturn (value + increment).toFixed(7) / 1;\r\n\t\t}\r\n\r\n\t\tvar indexes = {};\r\n\t\tvar firstInRange = scope_Spectrum.xVal[0];\r\n\t\tvar lastInRange = scope_Spectrum.xVal[scope_Spectrum.xVal.length-1];\r\n\t\tvar ignoreFirst = false;\r\n\t\tvar ignoreLast = false;\r\n\t\tvar prevPct = 0;\r\n\r\n\t\t// Create a copy of the group, sort it and filter away all duplicates.\r\n\t\tgroup = unique(group.slice().sort(function(a, b){ return a - b; }));\r\n\r\n\t\t// Make sure the range starts with the first element.\r\n\t\tif ( group[0] !== firstInRange ) {\r\n\t\t\tgroup.unshift(firstInRange);\r\n\t\t\tignoreFirst = true;\r\n\t\t}\r\n\r\n\t\t// Likewise for the last one.\r\n\t\tif ( group[group.length - 1] !== lastInRange ) {\r\n\t\t\tgroup.push(lastInRange);\r\n\t\t\tignoreLast = true;\r\n\t\t}\r\n\r\n\t\tgroup.forEach(function ( current, index ) {\r\n\r\n\t\t\t// Get the current step and the lower + upper positions.\r\n\t\t\tvar step;\r\n\t\t\tvar i;\r\n\t\t\tvar q;\r\n\t\t\tvar low = current;\r\n\t\t\tvar high = group[index+1];\r\n\t\t\tvar newPct;\r\n\t\t\tvar pctDifference;\r\n\t\t\tvar pctPos;\r\n\t\t\tvar type;\r\n\t\t\tvar steps;\r\n\t\t\tvar realSteps;\r\n\t\t\tvar stepsize;\r\n\r\n\t\t\t// When using 'steps' mode, use the provided steps.\r\n\t\t\t// Otherwise, we'll step on to the next subrange.\r\n\t\t\tif ( mode === 'steps' ) {\r\n\t\t\t\tstep = scope_Spectrum.xNumSteps[ index ];\r\n\t\t\t}\r\n\r\n\t\t\t// Default to a 'full' step.\r\n\t\t\tif ( !step ) {\r\n\t\t\t\tstep = high-low;\r\n\t\t\t}\r\n\r\n\t\t\t// Low can be 0, so test for false. If high is undefined,\r\n\t\t\t// we are at the last subrange. Index 0 is already handled.\r\n\t\t\tif ( low === false || high === undefined ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Make sure step isn't 0, which would cause an infinite loop (#654)\r\n\t\t\tstep = Math.max(step, 0.0000001);\r\n\r\n\t\t\t// Find all steps in the subrange.\r\n\t\t\tfor ( i = low; i <= high; i = safeIncrement(i, step) ) {\r\n\r\n\t\t\t\t// Get the percentage value for the current step,\r\n\t\t\t\t// calculate the size for the subrange.\r\n\t\t\t\tnewPct = scope_Spectrum.toStepping( i );\r\n\t\t\t\tpctDifference = newPct - prevPct;\r\n\r\n\t\t\t\tsteps = pctDifference / density;\r\n\t\t\t\trealSteps = Math.round(steps);\r\n\r\n\t\t\t\t// This ratio represents the ammount of percentage-space a point indicates.\r\n\t\t\t\t// For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-devided.\r\n\t\t\t\t// Round the percentage offset to an even number, then divide by two\r\n\t\t\t\t// to spread the offset on both sides of the range.\r\n\t\t\t\tstepsize = pctDifference/realSteps;\r\n\r\n\t\t\t\t// Divide all points evenly, adding the correct number to this subrange.\r\n\t\t\t\t// Run up to <= so that 100% gets a point, event if ignoreLast is set.\r\n\t\t\t\tfor ( q = 1; q <= realSteps; q += 1 ) {\r\n\r\n\t\t\t\t\t// The ratio between the rounded value and the actual size might be ~1% off.\r\n\t\t\t\t\t// Correct the percentage offset by the number of points\r\n\t\t\t\t\t// per subrange. density = 1 will result in 100 points on the\r\n\t\t\t\t\t// full range, 2 for 50, 4 for 25, etc.\r\n\t\t\t\t\tpctPos = prevPct + ( q * stepsize );\r\n\t\t\t\t\tindexes[pctPos.toFixed(5)] = ['x', 0];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Determine the point type.\r\n\t\t\t\ttype = (group.indexOf(i) > -1) ? 1 : ( mode === 'steps' ? 2 : 0 );\r\n\r\n\t\t\t\t// Enforce the 'ignoreFirst' option by overwriting the type for 0.\r\n\t\t\t\tif ( !index && ignoreFirst ) {\r\n\t\t\t\t\ttype = 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( !(i === high && ignoreLast)) {\r\n\t\t\t\t\t// Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value.\r\n\t\t\t\t\tindexes[newPct.toFixed(5)] = [i, type];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Update the percentage count.\r\n\t\t\t\tprevPct = newPct;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn indexes;\r\n\t}\r\n\r\n\tfunction addMarking ( spread, filterFunc, formatter ) {\r\n\r\n\t\tvar element = scope_Document.createElement('div');\r\n\r\n\t\tvar valueSizeClasses = [\r\n\t\t\toptions.cssClasses.valueNormal,\r\n\t\t\toptions.cssClasses.valueLarge,\r\n\t\t\toptions.cssClasses.valueSub\r\n\t\t];\r\n\t\tvar markerSizeClasses = [\r\n\t\t\toptions.cssClasses.markerNormal,\r\n\t\t\toptions.cssClasses.markerLarge,\r\n\t\t\toptions.cssClasses.markerSub\r\n\t\t];\r\n\t\tvar valueOrientationClasses = [\r\n\t\t\toptions.cssClasses.valueHorizontal,\r\n\t\t\toptions.cssClasses.valueVertical\r\n\t\t];\r\n\t\tvar markerOrientationClasses = [\r\n\t\t\toptions.cssClasses.markerHorizontal,\r\n\t\t\toptions.cssClasses.markerVertical\r\n\t\t];\r\n\r\n\t\taddClass(element, options.cssClasses.pips);\r\n\t\taddClass(element, options.ort === 0 ? options.cssClasses.pipsHorizontal : options.cssClasses.pipsVertical);\r\n\r\n\t\tfunction getClasses( type, source ){\r\n\t\t\tvar a = source === options.cssClasses.value;\r\n\t\t\tvar orientationClasses = a ? valueOrientationClasses : markerOrientationClasses;\r\n\t\t\tvar sizeClasses = a ? valueSizeClasses : markerSizeClasses;\r\n\r\n\t\t\treturn source + ' ' + orientationClasses[options.ort] + ' ' + sizeClasses[type];\r\n\t\t}\r\n\r\n\t\tfunction addSpread ( offset, values ){\r\n\r\n\t\t\t// Apply the filter function, if it is set.\r\n\t\t\tvalues[1] = (values[1] && filterFunc) ? filterFunc(values[0], values[1]) : values[1];\r\n\r\n\t\t\t// Add a marker for every point\r\n\t\t\tvar node = addNodeTo(element, false);\r\n\t\t\t\tnode.className = getClasses(values[1], options.cssClasses.marker);\r\n\t\t\t\tnode.style[options.style] = offset + '%';\r\n\r\n\t\t\t// Values are only appended for points marked '1' or '2'.\r\n\t\t\tif ( values[1] ) {\r\n\t\t\t\tnode = addNodeTo(element, false);\r\n\t\t\t\tnode.className = getClasses(values[1], options.cssClasses.value);\r\n\t\t\t\tnode.style[options.style] = offset + '%';\r\n\t\t\t\tnode.innerText = formatter.to(values[0]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Append all points.\r\n\t\tObject.keys(spread).forEach(function(a){\r\n\t\t\taddSpread(a, spread[a]);\r\n\t\t});\r\n\r\n\t\treturn element;\r\n\t}\r\n\r\n\tfunction removePips ( ) {\r\n\t\tif ( scope_Pips ) {\r\n\t\t\tremoveElement(scope_Pips);\r\n\t\t\tscope_Pips = null;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction pips ( grid ) {\r\n\r\n\t\t// Fix #669\r\n\t\tremovePips();\r\n\r\n\t\tvar mode = grid.mode;\r\n\t\tvar density = grid.density || 1;\r\n\t\tvar filter = grid.filter || false;\r\n\t\tvar values = grid.values || false;\r\n\t\tvar stepped = grid.stepped || false;\r\n\t\tvar group = getGroup( mode, values, stepped );\r\n\t\tvar spread = generateSpread( density, mode, group );\r\n\t\tvar format = grid.format || {\r\n\t\t\tto: Math.round\r\n\t\t};\r\n\r\n\t\tscope_Pips = scope_Target.appendChild(addMarking(\r\n\t\t\tspread,\r\n\t\t\tfilter,\r\n\t\t\tformat\r\n\t\t));\r\n\r\n\t\treturn scope_Pips;\r\n\t}\r\n\r\n\r\n\t// Shorthand for base dimensions.\r\n\tfunction baseSize ( ) {\r\n\t\tvar rect = scope_Base.getBoundingClientRect(), alt = 'offset' + ['Width', 'Height'][options.ort];\r\n\t\treturn options.ort === 0 ? (rect.width||scope_Base[alt]) : (rect.height||scope_Base[alt]);\r\n\t}\r\n\r\n\t// Handler for attaching events trough a proxy.\r\n\tfunction attachEvent ( events, element, callback, data ) {\r\n\r\n\t\t// This function can be used to 'filter' events to the slider.\r\n\t\t// element is a node, not a nodeList\r\n\r\n\t\tvar method = function ( e ){\r\n\r\n\t\t\tif ( scope_Target.hasAttribute('disabled') ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Stop if an active 'tap' transition is taking place.\r\n\t\t\tif ( hasClass(scope_Target, options.cssClasses.tap) ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\te = fixEvent(e, data.pageOffset);\r\n\r\n\t\t\t// Handle reject of multitouch\r\n\t\t\tif ( !e ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Ignore right or middle clicks on start #454\r\n\t\t\tif ( events === actions.start && e.buttons !== undefined && e.buttons > 1 ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Ignore right or middle clicks on start #454\r\n\t\t\tif ( data.hover && e.buttons ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// 'supportsPassive' is only true if a browser also supports touch-action: none in CSS.\r\n\t\t\t// iOS safari does not, so it doesn't get to benefit from passive scrolling. iOS does support\r\n\t\t\t// touch-action: manipulation, but that allows panning, which breaks\r\n\t\t\t// sliders after zooming/on non-responsive pages.\r\n\t\t\t// See: https://bugs.webkit.org/show_bug.cgi?id=133112\r\n\t\t\tif ( !supportsPassive ) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t}\r\n\r\n\t\t\te.calcPoint = e.points[ options.ort ];\r\n\r\n\t\t\t// Call the event handler with the event [ and additional data ].\r\n\t\t\tcallback ( e, data );\r\n\t\t};\r\n\r\n\t\tvar methods = [];\r\n\r\n\t\t// Bind a closure on the target for every event type.\r\n\t\tevents.split(' ').forEach(function( eventName ){\r\n\t\t\telement.addEventListener(eventName, method, supportsPassive ? { passive: true } : false);\r\n\t\t\tmethods.push([eventName, method]);\r\n\t\t});\r\n\r\n\t\treturn methods;\r\n\t}\r\n\r\n\t// Provide a clean event with standardized offset values.\r\n\tfunction fixEvent ( e, pageOffset ) {\r\n\r\n\t\t// Filter the event to register the type, which can be\r\n\t\t// touch, mouse or pointer. Offset changes need to be\r\n\t\t// made on an event specific basis.\r\n\t\tvar touch = e.type.indexOf('touch') === 0;\r\n\t\tvar mouse = e.type.indexOf('mouse') === 0;\r\n\t\tvar pointer = e.type.indexOf('pointer') === 0;\r\n\r\n\t\tvar x;\r\n\t\tvar y;\r\n\r\n\t\t// IE10 implemented pointer events with a prefix;\r\n\t\tif ( e.type.indexOf('MSPointer') === 0 ) {\r\n\t\t\tpointer = true;\r\n\t\t}\r\n\r\n\t\tif ( touch ) {\r\n\r\n\t\t\t// Fix bug when user touches with two or more fingers on mobile devices.\r\n\t\t\t// It's useful when you have two or more sliders on one page,\r\n\t\t\t// that can be touched simultaneously.\r\n\t\t\t// #649, #663, #668\r\n\t\t\tif ( e.touches.length > 1 ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// noUiSlider supports one movement at a time,\r\n\t\t\t// so we can select the first 'changedTouch'.\r\n\t\t\tx = e.changedTouches[0].pageX;\r\n\t\t\ty = e.changedTouches[0].pageY;\r\n\t\t}\r\n\r\n\t\tpageOffset = pageOffset || getPageOffset(scope_Document);\r\n\r\n\t\tif ( mouse || pointer ) {\r\n\t\t\tx = e.clientX + pageOffset.x;\r\n\t\t\ty = e.clientY + pageOffset.y;\r\n\t\t}\r\n\r\n\t\te.pageOffset = pageOffset;\r\n\t\te.points = [x, y];\r\n\t\te.cursor = mouse || pointer; // Fix #435\r\n\r\n\t\treturn e;\r\n\t}\r\n\r\n\t// Translate a coordinate in the document to a percentage on the slider\r\n\tfunction calcPointToPercentage ( calcPoint ) {\r\n\t\tvar location = calcPoint - offset(scope_Base, options.ort);\r\n\t\tvar proposal = ( location * 100 ) / baseSize();\r\n\t\treturn options.dir ? 100 - proposal : proposal;\r\n\t}\r\n\r\n\t// Find handle closest to a certain percentage on the slider\r\n\tfunction getClosestHandle ( proposal ) {\r\n\r\n\t\tvar closest = 100;\r\n\t\tvar handleNumber = false;\r\n\r\n\t\tscope_Handles.forEach(function(handle, index){\r\n\r\n\t\t\t// Disabled handles are ignored\r\n\t\t\tif ( handle.hasAttribute('disabled') ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar pos = Math.abs(scope_Locations[index] - proposal);\r\n\r\n\t\t\tif ( pos < closest ) {\r\n\t\t\t\thandleNumber = index;\r\n\t\t\t\tclosest = pos;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn handleNumber;\r\n\t}\r\n\r\n\t// Moves handle(s) by a percentage\r\n\t// (bool, % to move, [% where handle started, ...], [index in scope_Handles, ...])\r\n\tfunction moveHandles ( upward, proposal, locations, handleNumbers ) {\r\n\r\n\t\tvar proposals = locations.slice();\r\n\r\n\t\tvar b = [!upward, upward];\r\n\t\tvar f = [upward, !upward];\r\n\r\n\t\t// Copy handleNumbers so we don't change the dataset\r\n\t\thandleNumbers = handleNumbers.slice();\r\n\r\n\t\t// Check to see which handle is 'leading'.\r\n\t\t// If that one can't move the second can't either.\r\n\t\tif ( upward ) {\r\n\t\t\thandleNumbers.reverse();\r\n\t\t}\r\n\r\n\t\t// Step 1: get the maximum percentage that any of the handles can move\r\n\t\tif ( handleNumbers.length > 1 ) {\r\n\r\n\t\t\thandleNumbers.forEach(function(handleNumber, o) {\r\n\r\n\t\t\t\tvar to = checkHandlePosition(proposals, handleNumber, proposals[handleNumber] + proposal, b[o], f[o], false);\r\n\r\n\t\t\t\t// Stop if one of the handles can't move.\r\n\t\t\t\tif ( to === false ) {\r\n\t\t\t\t\tproposal = 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tproposal = to - proposals[handleNumber];\r\n\t\t\t\t\tproposals[handleNumber] = to;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// If using one handle, check backward AND forward\r\n\t\telse {\r\n\t\t\tb = f = [true];\r\n\t\t}\r\n\r\n\t\tvar state = false;\r\n\r\n\t\t// Step 2: Try to set the handles with the found percentage\r\n\t\thandleNumbers.forEach(function(handleNumber, o) {\r\n\t\t\tstate = setHandle(handleNumber, locations[handleNumber] + proposal, b[o], f[o]) || state;\r\n\t\t});\r\n\r\n\t\t// Step 3: If a handle moved, fire events\r\n\t\tif ( state ) {\r\n\t\t\thandleNumbers.forEach(function(handleNumber){\r\n\t\t\t\tfireEvent('update', handleNumber);\r\n\t\t\t\tfireEvent('slide', handleNumber);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// External event handling\r\n\tfunction fireEvent ( eventName, handleNumber, tap ) {\r\n\r\n\t\tObject.keys(scope_Events).forEach(function( targetEvent ) {\r\n\r\n\t\t\tvar eventType = targetEvent.split('.')[0];\r\n\r\n\t\t\tif ( eventName === eventType ) {\r\n\t\t\t\tscope_Events[targetEvent].forEach(function( callback ) {\r\n\r\n\t\t\t\t\tcallback.call(\r\n\t\t\t\t\t\t// Use the slider public API as the scope ('this')\r\n\t\t\t\t\t\tscope_Self,\r\n\t\t\t\t\t\t// Return values as array, so arg_1[arg_2] is always valid.\r\n\t\t\t\t\t\tscope_Values.map(options.format.to),\r\n\t\t\t\t\t\t// Handle index, 0 or 1\r\n\t\t\t\t\t\thandleNumber,\r\n\t\t\t\t\t\t// Unformatted slider values\r\n\t\t\t\t\t\tscope_Values.slice(),\r\n\t\t\t\t\t\t// Event is fired by tap, true or false\r\n\t\t\t\t\t\ttap || false,\r\n\t\t\t\t\t\t// Left offset of the handle, in relation to the slider\r\n\t\t\t\t\t\tscope_Locations.slice()\r\n\t\t\t\t\t);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\r\n\t// Fire 'end' when a mouse or pen leaves the document.\r\n\tfunction documentLeave ( event, data ) {\r\n\t\tif ( event.type === \"mouseout\" && event.target.nodeName === \"HTML\" && event.relatedTarget === null ){\r\n\t\t\teventEnd (event, data);\r\n\t\t}\r\n\t}\r\n\r\n\t// Handle movement on document for handle and range drag.\r\n\tfunction eventMove ( event, data ) {\r\n\r\n\t\t// Fix #498\r\n\t\t// Check value of .buttons in 'start' to work around a bug in IE10 mobile (data.buttonsProperty).\r\n\t\t// https://connect.microsoft.com/IE/feedback/details/927005/mobile-ie10-windows-phone-buttons-property-of-pointermove-event-always-zero\r\n\t\t// IE9 has .buttons and .which zero on mousemove.\r\n\t\t// Firefox breaks the spec MDN defines.\r\n\t\tif ( navigator.appVersion.indexOf(\"MSIE 9\") === -1 && event.buttons === 0 && data.buttonsProperty !== 0 ) {\r\n\t\t\treturn eventEnd(event, data);\r\n\t\t}\r\n\r\n\t\t// Check if we are moving up or down\r\n\t\tvar movement = (options.dir ? -1 : 1) * (event.calcPoint - data.startCalcPoint);\r\n\r\n\t\t// Convert the movement into a percentage of the slider width/height\r\n\t\tvar proposal = (movement * 100) / data.baseSize;\r\n\r\n\t\tmoveHandles(movement > 0, proposal, data.locations, data.handleNumbers);\r\n\t}\r\n\r\n\t// Unbind move events on document, call callbacks.\r\n\tfunction eventEnd ( event, data ) {\r\n\r\n\t\t// The handle is no longer active, so remove the class.\r\n\t\tif ( scope_ActiveHandle ) {\r\n\t\t\tremoveClass(scope_ActiveHandle, options.cssClasses.active);\r\n\t\t\tscope_ActiveHandle = false;\r\n\t\t}\r\n\r\n\t\t// Remove cursor styles and text-selection events bound to the body.\r\n\t\tif ( event.cursor ) {\r\n\t\t\tscope_Body.style.cursor = '';\r\n\t\t\tscope_Body.removeEventListener('selectstart', preventDefault);\r\n\t\t}\r\n\r\n\t\t// Unbind the move and end events, which are added on 'start'.\r\n\t\tscope_Listeners.forEach(function( c ) {\r\n\t\t\tscope_DocumentElement.removeEventListener(c[0], c[1]);\r\n\t\t});\r\n\r\n\t\t// Remove dragging class.\r\n\t\tremoveClass(scope_Target, options.cssClasses.drag);\r\n\r\n\t\tsetZindex();\r\n\r\n\t\tdata.handleNumbers.forEach(function(handleNumber){\r\n\t\t\tfireEvent('change', handleNumber);\r\n\t\t\tfireEvent('set', handleNumber);\r\n\t\t\tfireEvent('end', handleNumber);\r\n\t\t});\r\n\t}\r\n\r\n\t// Bind move events on document.\r\n\tfunction eventStart ( event, data ) {\r\n\r\n\t\tif ( data.handleNumbers.length === 1 ) {\r\n\r\n\t\t\tvar handle = scope_Handles[data.handleNumbers[0]];\r\n\r\n\t\t\t// Ignore 'disabled' handles\r\n\t\t\tif ( handle.hasAttribute('disabled') ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Mark the handle as 'active' so it can be styled.\r\n\t\t\tscope_ActiveHandle = handle.children[0];\r\n\t\t\taddClass(scope_ActiveHandle, options.cssClasses.active);\r\n\t\t}\r\n\r\n\t\t// A drag should never propagate up to the 'tap' event.\r\n\t\tevent.stopPropagation();\r\n\r\n\t\t// Attach the move and end events.\r\n\t\tvar moveEvent = attachEvent(actions.move, scope_DocumentElement, eventMove, {\r\n\t\t\tstartCalcPoint: event.calcPoint,\r\n\t\t\tbaseSize: baseSize(),\r\n\t\t\tpageOffset: event.pageOffset,\r\n\t\t\thandleNumbers: data.handleNumbers,\r\n\t\t\tbuttonsProperty: event.buttons,\r\n\t\t\tlocations: scope_Locations.slice()\r\n\t\t});\r\n\r\n\t\tvar endEvent = attachEvent(actions.end, scope_DocumentElement, eventEnd, {\r\n\t\t\thandleNumbers: data.handleNumbers\r\n\t\t});\r\n\r\n\t\tvar outEvent = attachEvent(\"mouseout\", scope_DocumentElement, documentLeave, {\r\n\t\t\thandleNumbers: data.handleNumbers\r\n\t\t});\r\n\r\n\t\tscope_Listeners = moveEvent.concat(endEvent, outEvent);\r\n\r\n\t\t// Text selection isn't an issue on touch devices,\r\n\t\t// so adding cursor styles can be skipped.\r\n\t\tif ( event.cursor ) {\r\n\r\n\t\t\t// Prevent the 'I' cursor and extend the range-drag cursor.\r\n\t\t\tscope_Body.style.cursor = getComputedStyle(event.target).cursor;\r\n\r\n\t\t\t// Mark the target with a dragging state.\r\n\t\t\tif ( scope_Handles.length > 1 ) {\r\n\t\t\t\taddClass(scope_Target, options.cssClasses.drag);\r\n\t\t\t}\r\n\r\n\t\t\t// Prevent text selection when dragging the handles.\r\n\t\t\t// In noUiSlider <= 9.2.0, this was handled by calling preventDefault on mouse/touch start/move,\r\n\t\t\t// which is scroll blocking. The selectstart event is supported by FireFox starting from version 52,\r\n\t\t\t// meaning the only holdout is iOS Safari. This doesn't matter: text selection isn't triggered there.\r\n\t\t\t// The 'cursor' flag is false.\r\n\t\t\t// See: http://caniuse.com/#search=selectstart\r\n\t\t\tscope_Body.addEventListener('selectstart', preventDefault, false);\r\n\t\t}\r\n\r\n\t\tdata.handleNumbers.forEach(function(handleNumber){\r\n\t\t\tfireEvent('start', handleNumber);\r\n\t\t});\r\n\t}\r\n\r\n\t// Move closest handle to tapped location.\r\n\tfunction eventTap ( event ) {\r\n\r\n\t\t// The tap event shouldn't propagate up\r\n\t\tevent.stopPropagation();\r\n\r\n\t\tvar proposal = calcPointToPercentage(event.calcPoint);\r\n\t\tvar handleNumber = getClosestHandle(proposal);\r\n\r\n\t\t// Tackle the case that all handles are 'disabled'.\r\n\t\tif ( handleNumber === false ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Flag the slider as it is now in a transitional state.\r\n\t\t// Transition takes a configurable amount of ms (default 300). Re-enable the slider after that.\r\n\t\tif ( !options.events.snap ) {\r\n\t\t\taddClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);\r\n\t\t}\r\n\r\n\t\tsetHandle(handleNumber, proposal, true, true);\r\n\r\n\t\tsetZindex();\r\n\r\n\t\tfireEvent('slide', handleNumber, true);\r\n\t\tfireEvent('update', handleNumber, true);\r\n\t\tfireEvent('change', handleNumber, true);\r\n\t\tfireEvent('set', handleNumber, true);\r\n\r\n\t\tif ( options.events.snap ) {\r\n\t\t\teventStart(event, { handleNumbers: [handleNumber] });\r\n\t\t}\r\n\t}\r\n\r\n\t// Fires a 'hover' event for a hovered mouse/pen position.\r\n\tfunction eventHover ( event ) {\r\n\r\n\t\tvar proposal = calcPointToPercentage(event.calcPoint);\r\n\r\n\t\tvar to = scope_Spectrum.getStep(proposal);\r\n\t\tvar value = scope_Spectrum.fromStepping(to);\r\n\r\n\t\tObject.keys(scope_Events).forEach(function( targetEvent ) {\r\n\t\t\tif ( 'hover' === targetEvent.split('.')[0] ) {\r\n\t\t\t\tscope_Events[targetEvent].forEach(function( callback ) {\r\n\t\t\t\t\tcallback.call( scope_Self, value );\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Attach events to several slider parts.\r\n\tfunction bindSliderEvents ( behaviour ) {\r\n\r\n\t\t// Attach the standard drag event to the handles.\r\n\t\tif ( !behaviour.fixed ) {\r\n\r\n\t\t\tscope_Handles.forEach(function( handle, index ){\r\n\r\n\t\t\t\t// These events are only bound to the visual handle\r\n\t\t\t\t// element, not the 'real' origin element.\r\n\t\t\t\tattachEvent ( actions.start, handle.children[0], eventStart, {\r\n\t\t\t\t\thandleNumbers: [index]\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Attach the tap event to the slider base.\r\n\t\tif ( behaviour.tap ) {\r\n\t\t\tattachEvent (actions.start, scope_Base, eventTap, {});\r\n\t\t}\r\n\r\n\t\t// Fire hover events\r\n\t\tif ( behaviour.hover ) {\r\n\t\t\tattachEvent (actions.move, scope_Base, eventHover, { hover: true });\r\n\t\t}\r\n\r\n\t\t// Make the range draggable.\r\n\t\tif ( behaviour.drag ){\r\n\r\n\t\t\tscope_Connects.forEach(function( connect, index ){\r\n\r\n\t\t\t\tif ( connect === false || index === 0 || index === scope_Connects.length - 1 ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar handleBefore = scope_Handles[index - 1];\r\n\t\t\t\tvar handleAfter = scope_Handles[index];\r\n\t\t\t\tvar eventHolders = [connect];\r\n\r\n\t\t\t\taddClass(connect, options.cssClasses.draggable);\r\n\r\n\t\t\t\t// When the range is fixed, the entire range can\r\n\t\t\t\t// be dragged by the handles. The handle in the first\r\n\t\t\t\t// origin will propagate the start event upward,\r\n\t\t\t\t// but it needs to be bound manually on the other.\r\n\t\t\t\tif ( behaviour.fixed ) {\r\n\t\t\t\t\teventHolders.push(handleBefore.children[0]);\r\n\t\t\t\t\teventHolders.push(handleAfter.children[0]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\teventHolders.forEach(function( eventHolder ) {\r\n\t\t\t\t\tattachEvent ( actions.start, eventHolder, eventStart, {\r\n\t\t\t\t\t\thandles: [handleBefore, handleAfter],\r\n\t\t\t\t\t\thandleNumbers: [index - 1, index]\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t// Split out the handle positioning logic so the Move event can use it, too\r\n\tfunction checkHandlePosition ( reference, handleNumber, to, lookBackward, lookForward, getValue ) {\r\n\r\n\t\t// For sliders with multiple handles, limit movement to the other handle.\r\n\t\t// Apply the margin option by adding it to the handle positions.\r\n\t\tif ( scope_Handles.length > 1 ) {\r\n\r\n\t\t\tif ( lookBackward && handleNumber > 0 ) {\r\n\t\t\t\tto = Math.max(to, reference[handleNumber - 1] + options.margin);\r\n\t\t\t}\r\n\r\n\t\t\tif ( lookForward && handleNumber < scope_Handles.length - 1 ) {\r\n\t\t\t\tto = Math.min(to, reference[handleNumber + 1] - options.margin);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// The limit option has the opposite effect, limiting handles to a\r\n\t\t// maximum distance from another. Limit must be > 0, as otherwise\r\n\t\t// handles would be unmoveable.\r\n\t\tif ( scope_Handles.length > 1 && options.limit ) {\r\n\r\n\t\t\tif ( lookBackward && handleNumber > 0 ) {\r\n\t\t\t\tto = Math.min(to, reference[handleNumber - 1] + options.limit);\r\n\t\t\t}\r\n\r\n\t\t\tif ( lookForward && handleNumber < scope_Handles.length - 1 ) {\r\n\t\t\t\tto = Math.max(to, reference[handleNumber + 1] - options.limit);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// The padding option keeps the handles a certain distance from the\r\n\t\t// edges of the slider. Padding must be > 0.\r\n\t\tif ( options.padding ) {\r\n\r\n\t\t\tif ( handleNumber === 0 ) {\r\n\t\t\t\tto = Math.max(to, options.padding);\r\n\t\t\t}\r\n\r\n\t\t\tif ( handleNumber === scope_Handles.length - 1 ) {\r\n\t\t\t\tto = Math.min(to, 100 - options.padding);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tto = scope_Spectrum.getStep(to);\r\n\r\n\t\t// Limit percentage to the 0 - 100 range\r\n\t\tto = limit(to);\r\n\r\n\t\t// Return false if handle can't move\r\n\t\tif ( to === reference[handleNumber] && !getValue ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn to;\r\n\t}\r\n\r\n\tfunction toPct ( pct ) {\r\n\t\treturn pct + '%';\r\n\t}\r\n\r\n\t// Updates scope_Locations and scope_Values, updates visual state\r\n\tfunction updateHandlePosition ( handleNumber, to ) {\r\n\r\n\t\t// Update locations.\r\n\t\tscope_Locations[handleNumber] = to;\r\n\r\n\t\t// Convert the value to the slider stepping/range.\r\n\t\tscope_Values[handleNumber] = scope_Spectrum.fromStepping(to);\r\n\r\n\t\t// Called synchronously or on the next animationFrame\r\n\t\tvar stateUpdate = function() {\r\n\t\t\tscope_Handles[handleNumber].style[options.style] = toPct(to);\r\n\t\t\tupdateConnect(handleNumber);\r\n\t\t\tupdateConnect(handleNumber + 1);\r\n\t\t};\r\n\r\n\t\t// Set the handle to the new position.\r\n\t\t// Use requestAnimationFrame for efficient painting.\r\n\t\t// No significant effect in Chrome, Edge sees dramatic performace improvements.\r\n\t\t// Option to disable is useful for unit tests, and single-step debugging.\r\n\t\tif ( window.requestAnimationFrame && options.useRequestAnimationFrame ) {\r\n\t\t\twindow.requestAnimationFrame(stateUpdate);\r\n\t\t} else {\r\n\t\t\tstateUpdate();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction setZindex ( ) {\r\n\r\n\t\tscope_HandleNumbers.forEach(function(handleNumber){\r\n\t\t\t// Handles before the slider middle are stacked later = higher,\r\n\t\t\t// Handles after the middle later is lower\r\n\t\t\t// [[7] [8] .......... | .......... [5] [4]\r\n\t\t\tvar dir = (scope_Locations[handleNumber] > 50 ? -1 : 1);\r\n\t\t\tvar zIndex = 3 + (scope_Handles.length + (dir * handleNumber));\r\n\t\t\tscope_Handles[handleNumber].childNodes[0].style.zIndex = zIndex;\r\n\t\t});\r\n\t}\r\n\r\n\t// Test suggested values and apply margin, step.\r\n\tfunction setHandle ( handleNumber, to, lookBackward, lookForward ) {\r\n\r\n\t\tto = checkHandlePosition(scope_Locations, handleNumber, to, lookBackward, lookForward, false);\r\n\r\n\t\tif ( to === false ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tupdateHandlePosition(handleNumber, to);\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// Updates style attribute for connect nodes\r\n\tfunction updateConnect ( index ) {\r\n\r\n\t\t// Skip connects set to false\r\n\t\tif ( !scope_Connects[index] ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar l = 0;\r\n\t\tvar h = 100;\r\n\r\n\t\tif ( index !== 0 ) {\r\n\t\t\tl = scope_Locations[index - 1];\r\n\t\t}\r\n\r\n\t\tif ( index !== scope_Connects.length - 1 ) {\r\n\t\t\th = scope_Locations[index];\r\n\t\t}\r\n\r\n\t\tscope_Connects[index].style[options.style] = toPct(l);\r\n\t\tscope_Connects[index].style[options.styleOposite] = toPct(100 - h);\r\n\t}\r\n\r\n\t// ...\r\n\tfunction setValue ( to, handleNumber ) {\r\n\r\n\t\t// Setting with null indicates an 'ignore'.\r\n\t\t// Inputting 'false' is invalid.\r\n\t\tif ( to === null || to === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// If a formatted number was passed, attemt to decode it.\r\n\t\tif ( typeof to === 'number' ) {\r\n\t\t\tto = String(to);\r\n\t\t}\r\n\r\n\t\tto = options.format.from(to);\r\n\r\n\t\t// Request an update for all links if the value was invalid.\r\n\t\t// Do so too if setting the handle fails.\r\n\t\tif ( to !== false && !isNaN(to) ) {\r\n\t\t\tsetHandle(handleNumber, scope_Spectrum.toStepping(to), false, false);\r\n\t\t}\r\n\t}\r\n\r\n\t// Set the slider value.\r\n\tfunction valueSet ( input, fireSetEvent ) {\r\n\r\n\t\tvar values = asArray(input);\r\n\t\tvar isInit = scope_Locations[0] === undefined;\r\n\r\n\t\t// Event fires by default\r\n\t\tfireSetEvent = (fireSetEvent === undefined ? true : !!fireSetEvent);\r\n\r\n\t\tvalues.forEach(setValue);\r\n\r\n\t\t// Animation is optional.\r\n\t\t// Make sure the initial values were set before using animated placement.\r\n\t\tif ( options.animate && !isInit ) {\r\n\t\t\taddClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);\r\n\t\t}\r\n\r\n\t\t// Now that all base values are set, apply constraints\r\n\t\tscope_HandleNumbers.forEach(function(handleNumber){\r\n\t\t\tsetHandle(handleNumber, scope_Locations[handleNumber], true, false);\r\n\t\t});\r\n\r\n\t\tsetZindex();\r\n\r\n\t\tscope_HandleNumbers.forEach(function(handleNumber){\r\n\r\n\t\t\tfireEvent('update', handleNumber);\r\n\r\n\t\t\t// Fire the event only for handles that received a new value, as per #579\r\n\t\t\tif ( values[handleNumber] !== null && fireSetEvent ) {\r\n\t\t\t\tfireEvent('set', handleNumber);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Reset slider to initial values\r\n\tfunction valueReset ( fireSetEvent ) {\r\n\t\tvalueSet(options.start, fireSetEvent);\r\n\t}\r\n\r\n\t// Get the slider value.\r\n\tfunction valueGet ( ) {\r\n\r\n\t\tvar values = scope_Values.map(options.format.to);\r\n\r\n\t\t// If only one handle is used, return a single value.\r\n\t\tif ( values.length === 1 ){\r\n\t\t\treturn values[0];\r\n\t\t}\r\n\r\n\t\treturn values;\r\n\t}\r\n\r\n\t// Removes classes from the root and empties it.\r\n\tfunction destroy ( ) {\r\n\r\n\t\tfor ( var key in options.cssClasses ) {\r\n\t\t\tif ( !options.cssClasses.hasOwnProperty(key) ) { continue; }\r\n\t\t\tremoveClass(scope_Target, options.cssClasses[key]);\r\n\t\t}\r\n\r\n\t\twhile (scope_Target.firstChild) {\r\n\t\t\tscope_Target.removeChild(scope_Target.firstChild);\r\n\t\t}\r\n\r\n\t\tdelete scope_Target.noUiSlider;\r\n\t}\r\n\r\n\t// Get the current step size for the slider.\r\n\tfunction getCurrentStep ( ) {\r\n\r\n\t\t// Check all locations, map them to their stepping point.\r\n\t\t// Get the step point, then find it in the input list.\r\n\t\treturn scope_Locations.map(function( location, index ){\r\n\r\n\t\t\tvar nearbySteps = scope_Spectrum.getNearbySteps( location );\r\n\t\t\tvar value = scope_Values[index];\r\n\t\t\tvar increment = nearbySteps.thisStep.step;\r\n\t\t\tvar decrement = null;\r\n\r\n\t\t\t// If the next value in this step moves into the next step,\r\n\t\t\t// the increment is the start of the next step - the current value\r\n\t\t\tif ( increment !== false ) {\r\n\t\t\t\tif ( value + increment > nearbySteps.stepAfter.startValue ) {\r\n\t\t\t\t\tincrement = nearbySteps.stepAfter.startValue - value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\t// If the value is beyond the starting point\r\n\t\t\tif ( value > nearbySteps.thisStep.startValue ) {\r\n\t\t\t\tdecrement = nearbySteps.thisStep.step;\r\n\t\t\t}\r\n\r\n\t\t\telse if ( nearbySteps.stepBefore.step === false ) {\r\n\t\t\t\tdecrement = false;\r\n\t\t\t}\r\n\r\n\t\t\t// If a handle is at the start of a step, it always steps back into the previous step first\r\n\t\t\telse {\r\n\t\t\t\tdecrement = value - nearbySteps.stepBefore.highestStep;\r\n\t\t\t}\r\n\r\n\r\n\t\t\t// Now, if at the slider edges, there is not in/decrement\r\n\t\t\tif ( location === 100 ) {\r\n\t\t\t\tincrement = null;\r\n\t\t\t}\r\n\r\n\t\t\telse if ( location === 0 ) {\r\n\t\t\t\tdecrement = null;\r\n\t\t\t}\r\n\r\n\t\t\t// As per #391, the comparison for the decrement step can have some rounding issues.\r\n\t\t\tvar stepDecimals = scope_Spectrum.countStepDecimals();\r\n\r\n\t\t\t// Round per #391\r\n\t\t\tif ( increment !== null && increment !== false ) {\r\n\t\t\t\tincrement = Number(increment.toFixed(stepDecimals));\r\n\t\t\t}\r\n\r\n\t\t\tif ( decrement !== null && decrement !== false ) {\r\n\t\t\t\tdecrement = Number(decrement.toFixed(stepDecimals));\r\n\t\t\t}\r\n\r\n\t\t\treturn [decrement, increment];\r\n\t\t});\r\n\t}\r\n\r\n\t// Attach an event to this slider, possibly including a namespace\r\n\tfunction bindEvent ( namespacedEvent, callback ) {\r\n\t\tscope_Events[namespacedEvent] = scope_Events[namespacedEvent] || [];\r\n\t\tscope_Events[namespacedEvent].push(callback);\r\n\r\n\t\t// If the event bound is 'update,' fire it immediately for all handles.\r\n\t\tif ( namespacedEvent.split('.')[0] === 'update' ) {\r\n\t\t\tscope_Handles.forEach(function(a, index){\r\n\t\t\t\tfireEvent('update', index);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// Undo attachment of event\r\n\tfunction removeEvent ( namespacedEvent ) {\r\n\r\n\t\tvar event = namespacedEvent && namespacedEvent.split('.')[0];\r\n\t\tvar namespace = event && namespacedEvent.substring(event.length);\r\n\r\n\t\tObject.keys(scope_Events).forEach(function( bind ){\r\n\r\n\t\t\tvar tEvent = bind.split('.')[0],\r\n\t\t\t\ttNamespace = bind.substring(tEvent.length);\r\n\r\n\t\t\tif ( (!event || event === tEvent) && (!namespace || namespace === tNamespace) ) {\r\n\t\t\t\tdelete scope_Events[bind];\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Updateable: margin, limit, padding, step, range, animate, snap\r\n\tfunction updateOptions ( optionsToUpdate, fireSetEvent ) {\r\n\r\n\t\t// Spectrum is created using the range, snap, direction and step options.\r\n\t\t// 'snap' and 'step' can be updated.\r\n\t\t// If 'snap' and 'step' are not passed, they should remain unchanged.\r\n\t\tvar v = valueGet();\r\n\r\n\t\tvar updateAble = ['margin', 'limit', 'padding', 'range', 'animate', 'snap', 'step', 'format'];\r\n\r\n\t\t// Only change options that we're actually passed to update.\r\n\t\tupdateAble.forEach(function(name){\r\n\t\t\tif ( optionsToUpdate[name] !== undefined ) {\r\n\t\t\t\toriginalOptions[name] = optionsToUpdate[name];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tvar newOptions = testOptions(originalOptions);\r\n\r\n\t\t// Load new options into the slider state\r\n\t\tupdateAble.forEach(function(name){\r\n\t\t\tif ( optionsToUpdate[name] !== undefined ) {\r\n\t\t\t\toptions[name] = newOptions[name];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tscope_Spectrum = newOptions.spectrum;\r\n\r\n\t\t// Limit, margin and padding depend on the spectrum but are stored outside of it. (#677)\r\n\t\toptions.margin = newOptions.margin;\r\n\t\toptions.limit = newOptions.limit;\r\n\t\toptions.padding = newOptions.padding;\r\n\r\n\t\t// Update pips, removes existing.\r\n\t\tif ( options.pips ) {\r\n\t\t\tpips(options.pips);\r\n\t\t}\r\n\r\n\t\t// Invalidate the current positioning so valueSet forces an update.\r\n\t\tscope_Locations = [];\r\n\t\tvalueSet(optionsToUpdate.start || v, fireSetEvent);\r\n\t}\r\n\r\n\t// Throw an error if the slider was already initialized.\r\n\tif ( scope_Target.noUiSlider ) {\r\n\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): Slider was already initialized.\");\r\n\t}\r\n\r\n\t// Create the base element, initialise HTML and set classes.\r\n\t// Add handles and connect elements.\r\n\taddSlider(scope_Target);\r\n\taddElements(options.connect, scope_Base);\r\n\r\n\tscope_Self = {\r\n\t\tdestroy: destroy,\r\n\t\tsteps: getCurrentStep,\r\n\t\ton: bindEvent,\r\n\t\toff: removeEvent,\r\n\t\tget: valueGet,\r\n\t\tset: valueSet,\r\n\t\treset: valueReset,\r\n\t\t// Exposed for unit testing, don't use this in your application.\r\n\t\t__moveHandles: function(a, b, c) { moveHandles(a, b, scope_Locations, c); },\r\n\t\toptions: originalOptions, // Issue #600, #678\r\n\t\tupdateOptions: updateOptions,\r\n\t\ttarget: scope_Target, // Issue #597\r\n\t\tremovePips: removePips,\r\n\t\tpips: pips // Issue #594\r\n\t};\r\n\r\n\t// Attach user events.\r\n\tbindSliderEvents(options.events);\r\n\r\n\t// Use the public value method to set the start values.\r\n\tvalueSet(options.start);\r\n\r\n\tif ( options.pips ) {\r\n\t\tpips(options.pips);\r\n\t}\r\n\r\n\tif ( options.tooltips ) {\r\n\t\ttooltips();\r\n\t}\r\n\r\n\taria();\r\n\r\n\treturn scope_Self;\r\n\r\n}\r\n\r\n\r\n\t// Run the standard initializer\r\n\tfunction initialize ( target, originalOptions ) {\r\n\r\n\t\tif ( !target || !target.nodeName ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): create requires a single element, got: \" + target);\r\n\t\t}\r\n\r\n\t\t// Test the options and create the slider environment;\r\n\t\tvar options = testOptions( originalOptions, target );\r\n\t\tvar api = closure( target, options, originalOptions );\r\n\r\n\t\ttarget.noUiSlider = api;\r\n\r\n\t\treturn api;\r\n\t}\r\n\r\n\t// Use an object instead of a function for future expansibility;\r\n\treturn {\r\n\t\tversion: VERSION,\r\n\t\tcreate: initialize\r\n\t};\r\n\r\n}));\nfunction scrollToEl(el) {\n    var scrollDuration = 500;\n    var scrollTop = Math.round(el.offset().top - 10);\n    var header = window.innerWidth > 1250 ? $('.header__nav') : $('.header');\n    var items = [\n        header,\n        $('#debug-bar'),\n        $('#admin-bar'),\n        $('.notice'),\n    ];\n\n    for (var i = 0; i < items.length; i++) {\n        if (items[i].length > 0) {\n            scrollTop -= items[i].outerHeight();\n        }\n    }\n\n    $('html, body').animate({\n        scrollTop: scrollTop\n    }, {\n        duration: scrollDuration\n    });\n}\n\n//=require js-tools/svg.js\n//=require js-tools/viewport.js\n\nfunction Carousel(options, className) {\n\n    var viewport = new Viewport(AndrewMartin.breakpoints);\n\n    // Options\n    this.options = {\n        arrows: false,\n        dots: true,\n        prevArrow: 'icon-arrow-large-left',\n        nextArrow: 'icon-arrow-large-right'\n    };\n\n    $.extend(this.options, options);\n\n    this.options.prevArrow = slickArrow(this.options.prevArrow, 'prev');\n    this.options.nextArrow = slickArrow(this.options.nextArrow, 'next');\n\n    // Variables\n    this.className = 'js-carousel--';\n    this.breakpoint;\n\n    // Public functions\n    this.init = init;\n    this.activate = activate;\n    this.watch = watch;\n    this.unslickable = unslickable;\n    this.playVideo = playVideo;\n    this.watchFilter = watchFilter;\n    this.setFilter = setFilter;\n    this.unsetFilter = unsetFilter;\n\n    // Functions\n\n    // Set up a carousel\n    function init(el) {\n        var self = this;\n\n        // Assign the classname of the carousel element\n        this.className += className;\n\n        if (this.options.arrows) {\n            el.addClass('carousel--has-arrows');\n        }\n\n        if (this.options.dots) {\n            el.addClass('carousel--has-dots');\n        }\n\n        // Is the carousel responsive?\n        if (this.options.responsive) {\n            // If so, is it unslickable (is slick unset at a particular breakpoint)?\n            if (this.unslickable()) {\n                // If we start at the small breakpoint, we need to be ready to reinit for the large breakpoint\n                if (this.options.mobileFirst) {\n                    if (window.matchMedia('(min-width : ' + this.breakpoint + 'px)').matches) {\n                        this.watch();\n                    }\n                } else {\n                    if (window.matchMedia('(max-width : ' + this.breakpoint + 'px)').matches) {\n                        this.watch();\n                    }\n                }\n                // If we destroy the carousel, we need to be ready to reinit\n                $('.' + this.className).on('destroy', function(e, slick) {\n                    $(this).attr('data-carousel-active', false);\n                    self.watch();\n                });\n            }\n        }\n\n        $('.' + this.className).on('init', function(event, slick) {\n            self.playVideo($(event.target), slick.currentSlide);\n        });\n\n        $('.' + this.className).on('afterChange', function(event, slick, currentSlide) {\n            self.playVideo($(event.target), currentSlide);\n        });\n\n        // Init the carousel\n        this.activate();\n\n        this.watchFilter();\n    }\n\n    // Init the carousel\n    function activate() {\n        $('.' + this.className).attr('data-carousel-active', true);\n        $('.' + this.className).slick(this.options);\n    }\n\n    // Watch for resize events\n    function watch() {\n        var self = this;\n        var resize;\n        $(window).off('resize.' + this.className).on('resize.' + this.className, function() {\n            clearTimeout(resize);\n            resize = setTimeout(function() {\n                if (self.options.mobileFirst) {\n                    if (window.matchMedia('(max-width : ' + self.breakpoint + 'px)').matches) {\n                        self.activate();\n                        $(window).off('resize.' + self.className);\n                    }\n                } else {\n                    if (window.matchMedia('(min-width : ' + self.breakpoint + 'px)').matches) {\n                        self.activate();\n                        $(window).off('resize.' + self.className);\n                    }\n                }\n            }, 100);\n        });\n    }\n\n    // Is the carousel unslickable?\n    function unslickable() {\n        var unslick = false;\n        for (var i = 0; i < this.options.responsive.length; i++) {\n            if (this.options.responsive[i].settings == 'unslick') {\n                this.breakpoint = this.options.responsive[i].breakpoint;\n                unslick = true;\n            }\n        }\n        return unslick;\n    }\n\n    function playVideo(carousel, id) {\n        var slide = carousel.find('.slick-slide[data-slick-index=\"' + id + '\"]');\n\n        if (slide.find('.playable-video').length > 0) {\n            var video = slide.find('.playable-video');\n            if (!video.hasClass('playable-video--playing')) {\n                video.addClass('playable-video--playing');\n\n                videojs(video.attr('id')).play();\n            }\n        }\n    }\n\n    function slickArrow(icon, action) {\n        const svg = new Svg();\n\n        return '<button type=\"button\" class=\"slick-arrow slick-' + action + '\"><span>' + svg.render(icon) + '</span></button>'\n    }\n\n    function watchFilter() {\n        if (this.options.filter) {\n            this.filtered = false;\n\n            if (viewport.customMatches('(max-width: ' + this.options.filter.breakpoint + 'px)')) {\n                this.setFilter();\n            } else {\n                this.unsetFilter(true);\n            }\n\n            viewport.resize(() => {\n                if (viewport.customMatches('(max-width: ' + this.options.filter.breakpoint + 'px)')) {\n                    this.setFilter();\n                } else {\n                    this.unsetFilter();\n                }\n            });\n        }\n    }\n\n    function setFilter() {\n        if (!this.filtered) {\n\n            if (!$('.' + this.className).hasClass('slick-slider')) {\n                this.activate();\n            }\n\n            $('.' + this.className).slick('slickUnfilter');\n            $('.' + this.className).slick('slickFilter', this.options.filter.selector);\n\n            this.filtered = true;\n        }\n    }\n\n    function unsetFilter(force) {\n        if (this.filtered || force) {\n\n            $('.' + this.className).slick('slickUnfilter');\n            $('.' + this.className).slick('unslick');\n\n            this.filtered = false;\n        }\n    }\n}\n\n\nwindow.noZensmooth = true;\n/**\n * Zenscroll 4.0.2\n * https://github.com/zengabor/zenscroll/\n *\n * Copyright 2015–2018 Gabor Lenard\n *\n * This is free and unencumbered software released into the public domain.\n * \n * Anyone is free to copy, modify, publish, use, compile, sell, or\n * distribute this software, either in source code form or as a compiled\n * binary, for any purpose, commercial or non-commercial, and by any\n * means.\n * \n * In jurisdictions that recognize copyright laws, the author or authors\n * of this software dedicate any and all copyright interest in the\n * software to the public domain. We make this dedication for the benefit\n * of the public at large and to the detriment of our heirs and\n * successors. We intend this dedication to be an overt act of\n * relinquishment in perpetuity of all present and future rights to this\n * software under copyright law.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n * \n * For more information, please refer to <http://unlicense.org>\n * \n */\n\n/*jshint devel:true, asi:true */\n\n/*global define, module */\n\n\n(function (root, factory) {\n\tif (typeof define === \"function\" && define.amd) {\n\t\tdefine([], factory())\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\tmodule.exports = factory()\n\t} else {\n\t\t(function install() {\n\t\t\t// To make sure Zenscroll can be referenced from the header, before `body` is available\n\t\t\tif (document && document.body) {\n\t\t\t\troot.zenscroll = factory()\n\t\t\t} else {\n\t\t\t\t// retry 9ms later\n\t\t\t\tsetTimeout(install, 9)\n\t\t\t}\n\t\t})()\n\t}\n}(this, function () {\n\t\"use strict\"\n\n\n\t// Detect if the browser already supports native smooth scrolling (e.g., Firefox 36+ and Chrome 49+) and it is enabled:\n\tvar isNativeSmoothScrollEnabledOn = function (elem) {\n\t\treturn elem && \"getComputedStyle\" in window &&\n\t\t\twindow.getComputedStyle(elem)[\"scroll-behavior\"] === \"smooth\"\n\t}\n\n\n\t// Exit if it’s not a browser environment:\n\tif (typeof window === \"undefined\" || !(\"document\" in window)) {\n\t\treturn {}\n\t}\n\n\n\tvar makeScroller = function (container, defaultDuration, edgeOffset) {\n\n\t\t// Use defaults if not provided\n\t\tdefaultDuration = defaultDuration || 999 //ms\n\t\tif (!edgeOffset && edgeOffset !== 0) {\n\t\t\t// When scrolling, this amount of distance is kept from the edges of the container:\n\t\t\tedgeOffset = 9 //px\n\t\t}\n\n\t\t// Handling the life-cycle of the scroller\n\t\tvar scrollTimeoutId\n\t\tvar setScrollTimeoutId = function (newValue) {\n\t\t\tscrollTimeoutId = newValue\n\t\t}\n\n\t\t/**\n\t\t * Stop the current smooth scroll operation immediately\n\t\t */\n\t\tvar stopScroll = function () {\n\t\t\tclearTimeout(scrollTimeoutId)\n\t\t\tsetScrollTimeoutId(0)\n\t\t}\n\n\t\tvar getTopWithEdgeOffset = function (elem) {\n\t\t\treturn Math.max(0, container.getTopOf(elem) - edgeOffset)\n\t\t}\n\n\t\t/**\n\t\t * Scrolls to a specific vertical position in the document.\n\t\t *\n\t\t * @param {targetY} The vertical position within the document.\n\t\t * @param {duration} Optionally the duration of the scroll operation.\n\t\t *        If not provided the default duration is used.\n\t\t * @param {onDone} An optional callback function to be invoked once the scroll finished.\n\t\t */\n\t\tvar scrollToY = function (targetY, duration, onDone) {\n\t\t\tstopScroll()\n\t\t\tif (duration === 0 || (duration && duration < 0) || isNativeSmoothScrollEnabledOn(container.body)) {\n\t\t\t\tcontainer.toY(targetY)\n\t\t\t\tif (onDone) {\n\t\t\t\t\tonDone()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar startY = container.getY()\n\t\t\t\tvar distance = Math.max(0, targetY) - startY\n\t\t\t\tvar startTime = new Date().getTime()\n\t\t\t\tduration = duration || Math.min(Math.abs(distance), defaultDuration);\n\t\t\t\t(function loopScroll() {\n\t\t\t\t\tsetScrollTimeoutId(setTimeout(function () {\n\t\t\t\t\t\t// Calculate percentage:\n\t\t\t\t\t\tvar p = Math.min(1, (new Date().getTime() - startTime) / duration)\n\t\t\t\t\t\t// Calculate the absolute vertical position:\n\t\t\t\t\t\tvar y = Math.max(0, Math.floor(startY + distance*(p < 0.5 ? 2*p*p : p*(4 - p*2)-1)))\n\t\t\t\t\t\tcontainer.toY(y)\n\t\t\t\t\t\tif (p < 1 && (container.getHeight() + y) < container.body.scrollHeight) {\n\t\t\t\t\t\t\tloopScroll()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetTimeout(stopScroll, 99) // with cooldown time\n\t\t\t\t\t\t\tif (onDone) {\n\t\t\t\t\t\t\t\tonDone()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 9))\n\t\t\t\t})()\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Scrolls to the top of a specific element.\n\t\t *\n\t\t * @param {elem} The element to scroll to.\n\t\t * @param {duration} Optionally the duration of the scroll operation.\n\t\t * @param {onDone} An optional callback function to be invoked once the scroll finished.\n\t\t */\n\t\tvar scrollToElem = function (elem, duration, onDone) {\n\t\t\tscrollToY(getTopWithEdgeOffset(elem), duration, onDone)\n\t\t}\n\n\t\t/**\n\t\t * Scrolls an element into view if necessary.\n\t\t *\n\t\t * @param {elem} The element.\n\t\t * @param {duration} Optionally the duration of the scroll operation.\n\t\t * @param {onDone} An optional callback function to be invoked once the scroll finished.\n\t\t */\n\t\tvar scrollIntoView = function (elem, duration, onDone) {\n\t\t\tvar elemHeight = elem.getBoundingClientRect().height\n\t\t\tvar elemBottom = container.getTopOf(elem) + elemHeight\n\t\t\tvar containerHeight = container.getHeight()\n\t\t\tvar y = container.getY()\n\t\t\tvar containerBottom = y + containerHeight\n\t\t\tif (getTopWithEdgeOffset(elem) < y || (elemHeight + edgeOffset) > containerHeight) {\n\t\t\t\t// Element is clipped at top or is higher than screen.\n\t\t\t\tscrollToElem(elem, duration, onDone)\n\t\t\t} else if ((elemBottom + edgeOffset) > containerBottom) {\n\t\t\t\t// Element is clipped at the bottom.\n\t\t\t\tscrollToY(elemBottom - containerHeight + edgeOffset, duration, onDone)\n\t\t\t} else if (onDone) {\n\t\t\t\tonDone()\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Scrolls to the center of an element.\n\t\t *\n\t\t * @param {elem} The element.\n\t\t * @param {duration} Optionally the duration of the scroll operation.\n\t\t * @param {offset} Optionally the offset of the top of the element from the center of the screen.\n\t\t *        A value of 0 is ignored.\n\t\t * @param {onDone} An optional callback function to be invoked once the scroll finished.\n\t\t */\n\t\tvar scrollToCenterOf = function (elem, duration, offset, onDone) {\n\t\t\tscrollToY(Math.max(0, container.getTopOf(elem) - container.getHeight()/2 + (offset || elem.getBoundingClientRect().height/2)), duration, onDone)\n\t\t}\n\n\t\t/**\n\t\t * Changes default settings for this scroller.\n\t\t *\n\t\t * @param {newDefaultDuration} Optionally a new value for default duration, used for each scroll method by default.\n\t\t *        Ignored if null or undefined.\n\t\t * @param {newEdgeOffset} Optionally a new value for the edge offset, used by each scroll method by default. Ignored if null or undefined.\n\t\t * @returns An object with the current values.\n\t\t */\n\t\tvar setup = function (newDefaultDuration, newEdgeOffset) {\n\t\t\tif (newDefaultDuration === 0 || newDefaultDuration) {\n\t\t\t\tdefaultDuration = newDefaultDuration\n\t\t\t}\n\t\t\tif (newEdgeOffset === 0 || newEdgeOffset) {\n\t\t\t\tedgeOffset = newEdgeOffset\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tdefaultDuration: defaultDuration,\n\t\t\t\tedgeOffset: edgeOffset\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsetup: setup,\n\t\t\tto: scrollToElem,\n\t\t\ttoY: scrollToY,\n\t\t\tintoView: scrollIntoView,\n\t\t\tcenter: scrollToCenterOf,\n\t\t\tstop: stopScroll,\n\t\t\tmoving: function () { return !!scrollTimeoutId },\n\t\t\tgetY: container.getY,\n\t\t\tgetTopOf: container.getTopOf\n\t\t}\n\n\t}\n\n\n\tvar docElem = document.documentElement\n\tvar getDocY = function () { return window.scrollY || docElem.scrollTop }\n\n\t// Create a scroller for the document:\n\tvar zenscroll = makeScroller({\n\t\tbody: document.scrollingElement || document.body,\n\t\ttoY: function (y) { window.scrollTo(0, y) },\n\t\tgetY: getDocY,\n\t\tgetHeight: function () { return window.innerHeight || docElem.clientHeight },\n\t\tgetTopOf: function (elem) { return elem.getBoundingClientRect().top + getDocY() - docElem.offsetTop }\n\t})\n\n\n\t/**\n\t * Creates a scroller from the provided container element (e.g., a DIV)\n\t *\n\t * @param {scrollContainer} The vertical position within the document.\n\t * @param {defaultDuration} Optionally a value for default duration, used for each scroll method by default.\n\t *        Ignored if 0 or null or undefined.\n\t * @param {edgeOffset} Optionally a value for the edge offset, used by each scroll method by default. \n\t *        Ignored if null or undefined.\n\t * @returns A scroller object, similar to `zenscroll` but controlling the provided element.\n\t */\n\tzenscroll.createScroller = function (scrollContainer, defaultDuration, edgeOffset) {\n\t\treturn makeScroller({\n\t\t\tbody: scrollContainer,\n\t\t\ttoY: function (y) { scrollContainer.scrollTop = y },\n\t\t\tgetY: function () { return scrollContainer.scrollTop },\n\t\t\tgetHeight: function () { return Math.min(scrollContainer.clientHeight, window.innerHeight || docElem.clientHeight) },\n\t\t\tgetTopOf: function (elem) { return elem.offsetTop }\n\t\t}, defaultDuration, edgeOffset)\n\t}\n\n\n\t// Automatic link-smoothing on achors\n\t// Exclude IE8- or when native is enabled or Zenscroll auto- is disabled\n\tif (\"addEventListener\" in window && !window.noZensmooth && !isNativeSmoothScrollEnabledOn(document.body)) {\n\n\t\tvar isHistorySupported = \"history\" in window && \"pushState\" in history\n\t\tvar isScrollRestorationSupported = isHistorySupported && \"scrollRestoration\" in history\n\n\t\t// On first load & refresh make sure the browser restores the position first\n\t\tif (isScrollRestorationSupported) {\n\t\t\thistory.scrollRestoration = \"auto\"\n\t\t}\n\n\t\twindow.addEventListener(\"load\", function () {\n\n\t\t\tif (isScrollRestorationSupported) {\n\t\t\t\t// Set it to manual\n\t\t\t\tsetTimeout(function () { history.scrollRestoration = \"manual\" }, 9)\n\t\t\t\twindow.addEventListener(\"popstate\", function (event) {\n\t\t\t\t\tif (event.state && \"zenscrollY\" in event.state) {\n\t\t\t\t\t\tzenscroll.toY(event.state.zenscrollY)\n\t\t\t\t\t}\n\t\t\t\t}, false)\n\t\t\t}\n\n\t\t\t// Add edge offset on first load if necessary\n\t\t\t// This may not work on IE (or older computer?) as it requires more timeout, around 100 ms\n\t\t\tif (window.location.hash) {\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t// Adjustment is only needed if there is an edge offset:\n\t\t\t\t\tvar edgeOffset = zenscroll.setup().edgeOffset\n\t\t\t\t\tif (edgeOffset) {\n\t\t\t\t\t\tvar targetElem = document.getElementById(window.location.href.split(\"#\")[1])\n\t\t\t\t\t\tif (targetElem) {\n\t\t\t\t\t\t\tvar targetY = Math.max(0, zenscroll.getTopOf(targetElem) - edgeOffset)\n\t\t\t\t\t\t\tvar diff = zenscroll.getY() - targetY\n\t\t\t\t\t\t\t// Only do the adjustment if the browser is very close to the element:\n\t\t\t\t\t\t\tif (0 <= diff && diff < 9 ) {\n\t\t\t\t\t\t\t\twindow.scrollTo(0, targetY)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, 9)\n\t\t\t}\n\n\t\t}, false)\n\n\t\t// Handling clicks on anchors\n\t\tvar RE_noZensmooth = new RegExp(\"(^|\\\\s)noZensmooth(\\\\s|$)\")\n\t\twindow.addEventListener(\"click\", function (event) {\n\t\t\tvar anchor = event.target\n\t\t\twhile (anchor && anchor.tagName !== \"A\") {\n\t\t\t\tanchor = anchor.parentNode\n\t\t\t}\n\t\t\t// Let the browser handle the click if it wasn't with the primary button, or with some modifier keys:\n\t\t\tif (!anchor || event.which !== 1 || event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Save the current scrolling position so it can be used for scroll restoration:\n\t\t\tif (isScrollRestorationSupported) {\n\t\t\t\tvar historyState = history.state && typeof history.state === \"object\" ? history.state : {}\n\t\t\t\thistoryState.zenscrollY = zenscroll.getY()\n\t\t\t\ttry {\n\t\t\t\t\thistory.replaceState(historyState, \"\")\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Avoid the Chrome Security exception on file protocol, e.g., file://index.html\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Find the referenced ID:\n\t\t\tvar href = anchor.getAttribute(\"href\") || \"\"\n\t\t\tif (href.indexOf(\"#\") === 0 && !RE_noZensmooth.test(anchor.className)) {\n\t\t\t\tvar targetY = 0\n\t\t\t\tvar targetElem = document.getElementById(href.substring(1))\n\t\t\t\tif (href !== \"#\") {\n\t\t\t\t\tif (!targetElem) {\n\t\t\t\t\t\t// Let the browser handle the click if the target ID is not found.\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\ttargetY = zenscroll.getTopOf(targetElem)\n\t\t\t\t}\n\t\t\t\tevent.preventDefault()\n\t\t\t\t// By default trigger the browser's `hashchange` event...\n\t\t\t\tvar onDone = function () { window.location = href }\n\t\t\t\t// ...unless there is an edge offset specified\n\t\t\t\tvar edgeOffset = zenscroll.setup().edgeOffset\n\t\t\t\tif (edgeOffset) {\n\t\t\t\t\ttargetY = Math.max(0, targetY - edgeOffset)\n\t\t\t\t\tif (isHistorySupported) {\n\t\t\t\t\t\tonDone = function () { history.pushState({}, \"\", href) }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tzenscroll.toY(targetY, null, onDone)\n\t\t\t}\n\t\t}, false)\n\n\t}\n\n\n\treturn zenscroll\n\n\n}));\n\n\n// Pause hero carousel when CTA is hovered\nvar heroButtons = document.querySelectorAll('.js-hero-button')\n\nif (heroButtons) {\n    heroButtons.forEach((button) => {\n\n        button.addEventListener('mouseenter', function() {\n            $('.js-carousel--hero').slick('slickPause');\n        })\n\n        button.addEventListener('mouseleave', function() {\n            $('.js-carousel--hero').slick('slickPlay');\n        })\n    })\n}\n\n$('input[type=checkbox]')\n    .not('.custom-check-replace')\n    .not('.custom-check-replace2')\n    .not('.no-replace')\n    .not('.account-form-toggle__switch')\n    .checkReplace();\n$('input[type=checkbox].custom-check-replace').customCheckReplace();\n\nif ($('#hero_video').length) {\n    videojs.options.flash.swf = '/css/video-js/video-js.swf';\n    videojs(\"hero_video\").ready(function() {\n        var player = this;\n        player.play();\n        player.muted(true);\n    });\n}\n\n// Reveal the product listing items, after the timeout\nsetTimeout(function() {\n    $('.product-listing--to-load').removeClass('product-listing--to-load');\n}, 100);\n\n// Watch the categories sub-navigation\n\n(function() {\n\n    var breakpoint = 1199;\n\n    // Check if we are viewing the mobile or desktop layout\n\n    function isDesktop() {\n        return !window.matchMedia('(max-width : ' + breakpoint + 'px)').matches;\n    }\n\n    // Toggle the visibility of the sub-categories (on mobile)\n\n    $('.js-expand-nav').on('click', function(e){\n        if (!isDesktop()) {\n            e.preventDefault();\n            $(this).toggleClass('nav-categories__item--expanded');\n        }\n    });\n\n    // Toggle the visibility of the sub-categories (on desktop)\n\n    $('.js-expand-nav').on('mouseenter', function(e){\n        if (isDesktop()) {\n            $(this).addClass('nav-categories__item--expanded');\n        }\n    }).on('mouseleave', function(e){\n        if (isDesktop()) {\n            $(this).removeClass('nav-categories__item--expanded');\n        }\n    });\n\n    // Prevent click events bubbling up to the parent category link\n\n    $('.js-expand-nav .nav-categories__children').on('click', function(e){\n        e.stopPropagation();\n    });\n})();\n\n// Open external links in a new window\n$('body').on('click', '.external-link', function(e) {\n    e.preventDefault();\n    window.open($(e.target).attr('href'));\n});\n\n// Watch the product accordions\n(function() {\n    // Watch all clicks on links that begin with a hash\n    $('a[href^=\"#\"][href!=\"#\"]').on('click', function(event) {\n        // Check to see if the element can be ignored\n        if ($(this).data('zen-ignore')) {\n            return;\n        }\n        var anchor = event.target\n        while (anchor && anchor.tagName !== \"A\") {\n            anchor = anchor.parentNode\n        }\n        // Let the browser handle the click if it wasn't with the primary button, or with some modifier keys:\n        if (!anchor || event.which !== 1 || event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) {\n            return;\n        }\n\n        var href = anchor.getAttribute(\"href\") || \"\"\n        if (href.indexOf(\"#\") === 0) {\n            var targetY = 0\n            var targetElem = document.getElementById(href.substring(1))\n            if (href !== \"#\") {\n                if (!targetElem) {\n                    // Let the browser handle the click if the target ID is not found.\n                    return\n                }\n                targetY = zenscroll.getTopOf(targetElem)\n            }\n            event.preventDefault()\n            // By default trigger the browser's `hashchange` event...\n            var onDone = function () {\n                window.location = href;\n                checkHash();\n            }\n\n            zenscroll.toY(targetY, null, onDone)\n        }\n    });\n\n    // Check the current URL for a hash\n\n    checkHash();\n\n    // If the current URL features a hash value, check if the hash corresponds to accordion-based content\n\n    function checkHash() {\n        var hash = window.location.hash;\n        var target = $(hash);\n\n        var item = target.siblings('.accordion').eq(0);\n\n        if (item.length && item.attr('class').indexOf('--active') == -1) {\n            item.find('.js-accordion-toggle').trigger('click');\n        }\n    }\n})();\n\n// Apply carousel functionality to steps\n(function() {\n    // Define the breakpoint at which the layout changes\n    var breakpoint = 860;\n\n    // Init the carousel\n    function init() {\n        $('.js-steps-carousel').each(function(index, value) {\n            var steps = $(this).find('.block__step').length;\n\n            $(value).slick({\n                slidesToShow: steps >= 4 ? 4 : steps,\n                infinite : false,\n                dots: true,\n                arrows: false,\n                responsive: [{\n                    breakpoint: breakpoint,\n                    settings: 'unslick'\n                }]\n            });\n        });\n    }\n\n    // Reinit the carousel (after changing breakpoint)\n    function reInit() {\n        var resize;\n        $(window).on('resize.steps-carousel', function() {\n            clearTimeout(resize);\n            resize = setTimeout(function() {\n                if (!window.matchMedia('(max-width : ' + breakpoint + 'px)').matches) {\n                    init();\n                    $(window).off('resize.steps-carousel');\n                }\n            }, 100);\n        });\n    }\n\n    // Init the carousel\n    init();\n\n    // If we start at the small breakpoint, we need to be ready to reinit for the large breakpoint\n    if (window.matchMedia('(max-width : ' + breakpoint + 'px)').matches) {\n        reInit();\n    }\n\n    // If we destroy the carousel, we need to be ready to reinit\n    $('.js-steps-carousel').on('destroy', function(e, slick) {\n        reInit();\n    });\n})();\n\n// Toggle accordion content visibility\nfunction accordion(callback) {\n    // Toggle accordion content visibility\n    $('.js-accordion-toggle').off('click.accordion-toggle').on('click.accordion-toggle', function() {\n        $(this).parent().toggleClass('accordion--active');\n        if (callback) {\n            callback($(this).parent());\n        }\n    });\n}\naccordion();\n\n// Video preview\n(function() {\n    var video = $('.block--video').eq(0);\n    if ($('.js-preview-video').length == 0) {\n        return;\n    }\n    if (video.length == 0) {\n        $('.js-preview-video').remove();\n        return;\n    }\n\n    $(document).on('click', '.js-go-to-video', function() {\n        scrollToEl(video);\n    });\n})();\n\n$(document).on('click', '.js-go-to-video', function() {\n    scrollToEl(video);\n});\n\n// Video preview\n$(document).on('click', '.js-show-stockists', function(e) {\n    e.preventDefault();\n    scrollToEl($('.stockist__list'));\n});\n\nfunction handlePaintLinks() {\n    // Allow the fake link to go to the new URL\n    $('.js-go-to-url').on('click', function(e) {\n        e.stopPropagation();\n        window.location = $(this).data('href');\n    });\n    // Add the sample to the basket\n    $('.js-add-sample-to-basket').on('click', function(e) {\n        e.stopPropagation();\n\n        $.ajax($(this).data('href'), {\n            type: 'get',\n            success: function(data) {\n                refreshAfterAjax(data, 1);\n            },\n            fail: function() {\n            }\n        });\n    });\n    // Resize the overlay to center it correctly\n    $('.js-go-to-url').parent().on('mouseenter',function(e) {\n        $('.js-go-to-url').height($(this).height() - $(this).find('.product-listing__content__bottom').outerHeight());\n    });\n\n    function refreshAfterAjax(data, quantity) {\n        if (data.hasOwnProperty('payload')) {\n            if (data.payload.hasOwnProperty('qty')) {\n                $('.quick-links__notification__value').html(data.payload.qty)\n\n                if (quantity) {\n                    var noun = quantity == 1 ? 'item' : 'items';\n                    var message = quantity + ' ' + noun + ' added to the basket';\n\n                    $('.quick-links__update').html(message);\n                    $('.quick-links__update').addClass('quick-links__update--active');\n\n                    setTimeout(function() {\n                        $('.quick-links__update').removeClass('quick-links__update--active');\n\n                        setTimeout(function() {\n                            $('.quick-links__update').html('');\n                        }, 300);\n                    }, 3000);\n                }\n            }\n        }\n    }\n}\n\nhandlePaintLinks();\n\n$(document).on('click', '.js-account-message__close', function () {\n    $(this).closest(('.account-message')).remove();\n});\n\n\n$('#basket__account-select').on('change', function(){\n    window.location = 'basket/change-account/' + $(this).val();\n});\n\n$(document).on('click', '.discover-nav__link, .js-scroll', function(e) {\n    var $this = $(this);\n    var href = $this.attr('href');\n    if (href != '#') {\n        e.preventDefault();\n        scrollToEl($(href));\n    }\n});\n\n// Hide empty social boxed on PDP\n(function () {\n    var socials = document.querySelectorAll('.product__sharing-list__item')\n\n    if (socials) {\n        socials.forEach(social => {\n            if (social.children.length == 0) {\n                social.style.display = 'none';\n            }\n        })\n    }\n})()\n\n// Responsive slick dots height for when hero breaks in to two on mobile\n\nfunction setSlickDotsTop(dots) {\n    dots.style.top = 'initial';\n    dots.style.bottom = `${getHeroContentHeight() + 20}px`;\n}\n\nfunction resetDots(dots) {\n    dots.style.top = 'initial';\n\n    if (window.matchMedia('(max-width: 999px)').matches) {\n        dots.style.bottom = '40px'\n    } else {\n        dots.style.bottom = '80px';\n    }\n}\n\nfunction getHeroContentHeight() {\n    const contentBoxes = Array.from(\n        document.querySelectorAll('.hero__content')\n    );\n    const heights = contentBoxes.map(\n        content => content.getBoundingClientRect().height\n    );\n\n    return Math.max(...heights);\n}\n\nfunction checkHomePage() {\n    var header = document.querySelector('.js-header');\n    return header && !header.classList.contains('header--plain');\n}\n\nfunction checkMobile() {\n    return (window.matchMedia('(max-width: 680px)').matches);\n}\n\nfunction setupSampleModal() {\n    var self = this;\n    const modal = document.querySelector('.js-customise-info-modal');\n\n    if (modal == null) return;\n\n    $('.js-open-sample-detail').on('click', function(e) {\n        e.preventDefault();\n        var svg = new Svg();\n\n        $.magnificPopup.open({\n            type: 'inline',\n            mainClass: 'mfp-sample-detail mfp-fade',\n            removalDelay: 300,\n            items: {\n                src: '.js-sample-popup--pdp',\n            },\n            closeMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\">' + svg.render('close') + '</button>',\n            fixedContentPos: true,\n            callbacks: {\n                open: function() {\n                    function slickArrow(icon, action) {\n                        const svg = new Svg();\n\n                        return '<button type=\"button\" class=\"slick-arrow slick-' + action + '\"><span>' + svg.render(icon) + '</span></button>';\n                    }\n\n                    $(\".js-carousel--customise-modal--pdp\").slick({\n                        slidesToShow: 1,\n                        slidesToScroll: 1,\n                        arrows: true,\n                        swipe: true,\n                        infinite: false,\n                        autoplay: false,\n                        mobileFirst: true,\n                        dots: false,\n                        fade: true,\n                        cssEase: 'linear',\n                        asNavFor: '.js-carousel--modal-thumbnails--pdp',\n                        speed: 100,\n                        prevArrow: slickArrow('icon-arrow-large-left', 'prev'),\n                        nextArrow: slickArrow('icon-arrow-large-right', 'next')\n                    })\n\n                    $(\".js-carousel--modal-thumbnails--pdp\").slick({\n                        slidesToShow: 3.5,\n                        asNavFor: '.js-carousel--customise-modal--pdp',\n                        focusOnSelect: true,\n                        infinite: false,\n                        dots: false,\n                        arrows: false,\n                    })\n\n                    $('.js-fabric-sample-add').on('click', function(e) {\n                        e.preventDefault();\n                        var clicked = $(this);\n                        var span = clicked.find('span');\n                        var html = span.html();\n                        html = html.replace(' Added to basket', '');\n                        clicked.addClass('customise__action--working');\n                        span.html('Adding to basket...');\n                        $.ajax($(this).attr('href'), {\n                            success: function(data) {\n                                if (data.payload.hasOwnProperty('count')) {\n                                    $('.js-basket-count').html(data.payload.count);\n                                }\n\n                                clicked.find('span').html(html + ' Added to basket');\n                                clicked.removeClass('customise__action--working');\n                                clicked.addClass('customise__action--done');\n\n                                if (clicked.hasClass('js-close-after-action')) {\n                                    $.magnificPopup.close();\n                                }\n                            }\n                        });\n                    });\n                }\n            }\n        });\n    });\n}\n\nsetupSampleModal();\n\n$('.js-open-sample').on('click', function(e) {\n    e.preventDefault();\n    var svg = new Svg();\n\n    $.magnificPopup.open({\n        type: 'inline',\n        mainClass: 'mfp-sample mfp-fade',\n        removalDelay: 300,\n        items: {\n            src: '.js-sample-popup',\n        },\n        closeMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\">' + svg.render('close') + '</button>',\n        fixedContentPos: true\n    });\n})\n\n$('.js-open-sample-detail').on('click', function(e) {\n    e.preventDefault();\n    var svg = new Svg();\n\n    $.magnificPopup.open({\n        type: 'inline',\n        mainClass: 'mfp-sample-detail mfp-fade',\n        removalDelay: 300,\n        items: {\n            src: '.js-sample-popup--pdp',\n        },\n        closeMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\">' + svg.render('close') + '</button>',\n        fixedContentPos: true,\n        callbacks: {\n            open: function() {\n                function slickArrow(icon, action) {\n                    const svg = new Svg();\n\n                    return '<button type=\"button\" class=\"slick-arrow slick-' + action + '\"><span>' + svg.render(icon) + '</span></button>';\n                }\n\n                $(\".js-carousel--customise-modal--pdp\").slick({\n                    slidesToShow: 1,\n                    slidesToScroll: 1,\n                    arrows: true,\n                    swipe: true,\n                    infinite: false,\n                    autoplay: false,\n                    mobileFirst: true,\n                    dots: false,\n                    fade: true,\n                    cssEase: 'linear',\n                    asNavFor: '.js-carousel--modal-thumbnails--pdp',\n                    speed: 100,\n                    prevArrow: slickArrow('icon-arrow-large-left', 'prev'),\n                    nextArrow: slickArrow('icon-arrow-large-right', 'next')\n                })\n\n                $(\".js-carousel--modal-thumbnails--pdp\").slick({\n                    slidesToShow: 3.5,\n                    asNavFor: '.js-carousel--customise-modal--pdp',\n                    focusOnSelect: true,\n                    infinite: false,\n                    dots: false,\n                    arrows: false,\n                })\n\n                $('.js-fabric-sample-add').on('click', function(e) {\n                    e.preventDefault();\n                    var clicked = $(this);\n                    var span = clicked.find('span');\n                    var html = span.html();\n                    html = html.replace(' Added to basket', '');\n                    clicked.addClass('customise__action--working');\n                    span.html('Adding to basket...');\n                    $.ajax($(this).attr('href'), {\n                        success: function(data) {\n                            if (data.payload.hasOwnProperty('count')) {\n                                $('.js-basket-count').html(data.payload.count);\n                            }\n                            clicked.find('span').html(html + ' Added to basket');\n                            clicked.removeClass('customise__action--working');\n                            clicked.addClass('customise__action--done');\n\n                            if (clicked.hasClass('js-close-after-action')) {\n                                $.magnificPopup.close();\n                            }\n\n                            clicked.find('span').html(html);\n                        }\n                    });\n                });\n            }\n        }\n    });\n});\n\n// Shift slick dot positioning for too many dots\n\nfunction stackDots() {\n    setTimeout(() => {\n        var productGrid = document.querySelector('.product-grid');\n        var slickDots = productGrid.querySelector('.slick-dots')\n\n        if (slickDots) {\n            if (slickDots.childElementCount > 8 && window.matchMedia('(max-width: 600px)').matches) {\n                slickDots.classList.add('slick-dots--lots');\n            } else if (slickDots.classList.contains('slick-dots--lots') && !window.matchMedia('(max-width: 600px)').matches) {\n                slickDots.classList.remove('slick-dots--lots');\n            }\n        }\n    }, 500)\n}\n\nwindow.addEventListener('resize', function() {\n    var productGrid = document.querySelector('.product-grid');\n\n    if (productGrid) {\n        stackDots();\n    }\n});\n\nwindow.addEventListener('load', function() {\n    var productGrid = document.querySelector('.product-grid');\n\n    if (productGrid) {\n        stackDots();\n    }\n});\n\n// Expand first image in product grid if there are two or less images\n\n(function () {\n    var productGrid = document.querySelector('.product-grid');\n\n    if (productGrid && productGrid.childElementCount <= 2) {\n        productGrid.firstElementChild.classList.add('product-grid--photo-expand')\n    }\n})();\n\nAndrewMartin.carousel();\nAndrewMartin.photoswipe();\nAndrewMartin.siteNotice();\nAndrewMartin.bloomreach();\nAndrewMartin.klaviyo();\n\n$('.magnific-link').magnificPopup({\n    type: 'inline',\n    mainClass: 'mfp--cover mfp-fade',\n    closeOnBgClick: false,\n    removalDelay: 300,\n    closeMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\"><svg class=\"icon-close\"><use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-close\" /></svg></button>'\n});\n\nfunction initProductVideos() {\n    var videoContainer = $('.product__video');\n    var video = $('.product__video video');\n\n    if (typeof videojs == 'undefined') {\n        return;\n    }\n\n    if (!video.length) {\n        return;\n    }\n\n    video.each(function(i) {\n        var player = videojs(this.id);\n\n        $(this).on('touchend click', function(e) {\n            if (player.paused()) {\n                playVideo();\n            } else {\n                pauseVideo();\n            }\n        });\n\n        function playVideo() {\n            player.play();\n            $(videoContainer[i]).addClass('product__video--playing');\n        }\n\n        function pauseVideo() {\n            player.pause();\n            $(videoContainer[i]).removeClass('product__video--playing');\n        }\n    })\n}\n\ninitProductVideos();\n\n$('.js-outlet-popup').magnificPopup({\n    midClick: true,\n    type: 'inline',\n    closeMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\"><svg class=\"icon-close\"><use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-close\" /></svg></button>',\n    mainClass: 'mfp--outlet mfp-fade',\n    callbacks: {\n        open: function() {\n\n            function slickArrow(icon, action) {\n                const svg = new Svg();\n\n                return '<button type=\"button\" class=\"slick-arrow slick-' + action + '\"><span>' + svg.render(icon) + '</span></button>';\n            }\n\n            $(\".js-carousel--outlet\").slick({\n                slidesToShow: 1,\n                slidesToScroll: 1,\n                dots: true,\n                arrows: true,\n                swipe: true,\n                infinite: false,\n                autoplay: false,\n                fade: true,\n                speed: 600,\n                prevArrow: slickArrow('icon-arrow-large-left', 'prev'),\n                nextArrow: slickArrow('icon-arrow-large-right', 'next')\n            })\n        },\n\n        close: function() {\n            $(\".js-carousel--outlet\").slick('unslick');\n        }\n    }\n});\n\n//PDP extra info overlays\n\n(function() {\n    var svg = new Svg();\n\n    $('.js-open-details, .js-open-delivery, .js-open-product-details, .js-open-about').magnificPopup({\n        closeBtnInside: false,\n        mainClass: 'mfp-pdp mfp-fade',\n        removalDelay: 300,\n        closeMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\">' + svg.render('close') + '</button>',\n        fixedContentPos: true,\n        callbacks: {\n            open: function () {\n                bindEventListenersToAccordionTabs();\n            }\n        }\n    })\n})();\n\nconst bindEventListenersToAccordionTabs = () => {\n    $('.js-tabs__product').on('click', function(e) {\n        e.preventDefault();\n        $('.product-tab__item--active').removeClass('product-tab__item--active');\n        $(this).addClass('product-tab__item--active');\n        $('[data-tabs][data-tabs-active=\\\"true\\\"]').attr('data-tabs-active', false);\n        $('[data-tabs][data-tabs-id=\\\"' + $(this).data('tabs-id') + '\\\"]').attr('data-tabs-active', true);\n        var tab = $(this).data('tabs-id');\n        if (tab != 1) {\n            $('input[name=tab]').val(tab);\n        } else {\n            $('input[name=tab]').val('');\n        }\n    });\n}\n\n// Should the customiser option be selected?\nfunction checkCustomiserSelection(selector) {\n    const breakpoint = AndrewMartin.breakpoints.tablet;\n\n    if (breakpoint) {\n        var type = breakpoint.type;\n        var size = breakpoint.size;\n        var valid = !window.matchMedia(`(${type}: ${size}px)`).matches;\n\n        if (valid) {\n            var input = $(selector);\n\n            if (input) {\n                input.prop('checked', true);\n            }\n        }\n    }\n}\n","var SELECTREPLACE = {\n    classes: {\n        focused:  'multi-select-replace--focused',\n        disabled: 'multi-select-replace--disabled',\n        // single:   'multi-select-replace--single',\n        multiple: 'multi-select-replace--multiple',\n        active: 'multi-select-replace--active',\n        search:   'multi-select-replace--search',\n        listitem: 'multi-select-replace__list-item',\n        selected: 'multi-select-replace__list-item--selected',\n        current:  'multi-select-replace__list-item--current',\n        nobbled:  'multi-select-replace__list-item--disabled',\n        hidden:   'multi-select-replace__list-item--hidden',\n        image:    'multi-select-replace__list-item--image',\n        overview: 'multi-select-replace__overview',\n        mobileOverview: 'multi-select-replace__mobile-overview',\n        action:   'multi-select-replace__action',\n        actions:  'multi-select-replace__actions',\n        icon:     'multi-select-replace__icon',\n        back:     'multi-select-replace__back',\n        count:    'multi-select-replace__count'\n    },\n\n    keys: {\n        up:     38,\n        dn:     40,\n        pgup:   33,\n        pgdn:   34,\n        escape: 27,\n        space:  32,\n        enter:  13,\n    },\n\n    page: 5,\n\n    $focused: false,\n\n    svgIconPath: AndrewMartin.svgSymbolsFile,\n    svgIcon: {\n        back: 'icon-select',\n        dropdown: 'icon-select',\n        selected: 'icon-tick',\n        clear: 'icon-close'\n    }\n};\n\n// Styled select elements\n$.fn.selectReplace = function() {\n    $(this).filter(':not(.multi-select-replaced)').each(function() {\n        var $select = $(this);\n\n        var $form     = $select.closest('form');\n        var $label    = $select.prev('label');\n        var $extra    = $select.next('.filterable__extra-content');\n        var $wrapper  = $select.wrap('<div class=\"multi-select-replace\"></div>').parent();\n        var $input    = $('<input class=\"multi-select-replace__search\">').appendTo($wrapper);\n        var $drop     = $('<div class=\"multi-select-replace__drop\"></div>').appendTo($wrapper);\n        var $up       = $('<a href=\"#\" class=\"multi-select-replace__elevator-button multi-select-replace__elevator-button--up\"></a>').appendTo($drop);\n        var $down     = $('<a href=\"#\" class=\"multi-select-replace__elevator-button multi-select-replace__elevator-button--down\"></a>').appendTo($drop);\n\n        var $list = $('<ul class=\"multi-select-replace__list\"></ul>');\n\n        $select.find('option').each(function(ndx) {\n            var $option = $(this);\n\n            var $li = $('<li class=\"' + SELECTREPLACE.classes.listitem + '\" data-value=\"' + $option.val() + '\"><a href=\"#0\">' + $option.text() + '</a></li>');\n\n            if ($option.is('[data-hidden]')) {\n                $li.addClass(SELECTREPLACE.classes.hidden);\n            }\n\n            if ($option.is(':disabled')) {\n                $li.addClass(SELECTREPLACE.classes.nobbled);\n            }\n\n            if ($option.attr('data-image') !== undefined) {\n                $('<img src=\"' + $option.attr('data-image') + '\" />').appendTo($li);\n                $li.addClass(SELECTREPLACE.classes.image);\n            }\n\n            $li.appendTo($list);\n\n            var $icon = $('<span class=\"multi-select-replace__status\"><svg class=\"' + SELECTREPLACE.svgIcon.selected + '\">\\\n                <use xlink:href=\"' + SELECTREPLACE.svgIconPath + '#' + SELECTREPLACE.svgIcon.selected + '\" />\\\n            </svg></span>').appendTo($li);\n\n\n            if ($option.text().toLowerCase() == 'multicoloured') {\n                var $swatch = $('<div class=\"multi-select-replace__swatch multi-select-replace__swatch--multicoloured\"></div>').prependTo($li);\n            } else if ($option.attr('color') !== '') {\n                var $swatch = $('<div class=\"multi-select-replace__swatch\" style=\"color: ' + $option.attr('color') + ';\"></div>').prependTo($li);\n            }\n        });\n\n        var all = '<span class=\"' + SELECTREPLACE.classes.action + ' ' + SELECTREPLACE.classes.action + '--all\">Select all</span>';\n        var clear = '<span class=\"' + SELECTREPLACE.classes.action + ' ' + SELECTREPLACE.classes.action + '--clear\">Clear all</span>';\n\n        var $overviewMobile = $('<div class=\"' + SELECTREPLACE.classes.listitem + ' ' + SELECTREPLACE.classes.listitem + '--overview ' + SELECTREPLACE.classes.listitem + '--overview-1\" data-value=\"all\"><div class=\"' + SELECTREPLACE.classes.actions + '\">' + all + clear + '</div></div>');\n        $overviewMobile.appendTo($drop);\n\n        var $overview = $('<div class=\"' + SELECTREPLACE.classes.listitem + ' ' + SELECTREPLACE.classes.listitem + '--overview ' + SELECTREPLACE.classes.listitem + '--overview-2\" data-value=\"all\"><div class=\"' + SELECTREPLACE.classes.actions + '\">' + all + clear + '</div></div>');\n        $overview.appendTo($drop);\n\n        $list.appendTo($drop);\n\n        if ($extra) {\n            $extra.appendTo($drop);\n        }\n\n        var $options = $list.find('li');\n\n        $wrapper.addClass(SELECTREPLACE.classes.multiple);\n\n        if ($select.prop('id')) {\n            $select.parent().prop('id', $select.prop('id') + '_replace');\n        }\n\n        $select.addClass('multi-select-replaced');\n\n        $label.on('click', function(e) {\n            e.preventDefault();\n            e.stopPropagation();\n            deactivateFilterRanges($('.js-filter-ranges'))\n            if (SELECTREPLACE.$focused) {\n                if (SELECTREPLACE.$focused !== $wrapper) {\n                    // clicked a different select\n                    SELECTREPLACE.$focused.trigger('_blur');\n\n                    $wrapper.trigger('_focus');\n                } else {\n                    $wrapper.trigger('_blur');\n                }\n            } else {\n                $wrapper.trigger('_focus');\n            }\n        });\n\n        $list.on('click', '.' + SELECTREPLACE.classes.listitem, function(e) {\n            e.preventDefault();\n\n            var $item = $(this);\n\n            // if ($item.data('value') != 'all') {\n                $item.toggleClass(SELECTREPLACE.classes.selected);\n\n                var eventName = $item.hasClass(SELECTREPLACE.classes.selected) ? '_selected' : '_unselected';\n\n                $select.trigger(eventName, this);\n            // }\n\n            $wrapper.trigger('_change');\n        });\n\n        $wrapper.on('click', '.' + SELECTREPLACE.classes.back, function(e) {\n            $wrapper.trigger('_blur');\n        });\n\n        $wrapper.on('click', '.' + SELECTREPLACE.classes.actions, function(e) {\n            var $items = $list.find('.' + SELECTREPLACE.classes.listitem)//.not($item);\n\n            var showAll;\n\n            $wrapper.find('.' + SELECTREPLACE.classes.actions).each(function() {\n                var $item = $(this).parent();\n                $item.data('active', !$item.data('active'));\n\n                showAll = $item.data('active');\n\n                $overviewMobile.attr('data-all', showAll);\n                $overview.attr('data-all', showAll);\n            });\n\n            $items.each(function() {\n                var $item = $(this);\n                var eventName = '_unselected';\n                $item.removeClass(SELECTREPLACE.classes.selected);\n\n                if (showAll) {\n                    $item.addClass(SELECTREPLACE.classes.selected);\n                    eventName = '_selected';\n                }\n\n                $select.trigger(eventName, this);\n            });\n\n            $wrapper.trigger('_change');\n        });\n\n        $wrapper.on('_focus', function(e) {\n            SELECTREPLACE.$focused = $wrapper;\n            $wrapper.addClass(SELECTREPLACE.classes.focused);\n            $wrapper.parents('.filterable__dimension').addClass('filterable__dimension--active');\n            $wrapper.parents('.filterable__content').addClass('filterable__content--active');\n            countListItems(e)\n        });\n\n        // Count number of li's\n\n        function countListItems(e) {\n\n            var list = e.target.querySelector('.multi-select-replace__list')\n            var drop = list.parentElement\n\n            if ( list.childElementCount > 17) {\n                list.classList.add('multi-select-replace__list--large')\n                drop.classList.add('multi-select-replace__drop--large')\n\n            } else if ( list.childElementCount >= 7) {\n                list.classList.add('multi-select-replace__list--medium')\n\n            } else if ( list.childElementCount <= 6) {\n                list.classList.add('multi-select-replace__list--small')\n            }\n\n            var centrePoint = (window.innerWidth / 2);\n\n            if (drop.getBoundingClientRect().x > centrePoint) {\n                drop.classList.add('multi-select-replace__drop--right-align')\n            }\n        }\n\n        $wrapper.on('_blur', function() {\n            SELECTREPLACE.$focused = false;\n            $wrapper.removeClass(SELECTREPLACE.classes.focused);\n            $wrapper.parents('.filterable__dimension').removeClass('filterable__dimension--active');\n            $wrapper.parents('.filterable__content').removeClass('filterable__content--active');\n        });\n\n        $wrapper.on('_change', function(e, initial) {\n            var $selected = $options.filter('.' + SELECTREPLACE.classes.selected).not('[data-value=\"all\"]');\n            var $items = $options.not('[data-value=\"all\"]');\n\n            var selectValue = '';\n            if ($select.data('blank') !== undefined) {\n                selectValue = $select.data('blank');\n            }\n\n            var html = '';\n\n            if ($selected.length) {\n                $selected.each(function(i) {\n                    html += $(this).find('a').html();\n\n                    if (i < $selected.length - 1) {\n                        html += ', ';\n                    }\n                });\n                selectValue = $selected.length + ' selected';\n                $wrapper.addClass(SELECTREPLACE.classes.active);\n                $wrapper.parent().addClass('filterable__dimension--has-selection');\n                $('.js-clear-filters').show();\n            } else {\n                html = 'None selected';\n                $wrapper.removeClass(SELECTREPLACE.classes.active);\n                $wrapper.parent().removeClass('filterable__dimension--has-selection');\n                $('.js-clear-filters').hide();\n            }\n\n            $wrapper.find('.' + SELECTREPLACE.classes.count).html($selected.length);\n\n            if ($selected.length > 0) {\n                $label.find('.js-filterable__count').html('(' + $selected.length + ')');\n            } else {\n                $label.find('.js-filterable__count').html('');\n            }\n\n            if ($selected.length == 0) {\n                $overview.data('active', false);\n                $overview.attr('data-all', false);\n                $overviewMobile.attr('data-all', false);\n            } else {\n                $overview.data('active', true);\n                $overview.attr('data-all', true);\n                $overviewMobile.attr('data-all', true);\n            }\n\n            // $value.html(selectValue);\n            $wrapper.find('.' + SELECTREPLACE.classes.overview).html(html).attr('data-is-empty', $selected.length == 0);\n\n            $select.find('option').each(function(ndx) {\n                var $option = $(this);\n\n                if ($options.eq(ndx).hasClass(SELECTREPLACE.classes.selected)) {\n                    $option.prop('selected', true);\n                } else {\n                    $option.prop('selected', null);\n                }\n            });\n\n            if (!initial) {\n                $select.trigger('change', initial);\n            }\n        });\n\n        $(document).on('keydown', function(e) {\n            if (!SELECTREPLACE.$focused) {\n                return;\n            }\n\n            if (e.which == SELECTREPLACE.keys.escape) {\n                $wrapper.trigger('_blur');\n            }\n        });\n\n        $select.on('_change', function() {\n            $select.find('option').each(function(ndx) {\n                var $option = $(this);\n\n                if ($option.prop('selected')) {\n                    $li = $options.eq(ndx);\n                    $li.addClass(SELECTREPLACE.classes.selected);\n                }\n            });\n        });\n\n        $form.on('reset', function(e) {\n            $options.removeClass(SELECTREPLACE.classes.selected);\n            $wrapper.trigger('_change');\n        });\n\n        $select.trigger('_change', true);\n    });\n};\n\n$(document).on('click', function(e) {\n    if (SELECTREPLACE.$focused) {\n        if (!$.contains(SELECTREPLACE.$focused.get(0), e.target)) {\n            // clicked outside of the current select\n            SELECTREPLACE.$focused.trigger('_blur');\n        }\n    }\n});\n\n$('select[multiple]').selectReplace();\n","if (typeof SVG_DEFAULT_PATH == \"undefined\") {\n    var SVG_DEFAULT_PATH = '/images/svg-symbols.svg';\n}\nif (typeof SVG_DEFAULT_PREFIX == \"undefined\") {\n    var SVG_DEFAULT_PREFIX = 'icon';\n}\nfunction Svg() {\n\n    this.imagePath = SVG_DEFAULT_PATH;\n\n    this.imageClassPrefix = SVG_DEFAULT_PREFIX;\n\n    this.setImagePath = function(path) {\n        if (path) {\n            this.imagePath = path;\n        }\n    }\n\n    this.setImageClassPrefix = function(prefix) {\n        if (prefix) {\n            this.imageClassPrefix = prefix;\n        }\n    }\n\n    this.render = function(icon) {\n        return '<svg role=\"img\" class=\"' + this.imageClassPrefix + '-' + this.prepare(icon) + '\">' +\n                        '<use xlink:href=\"' + this.imagePath + '#icon-' + this.prepare(icon) + '\"></use>' +\n                    '</svg>'\n    }\n\n    this.prepare = function(icon) {\n        return icon.replace('icon-', '');\n    }\n}\n","/*\n * Copyright 2014 D3R Ltd\n * http://d3r.com\n *\n * D3R Standard Javascript\n *\n * You'll want at least:\n\n    .js .d3r-show,\n    .js .d3r-hide {\n        cursor: pointer;\n    }\n    .js .d3r-hidden {\n        display: none;\n    }\n    .js .d3r-shown {\n        display: block;\n    }\n    .d3r-chooser {\n\n    }\n        .d3r-chooser-option,\n        .d3r-multichooser-option {\n            display: none;\n        }\n *\n */\n\n// hidey showey\n$(document).on('click', '.d3r-show, .d3r-hide', function(e) {\n    var $this = $(this),\n        $target;\n    if ($this.is('a')) e.preventDefault();\n    if (!!$this.data('target')) {\n        $target = $('#'+$this.data('target'));\n    } else if (!!$this.attr('href') && \"#\" == $this.attr('href')[0]) {\n        $target = $($this.attr('href'));\n    }\n    if ($target.length) {\n        var hide = $this.hasClass('d3r-hide');\n        $target[hide ? 'toggleClass' : 'addClass']('d3r-shown');\n        $this[hide ? 'toggleClass' : 'addClass']('d3r-active');\n    }\n    if ($target.hasClass('d3r-shown') && $this.hasClass('d3r-autoclose')) {\n        var autoclose = function(e) {\n            if (!$.contains($target[0], e.target)) {\n                if ($target.hasClass('d3r-shown')) {\n                    e.preventDefault();\n                    $target.removeClass('d3r-shown');\n                    $this.removeClass('d3r-active');\n                }\n                $(document).off('click', autoclose);\n            }\n        };\n        $(document).on('click', autoclose);\n    }\n});\n// redirect from dropdowns\n$(document).on('change', 'select.d3r-redirector', function(e) {\n    window.location.assign($(this).val());\n});\n// display things based on dropdowns\n$(document).on('change', 'select.d3r-chooser', function(e) {\n    var $this = $(this),\n        $options = $('.d3r-chooser-option').filter('[data-chooser=\"'+$this.attr('id')+'\"]');\n    $options.removeClass('d3r-shown');\n\n    var selectors = ['[data-chooservalue=\"' + $this.val() + '\"]'];\n\n    if ($this.val()) {\n        selectors.push('#' + $this.val());\n    }\n\n    $options.filter(selectors.join(',')).addClass('d3r-shown');\n});\n$(document).on('change', 'select.d3r-multichooser', function(e) {\n    var $this = $(this),\n        $options = $('.d3r-multichooser-option').filter('[data-multichooser=\"'+$this.attr('id')+'\"]'),\n        $option = $('option:selected', this);\n    $options.removeClass('d3r-shown');\n    $.each($option.data('values').split(' '), function(index, val) {\n        var selectors = ['[data-chooservalue=\"' + val + '\"]'];\n\n        if (val) {\n            selectors.push('#' + val);\n        }\n\n        $options.filter(selectors.join(',')).addClass('d3r-shown');\n    });\n});\n$(document).on('change', 'input[type=\"radio\"].d3r-chooser', function(e) {\n    var $this = $(this),\n        $options = $('.d3r-chooser-option').filter('[data-chooser=\"'+$this.attr('name')+'\"]');\n    $options.removeClass('d3r-shown');\n\n    if ($this.is(':checked')) {\n        var selectors = ['[data-chooservalue=\"' + $this.val() + '\"]'];\n\n        if ($this.val()) {\n            selectors.push('#' + $this.val());\n        }\n\n        $options.filter(selectors.join(',')).addClass('d3r-shown');\n    }\n});\n\n$('input[type=\"radio\"].d3r-chooser:checked').trigger('change');\n\n$(document).on('click', '.d3r-submit', function(e) {\n    var $this = $(this);\n\n    // If the form is invalid, don't disable the button.\n    if ($this.closest('form') &&\n        !$this.closest('form')[0].checkValidity()) {\n        return;\n    }\n    // The timeout is to allow this submission to proceed. Nasty I know, sorry.\n    if ($this.hasClass('d3r-disabled')) {\n        e.preventDefault();\n    }\n    $this.addClass('d3r-disabled');\n    if (!$this.is('a')) {\n        setTimeout(function() {\n            $this.prop('disabled', true);\n        }, 0);\n    }\n});\n$(document).on('click', '.d3r-confirm', function(e) {\n    var $this = $(this),\n        message = 'Are you sure?';\n    if (!!$this.data('confirm')) message = $this.data('confirm');\n    if (!window.confirm(message)) e.preventDefault();\n});\n$(document).on('click', '.d3r-scrollto', function(e) {\n    var $this = $(this),\n        $target;\n    if (!!$this.data('target')) {\n        $target = $('#'+$this.data('target'));\n    } else if (!!$this.attr('href') && \"#\" == $this.attr('href').replace(window.location.pathname,\"\")[0]) {\n        $target = $($this.attr('href').replace(window.location.pathname,\"\"));\n    }\n    if ($target.length) {\n        var hash = $target.attr(\"id\");\n        $target.removeAttr(\"id\");\n        $(\"html,body\").animate({\n            scrollTop: $target.offset().top\n        }, 500, function() {\n            $target.attr(\"id\", hash);\n        });\n    }\n});\n$(document).on('click', '.d3r-popup', function(e) {\n    e.preventDefault();\n    var $this = $(this),\n        url = $this.attr('href'),\n        width = 600,\n        height = 300,\n        target = 'popup';\n    if (!!$this.data('width')) width = $this.data('width');\n    if (!!$this.data('height')) height = $this.data('height');\n    if (!!$this.attr('target')) target = $this.attr('target');\n\n    var newwindow = window.open(url, target ,'height='+height+',width='+width);\n    if (window.focus) newwindow.focus();\n});\n","!function(e){\"function\"==typeof define&&define.amd?define([\"jquery\"],e):\"object\"==typeof exports?e(require(\"jquery\")):e(window.jQuery||window.Zepto)}(function(c){function e(){}function d(e,t){m.ev.on(x+e+I,t)}function p(e,t,n,o){var i=document.createElement(\"div\");return i.className=\"mfp-\"+e,n&&(i.innerHTML=n),o?t&&t.appendChild(i):(i=c(i),t&&i.appendTo(t)),i}function u(e,t){m.ev.triggerHandler(x+e,t),m.st.callbacks&&(e=e.charAt(0).toLowerCase()+e.slice(1),m.st.callbacks[e])&&m.st.callbacks[e].apply(m,Array.isArray(t)?t:[t])}function f(e){return e===A&&m.currTemplate.closeBtn||(m.currTemplate.closeBtn=c(m.st.closeMarkup.replace(\"%title%\",m.st.tClose)),A=e),m.currTemplate.closeBtn}function r(){c.magnificPopup.instance||((m=new e).init(),c.magnificPopup.instance=m)}function a(){y&&(v.after(y.addClass(l)).detach(),y=null)}function i(){n&&c(document.body).removeClass(n)}function t(){i(),m.req&&m.req.abort()}var m,o,g,s,h,A,l,v,y,n,w=\"Close\",F=\"BeforeClose\",C=\"MarkupParse\",b=\"Open\",j=\"Change\",x=\"mfp\",I=\".\"+x,T=\"mfp-ready\",N=\"mfp-removing\",k=\"mfp-prevent-close\",P=!!window.jQuery,_=c(window),S=(c.magnificPopup={instance:null,proto:e.prototype={constructor:e,init:function(){var e=navigator.appVersion;m.isLowIE=m.isIE8=document.all&&!document.addEventListener,m.isAndroid=/android/gi.test(e),m.isIOS=/iphone|ipad|ipod/gi.test(e),m.supportsTransition=function(){var e=document.createElement(\"p\").style,t=[\"ms\",\"O\",\"Moz\",\"Webkit\"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+\"Transition\"in e)return!0;return!1}(),m.probablyMobile=m.isAndroid||m.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),g=c(document),m.popupsCache={}},open:function(e){if(!1===e.isObj){m.items=e.items.toArray(),m.index=0;for(var t,n=e.items,o=0;o<n.length;o++)if((t=(t=n[o]).parsed?t.el[0]:t)===e.el[0]){m.index=o;break}}else m.items=Array.isArray(e.items)?e.items:[e.items],m.index=e.index||0;if(!m.isOpen){m.types=[],h=\"\",e.mainEl&&e.mainEl.length?m.ev=e.mainEl.eq(0):m.ev=g,e.key?(m.popupsCache[e.key]||(m.popupsCache[e.key]={}),m.currTemplate=m.popupsCache[e.key]):m.currTemplate={},m.st=c.extend(!0,{},c.magnificPopup.defaults,e),m.fixedContentPos=\"auto\"===m.st.fixedContentPos?!m.probablyMobile:m.st.fixedContentPos,m.st.modal&&(m.st.closeOnContentClick=!1,m.st.closeOnBgClick=!1,m.st.showCloseBtn=!1,m.st.enableEscapeKey=!1),m.bgOverlay||(m.bgOverlay=p(\"bg\").on(\"click\"+I,function(){m.close()}),m.wrap=p(\"wrap\").attr(\"tabindex\",-1).on(\"click\"+I,function(e){m._checkIfClose(e.target)&&m.close()}),m.container=p(\"container\",m.wrap)),m.contentContainer=p(\"content\"),m.st.preloader&&(m.preloader=p(\"preloader\",m.container,m.st.tLoading));var i=c.magnificPopup.modules;for(o=0;o<i.length;o++){var r=(r=i[o]).charAt(0).toUpperCase()+r.slice(1);m[\"init\"+r].call(m)}u(\"BeforeOpen\"),m.st.showCloseBtn&&(m.st.closeBtnInside?(d(C,function(e,t,n,o){n.close_replaceWith=f(o.type)}),h+=\" mfp-close-btn-in\"):m.wrap.append(f())),m.st.alignTop&&(h+=\" mfp-align-top\"),m.fixedContentPos?m.wrap.css({overflow:m.st.overflowY,overflowX:\"hidden\",overflowY:m.st.overflowY}):m.wrap.css({top:_.scrollTop(),position:\"absolute\"}),!1!==m.st.fixedBgPos&&(\"auto\"!==m.st.fixedBgPos||m.fixedContentPos)||m.bgOverlay.css({height:g.height(),position:\"absolute\"}),m.st.enableEscapeKey&&g.on(\"keyup\"+I,function(e){27===e.keyCode&&m.close()}),_.on(\"resize\"+I,function(){m.updateSize()}),m.st.closeOnContentClick||(h+=\" mfp-auto-cursor\"),h&&m.wrap.addClass(h);var a=m.wH=_.height(),s={},l=(m.fixedContentPos&&m._hasScrollBar(a)&&(l=m._getScrollbarSize())&&(s.marginRight=l),m.fixedContentPos&&(m.isIE7?c(\"body, html\").css(\"overflow\",\"hidden\"):s.overflow=\"hidden\"),m.st.mainClass);return m.isIE7&&(l+=\" mfp-ie7\"),l&&m._addClassToMFP(l),m.updateItemHTML(),u(\"BuildControls\"),c(\"html\").css(s),m.bgOverlay.add(m.wrap).prependTo(m.st.prependTo||c(document.body)),m._lastFocusedEl=document.activeElement,setTimeout(function(){m.content?(m._addClassToMFP(T),m._setFocus()):m.bgOverlay.addClass(T),g.on(\"focusin\"+I,m._onFocusIn)},16),m.isOpen=!0,m.updateSize(a),u(b),e}m.updateItemHTML()},close:function(){m.isOpen&&(u(F),m.isOpen=!1,m.st.removalDelay&&!m.isLowIE&&m.supportsTransition?(m._addClassToMFP(N),setTimeout(function(){m._close()},m.st.removalDelay)):m._close())},_close:function(){u(w);var e=N+\" \"+T+\" \";m.bgOverlay.detach(),m.wrap.detach(),m.container.empty(),m.st.mainClass&&(e+=m.st.mainClass+\" \"),m._removeClassFromMFP(e),m.fixedContentPos&&(e={marginRight:\"\"},m.isIE7?c(\"body, html\").css(\"overflow\",\"\"):e.overflow=\"\",c(\"html\").css(e)),g.off(\"keyup.mfp focusin\"+I),m.ev.off(I),m.wrap.attr(\"class\",\"mfp-wrap\").removeAttr(\"style\"),m.bgOverlay.attr(\"class\",\"mfp-bg\"),m.container.attr(\"class\",\"mfp-container\"),!m.st.showCloseBtn||m.st.closeBtnInside&&!0!==m.currTemplate[m.currItem.type]||m.currTemplate.closeBtn&&m.currTemplate.closeBtn.detach(),m.st.autoFocusLast&&m._lastFocusedEl&&c(m._lastFocusedEl).trigger(\"focus\"),m.currItem=null,m.content=null,m.currTemplate=null,m.prevHeight=0,u(\"AfterClose\")},updateSize:function(e){var t;m.isIOS?(t=document.documentElement.clientWidth/window.innerWidth,t=window.innerHeight*t,m.wrap.css(\"height\",t),m.wH=t):m.wH=e||_.height(),m.fixedContentPos||m.wrap.css(\"height\",m.wH),u(\"Resize\")},updateItemHTML:function(){var e=m.items[m.index],t=(m.contentContainer.detach(),m.content&&m.content.detach(),(e=e.parsed?e:m.parseEl(m.index)).type),n=(u(\"BeforeChange\",[m.currItem?m.currItem.type:\"\",t]),m.currItem=e,m.currTemplate[t]||(n=!!m.st[t]&&m.st[t].markup,u(\"FirstMarkupParse\",n),m.currTemplate[t]=!n||c(n)),s&&s!==e.type&&m.container.removeClass(\"mfp-\"+s+\"-holder\"),m[\"get\"+t.charAt(0).toUpperCase()+t.slice(1)](e,m.currTemplate[t]));m.appendContent(n,t),e.preloaded=!0,u(j,e),s=e.type,m.container.prepend(m.contentContainer),u(\"AfterChange\")},appendContent:function(e,t){(m.content=e)?m.st.showCloseBtn&&m.st.closeBtnInside&&!0===m.currTemplate[t]?m.content.find(\".mfp-close\").length||m.content.append(f()):m.content=e:m.content=\"\",u(\"BeforeAppend\"),m.container.addClass(\"mfp-\"+t+\"-holder\"),m.contentContainer.append(m.content)},parseEl:function(e){var t,n=m.items[e];if((n=n.tagName?{el:c(n)}:(t=n.type,{data:n,src:n.src})).el){for(var o=m.types,i=0;i<o.length;i++)if(n.el.hasClass(\"mfp-\"+o[i])){t=o[i];break}n.src=n.el.attr(\"data-mfp-src\"),n.src||(n.src=n.el.attr(\"href\"))}return n.type=t||m.st.type||\"inline\",n.index=e,n.parsed=!0,m.items[e]=n,u(\"ElementParse\",n),m.items[e]},addGroup:function(t,n){function e(e){e.mfpEl=this,m._openClick(e,t,n)}var o=\"click.magnificPopup\";(n=n||{}).mainEl=t,n.items?(n.isObj=!0,t.off(o).on(o,e)):(n.isObj=!1,n.delegate?t.off(o).on(o,n.delegate,e):(n.items=t).off(o).on(o,e))},_openClick:function(e,t,n){var o=(void 0!==n.midClick?n:c.magnificPopup.defaults).midClick;if(o||!(2===e.which||e.ctrlKey||e.metaKey||e.altKey||e.shiftKey)){o=(void 0!==n.disableOn?n:c.magnificPopup.defaults).disableOn;if(o)if(\"function\"==typeof o){if(!o.call(m))return!0}else if(_.width()<o)return!0;e.type&&(e.preventDefault(),m.isOpen)&&e.stopPropagation(),n.el=c(e.mfpEl),n.delegate&&(n.items=t.find(n.delegate)),m.open(n)}},updateStatus:function(e,t){var n;m.preloader&&(o!==e&&m.container.removeClass(\"mfp-s-\"+o),n={status:e,text:t=t||\"loading\"!==e?t:m.st.tLoading},u(\"UpdateStatus\",n),e=n.status,t=n.text,m.st.allowHTMLInStatusIndicator?m.preloader.html(t):m.preloader.text(t),m.preloader.find(\"a\").on(\"click\",function(e){e.stopImmediatePropagation()}),m.container.addClass(\"mfp-s-\"+e),o=e)},_checkIfClose:function(e){if(!c(e).closest(\".\"+k).length){var t=m.st.closeOnContentClick,n=m.st.closeOnBgClick;if(t&&n)return!0;if(!m.content||c(e).closest(\".mfp-close\").length||m.preloader&&e===m.preloader[0])return!0;if(e===m.content[0]||c.contains(m.content[0],e)){if(t)return!0}else if(n&&c.contains(document,e))return!0;return!1}},_addClassToMFP:function(e){m.bgOverlay.addClass(e),m.wrap.addClass(e)},_removeClassFromMFP:function(e){this.bgOverlay.removeClass(e),m.wrap.removeClass(e)},_hasScrollBar:function(e){return(m.isIE7?g.height():document.body.scrollHeight)>(e||_.height())},_setFocus:function(){(m.st.focus?m.content.find(m.st.focus).eq(0):m.wrap).trigger(\"focus\")},_onFocusIn:function(e){if(e.target!==m.wrap[0]&&!c.contains(m.wrap[0],e.target))return m._setFocus(),!1},_parseMarkup:function(i,e,t){var r;t.data&&(e=c.extend(t.data,e)),u(C,[i,e,t]),c.each(e,function(e,t){if(void 0===t||!1===t)return!0;var n,o;1<(r=e.split(\"_\")).length?0<(n=i.find(I+\"-\"+r[0])).length&&(\"replaceWith\"===(o=r[1])?n[0]!==t[0]&&n.replaceWith(t):\"img\"===o?n.is(\"img\")?n.attr(\"src\",t):n.replaceWith(c(\"<img>\").attr(\"src\",t).attr(\"class\",n.attr(\"class\"))):n.attr(r[1],t)):m.st.allowHTMLInTemplate?i.find(I+\"-\"+e).html(t):i.find(I+\"-\"+e).text(t)})},_getScrollbarSize:function(){var e;return void 0===m.scrollbarSize&&((e=document.createElement(\"div\")).style.cssText=\"width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;\",document.body.appendChild(e),m.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),m.scrollbarSize}},modules:[],open:function(e,t){return r(),(e=e?c.extend(!0,{},e):{}).isObj=!0,e.index=t||0,this.instance.open(e)},close:function(){return c.magnificPopup.instance&&c.magnificPopup.instance.close()},registerModule:function(e,t){t.options&&(c.magnificPopup.defaults[e]=t.options),c.extend(this.proto,t.proto),this.modules.push(e)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:\"\",preloader:!0,focus:\"\",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:\"auto\",fixedBgPos:\"auto\",overflowY:\"auto\",closeMarkup:'<button title=\"%title%\" type=\"button\" class=\"mfp-close\">&#215;</button>',tClose:\"Close (Esc)\",tLoading:\"Loading...\",autoFocusLast:!0,allowHTMLInStatusIndicator:!1,allowHTMLInTemplate:!1}},c.fn.magnificPopup=function(e){r();var t,n,o,i=c(this);return\"string\"==typeof e?\"open\"===e?(t=P?i.data(\"magnificPopup\"):i[0].magnificPopup,n=parseInt(arguments[1],10)||0,o=t.items?t.items[n]:(o=i,(o=t.delegate?o.find(t.delegate):o).eq(n)),m._openClick({mfpEl:o},i,t)):m.isOpen&&m[e].apply(m,Array.prototype.slice.call(arguments,1)):(e=c.extend(!0,{},e),P?i.data(\"magnificPopup\",e):i[0].magnificPopup=e,m.addGroup(i,e)),i},\"inline\"),E=(c.magnificPopup.registerModule(S,{options:{hiddenClass:\"hide\",markup:\"\",tNotFound:\"Content not found\"},proto:{initInline:function(){m.types.push(S),d(w+\".\"+S,function(){a()})},getInline:function(e,t){var n,o,i;return a(),e.src?(n=m.st.inline,(o=c(e.src)).length?((i=o[0].parentNode)&&i.tagName&&(v||(l=n.hiddenClass,v=p(l),l=\"mfp-\"+l),y=o.after(v).detach().removeClass(l)),m.updateStatus(\"ready\")):(m.updateStatus(\"error\",n.tNotFound),o=c(\"<div>\")),e.inlineElement=o):(m.updateStatus(\"ready\"),m._parseMarkup(t,{},e),t)}}}),\"ajax\");c.magnificPopup.registerModule(E,{options:{settings:null,cursor:\"mfp-ajax-cur\",tError:\"The content could not be loaded.\"},proto:{initAjax:function(){m.types.push(E),n=m.st.ajax.cursor,d(w+\".\"+E,t),d(\"BeforeChange.\"+E,t)},getAjax:function(o){n&&c(document.body).addClass(n),m.updateStatus(\"loading\");var e=c.extend({url:o.src,success:function(e,t,n){e={data:e,xhr:n};u(\"ParseAjax\",e),m.appendContent(c(e.data),E),o.finished=!0,i(),m._setFocus(),setTimeout(function(){m.wrap.addClass(T)},16),m.updateStatus(\"ready\"),u(\"AjaxContentAdded\")},error:function(){i(),o.finished=o.loadError=!0,m.updateStatus(\"error\",m.st.ajax.tError.replace(\"%url%\",o.src))}},m.st.ajax.settings);return m.req=c.ajax(e),\"\"}}});var z;c.magnificPopup.registerModule(\"image\",{options:{markup:'<div class=\"mfp-figure\"><div class=\"mfp-close\"></div><figure><div class=\"mfp-img\"></div><figcaption><div class=\"mfp-bottom-bar\"><div class=\"mfp-title\"></div><div class=\"mfp-counter\"></div></div></figcaption></figure></div>',cursor:\"mfp-zoom-out-cur\",titleSrc:\"title\",verticalFit:!0,tError:\"The image could not be loaded.\"},proto:{initImage:function(){var e=m.st.image,t=\".image\";m.types.push(\"image\"),d(b+t,function(){\"image\"===m.currItem.type&&e.cursor&&c(document.body).addClass(e.cursor)}),d(w+t,function(){e.cursor&&c(document.body).removeClass(e.cursor),_.off(\"resize\"+I)}),d(\"Resize\"+t,m.resizeImage),m.isLowIE&&d(\"AfterChange\",m.resizeImage)},resizeImage:function(){var e,t=m.currItem;t&&t.img&&m.st.image.verticalFit&&(e=0,m.isLowIE&&(e=parseInt(t.img.css(\"padding-top\"),10)+parseInt(t.img.css(\"padding-bottom\"),10)),t.img.css(\"max-height\",m.wH-e))},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,z&&clearInterval(z),e.isCheckingImgSize=!1,u(\"ImageHasSize\",e),e.imgHidden)&&(m.content&&m.content.removeClass(\"mfp-loading\"),e.imgHidden=!1)},findImageSize:function(t){function n(e){z&&clearInterval(z),z=setInterval(function(){0<i.naturalWidth?m._onImageHasSize(t):(200<o&&clearInterval(z),3===++o?n(10):40===o?n(50):100===o&&n(500))},e)}var o=0,i=t.img[0];n(1)},getImage:function(e,t){function n(){e&&(e.img.off(\".mfploader\"),e===m.currItem&&(m._onImageHasSize(e),m.updateStatus(\"error\",a.tError.replace(\"%url%\",e.src))),e.hasSize=!0,e.loaded=!0,e.loadError=!0)}function o(){e&&(e.img[0].complete?(e.img.off(\".mfploader\"),e===m.currItem&&(m._onImageHasSize(e),m.updateStatus(\"ready\")),e.hasSize=!0,e.loaded=!0,u(\"ImageLoadComplete\")):++r<200?setTimeout(o,100):n())}var i,r=0,a=m.st.image,s=t.find(\".mfp-img\");return s.length&&((i=document.createElement(\"img\")).className=\"mfp-img\",e.el&&e.el.find(\"img\").length&&(i.alt=e.el.find(\"img\").attr(\"alt\")),e.img=c(i).on(\"load.mfploader\",o).on(\"error.mfploader\",n),i.src=e.src,s.is(\"img\")&&(e.img=e.img.clone()),0<(i=e.img[0]).naturalWidth?e.hasSize=!0:i.width||(e.hasSize=!1)),m._parseMarkup(t,{title:function(e){if(e.data&&void 0!==e.data.title)return e.data.title;var t=m.st.image.titleSrc;if(t){if(\"function\"==typeof t)return t.call(m,e);if(e.el)return e.el.attr(t)||\"\"}return\"\"}(e),img_replaceWith:e.img},e),m.resizeImage(),e.hasSize?(z&&clearInterval(z),e.loadError?(t.addClass(\"mfp-loading\"),m.updateStatus(\"error\",a.tError.replace(\"%url%\",e.src))):(t.removeClass(\"mfp-loading\"),m.updateStatus(\"ready\"))):(m.updateStatus(\"loading\"),e.loading=!0,e.hasSize||(e.imgHidden=!0,t.addClass(\"mfp-loading\"),m.findImageSize(e))),t}}});function O(e){var t;m.currTemplate[L]&&(t=m.currTemplate[L].find(\"iframe\")).length&&(e||(t[0].src=\"//about:blank\"),m.isIE8)&&t.css(\"display\",e?\"block\":\"none\")}function M(e){var t=m.items.length;return t-1<e?e-t:e<0?t+e:e}function D(e,t,n){return e.replace(/%curr%/gi,t+1).replace(/%total%/gi,n)}c.magnificPopup.registerModule(\"zoom\",{options:{enabled:!1,easing:\"ease-in-out\",duration:300,opener:function(e){return e.is(\"img\")?e:e.find(\"img\")}},proto:{initZoom:function(){var e,t,n,o,i,r,a=m.st.zoom,s=\".zoom\";a.enabled&&m.supportsTransition&&(t=a.duration,n=function(e){var e=e.clone().removeAttr(\"style\").removeAttr(\"class\").addClass(\"mfp-animated-image\"),t=\"all \"+a.duration/1e3+\"s \"+a.easing,n={position:\"fixed\",zIndex:9999,left:0,top:0,\"-webkit-backface-visibility\":\"hidden\"},o=\"transition\";return n[\"-webkit-\"+o]=n[\"-moz-\"+o]=n[\"-o-\"+o]=n[o]=t,e.css(n),e},o=function(){m.content.css(\"visibility\",\"visible\")},d(\"BuildControls\"+s,function(){m._allowZoom()&&(clearTimeout(i),m.content.css(\"visibility\",\"hidden\"),(e=m._getItemToZoom())?((r=n(e)).css(m._getOffset()),m.wrap.append(r),i=setTimeout(function(){r.css(m._getOffset(!0)),i=setTimeout(function(){o(),setTimeout(function(){r.remove(),e=r=null,u(\"ZoomAnimationEnded\")},16)},t)},16)):o())}),d(F+s,function(){if(m._allowZoom()){if(clearTimeout(i),m.st.removalDelay=t,!e){if(!(e=m._getItemToZoom()))return;r=n(e)}r.css(m._getOffset(!0)),m.wrap.append(r),m.content.css(\"visibility\",\"hidden\"),setTimeout(function(){r.css(m._getOffset())},16)}}),d(w+s,function(){m._allowZoom()&&(o(),r&&r.remove(),e=null)}))},_allowZoom:function(){return\"image\"===m.currItem.type},_getItemToZoom:function(){return!!m.currItem.hasSize&&m.currItem.img},_getOffset:function(e){var e=e?m.currItem.img:m.st.zoom.opener(m.currItem.el||m.currItem),t=e.offset(),n=parseInt(e.css(\"padding-top\"),10),o=parseInt(e.css(\"padding-bottom\"),10),e=(t.top-=c(window).scrollTop()-n,{width:e.width(),height:(P?e.innerHeight():e[0].offsetHeight)-o-n});return(B=void 0===B?void 0!==document.createElement(\"p\").style.MozTransform:B)?e[\"-moz-transform\"]=e.transform=\"translate(\"+t.left+\"px,\"+t.top+\"px)\":(e.left=t.left,e.top=t.top),e}}});var B,L=\"iframe\",H=(c.magnificPopup.registerModule(L,{options:{markup:'<div class=\"mfp-iframe-scaler\"><div class=\"mfp-close\"></div><iframe class=\"mfp-iframe\" src=\"//about:blank\" frameborder=\"0\" allowfullscreen></iframe></div>',srcAction:\"iframe_src\",patterns:{youtube:{index:\"youtube.com\",id:\"v=\",src:\"//www.youtube.com/embed/%id%?autoplay=1\"},vimeo:{index:\"vimeo.com/\",id:\"/\",src:\"//player.vimeo.com/video/%id%?autoplay=1\"},gmaps:{index:\"//maps.google.\",src:\"%id%&output=embed\"}}},proto:{initIframe:function(){m.types.push(L),d(\"BeforeChange\",function(e,t,n){t!==n&&(t===L?O():n===L&&O(!0))}),d(w+\".\"+L,function(){O()})},getIframe:function(e,t){var n=e.src,o=m.st.iframe,i=(c.each(o.patterns,function(){if(-1<n.indexOf(this.index))return this.id&&(n=\"string\"==typeof this.id?n.substr(n.lastIndexOf(this.id)+this.id.length,n.length):this.id.call(this,n)),n=this.src.replace(\"%id%\",n),!1}),{});return o.srcAction&&(i[o.srcAction]=n),m._parseMarkup(t,i,e),m.updateStatus(\"ready\"),t}}}),c.magnificPopup.registerModule(\"gallery\",{options:{enabled:!1,arrowMarkup:'<button title=\"%title%\" type=\"button\" class=\"mfp-arrow mfp-arrow-%dir%\"></button>',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:\"Previous (Left arrow key)\",tNext:\"Next (Right arrow key)\",tCounter:\"%curr% of %total%\",langDir:null,loop:!0},proto:{initGallery:function(){var r=m.st.gallery,e=\".mfp-gallery\";if(m.direction=!0,!r||!r.enabled)return!1;r.langDir||(r.langDir=document.dir||\"ltr\"),h+=\" mfp-gallery\",d(b+e,function(){r.navigateByImgClick&&m.wrap.on(\"click\"+e,\".mfp-img\",function(){if(1<m.items.length)return m.next(),!1}),g.on(\"keydown\"+e,function(e){37===e.keyCode?\"rtl\"===r.langDir?m.next():m.prev():39===e.keyCode&&(\"rtl\"===r.langDir?m.prev():m.next())}),m.updateGalleryButtons()}),d(\"UpdateStatus\"+e,function(){m.updateGalleryButtons()}),d(\"UpdateStatus\"+e,function(e,t){t.text&&(t.text=D(t.text,m.currItem.index,m.items.length))}),d(C+e,function(e,t,n,o){var i=m.items.length;n.counter=1<i?D(r.tCounter,o.index,i):\"\"}),d(\"BuildControls\"+e,function(){var e,t,n,o,i;1<m.items.length&&r.arrows&&!m.arrowLeft&&(t=\"rtl\"===r.langDir?(o=r.tNext,e=r.tPrev,i=\"next\",\"prev\"):(o=r.tPrev,e=r.tNext,i=\"prev\",\"next\"),n=r.arrowMarkup,o=m.arrowLeft=c(n.replace(/%title%/gi,o).replace(/%action%/gi,i).replace(/%dir%/gi,\"left\")).addClass(k),i=m.arrowRight=c(n.replace(/%title%/gi,e).replace(/%action%/gi,t).replace(/%dir%/gi,\"right\")).addClass(k),\"rtl\"===r.langDir?(m.arrowNext=o,m.arrowPrev=i):(m.arrowNext=i,m.arrowPrev=o),o.on(\"click\",function(){\"rtl\"===r.langDir?m.next():m.prev()}),i.on(\"click\",function(){\"rtl\"===r.langDir?m.prev():m.next()}),m.container.append(o.add(i)))}),d(j+e,function(){m._preloadTimeout&&clearTimeout(m._preloadTimeout),m._preloadTimeout=setTimeout(function(){m.preloadNearbyImages(),m._preloadTimeout=null},16)}),d(w+e,function(){g.off(e),m.wrap.off(\"click\"+e),m.arrowRight=m.arrowLeft=null})},next:function(){var e=M(m.index+1);if(!m.st.gallery.loop&&0===e)return!1;m.direction=!0,m.index=e,m.updateItemHTML()},prev:function(){var e=m.index-1;if(!m.st.gallery.loop&&e<0)return!1;m.direction=!1,m.index=M(e),m.updateItemHTML()},goTo:function(e){m.direction=e>=m.index,m.index=e,m.updateItemHTML()},preloadNearbyImages:function(){for(var e=m.st.gallery.preload,t=Math.min(e[0],m.items.length),n=Math.min(e[1],m.items.length),o=1;o<=(m.direction?n:t);o++)m._preloadItem(m.index+o);for(o=1;o<=(m.direction?t:n);o++)m._preloadItem(m.index-o)},_preloadItem:function(e){var t;e=M(e),m.items[e].preloaded||((t=m.items[e]).parsed||(t=m.parseEl(e)),u(\"LazyLoad\",t),\"image\"===t.type&&(t.img=c('<img class=\"mfp-img\" />').on(\"load.mfploader\",function(){t.hasSize=!0}).on(\"error.mfploader\",function(){t.hasSize=!0,t.loadError=!0,u(\"LazyLoadError\",t)}).attr(\"src\",t.src)),t.preloaded=!0)},updateGalleryButtons:function(){m.st.gallery.loop||\"object\"!=typeof m.arrowPrev||null===m.arrowPrev||(0===m.index?m.arrowPrev.hide():m.arrowPrev.show(),m.index===m.items.length-1?m.arrowNext.hide():m.arrowNext.show())}}}),\"retina\");c.magnificPopup.registerModule(H,{options:{replaceSrc:function(e){return e.src.replace(/\\.\\w+$/,function(e){return\"@2x\"+e})},ratio:1},proto:{initRetina:function(){var n,o;1<window.devicePixelRatio&&(n=m.st.retina,o=n.ratio,1<(o=isNaN(o)?o():o))&&(d(\"ImageHasSize.\"+H,function(e,t){t.img.css({\"max-width\":t.img[0].naturalWidth/o,width:\"100%\"})}),d(\"ElementParse.\"+H,function(e,t){t.src=n.replaceSrc(t,o)}))}}}),r()});","(function(factory) {\r\n  if (typeof define === \"function\" && define.amd) {\r\n    // AMD. Register as an anonymous module.\r\n    define([], factory);\r\n  } else if (typeof exports === \"object\") {\r\n    // Node/CommonJS\r\n    module.exports = factory();\r\n  } else {\r\n    // Browser globals\r\n    window.wNumb = factory();\r\n  }\r\n})(function() {\r\n  \"use strict\";\r\n\r\n  var FormatOptions = [\r\n    \"decimals\",\r\n    \"thousand\",\r\n    \"mark\",\r\n    \"prefix\",\r\n    \"suffix\",\r\n    \"encoder\",\r\n    \"decoder\",\r\n    \"negativeBefore\",\r\n    \"negative\",\r\n    \"edit\",\r\n    \"undo\"\r\n  ];\r\n\r\n  // General\r\n\r\n  // Reverse a string\r\n  function strReverse(a) {\r\n    return a\r\n      .split(\"\")\r\n      .reverse()\r\n      .join(\"\");\r\n  }\r\n\r\n  // Check if a string starts with a specified prefix.\r\n  function strStartsWith(input, match) {\r\n    return input.substring(0, match.length) === match;\r\n  }\r\n\r\n  // Check is a string ends in a specified suffix.\r\n  function strEndsWith(input, match) {\r\n    return input.slice(-1 * match.length) === match;\r\n  }\r\n\r\n  // Throw an error if formatting options are incompatible.\r\n  function throwEqualError(F, a, b) {\r\n    if ((F[a] || F[b]) && F[a] === F[b]) {\r\n      throw new Error(a);\r\n    }\r\n  }\r\n\r\n  // Check if a number is finite and not NaN\r\n  function isValidNumber(input) {\r\n    return typeof input === \"number\" && isFinite(input);\r\n  }\r\n\r\n  // Provide rounding-accurate toFixed method.\r\n  // Borrowed: http://stackoverflow.com/a/21323330/775265\r\n  function toFixed(value, exp) {\r\n    value = value.toString().split(\"e\");\r\n    value = Math.round(+(value[0] + \"e\" + (value[1] ? +value[1] + exp : exp)));\r\n    value = value.toString().split(\"e\");\r\n    return (+(value[0] + \"e\" + (value[1] ? +value[1] - exp : -exp))).toFixed(exp);\r\n  }\r\n\r\n  // Formatting\r\n\r\n  // Accept a number as input, output formatted string.\r\n  function formatTo(\r\n    decimals,\r\n    thousand,\r\n    mark,\r\n    prefix,\r\n    suffix,\r\n    encoder,\r\n    decoder,\r\n    negativeBefore,\r\n    negative,\r\n    edit,\r\n    undo,\r\n    input\r\n  ) {\r\n    var originalInput = input,\r\n      inputIsNegative,\r\n      inputPieces,\r\n      inputBase,\r\n      inputDecimals = \"\",\r\n      output = \"\";\r\n\r\n    // Apply user encoder to the input.\r\n    // Expected outcome: number.\r\n    if (encoder) {\r\n      input = encoder(input);\r\n    }\r\n\r\n    // Stop if no valid number was provided, the number is infinite or NaN.\r\n    if (!isValidNumber(input)) {\r\n      return false;\r\n    }\r\n\r\n    // Rounding away decimals might cause a value of -0\r\n    // when using very small ranges. Remove those cases.\r\n    if (decimals !== false && parseFloat(input.toFixed(decimals)) === 0) {\r\n      input = 0;\r\n    }\r\n\r\n    // Formatting is done on absolute numbers,\r\n    // decorated by an optional negative symbol.\r\n    if (input < 0) {\r\n      inputIsNegative = true;\r\n      input = Math.abs(input);\r\n    }\r\n\r\n    // Reduce the number of decimals to the specified option.\r\n    if (decimals !== false) {\r\n      input = toFixed(input, decimals);\r\n    }\r\n\r\n    // Transform the number into a string, so it can be split.\r\n    input = input.toString();\r\n\r\n    // Break the number on the decimal separator.\r\n    if (input.indexOf(\".\") !== -1) {\r\n      inputPieces = input.split(\".\");\r\n\r\n      inputBase = inputPieces[0];\r\n\r\n      if (mark) {\r\n        inputDecimals = mark + inputPieces[1];\r\n      }\r\n    } else {\r\n      // If it isn't split, the entire number will do.\r\n      inputBase = input;\r\n    }\r\n\r\n    // Group numbers in sets of three.\r\n    if (thousand) {\r\n      inputBase = strReverse(inputBase).match(/.{1,3}/g);\r\n      inputBase = strReverse(inputBase.join(strReverse(thousand)));\r\n    }\r\n\r\n    // If the number is negative, prefix with negation symbol.\r\n    if (inputIsNegative && negativeBefore) {\r\n      output += negativeBefore;\r\n    }\r\n\r\n    // Prefix the number\r\n    if (prefix) {\r\n      output += prefix;\r\n    }\r\n\r\n    // Normal negative option comes after the prefix. Defaults to '-'.\r\n    if (inputIsNegative && negative) {\r\n      output += negative;\r\n    }\r\n\r\n    // Append the actual number.\r\n    output += inputBase;\r\n    output += inputDecimals;\r\n\r\n    // Apply the suffix.\r\n    if (suffix) {\r\n      output += suffix;\r\n    }\r\n\r\n    // Run the output through a user-specified post-formatter.\r\n    if (edit) {\r\n      output = edit(output, originalInput);\r\n    }\r\n\r\n    // All done.\r\n    return output;\r\n  }\r\n\r\n  // Accept a sting as input, output decoded number.\r\n  function formatFrom(\r\n    decimals,\r\n    thousand,\r\n    mark,\r\n    prefix,\r\n    suffix,\r\n    encoder,\r\n    decoder,\r\n    negativeBefore,\r\n    negative,\r\n    edit,\r\n    undo,\r\n    input\r\n  ) {\r\n    var originalInput = input,\r\n      inputIsNegative,\r\n      output = \"\";\r\n\r\n    // User defined pre-decoder. Result must be a non empty string.\r\n    if (undo) {\r\n      input = undo(input);\r\n    }\r\n\r\n    // Test the input. Can't be empty.\r\n    if (!input || typeof input !== \"string\") {\r\n      return false;\r\n    }\r\n\r\n    // If the string starts with the negativeBefore value: remove it.\r\n    // Remember is was there, the number is negative.\r\n    if (negativeBefore && strStartsWith(input, negativeBefore)) {\r\n      input = input.replace(negativeBefore, \"\");\r\n      inputIsNegative = true;\r\n    }\r\n\r\n    // Repeat the same procedure for the prefix.\r\n    if (prefix && strStartsWith(input, prefix)) {\r\n      input = input.replace(prefix, \"\");\r\n    }\r\n\r\n    // And again for negative.\r\n    if (negative && strStartsWith(input, negative)) {\r\n      input = input.replace(negative, \"\");\r\n      inputIsNegative = true;\r\n    }\r\n\r\n    // Remove the suffix.\r\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice\r\n    if (suffix && strEndsWith(input, suffix)) {\r\n      input = input.slice(0, -1 * suffix.length);\r\n    }\r\n\r\n    // Remove the thousand grouping.\r\n    if (thousand) {\r\n      input = input.split(thousand).join(\"\");\r\n    }\r\n\r\n    // Set the decimal separator back to period.\r\n    if (mark) {\r\n      input = input.replace(mark, \".\");\r\n    }\r\n\r\n    // Prepend the negative symbol.\r\n    if (inputIsNegative) {\r\n      output += \"-\";\r\n    }\r\n\r\n    // Add the number\r\n    output += input;\r\n\r\n    // Trim all non-numeric characters (allow '.' and '-');\r\n    output = output.replace(/[^0-9\\.\\-.]/g, \"\");\r\n\r\n    // The value contains no parse-able number.\r\n    if (output === \"\") {\r\n      return false;\r\n    }\r\n\r\n    // Covert to number.\r\n    output = Number(output);\r\n\r\n    // Run the user-specified post-decoder.\r\n    if (decoder) {\r\n      output = decoder(output);\r\n    }\r\n\r\n    // Check is the output is valid, otherwise: return false.\r\n    if (!isValidNumber(output)) {\r\n      return false;\r\n    }\r\n\r\n    return output;\r\n  }\r\n\r\n  // Framework\r\n\r\n  // Validate formatting options\r\n  function validate(inputOptions) {\r\n    var i,\r\n      optionName,\r\n      optionValue,\r\n      filteredOptions = {};\r\n\r\n    if (inputOptions[\"suffix\"] === undefined) {\r\n      inputOptions[\"suffix\"] = inputOptions[\"postfix\"];\r\n    }\r\n\r\n    for (i = 0; i < FormatOptions.length; i += 1) {\r\n      optionName = FormatOptions[i];\r\n      optionValue = inputOptions[optionName];\r\n\r\n      if (optionValue === undefined) {\r\n        // Only default if negativeBefore isn't set.\r\n        if (optionName === \"negative\" && !filteredOptions.negativeBefore) {\r\n          filteredOptions[optionName] = \"-\";\r\n          // Don't set a default for mark when 'thousand' is set.\r\n        } else if (optionName === \"mark\" && filteredOptions.thousand !== \".\") {\r\n          filteredOptions[optionName] = \".\";\r\n        } else {\r\n          filteredOptions[optionName] = false;\r\n        }\r\n\r\n        // Floating points in JS are stable up to 7 decimals.\r\n      } else if (optionName === \"decimals\") {\r\n        if (optionValue >= 0 && optionValue < 8) {\r\n          filteredOptions[optionName] = optionValue;\r\n        } else {\r\n          throw new Error(optionName);\r\n        }\r\n\r\n        // These options, when provided, must be functions.\r\n      } else if (\r\n        optionName === \"encoder\" ||\r\n        optionName === \"decoder\" ||\r\n        optionName === \"edit\" ||\r\n        optionName === \"undo\"\r\n      ) {\r\n        if (typeof optionValue === \"function\") {\r\n          filteredOptions[optionName] = optionValue;\r\n        } else {\r\n          throw new Error(optionName);\r\n        }\r\n\r\n        // Other options are strings.\r\n      } else {\r\n        if (typeof optionValue === \"string\") {\r\n          filteredOptions[optionName] = optionValue;\r\n        } else {\r\n          throw new Error(optionName);\r\n        }\r\n      }\r\n    }\r\n\r\n    // Some values can't be extracted from a\r\n    // string if certain combinations are present.\r\n    throwEqualError(filteredOptions, \"mark\", \"thousand\");\r\n    throwEqualError(filteredOptions, \"prefix\", \"negative\");\r\n    throwEqualError(filteredOptions, \"prefix\", \"negativeBefore\");\r\n\r\n    return filteredOptions;\r\n  }\r\n\r\n  // Pass all options as function arguments\r\n  function passAll(options, method, input) {\r\n    var i,\r\n      args = [];\r\n\r\n    // Add all options in order of FormatOptions\r\n    for (i = 0; i < FormatOptions.length; i += 1) {\r\n      args.push(options[FormatOptions[i]]);\r\n    }\r\n\r\n    // Append the input, then call the method, presenting all\r\n    // options as arguments.\r\n    args.push(input);\r\n    return method.apply(\"\", args);\r\n  }\r\n\r\n  function wNumb(options) {\r\n    if (!(this instanceof wNumb)) {\r\n      return new wNumb(options);\r\n    }\r\n\r\n    if (typeof options !== \"object\") {\r\n      return;\r\n    }\r\n\r\n    options = validate(options);\r\n\r\n    // Call 'formatTo' with proper arguments.\r\n    this.to = function(input) {\r\n      return passAll(options, formatTo, input);\r\n    };\r\n\r\n    // Call 'formatFrom' with proper arguments.\r\n    this.from = function(input) {\r\n      return passAll(options, formatFrom, input);\r\n    };\r\n  }\r\n\r\n  return wNumb;\r\n});\r\n","/*\n     _ _      _       _\n ___| (_) ___| | __  (_)___\n/ __| | |/ __| |/ /  | / __|\n\\__ \\ | | (__|   < _ | \\__ \\\n|___/_|_|\\___|_|\\_(_)/ |___/\n                   |__/\n\n Version: 1.8.1\n  Author: Ken Wheeler\n Website: http://kenwheeler.github.io\n    Docs: http://kenwheeler.github.io/slick\n    Repo: http://github.com/kenwheeler/slick\n  Issues: http://github.com/kenwheeler/slick/issues\n\n */\n/* global window, document, define, jQuery, setInterval, clearInterval */\n;(function(factory) {\n    'use strict';\n    if (typeof define === 'function' && define.amd) {\n        define(['jquery'], factory);\n    } else if (typeof exports !== 'undefined') {\n        module.exports = factory(require('jquery'));\n    } else {\n        factory(jQuery);\n    }\n\n}(function($) {\n    'use strict';\n    var Slick = window.Slick || {};\n\n    Slick = (function() {\n\n        var instanceUid = 0;\n\n        function Slick(element, settings) {\n\n            var _ = this, dataSettings;\n\n            _.defaults = {\n                accessibility: true,\n                adaptiveHeight: false,\n                appendArrows: $(element),\n                appendDots: $(element),\n                arrows: true,\n                asNavFor: null,\n                prevArrow: '<button class=\"slick-prev\" aria-label=\"Previous\" type=\"button\">Previous</button>',\n                nextArrow: '<button class=\"slick-next\" aria-label=\"Next\" type=\"button\">Next</button>',\n                autoplay: false,\n                autoplaySpeed: 3000,\n                centerMode: false,\n                centerPadding: '50px',\n                cssEase: 'ease',\n                customPaging: function(slider, i) {\n                    return $('<button type=\"button\" />').text(i + 1);\n                },\n                dots: false,\n                dotsClass: 'slick-dots',\n                draggable: true,\n                easing: 'linear',\n                edgeFriction: 0.35,\n                fade: false,\n                focusOnSelect: false,\n                focusOnChange: false,\n                infinite: true,\n                initialSlide: 0,\n                lazyLoad: 'ondemand',\n                mobileFirst: false,\n                pauseOnHover: true,\n                pauseOnFocus: true,\n                pauseOnDotsHover: false,\n                respondTo: 'window',\n                responsive: null,\n                rows: 1,\n                rtl: false,\n                slide: '',\n                slidesPerRow: 1,\n                slidesToShow: 1,\n                slidesToScroll: 1,\n                speed: 500,\n                swipe: true,\n                swipeToSlide: false,\n                touchMove: true,\n                touchThreshold: 5,\n                useCSS: true,\n                useTransform: true,\n                variableWidth: false,\n                vertical: false,\n                verticalSwiping: false,\n                waitForAnimate: true,\n                zIndex: 1000\n            };\n\n            _.initials = {\n                animating: false,\n                dragging: false,\n                autoPlayTimer: null,\n                currentDirection: 0,\n                currentLeft: null,\n                currentSlide: 0,\n                direction: 1,\n                $dots: null,\n                listWidth: null,\n                listHeight: null,\n                loadIndex: 0,\n                $nextArrow: null,\n                $prevArrow: null,\n                scrolling: false,\n                slideCount: null,\n                slideWidth: null,\n                $slideTrack: null,\n                $slides: null,\n                sliding: false,\n                slideOffset: 0,\n                swipeLeft: null,\n                swiping: false,\n                $list: null,\n                touchObject: {},\n                transformsEnabled: false,\n                unslicked: false\n            };\n\n            $.extend(_, _.initials);\n\n            _.activeBreakpoint = null;\n            _.animType = null;\n            _.animProp = null;\n            _.breakpoints = [];\n            _.breakpointSettings = [];\n            _.cssTransitions = false;\n            _.focussed = false;\n            _.interrupted = false;\n            _.hidden = 'hidden';\n            _.paused = true;\n            _.positionProp = null;\n            _.respondTo = null;\n            _.rowCount = 1;\n            _.shouldClick = true;\n            _.$slider = $(element);\n            _.$slidesCache = null;\n            _.transformType = null;\n            _.transitionType = null;\n            _.visibilityChange = 'visibilitychange';\n            _.windowWidth = 0;\n            _.windowTimer = null;\n\n            dataSettings = $(element).data('slick') || {};\n\n            _.options = $.extend({}, _.defaults, settings, dataSettings);\n\n            _.currentSlide = _.options.initialSlide;\n\n            _.originalSettings = _.options;\n\n            if (typeof document.mozHidden !== 'undefined') {\n                _.hidden = 'mozHidden';\n                _.visibilityChange = 'mozvisibilitychange';\n            } else if (typeof document.webkitHidden !== 'undefined') {\n                _.hidden = 'webkitHidden';\n                _.visibilityChange = 'webkitvisibilitychange';\n            }\n\n            _.autoPlay = $.proxy(_.autoPlay, _);\n            _.autoPlayClear = $.proxy(_.autoPlayClear, _);\n            _.autoPlayIterator = $.proxy(_.autoPlayIterator, _);\n            _.changeSlide = $.proxy(_.changeSlide, _);\n            _.clickHandler = $.proxy(_.clickHandler, _);\n            _.selectHandler = $.proxy(_.selectHandler, _);\n            _.setPosition = $.proxy(_.setPosition, _);\n            _.swipeHandler = $.proxy(_.swipeHandler, _);\n            _.dragHandler = $.proxy(_.dragHandler, _);\n            _.keyHandler = $.proxy(_.keyHandler, _);\n\n            _.instanceUid = instanceUid++;\n\n            // A simple way to check for HTML strings\n            // Strict HTML recognition (must start with <)\n            // Extracted from jQuery v1.11 source\n            _.htmlExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*)$/;\n\n\n            _.registerBreakpoints();\n            _.init(true);\n\n        }\n\n        return Slick;\n\n    }());\n\n    Slick.prototype.activateADA = function() {\n        var _ = this;\n\n        _.$slideTrack.find('.slick-active').attr({\n            'aria-hidden': 'false'\n        }).find('a, input, button, select').attr({\n            'tabindex': '0'\n        });\n\n    };\n\n    Slick.prototype.addSlide = Slick.prototype.slickAdd = function(markup, index, addBefore) {\n\n        var _ = this;\n\n        if (typeof(index) === 'boolean') {\n            addBefore = index;\n            index = null;\n        } else if (index < 0 || (index >= _.slideCount)) {\n            return false;\n        }\n\n        _.unload();\n\n        if (typeof(index) === 'number') {\n            if (index === 0 && _.$slides.length === 0) {\n                $(markup).appendTo(_.$slideTrack);\n            } else if (addBefore) {\n                $(markup).insertBefore(_.$slides.eq(index));\n            } else {\n                $(markup).insertAfter(_.$slides.eq(index));\n            }\n        } else {\n            if (addBefore === true) {\n                $(markup).prependTo(_.$slideTrack);\n            } else {\n                $(markup).appendTo(_.$slideTrack);\n            }\n        }\n\n        _.$slides = _.$slideTrack.children(this.options.slide);\n\n        _.$slideTrack.children(this.options.slide).detach();\n\n        _.$slideTrack.append(_.$slides);\n\n        _.$slides.each(function(index, element) {\n            $(element).attr('data-slick-index', index);\n        });\n\n        _.$slidesCache = _.$slides;\n\n        _.reinit();\n\n    };\n\n    Slick.prototype.animateHeight = function() {\n        var _ = this;\n        if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {\n            var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);\n            _.$list.animate({\n                height: targetHeight\n            }, _.options.speed);\n        }\n    };\n\n    Slick.prototype.animateSlide = function(targetLeft, callback) {\n\n        var animProps = {},\n            _ = this;\n\n        _.animateHeight();\n\n        if (_.options.rtl === true && _.options.vertical === false) {\n            targetLeft = -targetLeft;\n        }\n        if (_.transformsEnabled === false) {\n            if (_.options.vertical === false) {\n                _.$slideTrack.animate({\n                    left: targetLeft\n                }, _.options.speed, _.options.easing, callback);\n            } else {\n                _.$slideTrack.animate({\n                    top: targetLeft\n                }, _.options.speed, _.options.easing, callback);\n            }\n\n        } else {\n\n            if (_.cssTransitions === false) {\n                if (_.options.rtl === true) {\n                    _.currentLeft = -(_.currentLeft);\n                }\n                $({\n                    animStart: _.currentLeft\n                }).animate({\n                    animStart: targetLeft\n                }, {\n                    duration: _.options.speed,\n                    easing: _.options.easing,\n                    step: function(now) {\n                        now = Math.ceil(now);\n                        if (_.options.vertical === false) {\n                            animProps[_.animType] = 'translate(' +\n                                now + 'px, 0px)';\n                            _.$slideTrack.css(animProps);\n                        } else {\n                            animProps[_.animType] = 'translate(0px,' +\n                                now + 'px)';\n                            _.$slideTrack.css(animProps);\n                        }\n                    },\n                    complete: function() {\n                        if (callback) {\n                            callback.call();\n                        }\n                    }\n                });\n\n            } else {\n\n                _.applyTransition();\n                targetLeft = Math.ceil(targetLeft);\n\n                if (_.options.vertical === false) {\n                    animProps[_.animType] = 'translate3d(' + targetLeft + 'px, 0px, 0px)';\n                } else {\n                    animProps[_.animType] = 'translate3d(0px,' + targetLeft + 'px, 0px)';\n                }\n                _.$slideTrack.css(animProps);\n\n                if (callback) {\n                    setTimeout(function() {\n\n                        _.disableTransition();\n\n                        callback.call();\n                    }, _.options.speed);\n                }\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.getNavTarget = function() {\n\n        var _ = this,\n            asNavFor = _.options.asNavFor;\n\n        if ( asNavFor && asNavFor !== null ) {\n            asNavFor = $(asNavFor).not(_.$slider);\n        }\n\n        return asNavFor;\n\n    };\n\n    Slick.prototype.asNavFor = function(index) {\n\n        var _ = this,\n            asNavFor = _.getNavTarget();\n\n        if ( asNavFor !== null && typeof asNavFor === 'object' ) {\n            asNavFor.each(function() {\n                var target = $(this).slick('getSlick');\n                if(!target.unslicked) {\n                    target.slideHandler(index, true);\n                }\n            });\n        }\n\n    };\n\n    Slick.prototype.applyTransition = function(slide) {\n\n        var _ = this,\n            transition = {};\n\n        if (_.options.fade === false) {\n            transition[_.transitionType] = _.transformType + ' ' + _.options.speed + 'ms ' + _.options.cssEase;\n        } else {\n            transition[_.transitionType] = 'opacity ' + _.options.speed + 'ms ' + _.options.cssEase;\n        }\n\n        if (_.options.fade === false) {\n            _.$slideTrack.css(transition);\n        } else {\n            _.$slides.eq(slide).css(transition);\n        }\n\n    };\n\n    Slick.prototype.autoPlay = function() {\n\n        var _ = this;\n\n        _.autoPlayClear();\n\n        if ( _.slideCount > _.options.slidesToShow ) {\n            _.autoPlayTimer = setInterval( _.autoPlayIterator, _.options.autoplaySpeed );\n        }\n\n    };\n\n    Slick.prototype.autoPlayClear = function() {\n\n        var _ = this;\n\n        if (_.autoPlayTimer) {\n            clearInterval(_.autoPlayTimer);\n        }\n\n    };\n\n    Slick.prototype.autoPlayIterator = function() {\n\n        var _ = this,\n            slideTo = _.currentSlide + _.options.slidesToScroll;\n\n        if ( !_.paused && !_.interrupted && !_.focussed ) {\n\n            if ( _.options.infinite === false ) {\n\n                if ( _.direction === 1 && ( _.currentSlide + 1 ) === ( _.slideCount - 1 )) {\n                    _.direction = 0;\n                }\n\n                else if ( _.direction === 0 ) {\n\n                    slideTo = _.currentSlide - _.options.slidesToScroll;\n\n                    if ( _.currentSlide - 1 === 0 ) {\n                        _.direction = 1;\n                    }\n\n                }\n\n            }\n\n            _.slideHandler( slideTo );\n\n        }\n\n    };\n\n    Slick.prototype.buildArrows = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true ) {\n\n            _.$prevArrow = $(_.options.prevArrow).addClass('slick-arrow');\n            _.$nextArrow = $(_.options.nextArrow).addClass('slick-arrow');\n\n            if( _.slideCount > _.options.slidesToShow ) {\n\n                _.$prevArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex');\n                _.$nextArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex');\n\n                if (_.htmlExpr.test(_.options.prevArrow)) {\n                    _.$prevArrow.prependTo(_.options.appendArrows);\n                }\n\n                if (_.htmlExpr.test(_.options.nextArrow)) {\n                    _.$nextArrow.appendTo(_.options.appendArrows);\n                }\n\n                if (_.options.infinite !== true) {\n                    _.$prevArrow\n                        .addClass('slick-disabled')\n                        .attr('aria-disabled', 'true');\n                }\n\n            } else {\n\n                _.$prevArrow.add( _.$nextArrow )\n\n                    .addClass('slick-hidden')\n                    .attr({\n                        'aria-disabled': 'true',\n                        'tabindex': '-1'\n                    });\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.buildDots = function() {\n\n        var _ = this,\n            i, dot;\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$slider.addClass('slick-dotted');\n\n            dot = $('<ul />').addClass(_.options.dotsClass);\n\n            for (i = 0; i <= _.getDotCount(); i += 1) {\n                dot.append($('<li />').append(_.options.customPaging.call(this, _, i)));\n            }\n\n            _.$dots = dot.appendTo(_.options.appendDots);\n\n            _.$dots.find('li').first().addClass('slick-active');\n\n        }\n\n    };\n\n    Slick.prototype.buildOut = function() {\n\n        var _ = this;\n\n        _.$slides =\n            _.$slider\n                .children( _.options.slide + ':not(.slick-cloned)')\n                .addClass('slick-slide');\n\n        _.slideCount = _.$slides.length;\n\n        _.$slides.each(function(index, element) {\n            $(element)\n                .attr('data-slick-index', index)\n                .data('originalStyling', $(element).attr('style') || '');\n        });\n\n        _.$slider.addClass('slick-slider');\n\n        _.$slideTrack = (_.slideCount === 0) ?\n            $('<div class=\"slick-track\"/>').appendTo(_.$slider) :\n            _.$slides.wrapAll('<div class=\"slick-track\"/>').parent();\n\n        _.$list = _.$slideTrack.wrap(\n            '<div class=\"slick-list\"/>').parent();\n        _.$slideTrack.css('opacity', 0);\n\n        if (_.options.centerMode === true || _.options.swipeToSlide === true) {\n            _.options.slidesToScroll = 1;\n        }\n\n        $('img[data-lazy]', _.$slider).not('[src]').addClass('slick-loading');\n\n        _.setupInfinite();\n\n        _.buildArrows();\n\n        _.buildDots();\n\n        _.updateDots();\n\n\n        _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);\n\n        if (_.options.draggable === true) {\n            _.$list.addClass('draggable');\n        }\n\n    };\n\n    Slick.prototype.buildRows = function() {\n\n        var _ = this, a, b, c, newSlides, numOfSlides, originalSlides,slidesPerSection;\n\n        newSlides = document.createDocumentFragment();\n        originalSlides = _.$slider.children();\n\n        if(_.options.rows > 0) {\n\n            slidesPerSection = _.options.slidesPerRow * _.options.rows;\n            numOfSlides = Math.ceil(\n                originalSlides.length / slidesPerSection\n            );\n\n            for(a = 0; a < numOfSlides; a++){\n                var slide = document.createElement('div');\n                for(b = 0; b < _.options.rows; b++) {\n                    var row = document.createElement('div');\n                    for(c = 0; c < _.options.slidesPerRow; c++) {\n                        var target = (a * slidesPerSection + ((b * _.options.slidesPerRow) + c));\n                        if (originalSlides.get(target)) {\n                            row.appendChild(originalSlides.get(target));\n                        }\n                    }\n                    slide.appendChild(row);\n                }\n                newSlides.appendChild(slide);\n            }\n\n            _.$slider.empty().append(newSlides);\n            _.$slider.children().children().children()\n                .css({\n                    'width':(100 / _.options.slidesPerRow) + '%',\n                    'display': 'inline-block'\n                });\n\n        }\n\n    };\n\n    Slick.prototype.checkResponsive = function(initial, forceUpdate) {\n\n        var _ = this,\n            breakpoint, targetBreakpoint, respondToWidth, triggerBreakpoint = false;\n        var sliderWidth = _.$slider.width();\n        var windowWidth = window.innerWidth || $(window).width();\n\n        if (_.respondTo === 'window') {\n            respondToWidth = windowWidth;\n        } else if (_.respondTo === 'slider') {\n            respondToWidth = sliderWidth;\n        } else if (_.respondTo === 'min') {\n            respondToWidth = Math.min(windowWidth, sliderWidth);\n        }\n\n        if ( _.options.responsive &&\n            _.options.responsive.length &&\n            _.options.responsive !== null) {\n\n            targetBreakpoint = null;\n\n            for (breakpoint in _.breakpoints) {\n                if (_.breakpoints.hasOwnProperty(breakpoint)) {\n                    if (_.originalSettings.mobileFirst === false) {\n                        if (respondToWidth < _.breakpoints[breakpoint]) {\n                            targetBreakpoint = _.breakpoints[breakpoint];\n                        }\n                    } else {\n                        if (respondToWidth > _.breakpoints[breakpoint]) {\n                            targetBreakpoint = _.breakpoints[breakpoint];\n                        }\n                    }\n                }\n            }\n\n            if (targetBreakpoint !== null) {\n                if (_.activeBreakpoint !== null) {\n                    if (targetBreakpoint !== _.activeBreakpoint || forceUpdate) {\n                        _.activeBreakpoint =\n                            targetBreakpoint;\n                        if (_.breakpointSettings[targetBreakpoint] === 'unslick') {\n                            _.unslick(targetBreakpoint);\n                        } else {\n                            _.options = $.extend({}, _.originalSettings,\n                                _.breakpointSettings[\n                                    targetBreakpoint]);\n                            if (initial === true) {\n                                _.currentSlide = _.options.initialSlide;\n                            }\n                            _.refresh(initial);\n                        }\n                        triggerBreakpoint = targetBreakpoint;\n                    }\n                } else {\n                    _.activeBreakpoint = targetBreakpoint;\n                    if (_.breakpointSettings[targetBreakpoint] === 'unslick') {\n                        _.unslick(targetBreakpoint);\n                    } else {\n                        _.options = $.extend({}, _.originalSettings,\n                            _.breakpointSettings[\n                                targetBreakpoint]);\n                        if (initial === true) {\n                            _.currentSlide = _.options.initialSlide;\n                        }\n                        _.refresh(initial);\n                    }\n                    triggerBreakpoint = targetBreakpoint;\n                }\n            } else {\n                if (_.activeBreakpoint !== null) {\n                    _.activeBreakpoint = null;\n                    _.options = _.originalSettings;\n                    if (initial === true) {\n                        _.currentSlide = _.options.initialSlide;\n                    }\n                    _.refresh(initial);\n                    triggerBreakpoint = targetBreakpoint;\n                }\n            }\n\n            // only trigger breakpoints during an actual break. not on initialize.\n            if( !initial && triggerBreakpoint !== false ) {\n                _.$slider.trigger('breakpoint', [_, triggerBreakpoint]);\n            }\n        }\n\n    };\n\n    Slick.prototype.changeSlide = function(event, dontAnimate) {\n\n        var _ = this,\n            $target = $(event.currentTarget),\n            indexOffset, slideOffset, unevenOffset;\n\n        // If target is a link, prevent default action.\n        if($target.is('a')) {\n            event.preventDefault();\n        }\n\n        // If target is not the <li> element (ie: a child), find the <li>.\n        if(!$target.is('li')) {\n            $target = $target.closest('li');\n        }\n\n        unevenOffset = (_.slideCount % _.options.slidesToScroll !== 0);\n        indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) % _.options.slidesToScroll;\n\n        switch (event.data.message) {\n\n            case 'previous':\n                slideOffset = indexOffset === 0 ? _.options.slidesToScroll : _.options.slidesToShow - indexOffset;\n                if (_.slideCount > _.options.slidesToShow) {\n                    _.slideHandler(_.currentSlide - slideOffset, false, dontAnimate);\n                }\n                break;\n\n            case 'next':\n                slideOffset = indexOffset === 0 ? _.options.slidesToScroll : indexOffset;\n                if (_.slideCount > _.options.slidesToShow) {\n                    _.slideHandler(_.currentSlide + slideOffset, false, dontAnimate);\n                }\n                break;\n\n            case 'index':\n                var index = event.data.index === 0 ? 0 :\n                    event.data.index || $target.index() * _.options.slidesToScroll;\n\n                _.slideHandler(_.checkNavigable(index), false, dontAnimate);\n                $target.children().trigger('focus');\n                break;\n\n            default:\n                return;\n        }\n\n    };\n\n    Slick.prototype.checkNavigable = function(index) {\n\n        var _ = this,\n            navigables, prevNavigable;\n\n        navigables = _.getNavigableIndexes();\n        prevNavigable = 0;\n        if (index > navigables[navigables.length - 1]) {\n            index = navigables[navigables.length - 1];\n        } else {\n            for (var n in navigables) {\n                if (index < navigables[n]) {\n                    index = prevNavigable;\n                    break;\n                }\n                prevNavigable = navigables[n];\n            }\n        }\n\n        return index;\n    };\n\n    Slick.prototype.cleanUpEvents = function() {\n\n        var _ = this;\n\n        if (_.options.dots && _.$dots !== null) {\n\n            $('li', _.$dots)\n                .off('click.slick', _.changeSlide)\n                .off('mouseenter.slick', $.proxy(_.interrupt, _, true))\n                .off('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n            if (_.options.accessibility === true) {\n                _.$dots.off('keydown.slick', _.keyHandler);\n            }\n        }\n\n        _.$slider.off('focus.slick blur.slick');\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n            _.$prevArrow && _.$prevArrow.off('click.slick', _.changeSlide);\n            _.$nextArrow && _.$nextArrow.off('click.slick', _.changeSlide);\n\n            if (_.options.accessibility === true) {\n                _.$prevArrow && _.$prevArrow.off('keydown.slick', _.keyHandler);\n                _.$nextArrow && _.$nextArrow.off('keydown.slick', _.keyHandler);\n            }\n        }\n\n        _.$list.off('touchstart.slick mousedown.slick', _.swipeHandler);\n        _.$list.off('touchmove.slick mousemove.slick', _.swipeHandler);\n        _.$list.off('touchend.slick mouseup.slick', _.swipeHandler);\n        _.$list.off('touchcancel.slick mouseleave.slick', _.swipeHandler);\n\n        _.$list.off('click.slick', _.clickHandler);\n\n        $(document).off(_.visibilityChange, _.visibility);\n\n        _.cleanUpSlideEvents();\n\n        if (_.options.accessibility === true) {\n            _.$list.off('keydown.slick', _.keyHandler);\n        }\n\n        if (_.options.focusOnSelect === true) {\n            $(_.$slideTrack).children().off('click.slick', _.selectHandler);\n        }\n\n        $(window).off('orientationchange.slick.slick-' + _.instanceUid, _.orientationChange);\n\n        $(window).off('resize.slick.slick-' + _.instanceUid, _.resize);\n\n        $('[draggable!=true]', _.$slideTrack).off('dragstart', _.preventDefault);\n\n        $(window).off('load.slick.slick-' + _.instanceUid, _.setPosition);\n\n    };\n\n    Slick.prototype.cleanUpSlideEvents = function() {\n\n        var _ = this;\n\n        _.$list.off('mouseenter.slick', $.proxy(_.interrupt, _, true));\n        _.$list.off('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n    };\n\n    Slick.prototype.cleanUpRows = function() {\n\n        var _ = this, originalSlides;\n\n        if(_.options.rows > 0) {\n            originalSlides = _.$slides.children().children();\n            originalSlides.removeAttr('style');\n            _.$slider.empty().append(originalSlides);\n        }\n\n    };\n\n    Slick.prototype.clickHandler = function(event) {\n\n        var _ = this;\n\n        if (_.shouldClick === false) {\n            event.stopImmediatePropagation();\n            event.stopPropagation();\n            event.preventDefault();\n        }\n\n    };\n\n    Slick.prototype.destroy = function(refresh) {\n\n        var _ = this;\n\n        _.autoPlayClear();\n\n        _.touchObject = {};\n\n        _.cleanUpEvents();\n\n        $('.slick-cloned', _.$slider).detach();\n\n        if (_.$dots) {\n            _.$dots.remove();\n        }\n\n        if ( _.$prevArrow && _.$prevArrow.length ) {\n\n            _.$prevArrow\n                .removeClass('slick-disabled slick-arrow slick-hidden')\n                .removeAttr('aria-hidden aria-disabled tabindex')\n                .css('display','');\n\n            if ( _.htmlExpr.test( _.options.prevArrow )) {\n                _.$prevArrow.remove();\n            }\n        }\n\n        if ( _.$nextArrow && _.$nextArrow.length ) {\n\n            _.$nextArrow\n                .removeClass('slick-disabled slick-arrow slick-hidden')\n                .removeAttr('aria-hidden aria-disabled tabindex')\n                .css('display','');\n\n            if ( _.htmlExpr.test( _.options.nextArrow )) {\n                _.$nextArrow.remove();\n            }\n        }\n\n\n        if (_.$slides) {\n\n            _.$slides\n                .removeClass('slick-slide slick-active slick-center slick-visible slick-current')\n                .removeAttr('aria-hidden')\n                .removeAttr('data-slick-index')\n                .each(function(){\n                    $(this).attr('style', $(this).data('originalStyling'));\n                });\n\n            _.$slideTrack.children(this.options.slide).detach();\n\n            _.$slideTrack.detach();\n\n            _.$list.detach();\n\n            _.$slider.append(_.$slides);\n        }\n\n        _.cleanUpRows();\n\n        _.$slider.removeClass('slick-slider');\n        _.$slider.removeClass('slick-initialized');\n        _.$slider.removeClass('slick-dotted');\n\n        _.unslicked = true;\n\n        if(!refresh) {\n            _.$slider.trigger('destroy', [_]);\n        }\n\n    };\n\n    Slick.prototype.disableTransition = function(slide) {\n\n        var _ = this,\n            transition = {};\n\n        transition[_.transitionType] = '';\n\n        if (_.options.fade === false) {\n            _.$slideTrack.css(transition);\n        } else {\n            _.$slides.eq(slide).css(transition);\n        }\n\n    };\n\n    Slick.prototype.fadeSlide = function(slideIndex, callback) {\n\n        var _ = this;\n\n        if (_.cssTransitions === false) {\n\n            _.$slides.eq(slideIndex).css({\n                zIndex: _.options.zIndex\n            });\n\n            _.$slides.eq(slideIndex).animate({\n                opacity: 1\n            }, _.options.speed, _.options.easing, callback);\n\n        } else {\n\n            _.applyTransition(slideIndex);\n\n            _.$slides.eq(slideIndex).css({\n                opacity: 1,\n                zIndex: _.options.zIndex\n            });\n\n            if (callback) {\n                setTimeout(function() {\n\n                    _.disableTransition(slideIndex);\n\n                    callback.call();\n                }, _.options.speed);\n            }\n\n        }\n\n    };\n\n    Slick.prototype.fadeSlideOut = function(slideIndex) {\n\n        var _ = this;\n\n        if (_.cssTransitions === false) {\n\n            _.$slides.eq(slideIndex).animate({\n                opacity: 0,\n                zIndex: _.options.zIndex - 2\n            }, _.options.speed, _.options.easing);\n\n        } else {\n\n            _.applyTransition(slideIndex);\n\n            _.$slides.eq(slideIndex).css({\n                opacity: 0,\n                zIndex: _.options.zIndex - 2\n            });\n\n        }\n\n    };\n\n    Slick.prototype.filterSlides = Slick.prototype.slickFilter = function(filter) {\n\n        var _ = this;\n\n        if (filter !== null) {\n\n            _.$slidesCache = _.$slides;\n\n            _.unload();\n\n            _.$slideTrack.children(this.options.slide).detach();\n\n            _.$slidesCache.filter(filter).appendTo(_.$slideTrack);\n\n            _.reinit();\n\n        }\n\n    };\n\n    Slick.prototype.focusHandler = function() {\n\n        var _ = this;\n\n        _.$slider\n            .off('focus.slick blur.slick')\n            .on('focus.slick blur.slick', '*', function(event) {\n\n            event.stopImmediatePropagation();\n            var $sf = $(this);\n\n            setTimeout(function() {\n\n                if( _.options.pauseOnFocus ) {\n                    _.focussed = $sf.is(':focus');\n                    _.autoPlay();\n                }\n\n            }, 0);\n\n        });\n    };\n\n    Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide = function() {\n\n        var _ = this;\n        return _.currentSlide;\n\n    };\n\n    Slick.prototype.getDotCount = function() {\n\n        var _ = this;\n\n        var breakPoint = 0;\n        var counter = 0;\n        var pagerQty = 0;\n\n        if (_.options.infinite === true) {\n            if (_.slideCount <= _.options.slidesToShow) {\n                 ++pagerQty;\n            } else {\n                while (breakPoint < _.slideCount) {\n                    ++pagerQty;\n                    breakPoint = counter + _.options.slidesToScroll;\n                    counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n                }\n            }\n        } else if (_.options.centerMode === true) {\n            pagerQty = _.slideCount;\n        } else if(!_.options.asNavFor) {\n            pagerQty = 1 + Math.ceil((_.slideCount - _.options.slidesToShow) / _.options.slidesToScroll);\n        }else {\n            while (breakPoint < _.slideCount) {\n                ++pagerQty;\n                breakPoint = counter + _.options.slidesToScroll;\n                counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n            }\n        }\n\n        return pagerQty - 1;\n\n    };\n\n    Slick.prototype.getLeft = function(slideIndex) {\n\n        var _ = this,\n            targetLeft,\n            verticalHeight,\n            verticalOffset = 0,\n            targetSlide,\n            coef;\n\n        _.slideOffset = 0;\n        verticalHeight = _.$slides.first().outerHeight(true);\n\n        if (_.options.infinite === true) {\n            if (_.slideCount > _.options.slidesToShow) {\n                _.slideOffset = (_.slideWidth * _.options.slidesToShow) * -1;\n                coef = -1\n\n                if (_.options.vertical === true && _.options.centerMode === true) {\n                    if (_.options.slidesToShow === 2) {\n                        coef = -1.5;\n                    } else if (_.options.slidesToShow === 1) {\n                        coef = -2\n                    }\n                }\n                verticalOffset = (verticalHeight * _.options.slidesToShow) * coef;\n            }\n            if (_.slideCount % _.options.slidesToScroll !== 0) {\n                if (slideIndex + _.options.slidesToScroll > _.slideCount && _.slideCount > _.options.slidesToShow) {\n                    if (slideIndex > _.slideCount) {\n                        _.slideOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * _.slideWidth) * -1;\n                        verticalOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * verticalHeight) * -1;\n                    } else {\n                        _.slideOffset = ((_.slideCount % _.options.slidesToScroll) * _.slideWidth) * -1;\n                        verticalOffset = ((_.slideCount % _.options.slidesToScroll) * verticalHeight) * -1;\n                    }\n                }\n            }\n        } else {\n            if (slideIndex + _.options.slidesToShow > _.slideCount) {\n                _.slideOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * _.slideWidth;\n                verticalOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * verticalHeight;\n            }\n        }\n\n        if (_.slideCount <= _.options.slidesToShow) {\n            _.slideOffset = 0;\n            verticalOffset = 0;\n        }\n\n        if (_.options.centerMode === true && _.slideCount <= _.options.slidesToShow) {\n            _.slideOffset = ((_.slideWidth * Math.floor(_.options.slidesToShow)) / 2) - ((_.slideWidth * _.slideCount) / 2);\n        } else if (_.options.centerMode === true && _.options.infinite === true) {\n            _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2) - _.slideWidth;\n        } else if (_.options.centerMode === true) {\n            _.slideOffset = 0;\n            _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2);\n        }\n\n        if (_.options.vertical === false) {\n            targetLeft = ((slideIndex * _.slideWidth) * -1) + _.slideOffset;\n        } else {\n            targetLeft = ((slideIndex * verticalHeight) * -1) + verticalOffset;\n        }\n\n        if (_.options.variableWidth === true) {\n\n            if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {\n                targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);\n            } else {\n                targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow);\n            }\n\n            if (_.options.rtl === true) {\n                if (targetSlide[0]) {\n                    targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;\n                } else {\n                    targetLeft =  0;\n                }\n            } else {\n                targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;\n            }\n\n            if (_.options.centerMode === true) {\n                if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {\n                    targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);\n                } else {\n                    targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow + 1);\n                }\n\n                if (_.options.rtl === true) {\n                    if (targetSlide[0]) {\n                        targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;\n                    } else {\n                        targetLeft =  0;\n                    }\n                } else {\n                    targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;\n                }\n\n                targetLeft += (_.$list.width() - targetSlide.outerWidth()) / 2;\n            }\n        }\n\n        return targetLeft;\n\n    };\n\n    Slick.prototype.getOption = Slick.prototype.slickGetOption = function(option) {\n\n        var _ = this;\n\n        return _.options[option];\n\n    };\n\n    Slick.prototype.getNavigableIndexes = function() {\n\n        var _ = this,\n            breakPoint = 0,\n            counter = 0,\n            indexes = [],\n            max;\n\n        if (_.options.infinite === false) {\n            max = _.slideCount;\n        } else {\n            breakPoint = _.options.slidesToScroll * -1;\n            counter = _.options.slidesToScroll * -1;\n            max = _.slideCount * 2;\n        }\n\n        while (breakPoint < max) {\n            indexes.push(breakPoint);\n            breakPoint = counter + _.options.slidesToScroll;\n            counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n        }\n\n        return indexes;\n\n    };\n\n    Slick.prototype.getSlick = function() {\n\n        return this;\n\n    };\n\n    Slick.prototype.getSlideCount = function() {\n\n        var _ = this,\n            slidesTraversed, swipedSlide, centerOffset;\n\n        centerOffset = _.options.centerMode === true ? _.slideWidth * Math.floor(_.options.slidesToShow / 2) : 0;\n\n        if (_.options.swipeToSlide === true) {\n            _.$slideTrack.find('.slick-slide').each(function(index, slide) {\n                if (slide.offsetLeft - centerOffset + ($(slide).outerWidth() / 2) > (_.swipeLeft * -1)) {\n                    swipedSlide = slide;\n                    return false;\n                }\n            });\n\n            slidesTraversed = Math.abs($(swipedSlide).attr('data-slick-index') - _.currentSlide) || 1;\n\n            return slidesTraversed;\n\n        } else {\n            return _.options.slidesToScroll;\n        }\n\n    };\n\n    Slick.prototype.goTo = Slick.prototype.slickGoTo = function(slide, dontAnimate) {\n\n        var _ = this;\n\n        _.changeSlide({\n            data: {\n                message: 'index',\n                index: parseInt(slide)\n            }\n        }, dontAnimate);\n\n    };\n\n    Slick.prototype.init = function(creation) {\n\n        var _ = this;\n\n        if (!$(_.$slider).hasClass('slick-initialized')) {\n\n            $(_.$slider).addClass('slick-initialized');\n\n            _.buildRows();\n            _.buildOut();\n            _.setProps();\n            _.startLoad();\n            _.loadSlider();\n            _.initializeEvents();\n            _.updateArrows();\n            _.updateDots();\n            _.checkResponsive(true);\n            _.focusHandler();\n\n        }\n\n        if (creation) {\n            _.$slider.trigger('init', [_]);\n        }\n\n        if (_.options.accessibility === true) {\n            _.initADA();\n        }\n\n        if ( _.options.autoplay ) {\n\n            _.paused = false;\n            _.autoPlay();\n\n        }\n\n    };\n\n    Slick.prototype.initADA = function() {\n        var _ = this,\n                numDotGroups = Math.ceil(_.slideCount / _.options.slidesToShow),\n                tabControlIndexes = _.getNavigableIndexes().filter(function(val) {\n                    return (val >= 0) && (val < _.slideCount);\n                });\n\n        _.$slides.add(_.$slideTrack.find('.slick-cloned')).attr({\n            'aria-hidden': 'true',\n            'tabindex': '-1'\n        }).find('a, input, button, select').attr({\n            'tabindex': '-1'\n        });\n\n        if (_.$dots !== null) {\n            _.$slides.not(_.$slideTrack.find('.slick-cloned')).each(function(i) {\n                var slideControlIndex = tabControlIndexes.indexOf(i);\n\n                $(this).attr({\n                    'role': 'tabpanel',\n                    'id': 'slick-slide' + _.instanceUid + i,\n                    'tabindex': -1\n                });\n\n                if (slideControlIndex !== -1) {\n                   var ariaButtonControl = 'slick-slide-control' + _.instanceUid + slideControlIndex\n                   if ($('#' + ariaButtonControl).length) {\n                     $(this).attr({\n                         'aria-describedby': ariaButtonControl\n                     });\n                   }\n                }\n            });\n\n            _.$dots.attr('role', 'tablist').find('li').each(function(i) {\n                var mappedSlideIndex = tabControlIndexes[i];\n\n                $(this).attr({\n                    'role': 'presentation'\n                });\n\n                $(this).find('button').first().attr({\n                    'role': 'tab',\n                    'id': 'slick-slide-control' + _.instanceUid + i,\n                    'aria-controls': 'slick-slide' + _.instanceUid + mappedSlideIndex,\n                    'aria-label': (i + 1) + ' of ' + numDotGroups,\n                    'aria-selected': null,\n                    'tabindex': '-1'\n                });\n\n            }).eq(_.currentSlide).find('button').attr({\n                'aria-selected': 'true',\n                'tabindex': '0'\n            }).end();\n        }\n\n        for (var i=_.currentSlide, max=i+_.options.slidesToShow; i < max; i++) {\n          if (_.options.focusOnChange) {\n            _.$slides.eq(i).attr({'tabindex': '0'});\n          } else {\n            _.$slides.eq(i).removeAttr('tabindex');\n          }\n        }\n\n        _.activateADA();\n\n    };\n\n    Slick.prototype.initArrowEvents = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n            _.$prevArrow\n               .off('click.slick')\n               .on('click.slick', {\n                    message: 'previous'\n               }, _.changeSlide);\n            _.$nextArrow\n               .off('click.slick')\n               .on('click.slick', {\n                    message: 'next'\n               }, _.changeSlide);\n\n            if (_.options.accessibility === true) {\n                _.$prevArrow.on('keydown.slick', _.keyHandler);\n                _.$nextArrow.on('keydown.slick', _.keyHandler);\n            }\n        }\n\n    };\n\n    Slick.prototype.initDotEvents = function() {\n\n        var _ = this;\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n            $('li', _.$dots).on('click.slick', {\n                message: 'index'\n            }, _.changeSlide);\n\n            if (_.options.accessibility === true) {\n                _.$dots.on('keydown.slick', _.keyHandler);\n            }\n        }\n\n        if (_.options.dots === true && _.options.pauseOnDotsHover === true && _.slideCount > _.options.slidesToShow) {\n\n            $('li', _.$dots)\n                .on('mouseenter.slick', $.proxy(_.interrupt, _, true))\n                .on('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n        }\n\n    };\n\n    Slick.prototype.initSlideEvents = function() {\n\n        var _ = this;\n\n        if ( _.options.pauseOnHover ) {\n\n            _.$list.on('mouseenter.slick', $.proxy(_.interrupt, _, true));\n            _.$list.on('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n        }\n\n    };\n\n    Slick.prototype.initializeEvents = function() {\n\n        var _ = this;\n\n        _.initArrowEvents();\n\n        _.initDotEvents();\n        _.initSlideEvents();\n\n        _.$list.on('touchstart.slick mousedown.slick', {\n            action: 'start'\n        }, _.swipeHandler);\n        _.$list.on('touchmove.slick mousemove.slick', {\n            action: 'move'\n        }, _.swipeHandler);\n        _.$list.on('touchend.slick mouseup.slick', {\n            action: 'end'\n        }, _.swipeHandler);\n        _.$list.on('touchcancel.slick mouseleave.slick', {\n            action: 'end'\n        }, _.swipeHandler);\n\n        _.$list.on('click.slick', _.clickHandler);\n\n        $(document).on(_.visibilityChange, $.proxy(_.visibility, _));\n\n        if (_.options.accessibility === true) {\n            _.$list.on('keydown.slick', _.keyHandler);\n        }\n\n        if (_.options.focusOnSelect === true) {\n            $(_.$slideTrack).children().on('click.slick', _.selectHandler);\n        }\n\n        $(window).on('orientationchange.slick.slick-' + _.instanceUid, $.proxy(_.orientationChange, _));\n\n        $(window).on('resize.slick.slick-' + _.instanceUid, $.proxy(_.resize, _));\n\n        $('[draggable!=true]', _.$slideTrack).on('dragstart', _.preventDefault);\n\n        $(window).on('load.slick.slick-' + _.instanceUid, _.setPosition);\n        $(_.setPosition);\n\n    };\n\n    Slick.prototype.initUI = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$prevArrow.show();\n            _.$nextArrow.show();\n\n        }\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$dots.show();\n\n        }\n\n    };\n\n    Slick.prototype.keyHandler = function(event) {\n\n        var _ = this;\n         //Dont slide if the cursor is inside the form fields and arrow keys are pressed\n        if(!event.target.tagName.match('TEXTAREA|INPUT|SELECT')) {\n            if (event.keyCode === 37 && _.options.accessibility === true) {\n                _.changeSlide({\n                    data: {\n                        message: _.options.rtl === true ? 'next' :  'previous'\n                    }\n                });\n            } else if (event.keyCode === 39 && _.options.accessibility === true) {\n                _.changeSlide({\n                    data: {\n                        message: _.options.rtl === true ? 'previous' : 'next'\n                    }\n                });\n            }\n        }\n\n    };\n\n    Slick.prototype.lazyLoad = function() {\n\n        var _ = this,\n            loadRange, cloneRange, rangeStart, rangeEnd;\n\n        function loadImages(imagesScope) {\n\n            $('img[data-lazy]', imagesScope).each(function() {\n\n                var image = $(this),\n                    imageSource = $(this).attr('data-lazy'),\n                    imageSrcSet = $(this).attr('data-srcset'),\n                    imageSizes  = $(this).attr('data-sizes') || _.$slider.attr('data-sizes'),\n                    imageToLoad = document.createElement('img');\n\n                imageToLoad.onload = function() {\n\n                    image\n                        .animate({ opacity: 0 }, 100, function() {\n\n                            if (imageSrcSet) {\n                                image\n                                    .attr('srcset', imageSrcSet );\n\n                                if (imageSizes) {\n                                    image\n                                        .attr('sizes', imageSizes );\n                                }\n                            }\n\n                            image\n                                .attr('src', imageSource)\n                                .animate({ opacity: 1 }, 200, function() {\n                                    image\n                                        .removeAttr('data-lazy data-srcset data-sizes')\n                                        .removeClass('slick-loading');\n                                });\n                            _.$slider.trigger('lazyLoaded', [_, image, imageSource]);\n                        });\n\n                };\n\n                imageToLoad.onerror = function() {\n\n                    image\n                        .removeAttr( 'data-lazy' )\n                        .removeClass( 'slick-loading' )\n                        .addClass( 'slick-lazyload-error' );\n\n                    _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]);\n\n                };\n\n                imageToLoad.src = imageSource;\n\n            });\n\n        }\n\n        if (_.options.centerMode === true) {\n            if (_.options.infinite === true) {\n                rangeStart = _.currentSlide + (_.options.slidesToShow / 2 + 1);\n                rangeEnd = rangeStart + _.options.slidesToShow + 2;\n            } else {\n                rangeStart = Math.max(0, _.currentSlide - (_.options.slidesToShow / 2 + 1));\n                rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) + _.currentSlide;\n            }\n        } else {\n            rangeStart = _.options.infinite ? _.options.slidesToShow + _.currentSlide : _.currentSlide;\n            rangeEnd = Math.ceil(rangeStart + _.options.slidesToShow);\n            if (_.options.fade === true) {\n                if (rangeStart > 0) rangeStart--;\n                if (rangeEnd <= _.slideCount) rangeEnd++;\n            }\n        }\n\n        loadRange = _.$slider.find('.slick-slide').slice(rangeStart, rangeEnd);\n\n        if (_.options.lazyLoad === 'anticipated') {\n            var prevSlide = rangeStart - 1,\n                nextSlide = rangeEnd,\n                $slides = _.$slider.find('.slick-slide');\n\n            for (var i = 0; i < _.options.slidesToScroll; i++) {\n                if (prevSlide < 0) prevSlide = _.slideCount - 1;\n                loadRange = loadRange.add($slides.eq(prevSlide));\n                loadRange = loadRange.add($slides.eq(nextSlide));\n                prevSlide--;\n                nextSlide++;\n            }\n        }\n\n        loadImages(loadRange);\n\n        if (_.slideCount <= _.options.slidesToShow) {\n            cloneRange = _.$slider.find('.slick-slide');\n            loadImages(cloneRange);\n        } else\n        if (_.currentSlide >= _.slideCount - _.options.slidesToShow) {\n            cloneRange = _.$slider.find('.slick-cloned').slice(0, _.options.slidesToShow);\n            loadImages(cloneRange);\n        } else if (_.currentSlide === 0) {\n            cloneRange = _.$slider.find('.slick-cloned').slice(_.options.slidesToShow * -1);\n            loadImages(cloneRange);\n        }\n\n    };\n\n    Slick.prototype.loadSlider = function() {\n\n        var _ = this;\n\n        _.setPosition();\n\n        _.$slideTrack.css({\n            opacity: 1\n        });\n\n        _.$slider.removeClass('slick-loading');\n\n        _.initUI();\n\n        if (_.options.lazyLoad === 'progressive') {\n            _.progressiveLazyLoad();\n        }\n\n    };\n\n    Slick.prototype.next = Slick.prototype.slickNext = function() {\n\n        var _ = this;\n\n        _.changeSlide({\n            data: {\n                message: 'next'\n            }\n        });\n\n    };\n\n    Slick.prototype.orientationChange = function() {\n\n        var _ = this;\n\n        _.checkResponsive();\n        _.setPosition();\n\n    };\n\n    Slick.prototype.pause = Slick.prototype.slickPause = function() {\n\n        var _ = this;\n\n        _.autoPlayClear();\n        _.paused = true;\n\n    };\n\n    Slick.prototype.play = Slick.prototype.slickPlay = function() {\n\n        var _ = this;\n\n        _.autoPlay();\n        _.options.autoplay = true;\n        _.paused = false;\n        _.focussed = false;\n        _.interrupted = false;\n\n    };\n\n    Slick.prototype.postSlide = function(index) {\n\n        var _ = this;\n\n        if( !_.unslicked ) {\n\n            _.$slider.trigger('afterChange', [_, index]);\n\n            _.animating = false;\n\n            if (_.slideCount > _.options.slidesToShow) {\n                _.setPosition();\n            }\n\n            _.swipeLeft = null;\n\n            if ( _.options.autoplay ) {\n                _.autoPlay();\n            }\n\n            if (_.options.accessibility === true) {\n                _.initADA();\n\n                if (_.options.focusOnChange) {\n                    var $currentSlide = $(_.$slides.get(_.currentSlide));\n                    $currentSlide.attr('tabindex', 0).focus();\n                }\n            }\n\n        }\n\n    };\n\n    Slick.prototype.prev = Slick.prototype.slickPrev = function() {\n\n        var _ = this;\n\n        _.changeSlide({\n            data: {\n                message: 'previous'\n            }\n        });\n\n    };\n\n    Slick.prototype.preventDefault = function(event) {\n\n        event.preventDefault();\n\n    };\n\n    Slick.prototype.progressiveLazyLoad = function( tryCount ) {\n\n        tryCount = tryCount || 1;\n\n        var _ = this,\n            $imgsToLoad = $( 'img[data-lazy]', _.$slider ),\n            image,\n            imageSource,\n            imageSrcSet,\n            imageSizes,\n            imageToLoad;\n\n        if ( $imgsToLoad.length ) {\n\n            image = $imgsToLoad.first();\n            imageSource = image.attr('data-lazy');\n            imageSrcSet = image.attr('data-srcset');\n            imageSizes  = image.attr('data-sizes') || _.$slider.attr('data-sizes');\n            imageToLoad = document.createElement('img');\n\n            imageToLoad.onload = function() {\n\n                if (imageSrcSet) {\n                    image\n                        .attr('srcset', imageSrcSet );\n\n                    if (imageSizes) {\n                        image\n                            .attr('sizes', imageSizes );\n                    }\n                }\n\n                image\n                    .attr( 'src', imageSource )\n                    .removeAttr('data-lazy data-srcset data-sizes')\n                    .removeClass('slick-loading');\n\n                if ( _.options.adaptiveHeight === true ) {\n                    _.setPosition();\n                }\n\n                _.$slider.trigger('lazyLoaded', [ _, image, imageSource ]);\n                _.progressiveLazyLoad();\n\n            };\n\n            imageToLoad.onerror = function() {\n\n                if ( tryCount < 3 ) {\n\n                    /**\n                     * try to load the image 3 times,\n                     * leave a slight delay so we don't get\n                     * servers blocking the request.\n                     */\n                    setTimeout( function() {\n                        _.progressiveLazyLoad( tryCount + 1 );\n                    }, 500 );\n\n                } else {\n\n                    image\n                        .removeAttr( 'data-lazy' )\n                        .removeClass( 'slick-loading' )\n                        .addClass( 'slick-lazyload-error' );\n\n                    _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]);\n\n                    _.progressiveLazyLoad();\n\n                }\n\n            };\n\n            imageToLoad.src = imageSource;\n\n        } else {\n\n            _.$slider.trigger('allImagesLoaded', [ _ ]);\n\n        }\n\n    };\n\n    Slick.prototype.refresh = function( initializing ) {\n\n        var _ = this, currentSlide, lastVisibleIndex;\n\n        lastVisibleIndex = _.slideCount - _.options.slidesToShow;\n\n        // in non-infinite sliders, we don't want to go past the\n        // last visible index.\n        if( !_.options.infinite && ( _.currentSlide > lastVisibleIndex )) {\n            _.currentSlide = lastVisibleIndex;\n        }\n\n        // if less slides than to show, go to start.\n        if ( _.slideCount <= _.options.slidesToShow ) {\n            _.currentSlide = 0;\n\n        }\n\n        currentSlide = _.currentSlide;\n\n        _.destroy(true);\n\n        $.extend(_, _.initials, { currentSlide: currentSlide });\n\n        _.init();\n\n        if( !initializing ) {\n\n            _.changeSlide({\n                data: {\n                    message: 'index',\n                    index: currentSlide\n                }\n            }, false);\n\n        }\n\n    };\n\n    Slick.prototype.registerBreakpoints = function() {\n\n        var _ = this, breakpoint, currentBreakpoint, l,\n            responsiveSettings = _.options.responsive || null;\n\n        if ( $.type(responsiveSettings) === 'array' && responsiveSettings.length ) {\n\n            _.respondTo = _.options.respondTo || 'window';\n\n            for ( breakpoint in responsiveSettings ) {\n\n                l = _.breakpoints.length-1;\n\n                if (responsiveSettings.hasOwnProperty(breakpoint)) {\n                    currentBreakpoint = responsiveSettings[breakpoint].breakpoint;\n\n                    // loop through the breakpoints and cut out any existing\n                    // ones with the same breakpoint number, we don't want dupes.\n                    while( l >= 0 ) {\n                        if( _.breakpoints[l] && _.breakpoints[l] === currentBreakpoint ) {\n                            _.breakpoints.splice(l,1);\n                        }\n                        l--;\n                    }\n\n                    _.breakpoints.push(currentBreakpoint);\n                    _.breakpointSettings[currentBreakpoint] = responsiveSettings[breakpoint].settings;\n\n                }\n\n            }\n\n            _.breakpoints.sort(function(a, b) {\n                return ( _.options.mobileFirst ) ? a-b : b-a;\n            });\n\n        }\n\n    };\n\n    Slick.prototype.reinit = function() {\n\n        var _ = this;\n\n        _.$slides =\n            _.$slideTrack\n                .children(_.options.slide)\n                .addClass('slick-slide');\n\n        _.slideCount = _.$slides.length;\n\n        if (_.currentSlide >= _.slideCount && _.currentSlide !== 0) {\n            _.currentSlide = _.currentSlide - _.options.slidesToScroll;\n        }\n\n        if (_.slideCount <= _.options.slidesToShow) {\n            _.currentSlide = 0;\n        }\n\n        _.registerBreakpoints();\n\n        _.setProps();\n        _.setupInfinite();\n        _.buildArrows();\n        _.updateArrows();\n        _.initArrowEvents();\n        _.buildDots();\n        _.updateDots();\n        _.initDotEvents();\n        _.cleanUpSlideEvents();\n        _.initSlideEvents();\n\n        _.checkResponsive(false, true);\n\n        if (_.options.focusOnSelect === true) {\n            $(_.$slideTrack).children().on('click.slick', _.selectHandler);\n        }\n\n        _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);\n\n        _.setPosition();\n        _.focusHandler();\n\n        _.paused = !_.options.autoplay;\n        _.autoPlay();\n\n        _.$slider.trigger('reInit', [_]);\n\n    };\n\n    Slick.prototype.resize = function() {\n\n        var _ = this;\n\n        if ($(window).width() !== _.windowWidth) {\n            clearTimeout(_.windowDelay);\n            _.windowDelay = window.setTimeout(function() {\n                _.windowWidth = $(window).width();\n                _.checkResponsive();\n                if( !_.unslicked ) { _.setPosition(); }\n            }, 50);\n        }\n    };\n\n    Slick.prototype.removeSlide = Slick.prototype.slickRemove = function(index, removeBefore, removeAll) {\n\n        var _ = this;\n\n        if (typeof(index) === 'boolean') {\n            removeBefore = index;\n            index = removeBefore === true ? 0 : _.slideCount - 1;\n        } else {\n            index = removeBefore === true ? --index : index;\n        }\n\n        if (_.slideCount < 1 || index < 0 || index > _.slideCount - 1) {\n            return false;\n        }\n\n        _.unload();\n\n        if (removeAll === true) {\n            _.$slideTrack.children().remove();\n        } else {\n            _.$slideTrack.children(this.options.slide).eq(index).remove();\n        }\n\n        _.$slides = _.$slideTrack.children(this.options.slide);\n\n        _.$slideTrack.children(this.options.slide).detach();\n\n        _.$slideTrack.append(_.$slides);\n\n        _.$slidesCache = _.$slides;\n\n        _.reinit();\n\n    };\n\n    Slick.prototype.setCSS = function(position) {\n\n        var _ = this,\n            positionProps = {},\n            x, y;\n\n        if (_.options.rtl === true) {\n            position = -position;\n        }\n        x = _.positionProp == 'left' ? Math.ceil(position) + 'px' : '0px';\n        y = _.positionProp == 'top' ? Math.ceil(position) + 'px' : '0px';\n\n        positionProps[_.positionProp] = position;\n\n        if (_.transformsEnabled === false) {\n            _.$slideTrack.css(positionProps);\n        } else {\n            positionProps = {};\n            if (_.cssTransitions === false) {\n                positionProps[_.animType] = 'translate(' + x + ', ' + y + ')';\n                _.$slideTrack.css(positionProps);\n            } else {\n                positionProps[_.animType] = 'translate3d(' + x + ', ' + y + ', 0px)';\n                _.$slideTrack.css(positionProps);\n            }\n        }\n\n    };\n\n    Slick.prototype.setDimensions = function() {\n\n        var _ = this;\n\n        if (_.options.vertical === false) {\n            if (_.options.centerMode === true) {\n                _.$list.css({\n                    padding: ('0px ' + _.options.centerPadding)\n                });\n            }\n        } else {\n            _.$list.height(_.$slides.first().outerHeight(true) * _.options.slidesToShow);\n            if (_.options.centerMode === true) {\n                _.$list.css({\n                    padding: (_.options.centerPadding + ' 0px')\n                });\n            }\n        }\n\n        _.listWidth = _.$list.width();\n        _.listHeight = _.$list.height();\n\n\n        if (_.options.vertical === false && _.options.variableWidth === false) {\n            _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow);\n            _.$slideTrack.width(Math.ceil((_.slideWidth * _.$slideTrack.children('.slick-slide').length)));\n\n        } else if (_.options.variableWidth === true) {\n            _.$slideTrack.width(5000 * _.slideCount);\n        } else {\n            _.slideWidth = Math.ceil(_.listWidth);\n            _.$slideTrack.height(Math.ceil((_.$slides.first().outerHeight(true) * _.$slideTrack.children('.slick-slide').length)));\n        }\n\n        var offset = _.$slides.first().outerWidth(true) - _.$slides.first().width();\n        if (_.options.variableWidth === false) _.$slideTrack.children('.slick-slide').width(_.slideWidth - offset);\n\n    };\n\n    Slick.prototype.setFade = function() {\n\n        var _ = this,\n            targetLeft;\n\n        _.$slides.each(function(index, element) {\n            targetLeft = (_.slideWidth * index) * -1;\n            if (_.options.rtl === true) {\n                $(element).css({\n                    position: 'relative',\n                    right: targetLeft,\n                    top: 0,\n                    zIndex: _.options.zIndex - 2,\n                    opacity: 0\n                });\n            } else {\n                $(element).css({\n                    position: 'relative',\n                    left: targetLeft,\n                    top: 0,\n                    zIndex: _.options.zIndex - 2,\n                    opacity: 0\n                });\n            }\n        });\n\n        _.$slides.eq(_.currentSlide).css({\n            zIndex: _.options.zIndex - 1,\n            opacity: 1\n        });\n\n    };\n\n    Slick.prototype.setHeight = function() {\n\n        var _ = this;\n\n        if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {\n            var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);\n            _.$list.css('height', targetHeight);\n        }\n\n    };\n\n    Slick.prototype.setOption =\n    Slick.prototype.slickSetOption = function() {\n\n        /**\n         * accepts arguments in format of:\n         *\n         *  - for changing a single option's value:\n         *     .slick(\"setOption\", option, value, refresh )\n         *\n         *  - for changing a set of responsive options:\n         *     .slick(\"setOption\", 'responsive', [{}, ...], refresh )\n         *\n         *  - for updating multiple values at once (not responsive)\n         *     .slick(\"setOption\", { 'option': value, ... }, refresh )\n         */\n\n        var _ = this, l, item, option, value, refresh = false, type;\n\n        if( $.type( arguments[0] ) === 'object' ) {\n\n            option =  arguments[0];\n            refresh = arguments[1];\n            type = 'multiple';\n\n        } else if ( $.type( arguments[0] ) === 'string' ) {\n\n            option =  arguments[0];\n            value = arguments[1];\n            refresh = arguments[2];\n\n            if ( arguments[0] === 'responsive' && $.type( arguments[1] ) === 'array' ) {\n\n                type = 'responsive';\n\n            } else if ( typeof arguments[1] !== 'undefined' ) {\n\n                type = 'single';\n\n            }\n\n        }\n\n        if ( type === 'single' ) {\n\n            _.options[option] = value;\n\n\n        } else if ( type === 'multiple' ) {\n\n            $.each( option , function( opt, val ) {\n\n                _.options[opt] = val;\n\n            });\n\n\n        } else if ( type === 'responsive' ) {\n\n            for ( item in value ) {\n\n                if( $.type( _.options.responsive ) !== 'array' ) {\n\n                    _.options.responsive = [ value[item] ];\n\n                } else {\n\n                    l = _.options.responsive.length-1;\n\n                    // loop through the responsive object and splice out duplicates.\n                    while( l >= 0 ) {\n\n                        if( _.options.responsive[l].breakpoint === value[item].breakpoint ) {\n\n                            _.options.responsive.splice(l,1);\n\n                        }\n\n                        l--;\n\n                    }\n\n                    _.options.responsive.push( value[item] );\n\n                }\n\n            }\n\n        }\n\n        if ( refresh ) {\n\n            _.unload();\n            _.reinit();\n\n        }\n\n    };\n\n    Slick.prototype.setPosition = function() {\n\n        var _ = this;\n\n        _.setDimensions();\n\n        _.setHeight();\n\n        if (_.options.fade === false) {\n            _.setCSS(_.getLeft(_.currentSlide));\n        } else {\n            _.setFade();\n        }\n\n        _.$slider.trigger('setPosition', [_]);\n\n    };\n\n    Slick.prototype.setProps = function() {\n\n        var _ = this,\n            bodyStyle = document.body.style;\n\n        _.positionProp = _.options.vertical === true ? 'top' : 'left';\n\n        if (_.positionProp === 'top') {\n            _.$slider.addClass('slick-vertical');\n        } else {\n            _.$slider.removeClass('slick-vertical');\n        }\n\n        if (bodyStyle.WebkitTransition !== undefined ||\n            bodyStyle.MozTransition !== undefined ||\n            bodyStyle.msTransition !== undefined) {\n            if (_.options.useCSS === true) {\n                _.cssTransitions = true;\n            }\n        }\n\n        if ( _.options.fade ) {\n            if ( typeof _.options.zIndex === 'number' ) {\n                if( _.options.zIndex < 3 ) {\n                    _.options.zIndex = 3;\n                }\n            } else {\n                _.options.zIndex = _.defaults.zIndex;\n            }\n        }\n\n        if (bodyStyle.OTransform !== undefined) {\n            _.animType = 'OTransform';\n            _.transformType = '-o-transform';\n            _.transitionType = 'OTransition';\n            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;\n        }\n        if (bodyStyle.MozTransform !== undefined) {\n            _.animType = 'MozTransform';\n            _.transformType = '-moz-transform';\n            _.transitionType = 'MozTransition';\n            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.MozPerspective === undefined) _.animType = false;\n        }\n        if (bodyStyle.webkitTransform !== undefined) {\n            _.animType = 'webkitTransform';\n            _.transformType = '-webkit-transform';\n            _.transitionType = 'webkitTransition';\n            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;\n        }\n        if (bodyStyle.msTransform !== undefined) {\n            _.animType = 'msTransform';\n            _.transformType = '-ms-transform';\n            _.transitionType = 'msTransition';\n            if (bodyStyle.msTransform === undefined) _.animType = false;\n        }\n        if (bodyStyle.transform !== undefined && _.animType !== false) {\n            _.animType = 'transform';\n            _.transformType = 'transform';\n            _.transitionType = 'transition';\n        }\n        _.transformsEnabled = _.options.useTransform && (_.animType !== null && _.animType !== false);\n    };\n\n\n    Slick.prototype.setSlideClasses = function(index) {\n\n        var _ = this,\n            centerOffset, allSlides, indexOffset, remainder;\n\n        allSlides = _.$slider\n            .find('.slick-slide')\n            .removeClass('slick-active slick-center slick-current')\n            .attr('aria-hidden', 'true');\n\n        _.$slides\n            .eq(index)\n            .addClass('slick-current');\n\n        if (_.options.centerMode === true) {\n\n            var evenCoef = _.options.slidesToShow % 2 === 0 ? 1 : 0;\n\n            centerOffset = Math.floor(_.options.slidesToShow / 2);\n\n            if (_.options.infinite === true) {\n\n                if (index >= centerOffset && index <= (_.slideCount - 1) - centerOffset) {\n                    _.$slides\n                        .slice(index - centerOffset + evenCoef, index + centerOffset + 1)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                } else {\n\n                    indexOffset = _.options.slidesToShow + index;\n                    allSlides\n                        .slice(indexOffset - centerOffset + 1 + evenCoef, indexOffset + centerOffset + 2)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                }\n\n                if (index === 0) {\n\n                    allSlides\n                        .eq(allSlides.length - 1 - _.options.slidesToShow)\n                        .addClass('slick-center');\n\n                } else if (index === _.slideCount - 1) {\n\n                    allSlides\n                        .eq(_.options.slidesToShow)\n                        .addClass('slick-center');\n\n                }\n\n            }\n\n            _.$slides\n                .eq(index)\n                .addClass('slick-center');\n\n        } else {\n\n            if (index >= 0 && index <= (_.slideCount - _.options.slidesToShow)) {\n\n                _.$slides\n                    .slice(index, index + _.options.slidesToShow)\n                    .addClass('slick-active')\n                    .attr('aria-hidden', 'false');\n\n            } else if (allSlides.length <= _.options.slidesToShow) {\n\n                allSlides\n                    .addClass('slick-active')\n                    .attr('aria-hidden', 'false');\n\n            } else {\n\n                remainder = _.slideCount % _.options.slidesToShow;\n                indexOffset = _.options.infinite === true ? _.options.slidesToShow + index : index;\n\n                if (_.options.slidesToShow == _.options.slidesToScroll && (_.slideCount - index) < _.options.slidesToShow) {\n\n                    allSlides\n                        .slice(indexOffset - (_.options.slidesToShow - remainder), indexOffset + remainder)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                } else {\n\n                    allSlides\n                        .slice(indexOffset, indexOffset + _.options.slidesToShow)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                }\n\n            }\n\n        }\n\n        if (_.options.lazyLoad === 'ondemand' || _.options.lazyLoad === 'anticipated') {\n            _.lazyLoad();\n        }\n    };\n\n    Slick.prototype.setupInfinite = function() {\n\n        var _ = this,\n            i, slideIndex, infiniteCount;\n\n        if (_.options.fade === true) {\n            _.options.centerMode = false;\n        }\n\n        if (_.options.infinite === true && _.options.fade === false) {\n\n            slideIndex = null;\n\n            if (_.slideCount > _.options.slidesToShow) {\n\n                if (_.options.centerMode === true) {\n                    infiniteCount = _.options.slidesToShow + 1;\n                } else {\n                    infiniteCount = _.options.slidesToShow;\n                }\n\n                for (i = _.slideCount; i > (_.slideCount -\n                        infiniteCount); i -= 1) {\n                    slideIndex = i - 1;\n                    $(_.$slides[slideIndex]).clone(true).attr('id', '')\n                        .attr('data-slick-index', slideIndex - _.slideCount)\n                        .prependTo(_.$slideTrack).addClass('slick-cloned');\n                }\n                for (i = 0; i < infiniteCount  + _.slideCount; i += 1) {\n                    slideIndex = i;\n                    $(_.$slides[slideIndex]).clone(true).attr('id', '')\n                        .attr('data-slick-index', slideIndex + _.slideCount)\n                        .appendTo(_.$slideTrack).addClass('slick-cloned');\n                }\n                _.$slideTrack.find('.slick-cloned').find('[id]').each(function() {\n                    $(this).attr('id', '');\n                });\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.interrupt = function( toggle ) {\n\n        var _ = this;\n\n        if( !toggle ) {\n            _.autoPlay();\n        }\n        _.interrupted = toggle;\n\n    };\n\n    Slick.prototype.selectHandler = function(event) {\n\n        var _ = this;\n\n        var targetElement =\n            $(event.target).is('.slick-slide') ?\n                $(event.target) :\n                $(event.target).parents('.slick-slide');\n\n        var index = parseInt(targetElement.attr('data-slick-index'));\n\n        if (!index) index = 0;\n\n        if (_.slideCount <= _.options.slidesToShow) {\n\n            _.slideHandler(index, false, true);\n            return;\n\n        }\n\n        _.slideHandler(index);\n\n    };\n\n    Slick.prototype.slideHandler = function(index, sync, dontAnimate) {\n\n        var targetSlide, animSlide, oldSlide, slideLeft, targetLeft = null,\n            _ = this, navTarget;\n\n        sync = sync || false;\n\n        if (_.animating === true && _.options.waitForAnimate === true) {\n            return;\n        }\n\n        if (_.options.fade === true && _.currentSlide === index) {\n            return;\n        }\n\n        if (sync === false) {\n            _.asNavFor(index);\n        }\n\n        targetSlide = index;\n        targetLeft = _.getLeft(targetSlide);\n        slideLeft = _.getLeft(_.currentSlide);\n\n        _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft;\n\n        if (_.options.infinite === false && _.options.centerMode === false && (index < 0 || index > _.getDotCount() * _.options.slidesToScroll)) {\n            if (_.options.fade === false) {\n                targetSlide = _.currentSlide;\n                if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n                    _.animateSlide(slideLeft, function() {\n                        _.postSlide(targetSlide);\n                    });\n                } else {\n                    _.postSlide(targetSlide);\n                }\n            }\n            return;\n        } else if (_.options.infinite === false && _.options.centerMode === true && (index < 0 || index > (_.slideCount - _.options.slidesToScroll))) {\n            if (_.options.fade === false) {\n                targetSlide = _.currentSlide;\n                if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n                    _.animateSlide(slideLeft, function() {\n                        _.postSlide(targetSlide);\n                    });\n                } else {\n                    _.postSlide(targetSlide);\n                }\n            }\n            return;\n        }\n\n        if ( _.options.autoplay ) {\n            clearInterval(_.autoPlayTimer);\n        }\n\n        if (targetSlide < 0) {\n            if (_.slideCount % _.options.slidesToScroll !== 0) {\n                animSlide = _.slideCount - (_.slideCount % _.options.slidesToScroll);\n            } else {\n                animSlide = _.slideCount + targetSlide;\n            }\n        } else if (targetSlide >= _.slideCount) {\n            if (_.slideCount % _.options.slidesToScroll !== 0) {\n                animSlide = 0;\n            } else {\n                animSlide = targetSlide - _.slideCount;\n            }\n        } else {\n            animSlide = targetSlide;\n        }\n\n        _.animating = true;\n\n        _.$slider.trigger('beforeChange', [_, _.currentSlide, animSlide]);\n\n        oldSlide = _.currentSlide;\n        _.currentSlide = animSlide;\n\n        _.setSlideClasses(_.currentSlide);\n\n        if ( _.options.asNavFor ) {\n\n            navTarget = _.getNavTarget();\n            navTarget = navTarget.slick('getSlick');\n\n            if ( navTarget.slideCount <= navTarget.options.slidesToShow ) {\n                navTarget.setSlideClasses(_.currentSlide);\n            }\n\n        }\n\n        _.updateDots();\n        _.updateArrows();\n\n        if (_.options.fade === true) {\n            if (dontAnimate !== true) {\n\n                _.fadeSlideOut(oldSlide);\n\n                _.fadeSlide(animSlide, function() {\n                    _.postSlide(animSlide);\n                });\n\n            } else {\n                _.postSlide(animSlide);\n            }\n            _.animateHeight();\n            return;\n        }\n\n        if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n            _.animateSlide(targetLeft, function() {\n                _.postSlide(animSlide);\n            });\n        } else {\n            _.postSlide(animSlide);\n        }\n\n    };\n\n    Slick.prototype.startLoad = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$prevArrow.hide();\n            _.$nextArrow.hide();\n\n        }\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$dots.hide();\n\n        }\n\n        _.$slider.addClass('slick-loading');\n\n    };\n\n    Slick.prototype.swipeDirection = function() {\n\n        var xDist, yDist, r, swipeAngle, _ = this;\n\n        xDist = _.touchObject.startX - _.touchObject.curX;\n        yDist = _.touchObject.startY - _.touchObject.curY;\n        r = Math.atan2(yDist, xDist);\n\n        swipeAngle = Math.round(r * 180 / Math.PI);\n        if (swipeAngle < 0) {\n            swipeAngle = 360 - Math.abs(swipeAngle);\n        }\n\n        if ((swipeAngle <= 45) && (swipeAngle >= 0)) {\n            return (_.options.rtl === false ? 'left' : 'right');\n        }\n        if ((swipeAngle <= 360) && (swipeAngle >= 315)) {\n            return (_.options.rtl === false ? 'left' : 'right');\n        }\n        if ((swipeAngle >= 135) && (swipeAngle <= 225)) {\n            return (_.options.rtl === false ? 'right' : 'left');\n        }\n        if (_.options.verticalSwiping === true) {\n            if ((swipeAngle >= 35) && (swipeAngle <= 135)) {\n                return 'down';\n            } else {\n                return 'up';\n            }\n        }\n\n        return 'vertical';\n\n    };\n\n    Slick.prototype.swipeEnd = function(event) {\n\n        var _ = this,\n            slideCount,\n            direction;\n\n        _.dragging = false;\n        _.swiping = false;\n\n        if (_.scrolling) {\n            _.scrolling = false;\n            return false;\n        }\n\n        _.interrupted = false;\n        _.shouldClick = ( _.touchObject.swipeLength > 10 ) ? false : true;\n\n        if ( _.touchObject.curX === undefined ) {\n            return false;\n        }\n\n        if ( _.touchObject.edgeHit === true ) {\n            _.$slider.trigger('edge', [_, _.swipeDirection() ]);\n        }\n\n        if ( _.touchObject.swipeLength >= _.touchObject.minSwipe ) {\n\n            direction = _.swipeDirection();\n\n            switch ( direction ) {\n\n                case 'left':\n                case 'down':\n\n                    slideCount =\n                        _.options.swipeToSlide ?\n                            _.checkNavigable( _.currentSlide + _.getSlideCount() ) :\n                            _.currentSlide + _.getSlideCount();\n\n                    _.currentDirection = 0;\n\n                    break;\n\n                case 'right':\n                case 'up':\n\n                    slideCount =\n                        _.options.swipeToSlide ?\n                            _.checkNavigable( _.currentSlide - _.getSlideCount() ) :\n                            _.currentSlide - _.getSlideCount();\n\n                    _.currentDirection = 1;\n\n                    break;\n\n                default:\n\n\n            }\n\n            if( direction != 'vertical' ) {\n\n                _.slideHandler( slideCount );\n                _.touchObject = {};\n                _.$slider.trigger('swipe', [_, direction ]);\n\n            }\n\n        } else {\n\n            if ( _.touchObject.startX !== _.touchObject.curX ) {\n\n                _.slideHandler( _.currentSlide );\n                _.touchObject = {};\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.swipeHandler = function(event) {\n\n        var _ = this;\n\n        if ((_.options.swipe === false) || ('ontouchend' in document && _.options.swipe === false)) {\n            return;\n        } else if (_.options.draggable === false && event.type.indexOf('mouse') !== -1) {\n            return;\n        }\n\n        _.touchObject.fingerCount = event.originalEvent && event.originalEvent.touches !== undefined ?\n            event.originalEvent.touches.length : 1;\n\n        _.touchObject.minSwipe = _.listWidth / _.options\n            .touchThreshold;\n\n        if (_.options.verticalSwiping === true) {\n            _.touchObject.minSwipe = _.listHeight / _.options\n                .touchThreshold;\n        }\n\n        switch (event.data.action) {\n\n            case 'start':\n                _.swipeStart(event);\n                break;\n\n            case 'move':\n                _.swipeMove(event);\n                break;\n\n            case 'end':\n                _.swipeEnd(event);\n                break;\n\n        }\n\n    };\n\n    Slick.prototype.swipeMove = function(event) {\n\n        var _ = this,\n            edgeWasHit = false,\n            curLeft, swipeDirection, swipeLength, positionOffset, touches, verticalSwipeLength;\n\n        touches = event.originalEvent !== undefined ? event.originalEvent.touches : null;\n\n        if (!_.dragging || _.scrolling || touches && touches.length !== 1) {\n            return false;\n        }\n\n        curLeft = _.getLeft(_.currentSlide);\n\n        _.touchObject.curX = touches !== undefined ? touches[0].pageX : event.clientX;\n        _.touchObject.curY = touches !== undefined ? touches[0].pageY : event.clientY;\n\n        _.touchObject.swipeLength = Math.round(Math.sqrt(\n            Math.pow(_.touchObject.curX - _.touchObject.startX, 2)));\n\n        verticalSwipeLength = Math.round(Math.sqrt(\n            Math.pow(_.touchObject.curY - _.touchObject.startY, 2)));\n\n        if (!_.options.verticalSwiping && !_.swiping && verticalSwipeLength > 4) {\n            _.scrolling = true;\n            return false;\n        }\n\n        if (_.options.verticalSwiping === true) {\n            _.touchObject.swipeLength = verticalSwipeLength;\n        }\n\n        swipeDirection = _.swipeDirection();\n\n        if (event.originalEvent !== undefined && _.touchObject.swipeLength > 4) {\n            _.swiping = true;\n            event.preventDefault();\n        }\n\n        positionOffset = (_.options.rtl === false ? 1 : -1) * (_.touchObject.curX > _.touchObject.startX ? 1 : -1);\n        if (_.options.verticalSwiping === true) {\n            positionOffset = _.touchObject.curY > _.touchObject.startY ? 1 : -1;\n        }\n\n\n        swipeLength = _.touchObject.swipeLength;\n\n        _.touchObject.edgeHit = false;\n\n        if (_.options.infinite === false) {\n            if ((_.currentSlide === 0 && swipeDirection === 'right') || (_.currentSlide >= _.getDotCount() && swipeDirection === 'left')) {\n                swipeLength = _.touchObject.swipeLength * _.options.edgeFriction;\n                _.touchObject.edgeHit = true;\n            }\n        }\n\n        if (_.options.vertical === false) {\n            _.swipeLeft = curLeft + swipeLength * positionOffset;\n        } else {\n            _.swipeLeft = curLeft + (swipeLength * (_.$list.height() / _.listWidth)) * positionOffset;\n        }\n        if (_.options.verticalSwiping === true) {\n            _.swipeLeft = curLeft + swipeLength * positionOffset;\n        }\n\n        if (_.options.fade === true || _.options.touchMove === false) {\n            return false;\n        }\n\n        if (_.animating === true) {\n            _.swipeLeft = null;\n            return false;\n        }\n\n        _.setCSS(_.swipeLeft);\n\n    };\n\n    Slick.prototype.swipeStart = function(event) {\n\n        var _ = this,\n            touches;\n\n        _.interrupted = true;\n\n        if (_.touchObject.fingerCount !== 1 || _.slideCount <= _.options.slidesToShow) {\n            _.touchObject = {};\n            return false;\n        }\n\n        if (event.originalEvent !== undefined && event.originalEvent.touches !== undefined) {\n            touches = event.originalEvent.touches[0];\n        }\n\n        _.touchObject.startX = _.touchObject.curX = touches !== undefined ? touches.pageX : event.clientX;\n        _.touchObject.startY = _.touchObject.curY = touches !== undefined ? touches.pageY : event.clientY;\n\n        _.dragging = true;\n\n    };\n\n    Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter = function() {\n\n        var _ = this;\n\n        if (_.$slidesCache !== null) {\n\n            _.unload();\n\n            _.$slideTrack.children(this.options.slide).detach();\n\n            _.$slidesCache.appendTo(_.$slideTrack);\n\n            _.reinit();\n\n        }\n\n    };\n\n    Slick.prototype.unload = function() {\n\n        var _ = this;\n\n        $('.slick-cloned', _.$slider).remove();\n\n        if (_.$dots) {\n            _.$dots.remove();\n        }\n\n        if (_.$prevArrow && _.htmlExpr.test(_.options.prevArrow)) {\n            _.$prevArrow.remove();\n        }\n\n        if (_.$nextArrow && _.htmlExpr.test(_.options.nextArrow)) {\n            _.$nextArrow.remove();\n        }\n\n        _.$slides\n            .removeClass('slick-slide slick-active slick-visible slick-current')\n            .attr('aria-hidden', 'true')\n            .css('width', '');\n\n    };\n\n    Slick.prototype.unslick = function(fromBreakpoint) {\n\n        var _ = this;\n        _.$slider.trigger('unslick', [_, fromBreakpoint]);\n        _.destroy();\n\n    };\n\n    Slick.prototype.updateArrows = function() {\n\n        var _ = this,\n            centerOffset;\n\n        centerOffset = Math.floor(_.options.slidesToShow / 2);\n\n        if ( _.options.arrows === true &&\n            _.slideCount > _.options.slidesToShow &&\n            !_.options.infinite ) {\n\n            _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n            _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            if (_.currentSlide === 0) {\n\n                _.$prevArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n                _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow && _.options.centerMode === false) {\n\n                _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n                _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            } else if (_.currentSlide >= _.slideCount - 1 && _.options.centerMode === true) {\n\n                _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n                _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.updateDots = function() {\n\n        var _ = this;\n\n        if (_.$dots !== null) {\n\n            _.$dots\n                .find('li')\n                    .removeClass('slick-active')\n                    .end();\n\n            _.$dots\n                .find('li')\n                .eq(Math.floor(_.currentSlide / _.options.slidesToScroll))\n                .addClass('slick-active');\n\n        }\n\n    };\n\n    Slick.prototype.visibility = function() {\n\n        var _ = this;\n\n        if ( _.options.autoplay ) {\n\n            if ( document[_.hidden] ) {\n\n                _.interrupted = true;\n\n            } else {\n\n                _.interrupted = false;\n\n            }\n\n        }\n\n    };\n\n    $.fn.slick = function() {\n        var _ = this,\n            opt = arguments[0],\n            args = Array.prototype.slice.call(arguments, 1),\n            l = _.length,\n            i,\n            ret;\n        for (i = 0; i < l; i++) {\n            if (typeof opt == 'object' || typeof opt == 'undefined')\n                _[i].slick = new Slick(_[i], opt);\n            else\n                ret = _[i].slick[opt].apply(_[i].slick, args);\n            if (typeof ret != 'undefined') return ret;\n        }\n        return _;\n    };\n\n}));\n","/*!\n * JavaScript Cookie v2.2.1\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader;\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction decode (s) {\n\t\treturn s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api() {}\n\n\t\tfunction set (key, value, attributes) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattributes = extend({\n\t\t\t\tpath: '/'\n\t\t\t}, api.defaults, attributes);\n\n\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\tattributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);\n\t\t\t}\n\n\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\ttry {\n\t\t\t\tvar result = JSON.stringify(value);\n\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\tvalue = result;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\n\t\t\tvalue = converter.write ?\n\t\t\t\tconverter.write(value, key) :\n\t\t\t\tencodeURIComponent(String(value))\n\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n\t\t\tkey = encodeURIComponent(String(key))\n\t\t\t\t.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)\n\t\t\t\t.replace(/[\\(\\)]/g, escape);\n\n\t\t\tvar stringifiedAttributes = '';\n\t\t\tfor (var attributeName in attributes) {\n\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Considers RFC 6265 section 5.2:\n\t\t\t\t// ...\n\t\t\t\t// 3.  If the remaining unparsed-attributes contains a %x3B (\";\")\n\t\t\t\t//     character:\n\t\t\t\t// Consume the characters of the unparsed-attributes up to,\n\t\t\t\t// not including, the first %x3B (\";\") character.\n\t\t\t\t// ...\n\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n\t\t\t}\n\n\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t}\n\n\t\tfunction get (key, json) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jar = {};\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all.\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = decode(parts[0]);\n\t\t\t\t\tcookie = (converter.read || converter)(cookie, name) ||\n\t\t\t\t\t\tdecode(cookie);\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tjar[name] = cookie;\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn key ? jar[key] : jar;\n\t\t}\n\n\t\tapi.set = set;\n\t\tapi.get = function (key) {\n\t\t\treturn get(key, false /* read as raw */);\n\t\t};\n\t\tapi.getJSON = function (key) {\n\t\t\treturn get(key, true /* read as json */);\n\t\t};\n\t\tapi.remove = function (key, attributes) {\n\t\t\tset(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.defaults = {};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n","/**\n * sifter.js\n * Copyright (c) 2013 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\n(function(root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine('sifter', factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.Sifter = factory();\n\t}\n}(this, function() {\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tvar Sifter = function(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t * @param {string} query\n\t * @returns {array}\n\t */\n\tSifter.prototype.tokenize = function(query) {\n\t\tquery = trim(String(query || '').toLowerCase());\n\t\tif (!query || !query.length) return [];\n\n\t\tvar i, n, regex, letter;\n\t\tvar tokens = [];\n\t\tvar words = query.split(/ +/);\n\n\t\tfor (i = 0, n = words.length; i < n; i++) {\n\t\t\tregex = escape_regex(words[i]);\n\t\t\tif (this.settings.diacritics) {\n\t\t\t\tfor (letter in DIACRITICS) {\n\t\t\t\t\tif (DIACRITICS.hasOwnProperty(letter)) {\n\t\t\t\t\t\tregex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttokens.push({\n\t\t\t\tstring : words[i],\n\t\t\t\tregex  : new RegExp(regex, 'i')\n\t\t\t});\n\t\t}\n\n\t\treturn tokens;\n\t};\n\n\t/**\n\t * Iterates over arrays and hashes.\n\t *\n\t * ```\n\t * this.iterator(this.items, function(item, id) {\n\t *    // invoked for each item\n\t * });\n\t * ```\n\t *\n\t * @param {array|object} object\n\t */\n\tSifter.prototype.iterator = function(object, callback) {\n\t\tvar iterator;\n\t\tif (is_array(object)) {\n\t\t\titerator = Array.prototype.forEach || function(callback) {\n\t\t\t\tfor (var i = 0, n = this.length; i < n; i++) {\n\t\t\t\t\tcallback(this[i], i, this);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\titerator = function(callback) {\n\t\t\t\tfor (var key in this) {\n\t\t\t\t\tif (this.hasOwnProperty(key)) {\n\t\t\t\t\t\tcallback(this[key], key, this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\titerator.apply(object, [callback]);\n\t};\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @param {object|string} search\n\t * @param {object} options (optional)\n\t * @returns {function}\n\t */\n\tSifter.prototype.getScoreFunction = function(search, options) {\n\t\tvar self, fields, tokens, token_count, nesting;\n\n\t\tself        = this;\n\t\tsearch      = self.prepareSearch(search, options);\n\t\ttokens      = search.tokens;\n\t\tfields      = search.options.fields;\n\t\ttoken_count = tokens.length;\n\t\tnesting     = search.options.nesting;\n\n\t\t/**\n\t\t * Calculates how close of a match the\n\t\t * given value is against a search token.\n\t\t *\n\t\t * @param {mixed} value\n\t\t * @param {object} token\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreValue = function(value, token) {\n\t\t\tvar score, pos;\n\n\t\t\tif (!value) return 0;\n\t\t\tvalue = String(value || '');\n\t\t\tpos = value.search(token.regex);\n\t\t\tif (pos === -1) return 0;\n\t\t\tscore = token.string.length / value.length;\n\t\t\tif (pos === 0) score += 0.5;\n\t\t\treturn score;\n\t\t};\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {object} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreObject = (function() {\n\t\t\tvar field_count = fields.length;\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token, data) {\n\t\t\t\t\treturn scoreValue(getattr(data, fields[0], nesting), token);\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn function(token, data) {\n\t\t\t\tfor (var i = 0, sum = 0; i < field_count; i++) {\n\t\t\t\t\tsum += scoreValue(getattr(data, fields[i], nesting), token);\n\t\t\t\t}\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar score;\n\t\t\t\tfor (var i = 0, sum = 0; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tfor (var i = 0, sum = 0; i < token_count; i++) {\n\t\t\t\t\tsum += scoreObject(tokens[i], data);\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @param {string|object} search\n\t * @param {object} options\n\t * @return function(a,b)\n\t */\n\tSifter.prototype.getSortFunction = function(search, options) {\n\t\tvar i, n, self, field, fields, fields_count, multiplier, multipliers, get_field, implicit_score, sort;\n\n\t\tself   = this;\n\t\tsearch = self.prepareSearch(search, options);\n\t\tsort   = (!search.query && options.sort_empty) || options.sort;\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param  {string} name\n\t\t * @param  {object} result\n\t\t * @return {mixed}\n\t\t */\n\t\tget_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn getattr(self.items[result.id], name, options.nesting);\n\t\t};\n\n\t\t// parse options\n\t\tfields = [];\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tfields.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = fields.length; i < n; i++) {\n\t\t\t\tif (fields[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tfields.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = fields.length; i < n; i++) {\n\t\t\t\tif (fields[i].field === '$score') {\n\t\t\t\t\tfields.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmultipliers = [];\n\t\tfor (i = 0, n = fields.length; i < n; i++) {\n\t\t\tmultipliers.push(fields[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tfields_count = fields.length;\n\t\tif (!fields_count) {\n\t\t\treturn null;\n\t\t} else if (fields_count === 1) {\n\t\t\tfield = fields[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(field, a),\n\t\t\t\t\tget_field(field, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, a_value, b_value, field;\n\t\t\t\tfor (i = 0; i < fields_count; i++) {\n\t\t\t\t\tfield = fields[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t * @param {string} query\n\t * @param {object} options\n\t * @returns {object}\n\t */\n\tSifter.prototype.prepareSearch = function(query, options) {\n\t\tif (typeof query === 'object') return query;\n\n\t\toptions = extend({}, options);\n\n\t\tvar option_fields     = options.fields;\n\t\tvar option_sort       = options.sort;\n\t\tvar option_sort_empty = options.sort_empty;\n\n\t\tif (option_fields && !is_array(option_fields)) options.fields = [option_fields];\n\t\tif (option_sort && !is_array(option_sort)) options.sort = [option_sort];\n\t\tif (option_sort_empty && !is_array(option_sort_empty)) options.sort_empty = [option_sort_empty];\n\n\t\treturn {\n\t\t\toptions : options,\n\t\t\tquery   : String(query || '').toLowerCase(),\n\t\t\ttokens  : this.tokenize(query),\n\t\t\ttotal   : 0,\n\t\t\titems   : []\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t * The `options` parameter can contain:\n\t *\n\t *   - fields {string|array}\n\t *   - sort {array}\n\t *   - score {function}\n\t *   - filter {bool}\n\t *   - limit {integer}\n\t *\n\t * Returns an object containing:\n\t *\n\t *   - options {object}\n\t *   - query {string}\n\t *   - tokens {array}\n\t *   - total {int}\n\t *   - items {array}\n\t *\n\t * @param {string} query\n\t * @param {object} options\n\t * @returns {object}\n\t */\n\tSifter.prototype.search = function(query, options) {\n\t\tvar self = this, value, score, search, calculateScore;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch  = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery   = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self.getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\tself.iterator(self.items, function(item, id) {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tself.iterator(self.items, function(item, id) {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self.getSortFunction(search, options);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n\n\t// utilities\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n\tvar cmp = function(a, b) {\n\t\tif (typeof a === 'number' && typeof b === 'number') {\n\t\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t\t}\n\t\ta = asciifold(String(a || ''));\n\t\tb = asciifold(String(b || ''));\n\t\tif (a > b) return 1;\n\t\tif (b > a) return -1;\n\t\treturn 0;\n\t};\n\n\tvar extend = function(a, b) {\n\t\tvar i, n, k, object;\n\t\tfor (i = 1, n = arguments.length; i < n; i++) {\n\t\t\tobject = arguments[i];\n\t\t\tif (!object) continue;\n\t\t\tfor (k in object) {\n\t\t\t\tif (object.hasOwnProperty(k)) {\n\t\t\t\t\ta[k] = object[k];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn a;\n\t};\n\n\t/**\n\t * A property getter resolving dot-notation\n\t * @param  {Object}  obj     The root object to fetch property on\n\t * @param  {String}  name    The optionally dotted property name to fetch\n\t * @param  {Boolean} nesting Handle nesting or not\n\t * @return {Object}          The resolved property value\n\t */\n\tvar getattr = function(obj, name, nesting) {\n\t    if (!obj || !name) return;\n\t    if (!nesting) return obj[name];\n\t    var names = name.split(\".\");\n\t    while(names.length && (obj = obj[names.shift()]));\n\t    return obj;\n\t};\n\n\tvar trim = function(str) {\n\t\treturn (str + '').replace(/^\\s+|\\s+$|/g, '');\n\t};\n\n\tvar escape_regex = function(str) {\n\t\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n\t};\n\n\tvar is_array = Array.isArray || (typeof $ !== 'undefined' && $.isArray) || function(object) {\n\t\treturn Object.prototype.toString.call(object) === '[object Array]';\n\t};\n\n\tvar DIACRITICS = {\n\t\t'a': '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]',\n\t\t'b': '[b␢βΒB฿𐌁ᛒ]',\n\t\t'c': '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄＣｃ]',\n\t\t'd': '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅＤｄð]',\n\t\t'e': '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇＥｅɘǝƏƐε]',\n\t\t'f': '[fƑƒḞḟ]',\n\t\t'g': '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]',\n\t\t'h': '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]',\n\t\t'i': '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪＩｉ]',\n\t\t'j': '[jȷĴĵɈɉʝɟʲ]',\n\t\t'k': '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]',\n\t\t'l': '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟＬｌ]',\n\t\t'n': '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴＮｎŊŋ]',\n\t\t'o': '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]',\n\t\t'p': '[pṔṕṖṗⱣᵽƤƥᵱ]',\n\t\t'q': '[qꝖꝗʠɊɋꝘꝙq̃]',\n\t\t'r': '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]',\n\t\t's': '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]',\n\t\t't': '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]',\n\t\t'u': '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]',\n\t\t'v': '[vṼṽṾṿƲʋꝞꝟⱱʋ]',\n\t\t'w': '[wẂẃẀẁŴŵẄẅẆẇẈẉ]',\n\t\t'x': '[xẌẍẊẋχ]',\n\t\t'y': '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]',\n\t\t'z': '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]'\n\t};\n\n\tvar asciifold = (function() {\n\t\tvar i, n, k, chunk;\n\t\tvar foreignletters = '';\n\t\tvar lookup = {};\n\t\tfor (k in DIACRITICS) {\n\t\t\tif (DIACRITICS.hasOwnProperty(k)) {\n\t\t\t\tchunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1);\n\t\t\t\tforeignletters += chunk;\n\t\t\t\tfor (i = 0, n = chunk.length; i < n; i++) {\n\t\t\t\t\tlookup[chunk.charAt(i)] = k;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvar regexp = new RegExp('[' +  foreignletters + ']', 'g');\n\t\treturn function(str) {\n\t\t\treturn str.replace(regexp, function(foreignletter) {\n\t\t\t\treturn lookup[foreignletter];\n\t\t\t}).toLowerCase();\n\t\t};\n\t})();\n\n\n\t// export\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n\treturn Sifter;\n}));\n\n\n\n/**\n * microplugin.js\n * Copyright (c) 2013 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\n(function(root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine('microplugin', factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.MicroPlugin = factory();\n\t}\n}(this, function() {\n\tvar MicroPlugin = {};\n\n\tMicroPlugin.mixin = function(Interface) {\n\t\tInterface.plugins = {};\n\n\t\t/**\n\t\t * Initializes the listed plugins (with options).\n\t\t * Acceptable formats:\n\t\t *\n\t\t * List (without options):\n\t\t *   ['a', 'b', 'c']\n\t\t *\n\t\t * List (with options):\n\t\t *   [{'name': 'a', options: {}}, {'name': 'b', options: {}}]\n\t\t *\n\t\t * Hash (with options):\n\t\t *   {'a': { ... }, 'b': { ... }, 'c': { ... }}\n\t\t *\n\t\t * @param {mixed} plugins\n\t\t */\n\t\tInterface.prototype.initializePlugins = function(plugins) {\n\t\t\tvar i, n, key;\n\t\t\tvar self  = this;\n\t\t\tvar queue = [];\n\n\t\t\tself.plugins = {\n\t\t\t\tnames     : [],\n\t\t\t\tsettings  : {},\n\t\t\t\trequested : {},\n\t\t\t\tloaded    : {}\n\t\t\t};\n\n\t\t\tif (utils.isArray(plugins)) {\n\t\t\t\tfor (i = 0, n = plugins.length; i < n; i++) {\n\t\t\t\t\tif (typeof plugins[i] === 'string') {\n\t\t\t\t\t\tqueue.push(plugins[i]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.plugins.settings[plugins[i].name] = plugins[i].options;\n\t\t\t\t\t\tqueue.push(plugins[i].name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (plugins) {\n\t\t\t\tfor (key in plugins) {\n\t\t\t\t\tif (plugins.hasOwnProperty(key)) {\n\t\t\t\t\t\tself.plugins.settings[key] = plugins[key];\n\t\t\t\t\t\tqueue.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile (queue.length) {\n\t\t\t\tself.require(queue.shift());\n\t\t\t}\n\t\t};\n\n\t\tInterface.prototype.loadPlugin = function(name) {\n\t\t\tvar self    = this;\n\t\t\tvar plugins = self.plugins;\n\t\t\tvar plugin  = Interface.plugins[name];\n\n\t\t\tif (!Interface.plugins.hasOwnProperty(name)) {\n\t\t\t\tthrow new Error('Unable to find \"' +  name + '\" plugin');\n\t\t\t}\n\n\t\t\tplugins.requested[name] = true;\n\t\t\tplugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);\n\t\t\tplugins.names.push(name);\n\t\t};\n\n\t\t/**\n\t\t * Initializes a plugin.\n\t\t *\n\t\t * @param {string} name\n\t\t */\n\t\tInterface.prototype.require = function(name) {\n\t\t\tvar self = this;\n\t\t\tvar plugins = self.plugins;\n\n\t\t\tif (!self.plugins.loaded.hasOwnProperty(name)) {\n\t\t\t\tif (plugins.requested[name]) {\n\t\t\t\t\tthrow new Error('Plugin has circular dependency (\"' + name + '\")');\n\t\t\t\t}\n\t\t\t\tself.loadPlugin(name);\n\t\t\t}\n\n\t\t\treturn plugins.loaded[name];\n\t\t};\n\n\t\t/**\n\t\t * Registers a plugin.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {function} fn\n\t\t */\n\t\tInterface.define = function(name, fn) {\n\t\t\tInterface.plugins[name] = {\n\t\t\t\t'name' : name,\n\t\t\t\t'fn'   : fn\n\t\t\t};\n\t\t};\n\t};\n\n\tvar utils = {\n\t\tisArray: Array.isArray || function(vArg) {\n\t\t\treturn Object.prototype.toString.call(vArg) === '[object Array]';\n\t\t}\n\t};\n\n\treturn MicroPlugin;\n}));\n\n/**\n * selectize.js (v0.12.6)\n * Copyright (c) 2013–2015 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\n/*jshint curly:false */\n/*jshint browser:true */\n\n(function(root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine('selectize', ['jquery','sifter','microplugin'], factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory(require('jquery'), require('sifter'), require('microplugin'));\n\t} else {\n\t\troot.Selectize = factory(root.jQuery, root.Sifter, root.MicroPlugin);\n\t}\n}(this, function($, Sifter, MicroPlugin) {\n\t'use strict';\n\n\tvar highlight = function($element, pattern) {\n\t\tif (typeof pattern === 'string' && !pattern.length) return;\n\t\tvar regex = (typeof pattern === 'string') ? new RegExp(pattern, 'i') : pattern;\n\t\n\t\tvar highlight = function(node) {\n\t\t\tvar skip = 0;\n\t\t\t// Wrap matching part of text node with highlighting <span>, e.g.\n\t\t\t// Soccer  ->  <span class=\"highlight\">Soc</span>cer  for regex = /soc/i\n\t\t\tif (node.nodeType === 3) {\n\t\t\t\tvar pos = node.data.search(regex);\n\t\t\t\tif (pos >= 0 && node.data.length > 0) {\n\t\t\t\t\tvar match = node.data.match(regex);\n\t\t\t\t\tvar spannode = document.createElement('span');\n\t\t\t\t\tspannode.className = 'highlight';\n\t\t\t\t\tvar middlebit = node.splitText(pos);\n\t\t\t\t\tvar endbit = middlebit.splitText(match[0].length);\n\t\t\t\t\tvar middleclone = middlebit.cloneNode(true);\n\t\t\t\t\tspannode.appendChild(middleclone);\n\t\t\t\t\tmiddlebit.parentNode.replaceChild(spannode, middlebit);\n\t\t\t\t\tskip = 1;\n\t\t\t\t}\n\t\t\t} \n\t\t\t// Recurse element node, looking for child text nodes to highlight, unless element \n\t\t\t// is childless, <script>, <style>, or already highlighted: <span class=\"hightlight\">\n\t\t\telse if (node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName) && ( node.className !== 'highlight' || node.tagName !== 'SPAN' )) {\n\t\t\t\tfor (var i = 0; i < node.childNodes.length; ++i) {\n\t\t\t\t\ti += highlight(node.childNodes[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn skip;\n\t\t};\n\t\n\t\treturn $element.each(function() {\n\t\t\thighlight(this);\n\t\t});\n\t};\n\t\n\t/**\n\t * removeHighlight fn copied from highlight v5 and\n\t * edited to remove with() and pass js strict mode\n\t */\n\t$.fn.removeHighlight = function() {\n\t\treturn this.find(\"span.highlight\").each(function() {\n\t\t\tthis.parentNode.firstChild.nodeName;\n\t\t\tvar parent = this.parentNode;\n\t\t\tparent.replaceChild(this.firstChild, this);\n\t\t\tparent.normalize();\n\t\t}).end();\n\t};\n\t\n\t\n\tvar MicroEvent = function() {};\n\tMicroEvent.prototype = {\n\t\ton: function(event, fct){\n\t\t\tthis._events = this._events || {};\n\t\t\tthis._events[event] = this._events[event] || [];\n\t\t\tthis._events[event].push(fct);\n\t\t},\n\t\toff: function(event, fct){\n\t\t\tvar n = arguments.length;\n\t\t\tif (n === 0) return delete this._events;\n\t\t\tif (n === 1) return delete this._events[event];\n\t\n\t\t\tthis._events = this._events || {};\n\t\t\tif (event in this._events === false) return;\n\t\t\tthis._events[event].splice(this._events[event].indexOf(fct), 1);\n\t\t},\n\t\ttrigger: function(event /* , args... */){\n\t\t\tthis._events = this._events || {};\n\t\t\tif (event in this._events === false) return;\n\t\t\tfor (var i = 0; i < this._events[event].length; i++){\n\t\t\t\tthis._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t\t}\n\t\t}\n\t};\n\t\n\t/**\n\t * Mixin will delegate all MicroEvent.js function in the destination object.\n\t *\n\t * - MicroEvent.mixin(Foobar) will make Foobar able to use MicroEvent\n\t *\n\t * @param {object} the object which will support MicroEvent\n\t */\n\tMicroEvent.mixin = function(destObject){\n\t\tvar props = ['on', 'off', 'trigger'];\n\t\tfor (var i = 0; i < props.length; i++){\n\t\t\tdestObject.prototype[props[i]] = MicroEvent.prototype[props[i]];\n\t\t}\n\t};\n\t\n\tvar IS_MAC        = /Mac/.test(navigator.userAgent);\n\t\n\tvar KEY_A         = 65;\n\tvar KEY_COMMA     = 188;\n\tvar KEY_RETURN    = 13;\n\tvar KEY_ESC       = 27;\n\tvar KEY_LEFT      = 37;\n\tvar KEY_UP        = 38;\n\tvar KEY_P         = 80;\n\tvar KEY_RIGHT     = 39;\n\tvar KEY_DOWN      = 40;\n\tvar KEY_N         = 78;\n\tvar KEY_BACKSPACE = 8;\n\tvar KEY_DELETE    = 46;\n\tvar KEY_SHIFT     = 16;\n\tvar KEY_CMD       = IS_MAC ? 91 : 17;\n\tvar KEY_CTRL      = IS_MAC ? 18 : 17;\n\tvar KEY_TAB       = 9;\n\t\n\tvar TAG_SELECT    = 1;\n\tvar TAG_INPUT     = 2;\n\t\n\t// for now, android support in general is too spotty to support validity\n\tvar SUPPORTS_VALIDITY_API = !/android/i.test(window.navigator.userAgent) && !!document.createElement('input').validity;\n\t\n\t\n\tvar isset = function(object) {\n\t\treturn typeof object !== 'undefined';\n\t};\n\t\n\t/**\n\t * Converts a scalar to its best string representation\n\t * for hash keys and HTML attribute values.\n\t *\n\t * Transformations:\n\t *   'str'     -> 'str'\n\t *   null      -> ''\n\t *   undefined -> ''\n\t *   true      -> '1'\n\t *   false     -> '0'\n\t *   0         -> '0'\n\t *   1         -> '1'\n\t *\n\t * @param {string} value\n\t * @returns {string|null}\n\t */\n\tvar hash_key = function(value) {\n\t\tif (typeof value === 'undefined' || value === null) return null;\n\t\tif (typeof value === 'boolean') return value ? '1' : '0';\n\t\treturn value + '';\n\t};\n\t\n\t/**\n\t * Escapes a string for use within HTML.\n\t *\n\t * @param {string} str\n\t * @returns {string}\n\t */\n\tvar escape_html = function(str) {\n\t\treturn (str + '')\n\t\t\t.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;');\n\t};\n\t\n\t/**\n\t * Escapes \"$\" characters in replacement strings.\n\t *\n\t * @param {string} str\n\t * @returns {string}\n\t */\n\tvar escape_replace = function(str) {\n\t\treturn (str + '').replace(/\\$/g, '$$$$');\n\t};\n\t\n\tvar hook = {};\n\t\n\t/**\n\t * Wraps `method` on `self` so that `fn`\n\t * is invoked before the original method.\n\t *\n\t * @param {object} self\n\t * @param {string} method\n\t * @param {function} fn\n\t */\n\thook.before = function(self, method, fn) {\n\t\tvar original = self[method];\n\t\tself[method] = function() {\n\t\t\tfn.apply(self, arguments);\n\t\t\treturn original.apply(self, arguments);\n\t\t};\n\t};\n\t\n\t/**\n\t * Wraps `method` on `self` so that `fn`\n\t * is invoked after the original method.\n\t *\n\t * @param {object} self\n\t * @param {string} method\n\t * @param {function} fn\n\t */\n\thook.after = function(self, method, fn) {\n\t\tvar original = self[method];\n\t\tself[method] = function() {\n\t\t\tvar result = original.apply(self, arguments);\n\t\t\tfn.apply(self, arguments);\n\t\t\treturn result;\n\t\t};\n\t};\n\t\n\t/**\n\t * Wraps `fn` so that it can only be invoked once.\n\t *\n\t * @param {function} fn\n\t * @returns {function}\n\t */\n\tvar once = function(fn) {\n\t\tvar called = false;\n\t\treturn function() {\n\t\t\tif (called) return;\n\t\t\tcalled = true;\n\t\t\tfn.apply(this, arguments);\n\t\t};\n\t};\n\t\n\t/**\n\t * Wraps `fn` so that it can only be called once\n\t * every `delay` milliseconds (invoked on the falling edge).\n\t *\n\t * @param {function} fn\n\t * @param {int} delay\n\t * @returns {function}\n\t */\n\tvar debounce = function(fn, delay) {\n\t\tvar timeout;\n\t\treturn function() {\n\t\t\tvar self = this;\n\t\t\tvar args = arguments;\n\t\t\twindow.clearTimeout(timeout);\n\t\t\ttimeout = window.setTimeout(function() {\n\t\t\t\tfn.apply(self, args);\n\t\t\t}, delay);\n\t\t};\n\t};\n\t\n\t/**\n\t * Debounce all fired events types listed in `types`\n\t * while executing the provided `fn`.\n\t *\n\t * @param {object} self\n\t * @param {array} types\n\t * @param {function} fn\n\t */\n\tvar debounce_events = function(self, types, fn) {\n\t\tvar type;\n\t\tvar trigger = self.trigger;\n\t\tvar event_args = {};\n\t\n\t\t// override trigger method\n\t\tself.trigger = function() {\n\t\t\tvar type = arguments[0];\n\t\t\tif (types.indexOf(type) !== -1) {\n\t\t\t\tevent_args[type] = arguments;\n\t\t\t} else {\n\t\t\t\treturn trigger.apply(self, arguments);\n\t\t\t}\n\t\t};\n\t\n\t\t// invoke provided function\n\t\tfn.apply(self, []);\n\t\tself.trigger = trigger;\n\t\n\t\t// trigger queued events\n\t\tfor (type in event_args) {\n\t\t\tif (event_args.hasOwnProperty(type)) {\n\t\t\t\ttrigger.apply(self, event_args[type]);\n\t\t\t}\n\t\t}\n\t};\n\t\n\t/**\n\t * A workaround for http://bugs.jquery.com/ticket/6696\n\t *\n\t * @param {object} $parent - Parent element to listen on.\n\t * @param {string} event - Event name.\n\t * @param {string} selector - Descendant selector to filter by.\n\t * @param {function} fn - Event handler.\n\t */\n\tvar watchChildEvent = function($parent, event, selector, fn) {\n\t\t$parent.on(event, selector, function(e) {\n\t\t\tvar child = e.target;\n\t\t\twhile (child && child.parentNode !== $parent[0]) {\n\t\t\t\tchild = child.parentNode;\n\t\t\t}\n\t\t\te.currentTarget = child;\n\t\t\treturn fn.apply(this, [e]);\n\t\t});\n\t};\n\t\n\t/**\n\t * Determines the current selection within a text input control.\n\t * Returns an object containing:\n\t *   - start\n\t *   - length\n\t *\n\t * @param {object} input\n\t * @returns {object}\n\t */\n\tvar getSelection = function(input) {\n\t\tvar result = {};\n\t\tif ('selectionStart' in input) {\n\t\t\tresult.start = input.selectionStart;\n\t\t\tresult.length = input.selectionEnd - result.start;\n\t\t} else if (document.selection) {\n\t\t\tinput.focus();\n\t\t\tvar sel = document.selection.createRange();\n\t\t\tvar selLen = document.selection.createRange().text.length;\n\t\t\tsel.moveStart('character', -input.value.length);\n\t\t\tresult.start = sel.text.length - selLen;\n\t\t\tresult.length = selLen;\n\t\t}\n\t\treturn result;\n\t};\n\t\n\t/**\n\t * Copies CSS properties from one element to another.\n\t *\n\t * @param {object} $from\n\t * @param {object} $to\n\t * @param {array} properties\n\t */\n\tvar transferStyles = function($from, $to, properties) {\n\t\tvar i, n, styles = {};\n\t\tif (properties) {\n\t\t\tfor (i = 0, n = properties.length; i < n; i++) {\n\t\t\t\tstyles[properties[i]] = $from.css(properties[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tstyles = $from.css();\n\t\t}\n\t\t$to.css(styles);\n\t};\n\t\n\t/**\n\t * Measures the width of a string within a\n\t * parent element (in pixels).\n\t *\n\t * @param {string} str\n\t * @param {object} $parent\n\t * @returns {int}\n\t */\n\tvar measureString = function(str, $parent) {\n\t\tif (!str) {\n\t\t\treturn 0;\n\t\t}\n\t\n\t\tif (!Selectize.$testInput) {\n\t\t\tSelectize.$testInput = $('<span />').css({\n\t\t\t\tposition: 'absolute',\n\t\t\t\ttop: -99999,\n\t\t\t\tleft: -99999,\n\t\t\t\twidth: 'auto',\n\t\t\t\tpadding: 0,\n\t\t\t\twhiteSpace: 'pre'\n\t\t\t}).appendTo('body');\n\t\t}\n\t\n\t\tSelectize.$testInput.text(str);\n\t\n\t\ttransferStyles($parent, Selectize.$testInput, [\n\t\t\t'letterSpacing',\n\t\t\t'fontSize',\n\t\t\t'fontFamily',\n\t\t\t'fontWeight',\n\t\t\t'textTransform'\n\t\t]);\n\t\n\t\treturn Selectize.$testInput.width();\n\t};\n\t\n\t/**\n\t * Sets up an input to grow horizontally as the user\n\t * types. If the value is changed manually, you can\n\t * trigger the \"update\" handler to resize:\n\t *\n\t * $input.trigger('update');\n\t *\n\t * @param {object} $input\n\t */\n\tvar autoGrow = function($input) {\n\t\tvar currentWidth = null;\n\t\n\t\tvar update = function(e, options) {\n\t\t\tvar value, keyCode, printable, placeholder, width;\n\t\t\tvar shift, character, selection;\n\t\t\te = e || window.event || {};\n\t\t\toptions = options || {};\n\t\n\t\t\tif (e.metaKey || e.altKey) return;\n\t\t\tif (!options.force && $input.data('grow') === false) return;\n\t\n\t\t\tvalue = $input.val();\n\t\t\tif (e.type && e.type.toLowerCase() === 'keydown') {\n\t\t\t\tkeyCode = e.keyCode;\n\t\t\t\tprintable = (\n\t\t\t\t\t(keyCode >= 48 && keyCode <= 57)  || // 0-9\n\t\t\t\t\t(keyCode >= 65 && keyCode <= 90)   || // a-z\n\t\t\t\t\t(keyCode >= 96 && keyCode <= 111)  || // numpad 0-9, numeric operators\n\t\t\t\t\t(keyCode >= 186 && keyCode <= 222) || // semicolon, equal, comma, dash, etc.\n\t\t\t\t\tkeyCode === 32 // space\n\t\t\t\t);\n\t\n\t\t\t\tif (keyCode === KEY_DELETE || keyCode === KEY_BACKSPACE) {\n\t\t\t\t\tselection = getSelection($input[0]);\n\t\t\t\t\tif (selection.length) {\n\t\t\t\t\t\tvalue = value.substring(0, selection.start) + value.substring(selection.start + selection.length);\n\t\t\t\t\t} else if (keyCode === KEY_BACKSPACE && selection.start) {\n\t\t\t\t\t\tvalue = value.substring(0, selection.start - 1) + value.substring(selection.start + 1);\n\t\t\t\t\t} else if (keyCode === KEY_DELETE && typeof selection.start !== 'undefined') {\n\t\t\t\t\t\tvalue = value.substring(0, selection.start) + value.substring(selection.start + 1);\n\t\t\t\t\t}\n\t\t\t\t} else if (printable) {\n\t\t\t\t\tshift = e.shiftKey;\n\t\t\t\t\tcharacter = String.fromCharCode(e.keyCode);\n\t\t\t\t\tif (shift) character = character.toUpperCase();\n\t\t\t\t\telse character = character.toLowerCase();\n\t\t\t\t\tvalue += character;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tplaceholder = $input.attr('placeholder');\n\t\t\tif (!value && placeholder) {\n\t\t\t\tvalue = placeholder;\n\t\t\t}\n\t\n\t\t\twidth = measureString(value, $input) + 4;\n\t\t\tif (width !== currentWidth) {\n\t\t\t\tcurrentWidth = width;\n\t\t\t\t$input.width(width);\n\t\t\t\t$input.triggerHandler('resize');\n\t\t\t}\n\t\t};\n\t\n\t\t$input.on('keydown keyup update blur', update);\n\t\tupdate();\n\t};\n\t\n\tvar domToString = function(d) {\n\t\tvar tmp = document.createElement('div');\n\t\n\t\ttmp.appendChild(d.cloneNode(true));\n\t\n\t\treturn tmp.innerHTML;\n\t};\n\t\n\tvar logError = function(message, options){\n\t\tif(!options) options = {};\n\t\tvar component = \"Selectize\";\n\t\n\t\tconsole.error(component + \": \" + message)\n\t\n\t\tif(options.explanation){\n\t\t\t// console.group is undefined in <IE11\n\t\t\tif(console.group) console.group();\n\t\t\tconsole.error(options.explanation);\n\t\t\tif(console.group) console.groupEnd();\n\t\t}\n\t}\n\t\n\t\n\tvar Selectize = function($input, settings) {\n\t\tvar key, i, n, dir, input, self = this;\n\t\tinput = $input[0];\n\t\tinput.selectize = self;\n\t\n\t\t// detect rtl environment\n\t\tvar computedStyle = window.getComputedStyle && window.getComputedStyle(input, null);\n\t\tdir = computedStyle ? computedStyle.getPropertyValue('direction') : input.currentStyle && input.currentStyle.direction;\n\t\tdir = dir || $input.parents('[dir]:first').attr('dir') || '';\n\t\n\t\t// setup default state\n\t\t$.extend(self, {\n\t\t\torder            : 0,\n\t\t\tsettings         : settings,\n\t\t\t$input           : $input,\n\t\t\ttabIndex         : $input.attr('tabindex') || '',\n\t\t\ttagType          : input.tagName.toLowerCase() === 'select' ? TAG_SELECT : TAG_INPUT,\n\t\t\trtl              : /rtl/i.test(dir),\n\t\n\t\t\teventNS          : '.selectize' + (++Selectize.count),\n\t\t\thighlightedValue : null,\n\t\t\tisBlurring       : false,\n\t\t\tisOpen           : false,\n\t\t\tisDisabled       : false,\n\t\t\tisRequired       : $input.is('[required]'),\n\t\t\tisInvalid        : false,\n\t\t\tisLocked         : false,\n\t\t\tisFocused        : false,\n\t\t\tisInputHidden    : false,\n\t\t\tisSetup          : false,\n\t\t\tisShiftDown      : false,\n\t\t\tisCmdDown        : false,\n\t\t\tisCtrlDown       : false,\n\t\t\tignoreFocus      : false,\n\t\t\tignoreBlur       : false,\n\t\t\tignoreHover      : false,\n\t\t\thasOptions       : false,\n\t\t\tcurrentResults   : null,\n\t\t\tlastValue        : '',\n\t\t\tcaretPos         : 0,\n\t\t\tloading          : 0,\n\t\t\tloadedSearches   : {},\n\t\n\t\t\t$activeOption    : null,\n\t\t\t$activeItems     : [],\n\t\n\t\t\toptgroups        : {},\n\t\t\toptions          : {},\n\t\t\tuserOptions      : {},\n\t\t\titems            : [],\n\t\t\trenderCache      : {},\n\t\t\tonSearchChange   : settings.loadThrottle === null ? self.onSearchChange : debounce(self.onSearchChange, settings.loadThrottle)\n\t\t});\n\t\n\t\t// search system\n\t\tself.sifter = new Sifter(this.options, {diacritics: settings.diacritics});\n\t\n\t\t// build options table\n\t\tif (self.settings.options) {\n\t\t\tfor (i = 0, n = self.settings.options.length; i < n; i++) {\n\t\t\t\tself.registerOption(self.settings.options[i]);\n\t\t\t}\n\t\t\tdelete self.settings.options;\n\t\t}\n\t\n\t\t// build optgroup table\n\t\tif (self.settings.optgroups) {\n\t\t\tfor (i = 0, n = self.settings.optgroups.length; i < n; i++) {\n\t\t\t\tself.registerOptionGroup(self.settings.optgroups[i]);\n\t\t\t}\n\t\t\tdelete self.settings.optgroups;\n\t\t}\n\t\n\t\t// option-dependent defaults\n\t\tself.settings.mode = self.settings.mode || (self.settings.maxItems === 1 ? 'single' : 'multi');\n\t\tif (typeof self.settings.hideSelected !== 'boolean') {\n\t\t\tself.settings.hideSelected = self.settings.mode === 'multi';\n\t\t}\n\t\n\t\tself.initializePlugins(self.settings.plugins);\n\t\tself.setupCallbacks();\n\t\tself.setupTemplates();\n\t\tself.setup();\n\t};\n\t\n\t// mixins\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\t\n\tMicroEvent.mixin(Selectize);\n\t\n\tif(typeof MicroPlugin !== \"undefined\"){\n\t\tMicroPlugin.mixin(Selectize);\n\t}else{\n\t\tlogError(\"Dependency MicroPlugin is missing\",\n\t\t\t{explanation:\n\t\t\t\t\"Make sure you either: (1) are using the \\\"standalone\\\" \"+\n\t\t\t\t\"version of Selectize, or (2) require MicroPlugin before you \"+\n\t\t\t\t\"load Selectize.\"}\n\t\t);\n\t}\n\t\n\t\n\t// methods\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\t\n\t$.extend(Selectize.prototype, {\n\t\n\t\t/**\n\t\t * Creates all elements and sets up event bindings.\n\t\t */\n\t\tsetup: function() {\n\t\t\tvar self      = this;\n\t\t\tvar settings  = self.settings;\n\t\t\tvar eventNS   = self.eventNS;\n\t\t\tvar $window   = $(window);\n\t\t\tvar $document = $(document);\n\t\t\tvar $input    = self.$input;\n\t\n\t\t\tvar $wrapper;\n\t\t\tvar $control;\n\t\t\tvar $control_input;\n\t\t\tvar $dropdown;\n\t\t\tvar $dropdown_content;\n\t\t\tvar $dropdown_parent;\n\t\t\tvar inputMode;\n\t\t\tvar timeout_blur;\n\t\t\tvar timeout_focus;\n\t\t\tvar classes;\n\t\t\tvar classes_plugins;\n\t\t\tvar inputId;\n\t\n\t\t\tinputMode         = self.settings.mode;\n\t\t\tclasses           = $input.attr('class') || '';\n\t\n\t\t\t$wrapper          = $('<div>').addClass(settings.wrapperClass).addClass(classes).addClass(inputMode);\n\t\t\t$control          = $('<div>').addClass(settings.inputClass).addClass('items').appendTo($wrapper);\n\t\t\t$control_input    = $('<input type=\"text\" autocomplete=\"off\" />').appendTo($control).attr('tabindex', $input.is(':disabled') ? '-1' : self.tabIndex);\n\t\t\t$dropdown_parent  = $(settings.dropdownParent || $wrapper);\n\t\t\t$dropdown         = $('<div>').addClass(settings.dropdownClass).addClass(inputMode).hide().appendTo($dropdown_parent);\n\t\t\t$dropdown_content = $('<div>').addClass(settings.dropdownContentClass).appendTo($dropdown);\n\t\n\t\t\tif(inputId = $input.attr('id')) {\n\t\t\t\t$control_input.attr('id', inputId + '-selectized');\n\t\t\t\t$(\"label[for='\"+inputId+\"']\").attr('for', inputId + '-selectized');\n\t\t\t}\n\t\n\t\t\tif(self.settings.copyClassesToDropdown) {\n\t\t\t\t$dropdown.addClass(classes);\n\t\t\t}\n\t\n\t\t\t$wrapper.css({\n\t\t\t\twidth: $input[0].style.width\n\t\t\t});\n\t\n\t\t\tif (self.plugins.names.length) {\n\t\t\t\tclasses_plugins = 'plugin-' + self.plugins.names.join(' plugin-');\n\t\t\t\t$wrapper.addClass(classes_plugins);\n\t\t\t\t$dropdown.addClass(classes_plugins);\n\t\t\t}\n\t\n\t\t\tif ((settings.maxItems === null || settings.maxItems > 1) && self.tagType === TAG_SELECT) {\n\t\t\t\t$input.attr('multiple', 'multiple');\n\t\t\t}\n\t\n\t\t\tif (self.settings.placeholder) {\n\t\t\t\t$control_input.attr('placeholder', settings.placeholder);\n\t\t\t}\n\t\n\t\t\t// if splitOn was not passed in, construct it from the delimiter to allow pasting universally\n\t\t\tif (!self.settings.splitOn && self.settings.delimiter) {\n\t\t\t\tvar delimiterEscaped = self.settings.delimiter.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\t\tself.settings.splitOn = new RegExp('\\\\s*' + delimiterEscaped + '+\\\\s*');\n\t\t\t}\n\t\n\t\t\tif ($input.attr('autocorrect')) {\n\t\t\t\t$control_input.attr('autocorrect', $input.attr('autocorrect'));\n\t\t\t}\n\t\n\t\t\tif ($input.attr('autocapitalize')) {\n\t\t\t\t$control_input.attr('autocapitalize', $input.attr('autocapitalize'));\n\t\t\t}\n\t\t\t$control_input[0].type = $input[0].type;\n\t\n\t\t\tself.$wrapper          = $wrapper;\n\t\t\tself.$control          = $control;\n\t\t\tself.$control_input    = $control_input;\n\t\t\tself.$dropdown         = $dropdown;\n\t\t\tself.$dropdown_content = $dropdown_content;\n\t\n\t\t\t$dropdown.on('mouseenter mousedown click', '[data-disabled]>[data-selectable]', function(e) { e.stopImmediatePropagation(); });\n\t\t\t$dropdown.on('mouseenter', '[data-selectable]', function() { return self.onOptionHover.apply(self, arguments); });\n\t\t\t$dropdown.on('mousedown click', '[data-selectable]', function() { return self.onOptionSelect.apply(self, arguments); });\n\t\t\twatchChildEvent($control, 'mousedown', '*:not(input)', function() { return self.onItemSelect.apply(self, arguments); });\n\t\t\tautoGrow($control_input);\n\t\n\t\t\t$control.on({\n\t\t\t\tmousedown : function() { return self.onMouseDown.apply(self, arguments); },\n\t\t\t\tclick     : function() { return self.onClick.apply(self, arguments); }\n\t\t\t});\n\t\n\t\t\t$control_input.on({\n\t\t\t\tmousedown : function(e) { e.stopPropagation(); },\n\t\t\t\tkeydown   : function() { return self.onKeyDown.apply(self, arguments); },\n\t\t\t\tkeyup     : function() { return self.onKeyUp.apply(self, arguments); },\n\t\t\t\tkeypress  : function() { return self.onKeyPress.apply(self, arguments); },\n\t\t\t\tresize    : function() { self.positionDropdown.apply(self, []); },\n\t\t\t\tblur      : function() { return self.onBlur.apply(self, arguments); },\n\t\t\t\tfocus     : function() { self.ignoreBlur = false; return self.onFocus.apply(self, arguments); },\n\t\t\t\tpaste     : function() { return self.onPaste.apply(self, arguments); }\n\t\t\t});\n\t\n\t\t\t$document.on('keydown' + eventNS, function(e) {\n\t\t\t\tself.isCmdDown = e[IS_MAC ? 'metaKey' : 'ctrlKey'];\n\t\t\t\tself.isCtrlDown = e[IS_MAC ? 'altKey' : 'ctrlKey'];\n\t\t\t\tself.isShiftDown = e.shiftKey;\n\t\t\t});\n\t\n\t\t\t$document.on('keyup' + eventNS, function(e) {\n\t\t\t\tif (e.keyCode === KEY_CTRL) self.isCtrlDown = false;\n\t\t\t\tif (e.keyCode === KEY_SHIFT) self.isShiftDown = false;\n\t\t\t\tif (e.keyCode === KEY_CMD) self.isCmdDown = false;\n\t\t\t});\n\t\n\t\t\t$document.on('mousedown' + eventNS, function(e) {\n\t\t\t\tif (self.isFocused) {\n\t\t\t\t\t// prevent events on the dropdown scrollbar from causing the control to blur\n\t\t\t\t\tif (e.target === self.$dropdown[0] || e.target.parentNode === self.$dropdown[0]) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t// blur on click outside\n\t\t\t\t\tif (!self.$control.has(e.target).length && e.target !== self.$control[0]) {\n\t\t\t\t\t\tself.blur(e.target);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\t$window.on(['scroll' + eventNS, 'resize' + eventNS].join(' '), function() {\n\t\t\t\tif (self.isOpen) {\n\t\t\t\t\tself.positionDropdown.apply(self, arguments);\n\t\t\t\t}\n\t\t\t});\n\t\t\t$window.on('mousemove' + eventNS, function() {\n\t\t\t\tself.ignoreHover = false;\n\t\t\t});\n\t\n\t\t\t// store original children and tab index so that they can be\n\t\t\t// restored when the destroy() method is called.\n\t\t\tthis.revertSettings = {\n\t\t\t\t$children : $input.children().detach(),\n\t\t\t\ttabindex  : $input.attr('tabindex')\n\t\t\t};\n\t\n\t\t\t$input.attr('tabindex', -1).hide().after(self.$wrapper);\n\t\n\t\t\tif ($.isArray(settings.items)) {\n\t\t\t\tself.setValue(settings.items);\n\t\t\t\tdelete settings.items;\n\t\t\t}\n\t\n\t\t\t// feature detect for the validation API\n\t\t\tif (SUPPORTS_VALIDITY_API) {\n\t\t\t\t$input.on('invalid' + eventNS, function(e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tself.isInvalid = true;\n\t\t\t\t\tself.refreshState();\n\t\t\t\t});\n\t\t\t}\n\t\n\t\t\tself.updateOriginalInput();\n\t\t\tself.refreshItems();\n\t\t\tself.refreshState();\n\t\t\tself.updatePlaceholder();\n\t\t\tself.isSetup = true;\n\t\n\t\t\tif ($input.is(':disabled')) {\n\t\t\t\tself.disable();\n\t\t\t}\n\t\n\t\t\tself.on('change', this.onChange);\n\t\n\t\t\t$input.data('selectize', self);\n\t\t\t$input.addClass('selectized');\n\t\t\tself.trigger('initialize');\n\t\n\t\t\t// preload options\n\t\t\tif (settings.preload === true) {\n\t\t\t\tself.onSearchChange('');\n\t\t\t}\n\t\n\t\t},\n\t\n\t\t/**\n\t\t * Sets up default rendering functions.\n\t\t */\n\t\tsetupTemplates: function() {\n\t\t\tvar self = this;\n\t\t\tvar field_label = self.settings.labelField;\n\t\t\tvar field_optgroup = self.settings.optgroupLabelField;\n\t\n\t\t\tvar templates = {\n\t\t\t\t'optgroup': function(data) {\n\t\t\t\t\treturn '<div class=\"optgroup\">' + data.html + '</div>';\n\t\t\t\t},\n\t\t\t\t'optgroup_header': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"optgroup-header\">' + escape(data[field_optgroup]) + '</div>';\n\t\t\t\t},\n\t\t\t\t'option': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"option\">' + escape(data[field_label]) + '</div>';\n\t\t\t\t},\n\t\t\t\t'item': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"item\">' + escape(data[field_label]) + '</div>';\n\t\t\t\t},\n\t\t\t\t'option_create': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"create\">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>';\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\tself.settings.render = $.extend({}, templates, self.settings.render);\n\t\t},\n\t\n\t\t/**\n\t\t * Maps fired events to callbacks provided\n\t\t * in the settings used when creating the control.\n\t\t */\n\t\tsetupCallbacks: function() {\n\t\t\tvar key, fn, callbacks = {\n\t\t\t\t'initialize'      : 'onInitialize',\n\t\t\t\t'change'          : 'onChange',\n\t\t\t\t'item_add'        : 'onItemAdd',\n\t\t\t\t'item_remove'     : 'onItemRemove',\n\t\t\t\t'clear'           : 'onClear',\n\t\t\t\t'option_add'      : 'onOptionAdd',\n\t\t\t\t'option_remove'   : 'onOptionRemove',\n\t\t\t\t'option_clear'    : 'onOptionClear',\n\t\t\t\t'optgroup_add'    : 'onOptionGroupAdd',\n\t\t\t\t'optgroup_remove' : 'onOptionGroupRemove',\n\t\t\t\t'optgroup_clear'  : 'onOptionGroupClear',\n\t\t\t\t'dropdown_open'   : 'onDropdownOpen',\n\t\t\t\t'dropdown_close'  : 'onDropdownClose',\n\t\t\t\t'type'            : 'onType',\n\t\t\t\t'load'            : 'onLoad',\n\t\t\t\t'focus'           : 'onFocus',\n\t\t\t\t'blur'            : 'onBlur'\n\t\t\t};\n\t\n\t\t\tfor (key in callbacks) {\n\t\t\t\tif (callbacks.hasOwnProperty(key)) {\n\t\t\t\t\tfn = this.settings[callbacks[key]];\n\t\t\t\t\tif (fn) this.on(key, fn);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the main control element\n\t\t * has a click event.\n\t\t *\n\t\t * @param {object} e\n\t\t * @return {boolean}\n\t\t */\n\t\tonClick: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\t// necessary for mobile webkit devices (manual focus triggering\n\t\t\t// is ignored unless invoked within a click event)\n\t    // also necessary to reopen a dropdown that has been closed by\n\t    // closeAfterSelect\n\t\t\tif (!self.isFocused || !self.isOpen) {\n\t\t\t\tself.focus();\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the main control element\n\t\t * has a mouse down event.\n\t\t *\n\t\t * @param {object} e\n\t\t * @return {boolean}\n\t\t */\n\t\tonMouseDown: function(e) {\n\t\t\tvar self = this;\n\t\t\tvar defaultPrevented = e.isDefaultPrevented();\n\t\t\tvar $target = $(e.target);\n\t\n\t\t\tif (self.isFocused) {\n\t\t\t\t// retain focus by preventing native handling. if the\n\t\t\t\t// event target is the input it should not be modified.\n\t\t\t\t// otherwise, text selection within the input won't work.\n\t\t\t\tif (e.target !== self.$control_input[0]) {\n\t\t\t\t\tif (self.settings.mode === 'single') {\n\t\t\t\t\t\t// toggle dropdown\n\t\t\t\t\t\tself.isOpen ? self.close() : self.open();\n\t\t\t\t\t} else if (!defaultPrevented) {\n\t\t\t\t\t\tself.setActiveItem(null);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// give control focus\n\t\t\t\tif (!defaultPrevented) {\n\t\t\t\t\twindow.setTimeout(function() {\n\t\t\t\t\t\tself.focus();\n\t\t\t\t\t}, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the value of the control has been changed.\n\t\t * This should propagate the event to the original DOM\n\t\t * input / select element.\n\t\t */\n\t\tonChange: function() {\n\t\t\tthis.$input.trigger('change');\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> paste.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonPaste: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isFull() || self.isInputHidden || self.isLocked) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// If a regex or string is included, this will split the pasted\n\t\t\t// input and create Items for each separate value\n\t\t\tif (self.settings.splitOn) {\n\t\n\t\t\t\t// Wait for pasted text to be recognized in value\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tvar pastedText = self.$control_input.val();\n\t\t\t\t\tif(!pastedText.match(self.settings.splitOn)){ return }\n\t\n\t\t\t\t\tvar splitInput = $.trim(pastedText).split(self.settings.splitOn);\n\t\t\t\t\tfor (var i = 0, n = splitInput.length; i < n; i++) {\n\t\t\t\t\t\tself.createItem(splitInput[i]);\n\t\t\t\t\t}\n\t\t\t\t}, 0);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> keypress.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonKeyPress: function(e) {\n\t\t\tif (this.isLocked) return e && e.preventDefault();\n\t\t\tvar character = String.fromCharCode(e.keyCode || e.which);\n\t\t\tif (this.settings.create && this.settings.mode === 'multi' && character === this.settings.delimiter) {\n\t\t\t\tthis.createItem();\n\t\t\t\te.preventDefault();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> keydown.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonKeyDown: function(e) {\n\t\t\tvar isInput = e.target === this.$control_input[0];\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked) {\n\t\t\t\tif (e.keyCode !== KEY_TAB) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tswitch (e.keyCode) {\n\t\t\t\tcase KEY_A:\n\t\t\t\t\tif (self.isCmdDown) {\n\t\t\t\t\t\tself.selectAll();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase KEY_ESC:\n\t\t\t\t\tif (self.isOpen) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_N:\n\t\t\t\t\tif (!e.ctrlKey || e.altKey) break;\n\t\t\t\tcase KEY_DOWN:\n\t\t\t\t\tif (!self.isOpen && self.hasOptions) {\n\t\t\t\t\t\tself.open();\n\t\t\t\t\t} else if (self.$activeOption) {\n\t\t\t\t\t\tself.ignoreHover = true;\n\t\t\t\t\t\tvar $next = self.getAdjacentOption(self.$activeOption, 1);\n\t\t\t\t\t\tif ($next.length) self.setActiveOption($next, true, true);\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_P:\n\t\t\t\t\tif (!e.ctrlKey || e.altKey) break;\n\t\t\t\tcase KEY_UP:\n\t\t\t\t\tif (self.$activeOption) {\n\t\t\t\t\t\tself.ignoreHover = true;\n\t\t\t\t\t\tvar $prev = self.getAdjacentOption(self.$activeOption, -1);\n\t\t\t\t\t\tif ($prev.length) self.setActiveOption($prev, true, true);\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_RETURN:\n\t\t\t\t\tif (self.isOpen && self.$activeOption) {\n\t\t\t\t\t\tself.onOptionSelect({currentTarget: self.$activeOption});\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_LEFT:\n\t\t\t\t\tself.advanceSelection(-1, e);\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_RIGHT:\n\t\t\t\t\tself.advanceSelection(1, e);\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_TAB:\n\t\t\t\t\tif (self.settings.selectOnTab && self.isOpen && self.$activeOption) {\n\t\t\t\t\t\tself.onOptionSelect({currentTarget: self.$activeOption});\n\t\n\t\t\t\t\t\t// Default behaviour is to jump to the next field, we only want this\n\t\t\t\t\t\t// if the current field doesn't accept any more entries\n\t\t\t\t\t\tif (!self.isFull()) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (self.settings.create && self.createItem()) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_BACKSPACE:\n\t\t\t\tcase KEY_DELETE:\n\t\t\t\t\tself.deleteSelection(e);\n\t\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tif ((self.isFull() || self.isInputHidden) && !(IS_MAC ? e.metaKey : e.ctrlKey)) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> keyup.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonKeyUp: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked) return e && e.preventDefault();\n\t\t\tvar value = self.$control_input.val() || '';\n\t\t\tif (self.lastValue !== value) {\n\t\t\t\tself.lastValue = value;\n\t\t\t\tself.onSearchChange(value);\n\t\t\t\tself.refreshOptions();\n\t\t\t\tself.trigger('type', value);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Invokes the user-provide option provider / loader.\n\t\t *\n\t\t * Note: this function is debounced in the Selectize\n\t\t * constructor (by `settings.loadThrottle` milliseconds)\n\t\t *\n\t\t * @param {string} value\n\t\t */\n\t\tonSearchChange: function(value) {\n\t\t\tvar self = this;\n\t\t\tvar fn = self.settings.load;\n\t\t\tif (!fn) return;\n\t\t\tif (self.loadedSearches.hasOwnProperty(value)) return;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tself.load(function(callback) {\n\t\t\t\tfn.apply(self, [value, callback]);\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> focus.\n\t\t *\n\t\t * @param {object} e (optional)\n\t\t * @returns {boolean}\n\t\t */\n\t\tonFocus: function(e) {\n\t\t\tvar self = this;\n\t\t\tvar wasFocused = self.isFocused;\n\t\n\t\t\tif (self.isDisabled) {\n\t\t\t\tself.blur();\n\t\t\t\te && e.preventDefault();\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\tif (self.ignoreFocus) return;\n\t\t\tself.isFocused = true;\n\t\t\tif (self.settings.preload === 'focus') self.onSearchChange('');\n\t\n\t\t\tif (!wasFocused) self.trigger('focus');\n\t\n\t\t\tif (!self.$activeItems.length) {\n\t\t\t\tself.showInput();\n\t\t\t\tself.setActiveItem(null);\n\t\t\t\tself.refreshOptions(!!self.settings.openOnFocus);\n\t\t\t}\n\t\n\t\t\tself.refreshState();\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> blur.\n\t\t *\n\t\t * @param {object} e\n\t\t * @param {Element} dest\n\t\t */\n\t\tonBlur: function(e, dest) {\n\t\t\tvar self = this;\n\t\t\tif (!self.isFocused) return;\n\t\t\tself.isFocused = false;\n\t\n\t\t\tif (self.ignoreFocus) {\n\t\t\t\treturn;\n\t\t\t} else if (!self.ignoreBlur && document.activeElement === self.$dropdown_content[0]) {\n\t\t\t\t// necessary to prevent IE closing the dropdown when the scrollbar is clicked\n\t\t\t\tself.ignoreBlur = true;\n\t\t\t\tself.onFocus(e);\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tvar deactivate = function() {\n\t\t\t\tself.close();\n\t\t\t\tself.setTextboxValue('');\n\t\t\t\tself.setActiveItem(null);\n\t\t\t\tself.setActiveOption(null);\n\t\t\t\tself.setCaret(self.items.length);\n\t\t\t\tself.refreshState();\n\t\n\t\t\t\t// IE11 bug: element still marked as active\n\t\t\t\tdest && dest.focus && dest.focus();\n\t\n\t\t\t\tself.isBlurring = false;\n\t\t\t\tself.ignoreFocus = false;\n\t\t\t\tself.trigger('blur');\n\t\t\t};\n\t\n\t\t\tself.isBlurring = true;\n\t\t\tself.ignoreFocus = true;\n\t\t\tif (self.settings.create && self.settings.createOnBlur) {\n\t\t\t\tself.createItem(null, false, deactivate);\n\t\t\t} else {\n\t\t\t\tdeactivate();\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the user rolls over\n\t\t * an option in the autocomplete dropdown menu.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonOptionHover: function(e) {\n\t\t\tif (this.ignoreHover) return;\n\t\t\tthis.setActiveOption(e.currentTarget, false);\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the user clicks on an option\n\t\t * in the autocomplete dropdown menu.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonOptionSelect: function(e) {\n\t\t\tvar value, $target, $option, self = this;\n\t\n\t\t\tif (e.preventDefault) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\n\t\t\t$target = $(e.currentTarget);\n\t\t\tif ($target.hasClass('create')) {\n\t\t\t\tself.createItem(null, function() {\n\t\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvalue = $target.attr('data-value');\n\t\t\t\tif (typeof value !== 'undefined') {\n\t\t\t\t\tself.lastQuery = null;\n\t\t\t\t\tself.setTextboxValue('');\n\t\t\t\t\tself.addItem(value);\n\t\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t} else if (!self.settings.hideSelected && e.type && /mouse/.test(e.type)) {\n\t\t\t\t\t\tself.setActiveOption(self.getOption(value));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the user clicks on an item\n\t\t * that has been selected.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonItemSelect: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked) return;\n\t\t\tif (self.settings.mode === 'multi') {\n\t\t\t\te.preventDefault();\n\t\t\t\tself.setActiveItem(e.currentTarget, e);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Invokes the provided method that provides\n\t\t * results to a callback---which are then added\n\t\t * as options to the control.\n\t\t *\n\t\t * @param {function} fn\n\t\t */\n\t\tload: function(fn) {\n\t\t\tvar self = this;\n\t\t\tvar $wrapper = self.$wrapper.addClass(self.settings.loadingClass);\n\t\n\t\t\tself.loading++;\n\t\t\tfn.apply(self, [function(results) {\n\t\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\t\tif (results && results.length) {\n\t\t\t\t\tself.addOption(results);\n\t\t\t\t\tself.refreshOptions(self.isFocused && !self.isInputHidden);\n\t\t\t\t}\n\t\t\t\tif (!self.loading) {\n\t\t\t\t\t$wrapper.removeClass(self.settings.loadingClass);\n\t\t\t\t}\n\t\t\t\tself.trigger('load', results);\n\t\t\t}]);\n\t\t},\n\t\n\t\t/**\n\t\t * Sets the input field of the control to the specified value.\n\t\t *\n\t\t * @param {string} value\n\t\t */\n\t\tsetTextboxValue: function(value) {\n\t\t\tvar $input = this.$control_input;\n\t\t\tvar changed = $input.val() !== value;\n\t\t\tif (changed) {\n\t\t\t\t$input.val(value).triggerHandler('update');\n\t\t\t\tthis.lastValue = value;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the value of the control. If multiple items\n\t\t * can be selected (e.g. <select multiple>), this returns\n\t\t * an array. If only one item can be selected, this\n\t\t * returns a string.\n\t\t *\n\t\t * @returns {mixed}\n\t\t */\n\t\tgetValue: function() {\n\t\t\tif (this.tagType === TAG_SELECT && this.$input.attr('multiple')) {\n\t\t\t\treturn this.items;\n\t\t\t} else {\n\t\t\t\treturn this.items.join(this.settings.delimiter);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Resets the selected items to the given value.\n\t\t *\n\t\t * @param {mixed} value\n\t\t */\n\t\tsetValue: function(value, silent) {\n\t\t\tvar events = silent ? [] : ['change'];\n\t\n\t\t\tdebounce_events(this, events, function() {\n\t\t\t\tthis.clear(silent);\n\t\t\t\tthis.addItems(value, silent);\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Sets the selected item.\n\t\t *\n\t\t * @param {object} $item\n\t\t * @param {object} e (optional)\n\t\t */\n\t\tsetActiveItem: function($item, e) {\n\t\t\tvar self = this;\n\t\t\tvar eventName;\n\t\t\tvar i, idx, begin, end, item, swap;\n\t\t\tvar $last;\n\t\n\t\t\tif (self.settings.mode === 'single') return;\n\t\t\t$item = $($item);\n\t\n\t\t\t// clear the active selection\n\t\t\tif (!$item.length) {\n\t\t\t\t$(self.$activeItems).removeClass('active');\n\t\t\t\tself.$activeItems = [];\n\t\t\t\tif (self.isFocused) {\n\t\t\t\t\tself.showInput();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// modify selection\n\t\t\teventName = e && e.type.toLowerCase();\n\t\n\t\t\tif (eventName === 'mousedown' && self.isShiftDown && self.$activeItems.length) {\n\t\t\t\t$last = self.$control.children('.active:last');\n\t\t\t\tbegin = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$last[0]]);\n\t\t\t\tend   = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$item[0]]);\n\t\t\t\tif (begin > end) {\n\t\t\t\t\tswap  = begin;\n\t\t\t\t\tbegin = end;\n\t\t\t\t\tend   = swap;\n\t\t\t\t}\n\t\t\t\tfor (i = begin; i <= end; i++) {\n\t\t\t\t\titem = self.$control[0].childNodes[i];\n\t\t\t\t\tif (self.$activeItems.indexOf(item) === -1) {\n\t\t\t\t\t\t$(item).addClass('active');\n\t\t\t\t\t\tself.$activeItems.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\te.preventDefault();\n\t\t\t} else if ((eventName === 'mousedown' && self.isCtrlDown) || (eventName === 'keydown' && this.isShiftDown)) {\n\t\t\t\tif ($item.hasClass('active')) {\n\t\t\t\t\tidx = self.$activeItems.indexOf($item[0]);\n\t\t\t\t\tself.$activeItems.splice(idx, 1);\n\t\t\t\t\t$item.removeClass('active');\n\t\t\t\t} else {\n\t\t\t\t\tself.$activeItems.push($item.addClass('active')[0]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$(self.$activeItems).removeClass('active');\n\t\t\t\tself.$activeItems = [$item.addClass('active')[0]];\n\t\t\t}\n\t\n\t\t\t// ensure control has focus\n\t\t\tself.hideInput();\n\t\t\tif (!this.isFocused) {\n\t\t\t\tself.focus();\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Sets the selected item in the dropdown menu\n\t\t * of available options.\n\t\t *\n\t\t * @param {object} $object\n\t\t * @param {boolean} scroll\n\t\t * @param {boolean} animate\n\t\t */\n\t\tsetActiveOption: function($option, scroll, animate) {\n\t\t\tvar height_menu, height_item, y;\n\t\t\tvar scroll_top, scroll_bottom;\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.$activeOption) self.$activeOption.removeClass('active');\n\t\t\tself.$activeOption = null;\n\t\n\t\t\t$option = $($option);\n\t\t\tif (!$option.length) return;\n\t\n\t\t\tself.$activeOption = $option.addClass('active');\n\t\n\t\t\tif (scroll || !isset(scroll)) {\n\t\n\t\t\t\theight_menu   = self.$dropdown_content.height();\n\t\t\t\theight_item   = self.$activeOption.outerHeight(true);\n\t\t\t\tscroll        = self.$dropdown_content.scrollTop() || 0;\n\t\t\t\ty             = self.$activeOption.offset().top - self.$dropdown_content.offset().top + scroll;\n\t\t\t\tscroll_top    = y;\n\t\t\t\tscroll_bottom = y - height_menu + height_item;\n\t\n\t\t\t\tif (y + height_item > height_menu + scroll) {\n\t\t\t\t\tself.$dropdown_content.stop().animate({scrollTop: scroll_bottom}, animate ? self.settings.scrollDuration : 0);\n\t\t\t\t} else if (y < scroll) {\n\t\t\t\t\tself.$dropdown_content.stop().animate({scrollTop: scroll_top}, animate ? self.settings.scrollDuration : 0);\n\t\t\t\t}\n\t\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Selects all items (CTRL + A).\n\t\t */\n\t\tselectAll: function() {\n\t\t\tvar self = this;\n\t\t\tif (self.settings.mode === 'single') return;\n\t\n\t\t\tself.$activeItems = Array.prototype.slice.apply(self.$control.children(':not(input)').addClass('active'));\n\t\t\tif (self.$activeItems.length) {\n\t\t\t\tself.hideInput();\n\t\t\t\tself.close();\n\t\t\t}\n\t\t\tself.focus();\n\t\t},\n\t\n\t\t/**\n\t\t * Hides the input element out of view, while\n\t\t * retaining its focus.\n\t\t */\n\t\thideInput: function() {\n\t\t\tvar self = this;\n\t\n\t\t\tself.setTextboxValue('');\n\t\t\tself.$control_input.css({opacity: 0, position: 'absolute', left: self.rtl ? 10000 : -10000});\n\t\t\tself.isInputHidden = true;\n\t\t},\n\t\n\t\t/**\n\t\t * Restores input visibility.\n\t\t */\n\t\tshowInput: function() {\n\t\t\tthis.$control_input.css({opacity: 1, position: 'relative', left: 0});\n\t\t\tthis.isInputHidden = false;\n\t\t},\n\t\n\t\t/**\n\t\t * Gives the control focus.\n\t\t */\n\t\tfocus: function() {\n\t\t\tvar self = this;\n\t\t\tif (self.isDisabled) return;\n\t\n\t\t\tself.ignoreFocus = true;\n\t\t\tself.$control_input[0].focus();\n\t\t\twindow.setTimeout(function() {\n\t\t\t\tself.ignoreFocus = false;\n\t\t\t\tself.onFocus();\n\t\t\t}, 0);\n\t\t},\n\t\n\t\t/**\n\t\t * Forces the control out of focus.\n\t\t *\n\t\t * @param {Element} dest\n\t\t */\n\t\tblur: function(dest) {\n\t\t\tthis.$control_input[0].blur();\n\t\t\tthis.onBlur(null, dest);\n\t\t},\n\t\n\t\t/**\n\t\t * Returns a function that scores an object\n\t\t * to show how good of a match it is to the\n\t\t * provided query.\n\t\t *\n\t\t * @param {string} query\n\t\t * @param {object} options\n\t\t * @return {function}\n\t\t */\n\t\tgetScoreFunction: function(query) {\n\t\t\treturn this.sifter.getScoreFunction(query, this.getSearchOptions());\n\t\t},\n\t\n\t\t/**\n\t\t * Returns search options for sifter (the system\n\t\t * for scoring and sorting results).\n\t\t *\n\t\t * @see https://github.com/brianreavis/sifter.js\n\t\t * @return {object}\n\t\t */\n\t\tgetSearchOptions: function() {\n\t\t\tvar settings = this.settings;\n\t\t\tvar sort = settings.sortField;\n\t\t\tif (typeof sort === 'string') {\n\t\t\t\tsort = [{field: sort}];\n\t\t\t}\n\t\n\t\t\treturn {\n\t\t\t\tfields      : settings.searchField,\n\t\t\t\tconjunction : settings.searchConjunction,\n\t\t\t\tsort        : sort,\n\t\t\t\tnesting     : settings.nesting\n\t\t\t};\n\t\t},\n\t\n\t\t/**\n\t\t * Searches through available options and returns\n\t\t * a sorted array of matches.\n\t\t *\n\t\t * Returns an object containing:\n\t\t *\n\t\t *   - query {string}\n\t\t *   - tokens {array}\n\t\t *   - total {int}\n\t\t *   - items {array}\n\t\t *\n\t\t * @param {string} query\n\t\t * @returns {object}\n\t\t */\n\t\tsearch: function(query) {\n\t\t\tvar i, value, score, result, calculateScore;\n\t\t\tvar self     = this;\n\t\t\tvar settings = self.settings;\n\t\t\tvar options  = this.getSearchOptions();\n\t\n\t\t\t// validate user-provided result scoring function\n\t\t\tif (settings.score) {\n\t\t\t\tcalculateScore = self.settings.score.apply(this, [query]);\n\t\t\t\tif (typeof calculateScore !== 'function') {\n\t\t\t\t\tthrow new Error('Selectize \"score\" setting must be a function that returns a function');\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// perform search\n\t\t\tif (query !== self.lastQuery) {\n\t\t\t\tself.lastQuery = query;\n\t\t\t\tresult = self.sifter.search(query, $.extend(options, {score: calculateScore}));\n\t\t\t\tself.currentResults = result;\n\t\t\t} else {\n\t\t\t\tresult = $.extend(true, {}, self.currentResults);\n\t\t\t}\n\t\n\t\t\t// filter out selected items\n\t\t\tif (settings.hideSelected) {\n\t\t\t\tfor (i = result.items.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (self.items.indexOf(hash_key(result.items[i].id)) !== -1) {\n\t\t\t\t\t\tresult.items.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn result;\n\t\t},\n\t\n\t\t/**\n\t\t * Refreshes the list of available options shown\n\t\t * in the autocomplete dropdown menu.\n\t\t *\n\t\t * @param {boolean} triggerDropdown\n\t\t */\n\t\trefreshOptions: function(triggerDropdown) {\n\t\t\tvar i, j, k, n, groups, groups_order, option, option_html, optgroup, optgroups, html, html_children, has_create_option;\n\t\t\tvar $active, $active_before, $create;\n\t\n\t\t\tif (typeof triggerDropdown === 'undefined') {\n\t\t\t\ttriggerDropdown = true;\n\t\t\t}\n\t\n\t\t\tvar self              = this;\n\t\t\tvar query             = $.trim(self.$control_input.val());\n\t\t\tvar results           = self.search(query);\n\t\t\tvar $dropdown_content = self.$dropdown_content;\n\t\t\tvar active_before     = self.$activeOption && hash_key(self.$activeOption.attr('data-value'));\n\t\n\t\t\t// build markup\n\t\t\tn = results.items.length;\n\t\t\tif (typeof self.settings.maxOptions === 'number') {\n\t\t\t\tn = Math.min(n, self.settings.maxOptions);\n\t\t\t}\n\t\n\t\t\t// render and group available options individually\n\t\t\tgroups = {};\n\t\t\tgroups_order = [];\n\t\n\t\t\tfor (i = 0; i < n; i++) {\n\t\t\t\toption      = self.options[results.items[i].id];\n\t\t\t\toption_html = self.render('option', option);\n\t\t\t\toptgroup    = option[self.settings.optgroupField] || '';\n\t\t\t\toptgroups   = $.isArray(optgroup) ? optgroup : [optgroup];\n\t\n\t\t\t\tfor (j = 0, k = optgroups && optgroups.length; j < k; j++) {\n\t\t\t\t\toptgroup = optgroups[j];\n\t\t\t\t\tif (!self.optgroups.hasOwnProperty(optgroup)) {\n\t\t\t\t\t\toptgroup = '';\n\t\t\t\t\t}\n\t\t\t\t\tif (!groups.hasOwnProperty(optgroup)) {\n\t\t\t\t\t\tgroups[optgroup] = document.createDocumentFragment();\n\t\t\t\t\t\tgroups_order.push(optgroup);\n\t\t\t\t\t}\n\t\t\t\t\tgroups[optgroup].appendChild(option_html);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// sort optgroups\n\t\t\tif (this.settings.lockOptgroupOrder) {\n\t\t\t\tgroups_order.sort(function(a, b) {\n\t\t\t\t\tvar a_order = self.optgroups[a].$order || 0;\n\t\t\t\t\tvar b_order = self.optgroups[b].$order || 0;\n\t\t\t\t\treturn a_order - b_order;\n\t\t\t\t});\n\t\t\t}\n\t\n\t\t\t// render optgroup headers & join groups\n\t\t\thtml = document.createDocumentFragment();\n\t\t\tfor (i = 0, n = groups_order.length; i < n; i++) {\n\t\t\t\toptgroup = groups_order[i];\n\t\t\t\tif (self.optgroups.hasOwnProperty(optgroup) && groups[optgroup].childNodes.length) {\n\t\t\t\t\t// render the optgroup header and options within it,\n\t\t\t\t\t// then pass it to the wrapper template\n\t\t\t\t\thtml_children = document.createDocumentFragment();\n\t\t\t\t\thtml_children.appendChild(self.render('optgroup_header', self.optgroups[optgroup]));\n\t\t\t\t\thtml_children.appendChild(groups[optgroup]);\n\t\n\t\t\t\t\thtml.appendChild(self.render('optgroup', $.extend({}, self.optgroups[optgroup], {\n\t\t\t\t\t\thtml: domToString(html_children),\n\t\t\t\t\t\tdom:  html_children\n\t\t\t\t\t})));\n\t\t\t\t} else {\n\t\t\t\t\thtml.appendChild(groups[optgroup]);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t$dropdown_content.html(html);\n\t\n\t\t\t// highlight matching terms inline\n\t\t\tif (self.settings.highlight) {\n\t\t\t\t$dropdown_content.removeHighlight();\n\t\t\t\tif (results.query.length && results.tokens.length) {\n\t\t\t\t\tfor (i = 0, n = results.tokens.length; i < n; i++) {\n\t\t\t\t\t\thighlight($dropdown_content, results.tokens[i].regex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// add \"selected\" class to selected options\n\t\t\tif (!self.settings.hideSelected) {\n\t\t\t\tfor (i = 0, n = self.items.length; i < n; i++) {\n\t\t\t\t\tself.getOption(self.items[i]).addClass('selected');\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// add create option\n\t\t\thas_create_option = self.canCreate(query);\n\t\t\tif (has_create_option) {\n\t\t\t\t$dropdown_content.prepend(self.render('option_create', {input: query}));\n\t\t\t\t$create = $($dropdown_content[0].childNodes[0]);\n\t\t\t}\n\t\n\t\t\t// activate\n\t\t\tself.hasOptions = results.items.length > 0 || has_create_option;\n\t\t\tif (self.hasOptions) {\n\t\t\t\tif (results.items.length > 0) {\n\t\t\t\t\t$active_before = active_before && self.getOption(active_before);\n\t\t\t\t\tif ($active_before && $active_before.length) {\n\t\t\t\t\t\t$active = $active_before;\n\t\t\t\t\t} else if (self.settings.mode === 'single' && self.items.length) {\n\t\t\t\t\t\t$active = self.getOption(self.items[0]);\n\t\t\t\t\t}\n\t\t\t\t\tif (!$active || !$active.length) {\n\t\t\t\t\t\tif ($create && !self.settings.addPrecedence) {\n\t\t\t\t\t\t\t$active = self.getAdjacentOption($create, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$active = $dropdown_content.find('[data-selectable]:first');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$active = $create;\n\t\t\t\t}\n\t\t\t\tself.setActiveOption($active);\n\t\t\t\tif (triggerDropdown && !self.isOpen) { self.open(); }\n\t\t\t} else {\n\t\t\t\tself.setActiveOption(null);\n\t\t\t\tif (triggerDropdown && self.isOpen) { self.close(); }\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Adds an available option. If it already exists,\n\t\t * nothing will happen. Note: this does not refresh\n\t\t * the options list dropdown (use `refreshOptions`\n\t\t * for that).\n\t\t *\n\t\t * Usage:\n\t\t *\n\t\t *   this.addOption(data)\n\t\t *\n\t\t * @param {object|array} data\n\t\t */\n\t\taddOption: function(data) {\n\t\t\tvar i, n, value, self = this;\n\t\n\t\t\tif ($.isArray(data)) {\n\t\t\t\tfor (i = 0, n = data.length; i < n; i++) {\n\t\t\t\t\tself.addOption(data[i]);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tif (value = self.registerOption(data)) {\n\t\t\t\tself.userOptions[value] = true;\n\t\t\t\tself.lastQuery = null;\n\t\t\t\tself.trigger('option_add', value, data);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Registers an option to the pool of options.\n\t\t *\n\t\t * @param {object} data\n\t\t * @return {boolean|string}\n\t\t */\n\t\tregisterOption: function(data) {\n\t\t\tvar key = hash_key(data[this.settings.valueField]);\n\t\t\tif (typeof key === 'undefined' || key === null || this.options.hasOwnProperty(key)) return false;\n\t\t\tdata.$order = data.$order || ++this.order;\n\t\t\tthis.options[key] = data;\n\t\t\treturn key;\n\t\t},\n\t\n\t\t/**\n\t\t * Registers an option group to the pool of option groups.\n\t\t *\n\t\t * @param {object} data\n\t\t * @return {boolean|string}\n\t\t */\n\t\tregisterOptionGroup: function(data) {\n\t\t\tvar key = hash_key(data[this.settings.optgroupValueField]);\n\t\t\tif (!key) return false;\n\t\n\t\t\tdata.$order = data.$order || ++this.order;\n\t\t\tthis.optgroups[key] = data;\n\t\t\treturn key;\n\t\t},\n\t\n\t\t/**\n\t\t * Registers a new optgroup for options\n\t\t * to be bucketed into.\n\t\t *\n\t\t * @param {string} id\n\t\t * @param {object} data\n\t\t */\n\t\taddOptionGroup: function(id, data) {\n\t\t\tdata[this.settings.optgroupValueField] = id;\n\t\t\tif (id = this.registerOptionGroup(data)) {\n\t\t\t\tthis.trigger('optgroup_add', id, data);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Removes an existing option group.\n\t\t *\n\t\t * @param {string} id\n\t\t */\n\t\tremoveOptionGroup: function(id) {\n\t\t\tif (this.optgroups.hasOwnProperty(id)) {\n\t\t\t\tdelete this.optgroups[id];\n\t\t\t\tthis.renderCache = {};\n\t\t\t\tthis.trigger('optgroup_remove', id);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Clears all existing option groups.\n\t\t */\n\t\tclearOptionGroups: function() {\n\t\t\tthis.optgroups = {};\n\t\t\tthis.renderCache = {};\n\t\t\tthis.trigger('optgroup_clear');\n\t\t},\n\t\n\t\t/**\n\t\t * Updates an option available for selection. If\n\t\t * it is visible in the selected items or options\n\t\t * dropdown, it will be re-rendered automatically.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {object} data\n\t\t */\n\t\tupdateOption: function(value, data) {\n\t\t\tvar self = this;\n\t\t\tvar $item, $item_new;\n\t\t\tvar value_new, index_item, cache_items, cache_options, order_old;\n\t\n\t\t\tvalue     = hash_key(value);\n\t\t\tvalue_new = hash_key(data[self.settings.valueField]);\n\t\n\t\t\t// sanity checks\n\t\t\tif (value === null) return;\n\t\t\tif (!self.options.hasOwnProperty(value)) return;\n\t\t\tif (typeof value_new !== 'string') throw new Error('Value must be set in option data');\n\t\n\t\t\torder_old = self.options[value].$order;\n\t\n\t\t\t// update references\n\t\t\tif (value_new !== value) {\n\t\t\t\tdelete self.options[value];\n\t\t\t\tindex_item = self.items.indexOf(value);\n\t\t\t\tif (index_item !== -1) {\n\t\t\t\t\tself.items.splice(index_item, 1, value_new);\n\t\t\t\t}\n\t\t\t}\n\t\t\tdata.$order = data.$order || order_old;\n\t\t\tself.options[value_new] = data;\n\t\n\t\t\t// invalidate render cache\n\t\t\tcache_items = self.renderCache['item'];\n\t\t\tcache_options = self.renderCache['option'];\n\t\n\t\t\tif (cache_items) {\n\t\t\t\tdelete cache_items[value];\n\t\t\t\tdelete cache_items[value_new];\n\t\t\t}\n\t\t\tif (cache_options) {\n\t\t\t\tdelete cache_options[value];\n\t\t\t\tdelete cache_options[value_new];\n\t\t\t}\n\t\n\t\t\t// update the item if it's selected\n\t\t\tif (self.items.indexOf(value_new) !== -1) {\n\t\t\t\t$item = self.getItem(value);\n\t\t\t\t$item_new = $(self.render('item', data));\n\t\t\t\tif ($item.hasClass('active')) $item_new.addClass('active');\n\t\t\t\t$item.replaceWith($item_new);\n\t\t\t}\n\t\n\t\t\t// invalidate last query because we might have updated the sortField\n\t\t\tself.lastQuery = null;\n\t\n\t\t\t// update dropdown contents\n\t\t\tif (self.isOpen) {\n\t\t\t\tself.refreshOptions(false);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Removes a single option.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} silent\n\t\t */\n\t\tremoveOption: function(value, silent) {\n\t\t\tvar self = this;\n\t\t\tvalue = hash_key(value);\n\t\n\t\t\tvar cache_items = self.renderCache['item'];\n\t\t\tvar cache_options = self.renderCache['option'];\n\t\t\tif (cache_items) delete cache_items[value];\n\t\t\tif (cache_options) delete cache_options[value];\n\t\n\t\t\tdelete self.userOptions[value];\n\t\t\tdelete self.options[value];\n\t\t\tself.lastQuery = null;\n\t\t\tself.trigger('option_remove', value);\n\t\t\tself.removeItem(value, silent);\n\t\t},\n\t\n\t\t/**\n\t\t * Clears all options.\n\t\t */\n\t\tclearOptions: function() {\n\t\t\tvar self = this;\n\t\n\t\t\tself.loadedSearches = {};\n\t\t\tself.userOptions = {};\n\t\t\tself.renderCache = {};\n\t\t\tvar options = self.options;\n\t\t\t$.each(self.options, function(key, value) {\n\t\t\t\tif(self.items.indexOf(key) == -1) {\n\t\t\t\t\tdelete options[key];\n\t\t\t\t}\n\t\t\t});\n\t\t\tself.options = self.sifter.items = options;\n\t\t\tself.lastQuery = null;\n\t\t\tself.trigger('option_clear');\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the jQuery element of the option\n\t\t * matching the given value.\n\t\t *\n\t\t * @param {string} value\n\t\t * @returns {object}\n\t\t */\n\t\tgetOption: function(value) {\n\t\t\treturn this.getElementWithValue(value, this.$dropdown_content.find('[data-selectable]'));\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the jQuery element of the next or\n\t\t * previous selectable option.\n\t\t *\n\t\t * @param {object} $option\n\t\t * @param {int} direction  can be 1 for next or -1 for previous\n\t\t * @return {object}\n\t\t */\n\t\tgetAdjacentOption: function($option, direction) {\n\t\t\tvar $options = this.$dropdown.find('[data-selectable]');\n\t\t\tvar index    = $options.index($option) + direction;\n\t\n\t\t\treturn index >= 0 && index < $options.length ? $options.eq(index) : $();\n\t\t},\n\t\n\t\t/**\n\t\t * Finds the first element with a \"data-value\" attribute\n\t\t * that matches the given value.\n\t\t *\n\t\t * @param {mixed} value\n\t\t * @param {object} $els\n\t\t * @return {object}\n\t\t */\n\t\tgetElementWithValue: function(value, $els) {\n\t\t\tvalue = hash_key(value);\n\t\n\t\t\tif (typeof value !== 'undefined' && value !== null) {\n\t\t\t\tfor (var i = 0, n = $els.length; i < n; i++) {\n\t\t\t\t\tif ($els[i].getAttribute('data-value') === value) {\n\t\t\t\t\t\treturn $($els[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn $();\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the jQuery element of the item\n\t\t * matching the given value.\n\t\t *\n\t\t * @param {string} value\n\t\t * @returns {object}\n\t\t */\n\t\tgetItem: function(value) {\n\t\t\treturn this.getElementWithValue(value, this.$control.children());\n\t\t},\n\t\n\t\t/**\n\t\t * \"Selects\" multiple items at once. Adds them to the list\n\t\t * at the current caret position.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} silent\n\t\t */\n\t\taddItems: function(values, silent) {\n\t\t\tthis.buffer = document.createDocumentFragment();\n\t\n\t\t\tvar childNodes = this.$control[0].childNodes;\n\t\t\tfor (var i = 0; i < childNodes.length; i++) {\n\t\t\t\tthis.buffer.appendChild(childNodes[i]);\n\t\t\t}\n\t\n\t\t\tvar items = $.isArray(values) ? values : [values];\n\t\t\tfor (var i = 0, n = items.length; i < n; i++) {\n\t\t\t\tthis.isPending = (i < n - 1);\n\t\t\t\tthis.addItem(items[i], silent);\n\t\t\t}\n\t\n\t\t\tvar control = this.$control[0];\n\t\t\tcontrol.insertBefore(this.buffer, control.firstChild);\n\t\n\t\t\tthis.buffer = null;\n\t\t},\n\t\n\t\t/**\n\t\t * \"Selects\" an item. Adds it to the list\n\t\t * at the current caret position.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} silent\n\t\t */\n\t\taddItem: function(value, silent) {\n\t\t\tvar events = silent ? [] : ['change'];\n\t\n\t\t\tdebounce_events(this, events, function() {\n\t\t\t\tvar $item, $option, $options;\n\t\t\t\tvar self = this;\n\t\t\t\tvar inputMode = self.settings.mode;\n\t\t\t\tvar i, active, value_next, wasFull;\n\t\t\t\tvalue = hash_key(value);\n\t\n\t\t\t\tif (self.items.indexOf(value) !== -1) {\n\t\t\t\t\tif (inputMode === 'single') self.close();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tif (!self.options.hasOwnProperty(value)) return;\n\t\t\t\tif (inputMode === 'single') self.clear(silent);\n\t\t\t\tif (inputMode === 'multi' && self.isFull()) return;\n\t\n\t\t\t\t$item = $(self.render('item', self.options[value]));\n\t\t\t\twasFull = self.isFull();\n\t\t\t\tself.items.splice(self.caretPos, 0, value);\n\t\t\t\tself.insertAtCaret($item);\n\t\t\t\tif (!self.isPending || (!wasFull && self.isFull())) {\n\t\t\t\t\tself.refreshState();\n\t\t\t\t}\n\t\n\t\t\t\tif (self.isSetup) {\n\t\t\t\t\t$options = self.$dropdown_content.find('[data-selectable]');\n\t\n\t\t\t\t\t// update menu / remove the option (if this is not one item being added as part of series)\n\t\t\t\t\tif (!self.isPending) {\n\t\t\t\t\t\t$option = self.getOption(value);\n\t\t\t\t\t\tvalue_next = self.getAdjacentOption($option, 1).attr('data-value');\n\t\t\t\t\t\tself.refreshOptions(self.isFocused && inputMode !== 'single');\n\t\t\t\t\t\tif (value_next) {\n\t\t\t\t\t\t\tself.setActiveOption(self.getOption(value_next));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// hide the menu if the maximum number of items have been selected or no options are left\n\t\t\t\t\tif (!$options.length || self.isFull()) {\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t} else if (!self.isPending) {\n\t\t\t\t\t\tself.positionDropdown();\n\t\t\t\t\t}\n\t\n\t\t\t\t\tself.updatePlaceholder();\n\t\t\t\t\tself.trigger('item_add', value, $item);\n\t\n\t\t\t\t\tif (!self.isPending) {\n\t\t\t\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Removes the selected item matching\n\t\t * the provided value.\n\t\t *\n\t\t * @param {string} value\n\t\t */\n\t\tremoveItem: function(value, silent) {\n\t\t\tvar self = this;\n\t\t\tvar $item, i, idx;\n\t\n\t\t\t$item = (value instanceof $) ? value : self.getItem(value);\n\t\t\tvalue = hash_key($item.attr('data-value'));\n\t\t\ti = self.items.indexOf(value);\n\t\n\t\t\tif (i !== -1) {\n\t\t\t\t$item.remove();\n\t\t\t\tif ($item.hasClass('active')) {\n\t\t\t\t\tidx = self.$activeItems.indexOf($item[0]);\n\t\t\t\t\tself.$activeItems.splice(idx, 1);\n\t\t\t\t}\n\t\n\t\t\t\tself.items.splice(i, 1);\n\t\t\t\tself.lastQuery = null;\n\t\t\t\tif (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {\n\t\t\t\t\tself.removeOption(value, silent);\n\t\t\t\t}\n\t\n\t\t\t\tif (i < self.caretPos) {\n\t\t\t\t\tself.setCaret(self.caretPos - 1);\n\t\t\t\t}\n\t\n\t\t\t\tself.refreshState();\n\t\t\t\tself.updatePlaceholder();\n\t\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\t\tself.positionDropdown();\n\t\t\t\tself.trigger('item_remove', value, $item);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Invokes the `create` method provided in the\n\t\t * selectize options that should provide the data\n\t\t * for the new item, given the user input.\n\t\t *\n\t\t * Once this completes, it will be added\n\t\t * to the item list.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} [triggerDropdown]\n\t\t * @param {function} [callback]\n\t\t * @return {boolean}\n\t\t */\n\t\tcreateItem: function(input, triggerDropdown) {\n\t\t\tvar self  = this;\n\t\t\tvar caret = self.caretPos;\n\t\t\tinput = input || $.trim(self.$control_input.val() || '');\n\t\n\t\t\tvar callback = arguments[arguments.length - 1];\n\t\t\tif (typeof callback !== 'function') callback = function() {};\n\t\n\t\t\tif (typeof triggerDropdown !== 'boolean') {\n\t\t\t\ttriggerDropdown = true;\n\t\t\t}\n\t\n\t\t\tif (!self.canCreate(input)) {\n\t\t\t\tcallback();\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\tself.lock();\n\t\n\t\t\tvar setup = (typeof self.settings.create === 'function') ? this.settings.create : function(input) {\n\t\t\t\tvar data = {};\n\t\t\t\tdata[self.settings.labelField] = input;\n\t\t\t\tdata[self.settings.valueField] = input;\n\t\t\t\treturn data;\n\t\t\t};\n\t\n\t\t\tvar create = once(function(data) {\n\t\t\t\tself.unlock();\n\t\n\t\t\t\tif (!data || typeof data !== 'object') return callback();\n\t\t\t\tvar value = hash_key(data[self.settings.valueField]);\n\t\t\t\tif (typeof value !== 'string') return callback();\n\t\n\t\t\t\tself.setTextboxValue('');\n\t\t\t\tself.addOption(data);\n\t\t\t\tself.setCaret(caret);\n\t\t\t\tself.addItem(value);\n\t\t\t\tself.refreshOptions(triggerDropdown && self.settings.mode !== 'single');\n\t\t\t\tcallback(data);\n\t\t\t});\n\t\n\t\t\tvar output = setup.apply(this, [input, create]);\n\t\t\tif (typeof output !== 'undefined') {\n\t\t\t\tcreate(output);\n\t\t\t}\n\t\n\t\t\treturn true;\n\t\t},\n\t\n\t\t/**\n\t\t * Re-renders the selected item lists.\n\t\t */\n\t\trefreshItems: function() {\n\t\t\tthis.lastQuery = null;\n\t\n\t\t\tif (this.isSetup) {\n\t\t\t\tthis.addItem(this.items);\n\t\t\t}\n\t\n\t\t\tthis.refreshState();\n\t\t\tthis.updateOriginalInput();\n\t\t},\n\t\n\t\t/**\n\t\t * Updates all state-dependent attributes\n\t\t * and CSS classes.\n\t\t */\n\t\trefreshState: function() {\n\t\t\tthis.refreshValidityState();\n\t\t\tthis.refreshClasses();\n\t\t},\n\t\n\t\t/**\n\t\t * Update the `required` attribute of both input and control input.\n\t\t *\n\t\t * The `required` property needs to be activated on the control input\n\t\t * for the error to be displayed at the right place. `required` also\n\t\t * needs to be temporarily deactivated on the input since the input is\n\t\t * hidden and can't show errors.\n\t\t */\n\t\trefreshValidityState: function() {\n\t\t\tif (!this.isRequired) return false;\n\t\n\t\t\tvar invalid = !this.items.length;\n\t\n\t\t\tthis.isInvalid = invalid;\n\t\t\tthis.$control_input.prop('required', invalid);\n\t\t\tthis.$input.prop('required', !invalid);\n\t\t},\n\t\n\t\t/**\n\t\t * Updates all state-dependent CSS classes.\n\t\t */\n\t\trefreshClasses: function() {\n\t\t\tvar self     = this;\n\t\t\tvar isFull   = self.isFull();\n\t\t\tvar isLocked = self.isLocked;\n\t\n\t\t\tself.$wrapper\n\t\t\t\t.toggleClass('rtl', self.rtl);\n\t\n\t\t\tself.$control\n\t\t\t\t.toggleClass('focus', self.isFocused)\n\t\t\t\t.toggleClass('disabled', self.isDisabled)\n\t\t\t\t.toggleClass('required', self.isRequired)\n\t\t\t\t.toggleClass('invalid', self.isInvalid)\n\t\t\t\t.toggleClass('locked', isLocked)\n\t\t\t\t.toggleClass('full', isFull).toggleClass('not-full', !isFull)\n\t\t\t\t.toggleClass('input-active', self.isFocused && !self.isInputHidden)\n\t\t\t\t.toggleClass('dropdown-active', self.isOpen)\n\t\t\t\t.toggleClass('has-options', !$.isEmptyObject(self.options))\n\t\t\t\t.toggleClass('has-items', self.items.length > 0);\n\t\n\t\t\tself.$control_input.data('grow', !isFull && !isLocked);\n\t\t},\n\t\n\t\t/**\n\t\t * Determines whether or not more items can be added\n\t\t * to the control without exceeding the user-defined maximum.\n\t\t *\n\t\t * @returns {boolean}\n\t\t */\n\t\tisFull: function() {\n\t\t\treturn this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;\n\t\t},\n\t\n\t\t/**\n\t\t * Refreshes the original <select> or <input>\n\t\t * element to reflect the current state.\n\t\t */\n\t\tupdateOriginalInput: function(opts) {\n\t\t\tvar i, n, options, label, self = this;\n\t\t\topts = opts || {};\n\t\n\t\t\tif (self.tagType === TAG_SELECT) {\n\t\t\t\toptions = [];\n\t\t\t\tfor (i = 0, n = self.items.length; i < n; i++) {\n\t\t\t\t\tlabel = self.options[self.items[i]][self.settings.labelField] || '';\n\t\t\t\t\toptions.push('<option value=\"' + escape_html(self.items[i]) + '\" selected=\"selected\">' + escape_html(label) + '</option>');\n\t\t\t\t}\n\t\t\t\tif (!options.length && !this.$input.attr('multiple')) {\n\t\t\t\t\toptions.push('<option value=\"\" selected=\"selected\"></option>');\n\t\t\t\t}\n\t\t\t\tself.$input.html(options.join(''));\n\t\t\t} else {\n\t\t\t\tself.$input.val(self.getValue());\n\t\t\t\tself.$input.attr('value',self.$input.val());\n\t\t\t}\n\t\n\t\t\tif (self.isSetup) {\n\t\t\t\tif (!opts.silent) {\n\t\t\t\t\tself.trigger('change', self.$input.val());\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Shows/hide the input placeholder depending\n\t\t * on if there items in the list already.\n\t\t */\n\t\tupdatePlaceholder: function() {\n\t\t\tif (!this.settings.placeholder) return;\n\t\t\tvar $input = this.$control_input;\n\t\n\t\t\tif (this.items.length) {\n\t\t\t\t$input.removeAttr('placeholder');\n\t\t\t} else {\n\t\t\t\t$input.attr('placeholder', this.settings.placeholder);\n\t\t\t}\n\t\t\t$input.triggerHandler('update', {force: true});\n\t\t},\n\t\n\t\t/**\n\t\t * Shows the autocomplete dropdown containing\n\t\t * the available options.\n\t\t */\n\t\topen: function() {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked || self.isOpen || (self.settings.mode === 'multi' && self.isFull())) return;\n\t\t\tself.focus();\n\t\t\tself.isOpen = true;\n\t\t\tself.refreshState();\n\t\t\tself.$dropdown.css({visibility: 'hidden', display: 'block'});\n\t\t\tself.positionDropdown();\n\t\t\tself.$dropdown.css({visibility: 'visible'});\n\t\t\tself.trigger('dropdown_open', self.$dropdown);\n\t\t},\n\t\n\t\t/**\n\t\t * Closes the autocomplete dropdown menu.\n\t\t */\n\t\tclose: function() {\n\t\t\tvar self = this;\n\t\t\tvar trigger = self.isOpen;\n\t\n\t\t\tif (self.settings.mode === 'single' && self.items.length) {\n\t\t\t\tself.hideInput();\n\t\n\t\t\t\t// Do not trigger blur while inside a blur event,\n\t\t\t\t// this fixes some weird tabbing behavior in FF and IE.\n\t\t\t\t// See #1164\n\t\t\t\tif (!self.isBlurring) {\n\t\t\t\t\tself.$control_input.blur(); // close keyboard on iOS\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tself.isOpen = false;\n\t\t\tself.$dropdown.hide();\n\t\t\tself.setActiveOption(null);\n\t\t\tself.refreshState();\n\t\n\t\t\tif (trigger) self.trigger('dropdown_close', self.$dropdown);\n\t\t},\n\t\n\t\t/**\n\t\t * Calculates and applies the appropriate\n\t\t * position of the dropdown.\n\t\t */\n\t\tpositionDropdown: function() {\n\t\t\tvar $control = this.$control;\n\t\t\tvar offset = this.settings.dropdownParent === 'body' ? $control.offset() : $control.position();\n\t\t\toffset.top += $control.outerHeight(true);\n\t\n\t\t\tthis.$dropdown.css({\n\t\t\t\twidth : $control[0].getBoundingClientRect().width,\n\t\t\t\ttop   : offset.top,\n\t\t\t\tleft  : offset.left\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Resets / clears all selected items\n\t\t * from the control.\n\t\t *\n\t\t * @param {boolean} silent\n\t\t */\n\t\tclear: function(silent) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (!self.items.length) return;\n\t\t\tself.$control.children(':not(input)').remove();\n\t\t\tself.items = [];\n\t\t\tself.lastQuery = null;\n\t\t\tself.setCaret(0);\n\t\t\tself.setActiveItem(null);\n\t\t\tself.updatePlaceholder();\n\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\tself.refreshState();\n\t\t\tself.showInput();\n\t\t\tself.trigger('clear');\n\t\t},\n\t\n\t\t/**\n\t\t * A helper method for inserting an element\n\t\t * at the current caret position.\n\t\t *\n\t\t * @param {object} $el\n\t\t */\n\t\tinsertAtCaret: function($el) {\n\t\t\tvar caret = Math.min(this.caretPos, this.items.length);\n\t\t\tvar el = $el[0];\n\t\t\tvar target = this.buffer || this.$control[0];\n\t\n\t\t\tif (caret === 0) {\n\t\t\t\ttarget.insertBefore(el, target.firstChild);\n\t\t\t} else {\n\t\t\t\ttarget.insertBefore(el, target.childNodes[caret]);\n\t\t\t}\n\t\n\t\t\tthis.setCaret(caret + 1);\n\t\t},\n\t\n\t\t/**\n\t\t * Removes the current selected item(s).\n\t\t *\n\t\t * @param {object} e (optional)\n\t\t * @returns {boolean}\n\t\t */\n\t\tdeleteSelection: function(e) {\n\t\t\tvar i, n, direction, selection, values, caret, option_select, $option_select, $tail;\n\t\t\tvar self = this;\n\t\n\t\t\tdirection = (e && e.keyCode === KEY_BACKSPACE) ? -1 : 1;\n\t\t\tselection = getSelection(self.$control_input[0]);\n\t\n\t\t\tif (self.$activeOption && !self.settings.hideSelected) {\n\t\t\t\toption_select = self.getAdjacentOption(self.$activeOption, -1).attr('data-value');\n\t\t\t}\n\t\n\t\t\t// determine items that will be removed\n\t\t\tvalues = [];\n\t\n\t\t\tif (self.$activeItems.length) {\n\t\t\t\t$tail = self.$control.children('.active:' + (direction > 0 ? 'last' : 'first'));\n\t\t\t\tcaret = self.$control.children(':not(input)').index($tail);\n\t\t\t\tif (direction > 0) { caret++; }\n\t\n\t\t\t\tfor (i = 0, n = self.$activeItems.length; i < n; i++) {\n\t\t\t\t\tvalues.push($(self.$activeItems[i]).attr('data-value'));\n\t\t\t\t}\n\t\t\t\tif (e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t} else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {\n\t\t\t\tif (direction < 0 && selection.start === 0 && selection.length === 0) {\n\t\t\t\t\tvalues.push(self.items[self.caretPos - 1]);\n\t\t\t\t} else if (direction > 0 && selection.start === self.$control_input.val().length) {\n\t\t\t\t\tvalues.push(self.items[self.caretPos]);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// allow the callback to abort\n\t\t\tif (!values.length || (typeof self.settings.onDelete === 'function' && self.settings.onDelete.apply(self, [values]) === false)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\t// perform removal\n\t\t\tif (typeof caret !== 'undefined') {\n\t\t\t\tself.setCaret(caret);\n\t\t\t}\n\t\t\twhile (values.length) {\n\t\t\t\tself.removeItem(values.pop());\n\t\t\t}\n\t\n\t\t\tself.showInput();\n\t\t\tself.positionDropdown();\n\t\t\tself.refreshOptions(true);\n\t\n\t\t\t// select previous option\n\t\t\tif (option_select) {\n\t\t\t\t$option_select = self.getOption(option_select);\n\t\t\t\tif ($option_select.length) {\n\t\t\t\t\tself.setActiveOption($option_select);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn true;\n\t\t},\n\t\n\t\t/**\n\t\t * Selects the previous / next item (depending\n\t\t * on the `direction` argument).\n\t\t *\n\t\t * > 0 - right\n\t\t * < 0 - left\n\t\t *\n\t\t * @param {int} direction\n\t\t * @param {object} e (optional)\n\t\t */\n\t\tadvanceSelection: function(direction, e) {\n\t\t\tvar tail, selection, idx, valueLength, cursorAtEdge, $tail;\n\t\t\tvar self = this;\n\t\n\t\t\tif (direction === 0) return;\n\t\t\tif (self.rtl) direction *= -1;\n\t\n\t\t\ttail = direction > 0 ? 'last' : 'first';\n\t\t\tselection = getSelection(self.$control_input[0]);\n\t\n\t\t\tif (self.isFocused && !self.isInputHidden) {\n\t\t\t\tvalueLength = self.$control_input.val().length;\n\t\t\t\tcursorAtEdge = direction < 0\n\t\t\t\t\t? selection.start === 0 && selection.length === 0\n\t\t\t\t\t: selection.start === valueLength;\n\t\n\t\t\t\tif (cursorAtEdge && !valueLength) {\n\t\t\t\t\tself.advanceCaret(direction, e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$tail = self.$control.children('.active:' + tail);\n\t\t\t\tif ($tail.length) {\n\t\t\t\t\tidx = self.$control.children(':not(input)').index($tail);\n\t\t\t\t\tself.setActiveItem(null);\n\t\t\t\t\tself.setCaret(direction > 0 ? idx + 1 : idx);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Moves the caret left / right.\n\t\t *\n\t\t * @param {int} direction\n\t\t * @param {object} e (optional)\n\t\t */\n\t\tadvanceCaret: function(direction, e) {\n\t\t\tvar self = this, fn, $adj;\n\t\n\t\t\tif (direction === 0) return;\n\t\n\t\t\tfn = direction > 0 ? 'next' : 'prev';\n\t\t\tif (self.isShiftDown) {\n\t\t\t\t$adj = self.$control_input[fn]();\n\t\t\t\tif ($adj.length) {\n\t\t\t\t\tself.hideInput();\n\t\t\t\t\tself.setActiveItem($adj);\n\t\t\t\t\te && e.preventDefault();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.setCaret(self.caretPos + direction);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Moves the caret to the specified index.\n\t\t *\n\t\t * @param {int} i\n\t\t */\n\t\tsetCaret: function(i) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.settings.mode === 'single') {\n\t\t\t\ti = self.items.length;\n\t\t\t} else {\n\t\t\t\ti = Math.max(0, Math.min(self.items.length, i));\n\t\t\t}\n\t\n\t\t\tif(!self.isPending) {\n\t\t\t\t// the input must be moved by leaving it in place and moving the\n\t\t\t\t// siblings, due to the fact that focus cannot be restored once lost\n\t\t\t\t// on mobile webkit devices\n\t\t\t\tvar j, n, fn, $children, $child;\n\t\t\t\t$children = self.$control.children(':not(input)');\n\t\t\t\tfor (j = 0, n = $children.length; j < n; j++) {\n\t\t\t\t\t$child = $($children[j]).detach();\n\t\t\t\t\tif (j <  i) {\n\t\t\t\t\t\tself.$control_input.before($child);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.$control.append($child);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tself.caretPos = i;\n\t\t},\n\t\n\t\t/**\n\t\t * Disables user input on the control. Used while\n\t\t * items are being asynchronously created.\n\t\t */\n\t\tlock: function() {\n\t\t\tthis.close();\n\t\t\tthis.isLocked = true;\n\t\t\tthis.refreshState();\n\t\t},\n\t\n\t\t/**\n\t\t * Re-enables user input on the control.\n\t\t */\n\t\tunlock: function() {\n\t\t\tthis.isLocked = false;\n\t\t\tthis.refreshState();\n\t\t},\n\t\n\t\t/**\n\t\t * Disables user input on the control completely.\n\t\t * While disabled, it cannot receive focus.\n\t\t */\n\t\tdisable: function() {\n\t\t\tvar self = this;\n\t\t\tself.$input.prop('disabled', true);\n\t\t\tself.$control_input.prop('disabled', true).prop('tabindex', -1);\n\t\t\tself.isDisabled = true;\n\t\t\tself.lock();\n\t\t},\n\t\n\t\t/**\n\t\t * Enables the control so that it can respond\n\t\t * to focus and user input.\n\t\t */\n\t\tenable: function() {\n\t\t\tvar self = this;\n\t\t\tself.$input.prop('disabled', false);\n\t\t\tself.$control_input.prop('disabled', false).prop('tabindex', self.tabIndex);\n\t\t\tself.isDisabled = false;\n\t\t\tself.unlock();\n\t\t},\n\t\n\t\t/**\n\t\t * Completely destroys the control and\n\t\t * unbinds all event listeners so that it can\n\t\t * be garbage collected.\n\t\t */\n\t\tdestroy: function() {\n\t\t\tvar self = this;\n\t\t\tvar eventNS = self.eventNS;\n\t\t\tvar revertSettings = self.revertSettings;\n\t\n\t\t\tself.trigger('destroy');\n\t\t\tself.off();\n\t\t\tself.$wrapper.remove();\n\t\t\tself.$dropdown.remove();\n\t\n\t\t\tself.$input\n\t\t\t\t.html('')\n\t\t\t\t.append(revertSettings.$children)\n\t\t\t\t.removeAttr('tabindex')\n\t\t\t\t.removeClass('selectized')\n\t\t\t\t.attr({tabindex: revertSettings.tabindex})\n\t\t\t\t.show();\n\t\n\t\t\tself.$control_input.removeData('grow');\n\t\t\tself.$input.removeData('selectize');\n\t\n\t\t\tif (--Selectize.count == 0 && Selectize.$testInput) {\n\t\t\t\tSelectize.$testInput.remove();\n\t\t\t\tSelectize.$testInput = undefined;\n\t\t\t}\n\t\n\t\t\t$(window).off(eventNS);\n\t\t\t$(document).off(eventNS);\n\t\t\t$(document.body).off(eventNS);\n\t\n\t\t\tdelete self.$input[0].selectize;\n\t\t},\n\t\n\t\t/**\n\t\t * A helper method for rendering \"item\" and\n\t\t * \"option\" templates, given the data.\n\t\t *\n\t\t * @param {string} templateName\n\t\t * @param {object} data\n\t\t * @returns {string}\n\t\t */\n\t\trender: function(templateName, data) {\n\t\t\tvar value, id, label;\n\t\t\tvar html = '';\n\t\t\tvar cache = false;\n\t\t\tvar self = this;\n\t\t\tvar regex_tag = /^[\\t \\r\\n]*<([a-z][a-z0-9\\-_]*(?:\\:[a-z][a-z0-9\\-_]*)?)/i;\n\t\n\t\t\tif (templateName === 'option' || templateName === 'item') {\n\t\t\t\tvalue = hash_key(data[self.settings.valueField]);\n\t\t\t\tcache = !!value;\n\t\t\t}\n\t\n\t\t\t// pull markup from cache if it exists\n\t\t\tif (cache) {\n\t\t\t\tif (!isset(self.renderCache[templateName])) {\n\t\t\t\t\tself.renderCache[templateName] = {};\n\t\t\t\t}\n\t\t\t\tif (self.renderCache[templateName].hasOwnProperty(value)) {\n\t\t\t\t\treturn self.renderCache[templateName][value];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// render markup\n\t\t\thtml = $(self.settings.render[templateName].apply(this, [data, escape_html]));\n\t\n\t\t\t// add mandatory attributes\n\t\t\tif (templateName === 'option' || templateName === 'option_create') {\n\t\t\t\tif (!data[self.settings.disabledField]) {\n\t\t\t\t\thtml.attr('data-selectable', '');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (templateName === 'optgroup') {\n\t\t\t\tid = data[self.settings.optgroupValueField] || '';\n\t\t\t\thtml.attr('data-group', id);\n\t\t\t\tif(data[self.settings.disabledField]) {\n\t\t\t\t\thtml.attr('data-disabled', '');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (templateName === 'option' || templateName === 'item') {\n\t\t\t\thtml.attr('data-value', value || '');\n\t\t\t}\n\t\n\t\t\t// update cache\n\t\t\tif (cache) {\n\t\t\t\tself.renderCache[templateName][value] = html[0];\n\t\t\t}\n\t\n\t\t\treturn html[0];\n\t\t},\n\t\n\t\t/**\n\t\t * Clears the render cache for a template. If\n\t\t * no template is given, clears all render\n\t\t * caches.\n\t\t *\n\t\t * @param {string} templateName\n\t\t */\n\t\tclearCache: function(templateName) {\n\t\t\tvar self = this;\n\t\t\tif (typeof templateName === 'undefined') {\n\t\t\t\tself.renderCache = {};\n\t\t\t} else {\n\t\t\t\tdelete self.renderCache[templateName];\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Determines whether or not to display the\n\t\t * create item prompt, given a user input.\n\t\t *\n\t\t * @param {string} input\n\t\t * @return {boolean}\n\t\t */\n\t\tcanCreate: function(input) {\n\t\t\tvar self = this;\n\t\t\tif (!self.settings.create) return false;\n\t\t\tvar filter = self.settings.createFilter;\n\t\t\treturn input.length\n\t\t\t\t&& (typeof filter !== 'function' || filter.apply(self, [input]))\n\t\t\t\t&& (typeof filter !== 'string' || new RegExp(filter).test(input))\n\t\t\t\t&& (!(filter instanceof RegExp) || filter.test(input));\n\t\t}\n\t\n\t});\n\t\n\t\n\tSelectize.count = 0;\n\tSelectize.defaults = {\n\t\toptions: [],\n\t\toptgroups: [],\n\t\n\t\tplugins: [],\n\t\tdelimiter: ',',\n\t\tsplitOn: null, // regexp or string for splitting up values from a paste command\n\t\tpersist: true,\n\t\tdiacritics: true,\n\t\tcreate: false,\n\t\tcreateOnBlur: false,\n\t\tcreateFilter: null,\n\t\thighlight: true,\n\t\topenOnFocus: true,\n\t\tmaxOptions: 1000,\n\t\tmaxItems: null,\n\t\thideSelected: null,\n\t\taddPrecedence: false,\n\t\tselectOnTab: false,\n\t\tpreload: false,\n\t\tallowEmptyOption: false,\n\t\tcloseAfterSelect: false,\n\t\n\t\tscrollDuration: 60,\n\t\tloadThrottle: 300,\n\t\tloadingClass: 'loading',\n\t\n\t\tdataAttr: 'data-data',\n\t\toptgroupField: 'optgroup',\n\t\tvalueField: 'value',\n\t\tlabelField: 'text',\n\t\tdisabledField: 'disabled',\n\t\toptgroupLabelField: 'label',\n\t\toptgroupValueField: 'value',\n\t\tlockOptgroupOrder: false,\n\t\n\t\tsortField: '$order',\n\t\tsearchField: ['text'],\n\t\tsearchConjunction: 'and',\n\t\n\t\tmode: null,\n\t\twrapperClass: 'selectize-control',\n\t\tinputClass: 'selectize-input',\n\t\tdropdownClass: 'selectize-dropdown',\n\t\tdropdownContentClass: 'selectize-dropdown-content',\n\t\n\t\tdropdownParent: null,\n\t\n\t\tcopyClassesToDropdown: true,\n\t\n\t\t/*\n\t\tload                 : null, // function(query, callback) { ... }\n\t\tscore                : null, // function(search) { ... }\n\t\tonInitialize         : null, // function() { ... }\n\t\tonChange             : null, // function(value) { ... }\n\t\tonItemAdd            : null, // function(value, $item) { ... }\n\t\tonItemRemove         : null, // function(value) { ... }\n\t\tonClear              : null, // function() { ... }\n\t\tonOptionAdd          : null, // function(value, data) { ... }\n\t\tonOptionRemove       : null, // function(value) { ... }\n\t\tonOptionClear        : null, // function() { ... }\n\t\tonOptionGroupAdd     : null, // function(id, data) { ... }\n\t\tonOptionGroupRemove  : null, // function(id) { ... }\n\t\tonOptionGroupClear   : null, // function() { ... }\n\t\tonDropdownOpen       : null, // function($dropdown) { ... }\n\t\tonDropdownClose      : null, // function($dropdown) { ... }\n\t\tonType               : null, // function(str) { ... }\n\t\tonDelete             : null, // function(values) { ... }\n\t\t*/\n\t\n\t\trender: {\n\t\t\t/*\n\t\t\titem: null,\n\t\t\toptgroup: null,\n\t\t\toptgroup_header: null,\n\t\t\toption: null,\n\t\t\toption_create: null\n\t\t\t*/\n\t\t}\n\t};\n\t\n\t\n\t$.fn.selectize = function(settings_user) {\n\t\tvar defaults             = $.fn.selectize.defaults;\n\t\tvar settings             = $.extend({}, defaults, settings_user);\n\t\tvar attr_data            = settings.dataAttr;\n\t\tvar field_label          = settings.labelField;\n\t\tvar field_value          = settings.valueField;\n\t\tvar field_disabled       = settings.disabledField;\n\t\tvar field_optgroup       = settings.optgroupField;\n\t\tvar field_optgroup_label = settings.optgroupLabelField;\n\t\tvar field_optgroup_value = settings.optgroupValueField;\n\t\n\t\t/**\n\t\t * Initializes selectize from a <input type=\"text\"> element.\n\t\t *\n\t\t * @param {object} $input\n\t\t * @param {object} settings_element\n\t\t */\n\t\tvar init_textbox = function($input, settings_element) {\n\t\t\tvar i, n, values, option;\n\t\n\t\t\tvar data_raw = $input.attr(attr_data);\n\t\n\t\t\tif (!data_raw) {\n\t\t\t\tvar value = $.trim($input.val() || '');\n\t\t\t\tif (!settings.allowEmptyOption && !value.length) return;\n\t\t\t\tvalues = value.split(settings.delimiter);\n\t\t\t\tfor (i = 0, n = values.length; i < n; i++) {\n\t\t\t\t\toption = {};\n\t\t\t\t\toption[field_label] = values[i];\n\t\t\t\t\toption[field_value] = values[i];\n\t\t\t\t\tsettings_element.options.push(option);\n\t\t\t\t}\n\t\t\t\tsettings_element.items = values;\n\t\t\t} else {\n\t\t\t\tsettings_element.options = JSON.parse(data_raw);\n\t\t\t\tfor (i = 0, n = settings_element.options.length; i < n; i++) {\n\t\t\t\t\tsettings_element.items.push(settings_element.options[i][field_value]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\t/**\n\t\t * Initializes selectize from a <select> element.\n\t\t *\n\t\t * @param {object} $input\n\t\t * @param {object} settings_element\n\t\t */\n\t\tvar init_select = function($input, settings_element) {\n\t\t\tvar i, n, tagName, $children, order = 0;\n\t\t\tvar options = settings_element.options;\n\t\t\tvar optionsMap = {};\n\t\n\t\t\tvar readData = function($el) {\n\t\t\t\tvar data = attr_data && $el.attr(attr_data);\n\t\t\t\tif (typeof data === 'string' && data.length) {\n\t\t\t\t\treturn JSON.parse(data);\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t};\n\t\n\t\t\tvar addOption = function($option, group) {\n\t\t\t\t$option = $($option);\n\t\n\t\t\t\tvar value = hash_key($option.val());\n\t\t\t\tif (!value && !settings.allowEmptyOption) return;\n\t\n\t\t\t\t// if the option already exists, it's probably been\n\t\t\t\t// duplicated in another optgroup. in this case, push\n\t\t\t\t// the current group to the \"optgroup\" property on the\n\t\t\t\t// existing option so that it's rendered in both places.\n\t\t\t\tif (optionsMap.hasOwnProperty(value)) {\n\t\t\t\t\tif (group) {\n\t\t\t\t\t\tvar arr = optionsMap[value][field_optgroup];\n\t\t\t\t\t\tif (!arr) {\n\t\t\t\t\t\t\toptionsMap[value][field_optgroup] = group;\n\t\t\t\t\t\t} else if (!$.isArray(arr)) {\n\t\t\t\t\t\t\toptionsMap[value][field_optgroup] = [arr, group];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tarr.push(group);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tvar option             = readData($option) || {};\n\t\t\t\toption[field_label]    = option[field_label] || $option.text();\n\t\t\t\toption[field_value]    = option[field_value] || value;\n\t\t\t\toption[field_disabled] = option[field_disabled] || $option.prop('disabled');\n\t\t\t\toption[field_optgroup] = option[field_optgroup] || group;\n\t\n\t\t\t\toptionsMap[value] = option;\n\t\t\t\toptions.push(option);\n\t\n\t\t\t\tif ($option.is(':selected')) {\n\t\t\t\t\tsettings_element.items.push(value);\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\tvar addGroup = function($optgroup) {\n\t\t\t\tvar i, n, id, optgroup, $options;\n\t\n\t\t\t\t$optgroup = $($optgroup);\n\t\t\t\tid = $optgroup.attr('label');\n\t\n\t\t\t\tif (id) {\n\t\t\t\t\toptgroup = readData($optgroup) || {};\n\t\t\t\t\toptgroup[field_optgroup_label] = id;\n\t\t\t\t\toptgroup[field_optgroup_value] = id;\n\t\t\t\t\toptgroup[field_disabled] = $optgroup.prop('disabled');\n\t\t\t\t\tsettings_element.optgroups.push(optgroup);\n\t\t\t\t}\n\t\n\t\t\t\t$options = $('option', $optgroup);\n\t\t\t\tfor (i = 0, n = $options.length; i < n; i++) {\n\t\t\t\t\taddOption($options[i], id);\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\tsettings_element.maxItems = $input.attr('multiple') ? null : 1;\n\t\n\t\t\t$children = $input.children();\n\t\t\tfor (i = 0, n = $children.length; i < n; i++) {\n\t\t\t\ttagName = $children[i].tagName.toLowerCase();\n\t\t\t\tif (tagName === 'optgroup') {\n\t\t\t\t\taddGroup($children[i]);\n\t\t\t\t} else if (tagName === 'option') {\n\t\t\t\t\taddOption($children[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\treturn this.each(function() {\n\t\t\tif (this.selectize) return;\n\t\n\t\t\tvar instance;\n\t\t\tvar $input = $(this);\n\t\t\tvar tag_name = this.tagName.toLowerCase();\n\t\t\tvar placeholder = $input.attr('placeholder') || $input.attr('data-placeholder');\n\t\t\tif (!placeholder && !settings.allowEmptyOption) {\n\t\t\t\tplaceholder = $input.children('option[value=\"\"]').text();\n\t\t\t}\n\t\n\t\t\tvar settings_element = {\n\t\t\t\t'placeholder' : placeholder,\n\t\t\t\t'options'     : [],\n\t\t\t\t'optgroups'   : [],\n\t\t\t\t'items'       : []\n\t\t\t};\n\t\n\t\t\tif (tag_name === 'select') {\n\t\t\t\tinit_select($input, settings_element);\n\t\t\t} else {\n\t\t\t\tinit_textbox($input, settings_element);\n\t\t\t}\n\t\n\t\t\tinstance = new Selectize($input, $.extend(true, {}, defaults, settings_element, settings_user));\n\t\t});\n\t};\n\t\n\t$.fn.selectize.defaults = Selectize.defaults;\n\t$.fn.selectize.support = {\n\t\tvalidity: SUPPORTS_VALIDITY_API\n\t};\n\t\n\t\n\tSelectize.define('drag_drop', function(options) {\n\t\tif (!$.fn.sortable) throw new Error('The \"drag_drop\" plugin requires jQuery UI \"sortable\".');\n\t\tif (this.settings.mode !== 'multi') return;\n\t\tvar self = this;\n\t\n\t\tself.lock = (function() {\n\t\t\tvar original = self.lock;\n\t\t\treturn function() {\n\t\t\t\tvar sortable = self.$control.data('sortable');\n\t\t\t\tif (sortable) sortable.disable();\n\t\t\t\treturn original.apply(self, arguments);\n\t\t\t};\n\t\t})();\n\t\n\t\tself.unlock = (function() {\n\t\t\tvar original = self.unlock;\n\t\t\treturn function() {\n\t\t\t\tvar sortable = self.$control.data('sortable');\n\t\t\t\tif (sortable) sortable.enable();\n\t\t\t\treturn original.apply(self, arguments);\n\t\t\t};\n\t\t})();\n\t\n\t\tself.setup = (function() {\n\t\t\tvar original = self.setup;\n\t\t\treturn function() {\n\t\t\t\toriginal.apply(this, arguments);\n\t\n\t\t\t\tvar $control = self.$control.sortable({\n\t\t\t\t\titems: '[data-value]',\n\t\t\t\t\tforcePlaceholderSize: true,\n\t\t\t\t\tdisabled: self.isLocked,\n\t\t\t\t\tstart: function(e, ui) {\n\t\t\t\t\t\tui.placeholder.css('width', ui.helper.css('width'));\n\t\t\t\t\t\t$control.css({overflow: 'visible'});\n\t\t\t\t\t},\n\t\t\t\t\tstop: function() {\n\t\t\t\t\t\t$control.css({overflow: 'hidden'});\n\t\t\t\t\t\tvar active = self.$activeItems ? self.$activeItems.slice() : null;\n\t\t\t\t\t\tvar values = [];\n\t\t\t\t\t\t$control.children('[data-value]').each(function() {\n\t\t\t\t\t\t\tvalues.push($(this).attr('data-value'));\n\t\t\t\t\t\t});\n\t\t\t\t\t\tself.setValue(values);\n\t\t\t\t\t\tself.setActiveItem(active);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t})();\n\t\n\t});\n\t\n\tSelectize.define('dropdown_header', function(options) {\n\t\tvar self = this;\n\t\n\t\toptions = $.extend({\n\t\t\ttitle         : 'Untitled',\n\t\t\theaderClass   : 'selectize-dropdown-header',\n\t\t\ttitleRowClass : 'selectize-dropdown-header-title',\n\t\t\tlabelClass    : 'selectize-dropdown-header-label',\n\t\t\tcloseClass    : 'selectize-dropdown-header-close',\n\t\n\t\t\thtml: function(data) {\n\t\t\t\treturn (\n\t\t\t\t\t'<div class=\"' + data.headerClass + '\">' +\n\t\t\t\t\t\t'<div class=\"' + data.titleRowClass + '\">' +\n\t\t\t\t\t\t\t'<span class=\"' + data.labelClass + '\">' + data.title + '</span>' +\n\t\t\t\t\t\t\t'<a href=\"javascript:void(0)\" class=\"' + data.closeClass + '\">&times;</a>' +\n\t\t\t\t\t\t'</div>' +\n\t\t\t\t\t'</div>'\n\t\t\t\t);\n\t\t\t}\n\t\t}, options);\n\t\n\t\tself.setup = (function() {\n\t\t\tvar original = self.setup;\n\t\t\treturn function() {\n\t\t\t\toriginal.apply(self, arguments);\n\t\t\t\tself.$dropdown_header = $(options.html(options));\n\t\t\t\tself.$dropdown.prepend(self.$dropdown_header);\n\t\t\t};\n\t\t})();\n\t\n\t});\n\t\n\tSelectize.define('optgroup_columns', function(options) {\n\t\tvar self = this;\n\t\n\t\toptions = $.extend({\n\t\t\tequalizeWidth  : true,\n\t\t\tequalizeHeight : true\n\t\t}, options);\n\t\n\t\tthis.getAdjacentOption = function($option, direction) {\n\t\t\tvar $options = $option.closest('[data-group]').find('[data-selectable]');\n\t\t\tvar index    = $options.index($option) + direction;\n\t\n\t\t\treturn index >= 0 && index < $options.length ? $options.eq(index) : $();\n\t\t};\n\t\n\t\tthis.onKeyDown = (function() {\n\t\t\tvar original = self.onKeyDown;\n\t\t\treturn function(e) {\n\t\t\t\tvar index, $option, $options, $optgroup;\n\t\n\t\t\t\tif (this.isOpen && (e.keyCode === KEY_LEFT || e.keyCode === KEY_RIGHT)) {\n\t\t\t\t\tself.ignoreHover = true;\n\t\t\t\t\t$optgroup = this.$activeOption.closest('[data-group]');\n\t\t\t\t\tindex = $optgroup.find('[data-selectable]').index(this.$activeOption);\n\t\n\t\t\t\t\tif(e.keyCode === KEY_LEFT) {\n\t\t\t\t\t\t$optgroup = $optgroup.prev('[data-group]');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$optgroup = $optgroup.next('[data-group]');\n\t\t\t\t\t}\n\t\n\t\t\t\t\t$options = $optgroup.find('[data-selectable]');\n\t\t\t\t\t$option  = $options.eq(Math.min($options.length - 1, index));\n\t\t\t\t\tif ($option.length) {\n\t\t\t\t\t\tthis.setActiveOption($option);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\treturn original.apply(this, arguments);\n\t\t\t};\n\t\t})();\n\t\n\t\tvar getScrollbarWidth = function() {\n\t\t\tvar div;\n\t\t\tvar width = getScrollbarWidth.width;\n\t\t\tvar doc = document;\n\t\n\t\t\tif (typeof width === 'undefined') {\n\t\t\t\tdiv = doc.createElement('div');\n\t\t\t\tdiv.innerHTML = '<div style=\"width:50px;height:50px;position:absolute;left:-50px;top:-50px;overflow:auto;\"><div style=\"width:1px;height:100px;\"></div></div>';\n\t\t\t\tdiv = div.firstChild;\n\t\t\t\tdoc.body.appendChild(div);\n\t\t\t\twidth = getScrollbarWidth.width = div.offsetWidth - div.clientWidth;\n\t\t\t\tdoc.body.removeChild(div);\n\t\t\t}\n\t\t\treturn width;\n\t\t};\n\t\n\t\tvar equalizeSizes = function() {\n\t\t\tvar i, n, height_max, width, width_last, width_parent, $optgroups;\n\t\n\t\t\t$optgroups = $('[data-group]', self.$dropdown_content);\n\t\t\tn = $optgroups.length;\n\t\t\tif (!n || !self.$dropdown_content.width()) return;\n\t\n\t\t\tif (options.equalizeHeight) {\n\t\t\t\theight_max = 0;\n\t\t\t\tfor (i = 0; i < n; i++) {\n\t\t\t\t\theight_max = Math.max(height_max, $optgroups.eq(i).height());\n\t\t\t\t}\n\t\t\t\t$optgroups.css({height: height_max});\n\t\t\t}\n\t\n\t\t\tif (options.equalizeWidth) {\n\t\t\t\twidth_parent = self.$dropdown_content.innerWidth() - getScrollbarWidth();\n\t\t\t\twidth = Math.round(width_parent / n);\n\t\t\t\t$optgroups.css({width: width});\n\t\t\t\tif (n > 1) {\n\t\t\t\t\twidth_last = width_parent - width * (n - 1);\n\t\t\t\t\t$optgroups.eq(n - 1).css({width: width_last});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\tif (options.equalizeHeight || options.equalizeWidth) {\n\t\t\thook.after(this, 'positionDropdown', equalizeSizes);\n\t\t\thook.after(this, 'refreshOptions', equalizeSizes);\n\t\t}\n\t\n\t\n\t});\n\t\n\tSelectize.define('remove_button', function(options) {\n\t\toptions = $.extend({\n\t\t\t\tlabel     : '&times;',\n\t\t\t\ttitle     : 'Remove',\n\t\t\t\tclassName : 'remove',\n\t\t\t\tappend    : true\n\t\t\t}, options);\n\t\n\t\t\tvar singleClose = function(thisRef, options) {\n\t\n\t\t\t\toptions.className = 'remove-single';\n\t\n\t\t\t\tvar self = thisRef;\n\t\t\t\tvar html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n\t\n\t\t\t\t/**\n\t\t\t\t * Appends an element as a child (with raw HTML).\n\t\t\t\t *\n\t\t\t\t * @param {string} html_container\n\t\t\t\t * @param {string} html_element\n\t\t\t\t * @return {string}\n\t\t\t\t */\n\t\t\t\tvar append = function(html_container, html_element) {\n\t\t\t\t\treturn $('<span>').append(html_container)\n\t\t\t\t\t\t.append(html_element);\n\t\t\t\t};\n\t\n\t\t\t\tthisRef.setup = (function() {\n\t\t\t\t\tvar original = self.setup;\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\t// override the item rendering method to add the button to each\n\t\t\t\t\t\tif (options.append) {\n\t\t\t\t\t\t\tvar id = $(self.$input.context).attr('id');\n\t\t\t\t\t\t\tvar selectizer = $('#'+id);\n\t\n\t\t\t\t\t\t\tvar render_item = self.settings.render.item;\n\t\t\t\t\t\t\tself.settings.render.item = function(data) {\n\t\t\t\t\t\t\t\treturn append(render_item.apply(thisRef, arguments), html);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\toriginal.apply(thisRef, arguments);\n\t\n\t\t\t\t\t\t// add event listener\n\t\t\t\t\t\tthisRef.$control.on('click', '.' + options.className, function(e) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tif (self.isLocked) return;\n\t\n\t\t\t\t\t\t\tself.clear();\n\t\t\t\t\t\t});\n\t\n\t\t\t\t\t};\n\t\t\t\t})();\n\t\t\t};\n\t\n\t\t\tvar multiClose = function(thisRef, options) {\n\t\n\t\t\t\tvar self = thisRef;\n\t\t\t\tvar html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n\t\n\t\t\t\t/**\n\t\t\t\t * Appends an element as a child (with raw HTML).\n\t\t\t\t *\n\t\t\t\t * @param {string} html_container\n\t\t\t\t * @param {string} html_element\n\t\t\t\t * @return {string}\n\t\t\t\t */\n\t\t\t\tvar append = function(html_container, html_element) {\n\t\t\t\t\tvar pos = html_container.search(/(<\\/[^>]+>\\s*)$/);\n\t\t\t\t\treturn html_container.substring(0, pos) + html_element + html_container.substring(pos);\n\t\t\t\t};\n\t\n\t\t\t\tthisRef.setup = (function() {\n\t\t\t\t\tvar original = self.setup;\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\t// override the item rendering method to add the button to each\n\t\t\t\t\t\tif (options.append) {\n\t\t\t\t\t\t\tvar render_item = self.settings.render.item;\n\t\t\t\t\t\t\tself.settings.render.item = function(data) {\n\t\t\t\t\t\t\t\treturn append(render_item.apply(thisRef, arguments), html);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\toriginal.apply(thisRef, arguments);\n\t\n\t\t\t\t\t\t// add event listener\n\t\t\t\t\t\tthisRef.$control.on('click', '.' + options.className, function(e) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tif (self.isLocked) return;\n\t\n\t\t\t\t\t\t\tvar $item = $(e.currentTarget).parent();\n\t\t\t\t\t\t\tself.setActiveItem($item);\n\t\t\t\t\t\t\tif (self.deleteSelection()) {\n\t\t\t\t\t\t\t\tself.setCaret(self.items.length);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\n\t\t\t\t\t};\n\t\t\t\t})();\n\t\t\t};\n\t\n\t\t\tif (this.settings.mode === 'single') {\n\t\t\t\tsingleClose(this, options);\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tmultiClose(this, options);\n\t\t\t}\n\t});\n\t\n\t\n\tSelectize.define('restore_on_backspace', function(options) {\n\t\tvar self = this;\n\t\n\t\toptions.text = options.text || function(option) {\n\t\t\treturn option[this.settings.labelField];\n\t\t};\n\t\n\t\tthis.onKeyDown = (function() {\n\t\t\tvar original = self.onKeyDown;\n\t\t\treturn function(e) {\n\t\t\t\tvar index, option;\n\t\t\t\tif (e.keyCode === KEY_BACKSPACE && this.$control_input.val() === '' && !this.$activeItems.length) {\n\t\t\t\t\tindex = this.caretPos - 1;\n\t\t\t\t\tif (index >= 0 && index < this.items.length) {\n\t\t\t\t\t\toption = this.options[this.items[index]];\n\t\t\t\t\t\tif (this.deleteSelection(e)) {\n\t\t\t\t\t\t\tthis.setTextboxValue(options.text.apply(this, [option]));\n\t\t\t\t\t\t\tthis.refreshOptions(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn original.apply(this, arguments);\n\t\t\t};\n\t\t})();\n\t});\n\t\n\n\treturn Selectize;\n}));","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"scrollLock\"] = factory();\n\telse\n\t\troot[\"scrollLock\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { 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 = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./src/tools.js\nvar argumentAsArray = function argumentAsArray(argument) {\n  return Array.isArray(argument) ? argument : [argument];\n};\nvar isElement = function isElement(target) {\n  return target instanceof Node;\n};\nvar isElementList = function isElementList(nodeList) {\n  return nodeList instanceof NodeList;\n};\nvar eachNode = function eachNode(nodeList, callback) {\n  if (nodeList && callback) {\n    nodeList = isElementList(nodeList) ? nodeList : [nodeList];\n\n    for (var i = 0; i < nodeList.length; i++) {\n      if (callback(nodeList[i], i, nodeList.length) === true) {\n        break;\n      }\n    }\n  }\n};\nvar throwError = function throwError(message) {\n  return console.error(\"[scroll-lock] \".concat(message));\n};\nvar arrayAsSelector = function arrayAsSelector(array) {\n  if (Array.isArray(array)) {\n    var selector = array.join(', ');\n    return selector;\n  }\n};\nvar nodeListAsArray = function nodeListAsArray(nodeList) {\n  var nodes = [];\n  eachNode(nodeList, function (node) {\n    return nodes.push(node);\n  });\n  return nodes;\n};\nvar findParentBySelector = function findParentBySelector($el, selector) {\n  var self = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n  var $root = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : document;\n\n  if (self && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1) {\n    return $el;\n  }\n\n  while (($el = $el.parentElement) && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) === -1) {\n    ;\n  }\n\n  return $el;\n};\nvar elementHasSelector = function elementHasSelector($el, selector) {\n  var $root = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document;\n  var has = nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1;\n  return has;\n};\nvar elementHasOverflowHidden = function elementHasOverflowHidden($el) {\n  if ($el) {\n    var computedStyle = getComputedStyle($el);\n    var overflowIsHidden = computedStyle.overflow === 'hidden';\n    return overflowIsHidden;\n  }\n};\nvar elementScrollTopOnStart = function elementScrollTopOnStart($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollTop = $el.scrollTop;\n    return scrollTop <= 0;\n  }\n};\nvar elementScrollTopOnEnd = function elementScrollTopOnEnd($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollTop = $el.scrollTop;\n    var scrollHeight = $el.scrollHeight;\n    var scrollTopWithHeight = scrollTop + $el.offsetHeight;\n    return scrollTopWithHeight >= scrollHeight;\n  }\n};\nvar elementScrollLeftOnStart = function elementScrollLeftOnStart($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollLeft = $el.scrollLeft;\n    return scrollLeft <= 0;\n  }\n};\nvar elementScrollLeftOnEnd = function elementScrollLeftOnEnd($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollLeft = $el.scrollLeft;\n    var scrollWidth = $el.scrollWidth;\n    var scrollLeftWithWidth = scrollLeft + $el.offsetWidth;\n    return scrollLeftWithWidth >= scrollWidth;\n  }\n};\nvar elementIsScrollableField = function elementIsScrollableField($el) {\n  var selector = 'textarea, [contenteditable=\"true\"]';\n  return elementHasSelector($el, selector);\n};\nvar elementIsInputRange = function elementIsInputRange($el) {\n  var selector = 'input[type=\"range\"]';\n  return elementHasSelector($el, selector);\n};\n// CONCATENATED MODULE: ./src/scroll-lock.js\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"disablePageScroll\", function() { return disablePageScroll; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"enablePageScroll\", function() { return enablePageScroll; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getScrollState\", function() { return getScrollState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clearQueueScrollLocks\", function() { return clearQueueScrollLocks; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getTargetScrollBarWidth\", function() { return scroll_lock_getTargetScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCurrentTargetScrollBarWidth\", function() { return scroll_lock_getCurrentTargetScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getPageScrollBarWidth\", function() { return getPageScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCurrentPageScrollBarWidth\", function() { return getCurrentPageScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addScrollableTarget\", function() { return scroll_lock_addScrollableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeScrollableTarget\", function() { return scroll_lock_removeScrollableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addScrollableSelector\", function() { return scroll_lock_addScrollableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeScrollableSelector\", function() { return scroll_lock_removeScrollableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addLockableTarget\", function() { return scroll_lock_addLockableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addLockableSelector\", function() { return scroll_lock_addLockableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"setFillGapMethod\", function() { return scroll_lock_setFillGapMethod; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addFillGapTarget\", function() { return scroll_lock_addFillGapTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeFillGapTarget\", function() { return scroll_lock_removeFillGapTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addFillGapSelector\", function() { return scroll_lock_addFillGapSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeFillGapSelector\", function() { return scroll_lock_removeFillGapSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"refillGaps\", function() { return refillGaps; });\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\nvar FILL_GAP_AVAILABLE_METHODS = ['padding', 'margin', 'width', 'max-width', 'none'];\nvar TOUCH_DIRECTION_DETECT_OFFSET = 3;\nvar state = {\n  scroll: true,\n  queue: 0,\n  scrollableSelectors: ['[data-scroll-lock-scrollable]'],\n  lockableSelectors: ['body', '[data-scroll-lock-lockable]'],\n  fillGapSelectors: ['body', '[data-scroll-lock-fill-gap]', '[data-scroll-lock-lockable]'],\n  fillGapMethod: FILL_GAP_AVAILABLE_METHODS[0],\n  //\n  startTouchY: 0,\n  startTouchX: 0\n};\nvar disablePageScroll = function disablePageScroll(target) {\n  if (state.queue <= 0) {\n    state.scroll = false;\n    scroll_lock_hideLockableOverflow();\n    fillGaps();\n  }\n\n  scroll_lock_addScrollableTarget(target);\n  state.queue++;\n};\nvar enablePageScroll = function enablePageScroll(target) {\n  state.queue > 0 && state.queue--;\n\n  if (state.queue <= 0) {\n    state.scroll = true;\n    scroll_lock_showLockableOverflow();\n    unfillGaps();\n  }\n\n  scroll_lock_removeScrollableTarget(target);\n};\nvar getScrollState = function getScrollState() {\n  return state.scroll;\n};\nvar clearQueueScrollLocks = function clearQueueScrollLocks() {\n  state.queue = 0;\n};\nvar scroll_lock_getTargetScrollBarWidth = function getTargetScrollBarWidth($target) {\n  var onlyExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (isElement($target)) {\n    var currentOverflowYProperty = $target.style.overflowY;\n\n    if (onlyExists) {\n      if (!getScrollState()) {\n        $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-overflow-y-property');\n      }\n    } else {\n      $target.style.overflowY = 'scroll';\n    }\n\n    var width = scroll_lock_getCurrentTargetScrollBarWidth($target);\n    $target.style.overflowY = currentOverflowYProperty;\n    return width;\n  } else {\n    return 0;\n  }\n};\nvar scroll_lock_getCurrentTargetScrollBarWidth = function getCurrentTargetScrollBarWidth($target) {\n  if (isElement($target)) {\n    if ($target === document.body) {\n      var documentWidth = document.documentElement.clientWidth;\n      var windowWidth = window.innerWidth;\n      var currentWidth = windowWidth - documentWidth;\n      return currentWidth;\n    } else {\n      var borderLeftWidthCurrentProperty = $target.style.borderLeftWidth;\n      var borderRightWidthCurrentProperty = $target.style.borderRightWidth;\n      $target.style.borderLeftWidth = '0px';\n      $target.style.borderRightWidth = '0px';\n\n      var _currentWidth = $target.offsetWidth - $target.clientWidth;\n\n      $target.style.borderLeftWidth = borderLeftWidthCurrentProperty;\n      $target.style.borderRightWidth = borderRightWidthCurrentProperty;\n      return _currentWidth;\n    }\n  } else {\n    return 0;\n  }\n};\nvar getPageScrollBarWidth = function getPageScrollBarWidth() {\n  var onlyExists = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n  return scroll_lock_getTargetScrollBarWidth(document.body, onlyExists);\n};\nvar getCurrentPageScrollBarWidth = function getCurrentPageScrollBarWidth() {\n  return scroll_lock_getCurrentTargetScrollBarWidth(document.body);\n};\nvar scroll_lock_addScrollableTarget = function addScrollableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-scrollable', '');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_removeScrollableTarget = function removeScrollableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.removeAttribute('data-scroll-lock-scrollable');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_addScrollableSelector = function addScrollableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.scrollableSelectors.push(selector);\n    });\n  }\n};\nvar scroll_lock_removeScrollableSelector = function removeScrollableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.scrollableSelectors = state.scrollableSelectors.filter(function (sSelector) {\n        return sSelector !== selector;\n      });\n    });\n  }\n};\nvar scroll_lock_addLockableTarget = function addLockableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-lockable', '');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n\n    if (!getScrollState()) {\n      scroll_lock_hideLockableOverflow();\n    }\n  }\n};\nvar scroll_lock_addLockableSelector = function addLockableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.lockableSelectors.push(selector);\n    });\n\n    if (!getScrollState()) {\n      scroll_lock_hideLockableOverflow();\n    }\n\n    scroll_lock_addFillGapSelector(selector);\n  }\n};\nvar scroll_lock_setFillGapMethod = function setFillGapMethod(method) {\n  if (method) {\n    if (FILL_GAP_AVAILABLE_METHODS.indexOf(method) !== -1) {\n      state.fillGapMethod = method;\n      refillGaps();\n    } else {\n      var methods = FILL_GAP_AVAILABLE_METHODS.join(', ');\n      throwError(\"\\\"\".concat(method, \"\\\" method is not available!\\nAvailable fill gap methods: \").concat(methods, \".\"));\n    }\n  }\n};\nvar scroll_lock_addFillGapTarget = function addFillGapTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-fill-gap', '');\n\n          if (!state.scroll) {\n            scroll_lock_fillGapTarget($target);\n          }\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_removeFillGapTarget = function removeFillGapTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.removeAttribute('data-scroll-lock-fill-gap');\n\n          if (!state.scroll) {\n            scroll_lock_unfillGapTarget($target);\n          }\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_addFillGapSelector = function addFillGapSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      if (state.fillGapSelectors.indexOf(selector) === -1) {\n        state.fillGapSelectors.push(selector);\n\n        if (!state.scroll) {\n          scroll_lock_fillGapSelector(selector);\n        }\n      }\n    });\n  }\n};\nvar scroll_lock_removeFillGapSelector = function removeFillGapSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.fillGapSelectors = state.fillGapSelectors.filter(function (fSelector) {\n        return fSelector !== selector;\n      });\n\n      if (!state.scroll) {\n        scroll_lock_unfillGapSelector(selector);\n      }\n    });\n  }\n};\nvar refillGaps = function refillGaps() {\n  if (!state.scroll) {\n    fillGaps();\n  }\n};\n\nvar scroll_lock_hideLockableOverflow = function hideLockableOverflow() {\n  var selector = arrayAsSelector(state.lockableSelectors);\n  scroll_lock_hideLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_showLockableOverflow = function showLockableOverflow() {\n  var selector = arrayAsSelector(state.lockableSelectors);\n  scroll_lock_showLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_hideLockableOverflowSelector = function hideLockableOverflowSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_hideLockableOverflowTarget($target);\n  });\n};\n\nvar scroll_lock_showLockableOverflowSelector = function showLockableOverflowSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_showLockableOverflowTarget($target);\n  });\n};\n\nvar scroll_lock_hideLockableOverflowTarget = function hideLockableOverflowTarget($target) {\n  if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') !== 'true') {\n    var computedStyle = window.getComputedStyle($target);\n    $target.setAttribute('data-scroll-lock-saved-overflow-y-property', computedStyle.overflowY);\n    $target.setAttribute('data-scroll-lock-saved-inline-overflow-property', $target.style.overflow);\n    $target.setAttribute('data-scroll-lock-saved-inline-overflow-y-property', $target.style.overflowY);\n    $target.style.overflow = 'hidden';\n    $target.setAttribute('data-scroll-lock-locked', 'true');\n  }\n};\n\nvar scroll_lock_showLockableOverflowTarget = function showLockableOverflowTarget($target) {\n  if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') === 'true') {\n    $target.style.overflow = $target.getAttribute('data-scroll-lock-saved-inline-overflow-property');\n    $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n    $target.removeAttribute('data-scroll-lock-saved-overflow-property');\n    $target.removeAttribute('data-scroll-lock-saved-inline-overflow-property');\n    $target.removeAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n    $target.removeAttribute('data-scroll-lock-locked');\n  }\n};\n\nvar fillGaps = function fillGaps() {\n  state.fillGapSelectors.map(function (selector) {\n    scroll_lock_fillGapSelector(selector);\n  });\n};\n\nvar unfillGaps = function unfillGaps() {\n  state.fillGapSelectors.map(function (selector) {\n    scroll_lock_unfillGapSelector(selector);\n  });\n};\n\nvar scroll_lock_fillGapSelector = function fillGapSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  var isLockable = state.lockableSelectors.indexOf(selector) !== -1;\n  eachNode($targets, function ($target) {\n    scroll_lock_fillGapTarget($target, isLockable);\n  });\n};\n\nvar scroll_lock_fillGapTarget = function fillGapTarget($target) {\n  var isLockable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (isElement($target)) {\n    var scrollBarWidth;\n\n    if ($target.getAttribute('data-scroll-lock-lockable') === '' || isLockable) {\n      scrollBarWidth = scroll_lock_getTargetScrollBarWidth($target, true);\n    } else {\n      var $lockableParent = findParentBySelector($target, arrayAsSelector(state.lockableSelectors));\n      scrollBarWidth = scroll_lock_getTargetScrollBarWidth($lockableParent, true);\n    }\n\n    if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n      scroll_lock_unfillGapTarget($target);\n    }\n\n    var computedStyle = window.getComputedStyle($target);\n    $target.setAttribute('data-scroll-lock-filled-gap', 'true');\n    $target.setAttribute('data-scroll-lock-current-fill-gap-method', state.fillGapMethod);\n\n    if (state.fillGapMethod === 'margin') {\n      var currentMargin = parseFloat(computedStyle.marginRight);\n      $target.style.marginRight = \"\".concat(currentMargin + scrollBarWidth, \"px\");\n    } else if (state.fillGapMethod === 'width') {\n      $target.style.width = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n    } else if (state.fillGapMethod === 'max-width') {\n      $target.style.maxWidth = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n    } else if (state.fillGapMethod === 'padding') {\n      var currentPadding = parseFloat(computedStyle.paddingRight);\n      $target.style.paddingRight = \"\".concat(currentPadding + scrollBarWidth, \"px\");\n    }\n  }\n};\n\nvar scroll_lock_unfillGapSelector = function unfillGapSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_unfillGapTarget($target);\n  });\n};\n\nvar scroll_lock_unfillGapTarget = function unfillGapTarget($target) {\n  if (isElement($target)) {\n    if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n      var currentFillGapMethod = $target.getAttribute('data-scroll-lock-current-fill-gap-method');\n      $target.removeAttribute('data-scroll-lock-filled-gap');\n      $target.removeAttribute('data-scroll-lock-current-fill-gap-method');\n\n      if (currentFillGapMethod === 'margin') {\n        $target.style.marginRight = \"\";\n      } else if (currentFillGapMethod === 'width') {\n        $target.style.width = \"\";\n      } else if (currentFillGapMethod === 'max-width') {\n        $target.style.maxWidth = \"\";\n      } else if (currentFillGapMethod === 'padding') {\n        $target.style.paddingRight = \"\";\n      }\n    }\n  }\n};\n\nvar onResize = function onResize(e) {\n  refillGaps();\n};\n\nvar onTouchStart = function onTouchStart(e) {\n  if (!state.scroll) {\n    state.startTouchY = e.touches[0].clientY;\n    state.startTouchX = e.touches[0].clientX;\n  }\n};\n\nvar scroll_lock_onTouchMove = function onTouchMove(e) {\n  if (!state.scroll) {\n    var startTouchY = state.startTouchY,\n        startTouchX = state.startTouchX;\n    var currentClientY = e.touches[0].clientY;\n    var currentClientX = e.touches[0].clientX;\n\n    if (e.touches.length < 2) {\n      var selector = arrayAsSelector(state.scrollableSelectors);\n      var direction = {\n        up: startTouchY < currentClientY,\n        down: startTouchY > currentClientY,\n        left: startTouchX < currentClientX,\n        right: startTouchX > currentClientX\n      };\n      var directionWithOffset = {\n        up: startTouchY + TOUCH_DIRECTION_DETECT_OFFSET < currentClientY,\n        down: startTouchY - TOUCH_DIRECTION_DETECT_OFFSET > currentClientY,\n        left: startTouchX + TOUCH_DIRECTION_DETECT_OFFSET < currentClientX,\n        right: startTouchX - TOUCH_DIRECTION_DETECT_OFFSET > currentClientX\n      };\n\n      var handle = function handle($el) {\n        var skip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n        if ($el) {\n          var parentScrollableEl = findParentBySelector($el, selector, false);\n\n          if (elementIsInputRange($el)) {\n            return false;\n          }\n\n          if (skip || elementIsScrollableField($el) && findParentBySelector($el, selector) || elementHasSelector($el, selector)) {\n            var prevent = false;\n\n            if (elementScrollLeftOnStart($el) && elementScrollLeftOnEnd($el)) {\n              if (direction.up && elementScrollTopOnStart($el) || direction.down && elementScrollTopOnEnd($el)) {\n                prevent = true;\n              }\n            } else if (elementScrollTopOnStart($el) && elementScrollTopOnEnd($el)) {\n              if (direction.left && elementScrollLeftOnStart($el) || direction.right && elementScrollLeftOnEnd($el)) {\n                prevent = true;\n              }\n            } else if (directionWithOffset.up && elementScrollTopOnStart($el) || directionWithOffset.down && elementScrollTopOnEnd($el) || directionWithOffset.left && elementScrollLeftOnStart($el) || directionWithOffset.right && elementScrollLeftOnEnd($el)) {\n              prevent = true;\n            }\n\n            if (prevent) {\n              if (parentScrollableEl) {\n                handle(parentScrollableEl, true);\n              } else {\n                if (e.cancelable) {\n                  e.preventDefault();\n                }\n              }\n            }\n          } else {\n            handle(parentScrollableEl);\n          }\n        } else {\n          if (e.cancelable) {\n            e.preventDefault();\n          }\n        }\n      };\n\n      handle(e.target);\n    }\n  }\n};\n\nvar onTouchEnd = function onTouchEnd(e) {\n  if (!state.scroll) {\n    state.startTouchY = 0;\n    state.startTouchX = 0;\n  }\n};\n\nif (typeof window !== 'undefined') {\n  window.addEventListener('resize', onResize);\n}\n\nif (typeof document !== 'undefined') {\n  document.addEventListener('touchstart', onTouchStart);\n  document.addEventListener('touchmove', scroll_lock_onTouchMove, {\n    passive: false\n  });\n  document.addEventListener('touchend', onTouchEnd);\n}\n\nvar deprecatedMethods = {\n  hide: function hide(target) {\n    throwError('\"hide\" is deprecated! Use \"disablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#disablepagescrollscrollabletarget');\n    disablePageScroll(target);\n  },\n  show: function show(target) {\n    throwError('\"show\" is deprecated! Use \"enablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#enablepagescrollscrollabletarget');\n    enablePageScroll(target);\n  },\n  toggle: function toggle(target) {\n    throwError('\"toggle\" is deprecated! Do not use it.');\n\n    if (getScrollState()) {\n      disablePageScroll();\n    } else {\n      enablePageScroll(target);\n    }\n  },\n  getState: function getState() {\n    throwError('\"getState\" is deprecated! Use \"getScrollState\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getscrollstate');\n    return getScrollState();\n  },\n  getWidth: function getWidth() {\n    throwError('\"getWidth\" is deprecated! Use \"getPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getpagescrollbarwidth');\n    return getPageScrollBarWidth();\n  },\n  getCurrentWidth: function getCurrentWidth() {\n    throwError('\"getCurrentWidth\" is deprecated! Use \"getCurrentPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getcurrentpagescrollbarwidth');\n    return getCurrentPageScrollBarWidth();\n  },\n  setScrollableTargets: function setScrollableTargets(target) {\n    throwError('\"setScrollableTargets\" is deprecated! Use \"addScrollableTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addscrollabletargetscrollabletarget');\n    scroll_lock_addScrollableTarget(target);\n  },\n  setFillGapSelectors: function setFillGapSelectors(selector) {\n    throwError('\"setFillGapSelectors\" is deprecated! Use \"addFillGapSelector\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgapselectorfillgapselector');\n    scroll_lock_addFillGapSelector(selector);\n  },\n  setFillGapTargets: function setFillGapTargets(target) {\n    throwError('\"setFillGapTargets\" is deprecated! Use \"addFillGapTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgaptargetfillgaptarget');\n    scroll_lock_addFillGapTarget(target);\n  },\n  clearQueue: function clearQueue() {\n    throwError('\"clearQueue\" is deprecated! Use \"clearQueueScrollLocks\" instead. \\n https://github.com/FL3NKEY/scroll-lock#clearqueuescrolllocks');\n    clearQueueScrollLocks();\n  }\n};\n\nvar scrollLock = _objectSpread({\n  disablePageScroll: disablePageScroll,\n  enablePageScroll: enablePageScroll,\n  getScrollState: getScrollState,\n  clearQueueScrollLocks: clearQueueScrollLocks,\n  getTargetScrollBarWidth: scroll_lock_getTargetScrollBarWidth,\n  getCurrentTargetScrollBarWidth: scroll_lock_getCurrentTargetScrollBarWidth,\n  getPageScrollBarWidth: getPageScrollBarWidth,\n  getCurrentPageScrollBarWidth: getCurrentPageScrollBarWidth,\n  addScrollableSelector: scroll_lock_addScrollableSelector,\n  removeScrollableSelector: scroll_lock_removeScrollableSelector,\n  addScrollableTarget: scroll_lock_addScrollableTarget,\n  removeScrollableTarget: scroll_lock_removeScrollableTarget,\n  addLockableSelector: scroll_lock_addLockableSelector,\n  addLockableTarget: scroll_lock_addLockableTarget,\n  addFillGapSelector: scroll_lock_addFillGapSelector,\n  removeFillGapSelector: scroll_lock_removeFillGapSelector,\n  addFillGapTarget: scroll_lock_addFillGapTarget,\n  removeFillGapTarget: scroll_lock_removeFillGapTarget,\n  setFillGapMethod: scroll_lock_setFillGapMethod,\n  refillGaps: refillGaps,\n  _state: state\n}, deprecatedMethods);\n\n/* harmony default export */ var scroll_lock = __webpack_exports__[\"default\"] = (scrollLock);\n\n/***/ })\n/******/ ])[\"default\"];\n});","/*!\n  * PhotoSwipe 5.4.4 - https://photoswipe.com\n  * (c) 2024 Dmytro Semenov\n  */\n!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).PhotoSwipe=i()}(this,(function(){\"use strict\";function t(t,i,s){const h=document.createElement(i);return t&&(h.className=t),s&&s.appendChild(h),h}function i(t,i){return t.x=i.x,t.y=i.y,void 0!==i.id&&(t.id=i.id),t}function s(t){t.x=Math.round(t.x),t.y=Math.round(t.y)}function h(t,i){const s=Math.abs(t.x-i.x),h=Math.abs(t.y-i.y);return Math.sqrt(s*s+h*h)}function e(t,i){return t.x===i.x&&t.y===i.y}function n(t,i,s){return Math.min(Math.max(t,i),s)}function o(t,i,s){let h=`translate3d(${t}px,${i||0}px,0)`;return void 0!==s&&(h+=` scale3d(${s},${s},1)`),h}function r(t,i,s,h){t.style.transform=o(i,s,h)}function a(t,i,s,h){t.style.transition=i?`${i} ${s}ms ${h||\"cubic-bezier(.4,0,.22,1)\"}`:\"none\"}function l(t,i,s){t.style.width=\"number\"==typeof i?`${i}px`:i,t.style.height=\"number\"==typeof s?`${s}px`:s}const c=\"idle\",d=\"loading\",u=\"loaded\",p=\"error\";function m(){return!(!navigator.vendor||!navigator.vendor.match(/apple/i))}let v=!1;try{window.addEventListener(\"test\",null,Object.defineProperty({},\"passive\",{get:()=>{v=!0}}))}catch(t){}class f{constructor(){this.t=[]}add(t,i,s,h){this.i(t,i,s,h)}remove(t,i,s,h){this.i(t,i,s,h,!0)}removeAll(){this.t.forEach((t=>{this.i(t.target,t.type,t.listener,t.passive,!0,!0)})),this.t=[]}i(t,i,s,h,e,n){if(!t)return;const o=e?\"removeEventListener\":\"addEventListener\";i.split(\" \").forEach((i=>{if(i){n||(e?this.t=this.t.filter((h=>h.type!==i||h.listener!==s||h.target!==t)):this.t.push({target:t,type:i,listener:s,passive:h}));const r=!!v&&{passive:h||!1};t[o](i,s,r)}}))}}function w(t,i){if(t.getViewportSizeFn){const s=t.getViewportSizeFn(t,i);if(s)return s}return{x:document.documentElement.clientWidth,y:window.innerHeight}}function g(t,i,s,h,e){let n=0;if(i.paddingFn)n=i.paddingFn(s,h,e)[t];else if(i.padding)n=i.padding[t];else{const s=\"padding\"+t[0].toUpperCase()+t.slice(1);i[s]&&(n=i[s])}return Number(n)||0}function y(t,i,s,h){return{x:i.x-g(\"left\",t,i,s,h)-g(\"right\",t,i,s,h),y:i.y-g(\"top\",t,i,s,h)-g(\"bottom\",t,i,s,h)}}class _{constructor(t){this.slide=t,this.currZoomLevel=1,this.center={x:0,y:0},this.max={x:0,y:0},this.min={x:0,y:0}}update(t){this.currZoomLevel=t,this.slide.width?(this.o(\"x\"),this.o(\"y\"),this.slide.pswp.dispatch(\"calcBounds\",{slide:this.slide})):this.reset()}o(t){const{pswp:i}=this.slide,s=this.slide[\"x\"===t?\"width\":\"height\"]*this.currZoomLevel,h=g(\"x\"===t?\"left\":\"top\",i.options,i.viewportSize,this.slide.data,this.slide.index),e=this.slide.panAreaSize[t];this.center[t]=Math.round((e-s)/2)+h,this.max[t]=s>e?Math.round(e-s)+h:this.center[t],this.min[t]=s>e?h:this.center[t]}reset(){this.center.x=0,this.center.y=0,this.max.x=0,this.max.y=0,this.min.x=0,this.min.y=0}correctPan(t,i){return n(i,this.max[t],this.min[t])}}class x{constructor(t,i,s,h){this.pswp=h,this.options=t,this.itemData=i,this.index=s,this.panAreaSize=null,this.elementSize=null,this.fit=1,this.fill=1,this.vFill=1,this.initial=1,this.secondary=1,this.max=1,this.min=1}update(t,i,s){const h={x:t,y:i};this.elementSize=h,this.panAreaSize=s;const e=s.x/h.x,n=s.y/h.y;this.fit=Math.min(1,e<n?e:n),this.fill=Math.min(1,e>n?e:n),this.vFill=Math.min(1,n),this.initial=this.l(),this.secondary=this.u(),this.max=Math.max(this.initial,this.secondary,this.p()),this.min=Math.min(this.fit,this.initial,this.secondary),this.pswp&&this.pswp.dispatch(\"zoomLevelsUpdate\",{zoomLevels:this,slideData:this.itemData})}m(t){const i=t+\"ZoomLevel\",s=this.options[i];if(s)return\"function\"==typeof s?s(this):\"fill\"===s?this.fill:\"fit\"===s?this.fit:Number(s)}u(){let t=this.m(\"secondary\");return t||(t=Math.min(1,3*this.fit),this.elementSize&&t*this.elementSize.x>4e3&&(t=4e3/this.elementSize.x),t)}l(){return this.m(\"initial\")||this.fit}p(){return this.m(\"max\")||Math.max(1,4*this.fit)}}class b{constructor(i,s,h){this.data=i,this.index=s,this.pswp=h,this.isActive=s===h.currIndex,this.currentResolution=0,this.panAreaSize={x:0,y:0},this.pan={x:0,y:0},this.isFirstSlide=this.isActive&&!h.opener.isOpen,this.zoomLevels=new x(h.options,i,s,h),this.pswp.dispatch(\"gettingData\",{slide:this,data:this.data,index:s}),this.content=this.pswp.contentLoader.getContentBySlide(this),this.container=t(\"pswp__zoom-wrap\",\"div\"),this.holderElement=null,this.currZoomLevel=1,this.width=this.content.width,this.height=this.content.height,this.heavyAppended=!1,this.bounds=new _(this),this.prevDisplayedWidth=-1,this.prevDisplayedHeight=-1,this.pswp.dispatch(\"slideInit\",{slide:this})}setIsActive(t){t&&!this.isActive?this.activate():!t&&this.isActive&&this.deactivate()}append(t){this.holderElement=t,this.container.style.transformOrigin=\"0 0\",this.data&&(this.calculateSize(),this.load(),this.updateContentSize(),this.appendHeavy(),this.holderElement.appendChild(this.container),this.zoomAndPanToInitial(),this.pswp.dispatch(\"firstZoomPan\",{slide:this}),this.applyCurrentZoomPan(),this.pswp.dispatch(\"afterSetContent\",{slide:this}),this.isActive&&this.activate())}load(){this.content.load(!1),this.pswp.dispatch(\"slideLoad\",{slide:this})}appendHeavy(){const{pswp:t}=this;!this.heavyAppended&&t.opener.isOpen&&!t.mainScroll.isShifted()&&(this.isActive,1)&&(this.pswp.dispatch(\"appendHeavy\",{slide:this}).defaultPrevented||(this.heavyAppended=!0,this.content.append(),this.pswp.dispatch(\"appendHeavyContent\",{slide:this})))}activate(){this.isActive=!0,this.appendHeavy(),this.content.activate(),this.pswp.dispatch(\"slideActivate\",{slide:this})}deactivate(){this.isActive=!1,this.content.deactivate(),this.currZoomLevel!==this.zoomLevels.initial&&this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize(),this.pswp.dispatch(\"slideDeactivate\",{slide:this})}destroy(){this.content.hasSlide=!1,this.content.remove(),this.container.remove(),this.pswp.dispatch(\"slideDestroy\",{slide:this})}resize(){this.currZoomLevel!==this.zoomLevels.initial&&this.isActive?(this.calculateSize(),this.bounds.update(this.currZoomLevel),this.panTo(this.pan.x,this.pan.y)):(this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize())}updateContentSize(t){const i=this.currentResolution||this.zoomLevels.initial;if(!i)return;const s=Math.round(this.width*i)||this.pswp.viewportSize.x,h=Math.round(this.height*i)||this.pswp.viewportSize.y;(this.sizeChanged(s,h)||t)&&this.content.setDisplayedSize(s,h)}sizeChanged(t,i){return(t!==this.prevDisplayedWidth||i!==this.prevDisplayedHeight)&&(this.prevDisplayedWidth=t,this.prevDisplayedHeight=i,!0)}getPlaceholderElement(){var t;return null===(t=this.content.placeholder)||void 0===t?void 0:t.element}zoomTo(t,i,h,e){const{pswp:o}=this;if(!this.isZoomable()||o.mainScroll.isShifted())return;o.dispatch(\"beforeZoomTo\",{destZoomLevel:t,centerPoint:i,transitionDuration:h}),o.animations.stopAllPan();const r=this.currZoomLevel;e||(t=n(t,this.zoomLevels.min,this.zoomLevels.max)),this.setZoomLevel(t),this.pan.x=this.calculateZoomToPanOffset(\"x\",i,r),this.pan.y=this.calculateZoomToPanOffset(\"y\",i,r),s(this.pan);const a=()=>{this.v(t),this.applyCurrentZoomPan()};h?o.animations.startTransition({isPan:!0,name:\"zoomTo\",target:this.container,transform:this.getCurrentTransform(),onComplete:a,duration:h,easing:o.options.easing}):a()}toggleZoom(t){this.zoomTo(this.currZoomLevel===this.zoomLevels.initial?this.zoomLevels.secondary:this.zoomLevels.initial,t,this.pswp.options.zoomAnimationDuration)}setZoomLevel(t){this.currZoomLevel=t,this.bounds.update(this.currZoomLevel)}calculateZoomToPanOffset(t,i,s){if(0===this.bounds.max[t]-this.bounds.min[t])return this.bounds.center[t];i||(i=this.pswp.getViewportCenterPoint()),s||(s=this.zoomLevels.initial);const h=this.currZoomLevel/s;return this.bounds.correctPan(t,(this.pan[t]-i[t])*h+i[t])}panTo(t,i){this.pan.x=this.bounds.correctPan(\"x\",t),this.pan.y=this.bounds.correctPan(\"y\",i),this.applyCurrentZoomPan()}isPannable(){return Boolean(this.width)&&this.currZoomLevel>this.zoomLevels.fit}isZoomable(){return Boolean(this.width)&&this.content.isZoomable()}applyCurrentZoomPan(){this.g(this.pan.x,this.pan.y,this.currZoomLevel),this===this.pswp.currSlide&&this.pswp.dispatch(\"zoomPanUpdate\",{slide:this})}zoomAndPanToInitial(){this.currZoomLevel=this.zoomLevels.initial,this.bounds.update(this.currZoomLevel),i(this.pan,this.bounds.center),this.pswp.dispatch(\"initialZoomPan\",{slide:this})}g(t,i,s){s/=this.currentResolution||this.zoomLevels.initial,r(this.container,t,i,s)}calculateSize(){const{pswp:t}=this;i(this.panAreaSize,y(t.options,t.viewportSize,this.data,this.index)),this.zoomLevels.update(this.width,this.height,this.panAreaSize),t.dispatch(\"calcSlideSize\",{slide:this})}getCurrentTransform(){const t=this.currZoomLevel/(this.currentResolution||this.zoomLevels.initial);return o(this.pan.x,this.pan.y,t)}v(t){t!==this.currentResolution&&(this.currentResolution=t,this.updateContentSize(),this.pswp.dispatch(\"resolutionChanged\"))}}class S{constructor(t){this.gestures=t,this.pswp=t.pswp,this.startPan={x:0,y:0}}start(){this.pswp.currSlide&&i(this.startPan,this.pswp.currSlide.pan),this.pswp.animations.stopAll()}change(){const{p1:t,prevP1:i,dragAxis:h}=this.gestures,{currSlide:e}=this.pswp;if(\"y\"===h&&this.pswp.options.closeOnVerticalDrag&&e&&e.currZoomLevel<=e.zoomLevels.fit&&!this.gestures.isMultitouch){const s=e.pan.y+(t.y-i.y);if(!this.pswp.dispatch(\"verticalDrag\",{panY:s}).defaultPrevented){this._(\"y\",s,.6);const t=1-Math.abs(this.S(e.pan.y));this.pswp.applyBgOpacity(t),e.applyCurrentZoomPan()}}else{this.M(\"x\")||(this.M(\"y\"),e&&(s(e.pan),e.applyCurrentZoomPan()))}}end(){const{velocity:t}=this.gestures,{mainScroll:i,currSlide:s}=this.pswp;let h=0;if(this.pswp.animations.stopAll(),i.isShifted()){const s=(i.x-i.getCurrSlideX())/this.pswp.viewportSize.x;t.x<-.5&&s<0||t.x<.1&&s<-.5?(h=1,t.x=Math.min(t.x,0)):(t.x>.5&&s>0||t.x>-.1&&s>.5)&&(h=-1,t.x=Math.max(t.x,0)),i.moveIndexBy(h,!0,t.x)}s&&s.currZoomLevel>s.zoomLevels.max||this.gestures.isMultitouch?this.gestures.zoomLevels.correctZoomPan(!0):(this.P(\"x\"),this.P(\"y\"))}P(t){const{velocity:i}=this.gestures,{currSlide:s}=this.pswp;if(!s)return;const{pan:h,bounds:e}=s,o=h[t],r=this.pswp.bgOpacity<1&&\"y\"===t,a=o+function(t,i){return t*i/(1-i)}(i[t],.995);if(r){const t=this.S(o),i=this.S(a);if(t<0&&i<-.4||t>0&&i>.4)return void this.pswp.close()}const l=e.correctPan(t,a);if(o===l)return;const c=l===a?1:.82,d=this.pswp.bgOpacity,u=l-o;this.pswp.animations.startSpring({name:\"panGesture\"+t,isPan:!0,start:o,end:l,velocity:i[t],dampingRatio:c,onUpdate:i=>{if(r&&this.pswp.bgOpacity<1){const t=1-(l-i)/u;this.pswp.applyBgOpacity(n(d+(1-d)*t,0,1))}h[t]=Math.floor(i),s.applyCurrentZoomPan()}})}M(t){const{p1:i,dragAxis:s,prevP1:h,isMultitouch:e}=this.gestures,{currSlide:n,mainScroll:o}=this.pswp,r=i[t]-h[t],a=o.x+r;if(!r||!n)return!1;if(\"x\"===t&&!n.isPannable()&&!e)return o.moveTo(a,!0),!0;const{bounds:l}=n,c=n.pan[t]+r;if(this.pswp.options.allowPanToNext&&\"x\"===s&&\"x\"===t&&!e){const i=o.getCurrSlideX(),s=o.x-i,h=r>0,e=!h;if(c>l.min[t]&&h){if(l.min[t]<=this.startPan[t])return o.moveTo(a,!0),!0;this._(t,c)}else if(c<l.max[t]&&e){if(this.startPan[t]<=l.max[t])return o.moveTo(a,!0),!0;this._(t,c)}else if(0!==s){if(s>0)return o.moveTo(Math.max(a,i),!0),!0;if(s<0)return o.moveTo(Math.min(a,i),!0),!0}else this._(t,c)}else\"y\"===t&&(o.isShifted()||l.min.y===l.max.y)||this._(t,c);return!1}S(t){var i,s;return(t-(null!==(i=null===(s=this.pswp.currSlide)||void 0===s?void 0:s.bounds.center.y)&&void 0!==i?i:0))/(this.pswp.viewportSize.y/3)}_(t,i,s){const{currSlide:h}=this.pswp;if(!h)return;const{pan:e,bounds:n}=h;if(n.correctPan(t,i)!==i||s){const h=Math.round(i-e[t]);e[t]+=h*(s||.35)}else e[t]=i}}function z(t,i,s){return t.x=(i.x+s.x)/2,t.y=(i.y+s.y)/2,t}class M{constructor(t){this.gestures=t,this.C={x:0,y:0},this.T={x:0,y:0},this.A={x:0,y:0},this.D=!1,this.I=1}start(){const{currSlide:t}=this.gestures.pswp;t&&(this.I=t.currZoomLevel,i(this.C,t.pan)),this.gestures.pswp.animations.stopAllPan(),this.D=!1}change(){const{p1:t,startP1:i,p2:s,startP2:e,pswp:n}=this.gestures,{currSlide:o}=n;if(!o)return;const r=o.zoomLevels.min,a=o.zoomLevels.max;if(!o.isZoomable()||n.mainScroll.isShifted())return;z(this.T,i,e),z(this.A,t,s);let l=1/h(i,e)*h(t,s)*this.I;if(l>o.zoomLevels.initial+o.zoomLevels.initial/15&&(this.D=!0),l<r)if(n.options.pinchToClose&&!this.D&&this.I<=o.zoomLevels.initial){const t=1-(r-l)/(r/1.2);n.dispatch(\"pinchClose\",{bgOpacity:t}).defaultPrevented||n.applyBgOpacity(t)}else l=r-.15*(r-l);else l>a&&(l=a+.05*(l-a));o.pan.x=this.L(\"x\",l),o.pan.y=this.L(\"y\",l),o.setZoomLevel(l),o.applyCurrentZoomPan()}end(){const{pswp:t}=this.gestures,{currSlide:i}=t;(!i||i.currZoomLevel<i.zoomLevels.initial)&&!this.D&&t.options.pinchToClose?t.close():this.correctZoomPan()}L(t,i){const s=i/this.I;return this.A[t]-(this.T[t]-this.C[t])*s}correctZoomPan(t){const{pswp:s}=this.gestures,{currSlide:h}=s;if(null==h||!h.isZoomable())return;0===this.A.x&&(t=!0);const o=h.currZoomLevel;let r,a=!0;o<h.zoomLevels.initial?r=h.zoomLevels.initial:o>h.zoomLevels.max?r=h.zoomLevels.max:(a=!1,r=o);const l=s.bgOpacity,c=s.bgOpacity<1,d=i({x:0,y:0},h.pan);let u=i({x:0,y:0},d);t&&(this.A.x=0,this.A.y=0,this.T.x=0,this.T.y=0,this.I=o,i(this.C,d)),a&&(u={x:this.L(\"x\",r),y:this.L(\"y\",r)}),h.setZoomLevel(r),u={x:h.bounds.correctPan(\"x\",u.x),y:h.bounds.correctPan(\"y\",u.y)},h.setZoomLevel(o);const p=!e(u,d);if(!p&&!a&&!c)return h.v(r),void h.applyCurrentZoomPan();s.animations.stopAllPan(),s.animations.startSpring({isPan:!0,start:0,end:1e3,velocity:0,dampingRatio:1,naturalFrequency:40,onUpdate:t=>{if(t/=1e3,p||a){if(p&&(h.pan.x=d.x+(u.x-d.x)*t,h.pan.y=d.y+(u.y-d.y)*t),a){const i=o+(r-o)*t;h.setZoomLevel(i)}h.applyCurrentZoomPan()}c&&s.bgOpacity<1&&s.applyBgOpacity(n(l+(1-l)*t,0,1))},onComplete:()=>{h.v(r),h.applyCurrentZoomPan()}})}}function P(t){return!!t.target.closest(\".pswp__container\")}class C{constructor(t){this.gestures=t}click(t,i){const s=i.target.classList,h=s.contains(\"pswp__img\"),e=s.contains(\"pswp__item\")||s.contains(\"pswp__zoom-wrap\");h?this.k(\"imageClick\",t,i):e&&this.k(\"bgClick\",t,i)}tap(t,i){P(i)&&this.k(\"tap\",t,i)}doubleTap(t,i){P(i)&&this.k(\"doubleTap\",t,i)}k(t,i,s){var h;const{pswp:e}=this.gestures,{currSlide:n}=e,o=t+\"Action\",r=e.options[o];if(!e.dispatch(o,{point:i,originalEvent:s}).defaultPrevented)if(\"function\"!=typeof r)switch(r){case\"close\":case\"next\":e[r]();break;case\"zoom\":null==n||n.toggleZoom(i);break;case\"zoom-or-close\":null!=n&&n.isZoomable()&&n.zoomLevels.secondary!==n.zoomLevels.initial?n.toggleZoom(i):e.options.clickToCloseNonZoomable&&e.close();break;case\"toggle-controls\":null===(h=this.gestures.pswp.element)||void 0===h||h.classList.toggle(\"pswp--ui-visible\")}else r.call(e,i,s)}}class T{constructor(t){this.pswp=t,this.dragAxis=null,this.p1={x:0,y:0},this.p2={x:0,y:0},this.prevP1={x:0,y:0},this.prevP2={x:0,y:0},this.startP1={x:0,y:0},this.startP2={x:0,y:0},this.velocity={x:0,y:0},this.Z={x:0,y:0},this.B={x:0,y:0},this.F=0,this.O=[],this.R=\"ontouchstart\"in window,this.N=!!window.PointerEvent,this.supportsTouch=this.R||this.N&&navigator.maxTouchPoints>1,this.F=0,this.U=0,this.V=!1,this.isMultitouch=!1,this.isDragging=!1,this.isZooming=!1,this.raf=null,this.G=null,this.supportsTouch||(t.options.allowPanToNext=!1),this.drag=new S(this),this.zoomLevels=new M(this),this.tapHandler=new C(this),t.on(\"bindEvents\",(()=>{t.events.add(t.scrollWrap,\"click\",this.$.bind(this)),this.N?this.q(\"pointer\",\"down\",\"up\",\"cancel\"):this.R?(this.q(\"touch\",\"start\",\"end\",\"cancel\"),t.scrollWrap&&(t.scrollWrap.ontouchmove=()=>{},t.scrollWrap.ontouchend=()=>{})):this.q(\"mouse\",\"down\",\"up\")}))}q(t,i,s,h){const{pswp:e}=this,{events:n}=e,o=h?t+h:\"\";n.add(e.scrollWrap,t+i,this.onPointerDown.bind(this)),n.add(window,t+\"move\",this.onPointerMove.bind(this)),n.add(window,t+s,this.onPointerUp.bind(this)),o&&n.add(e.scrollWrap,o,this.onPointerUp.bind(this))}onPointerDown(t){const s=\"mousedown\"===t.type||\"mouse\"===t.pointerType;if(s&&t.button>0)return;const{pswp:h}=this;h.opener.isOpen?h.dispatch(\"pointerDown\",{originalEvent:t}).defaultPrevented||(s&&(h.mouseDetected(),this.H(t,\"down\")),h.animations.stopAll(),this.K(t,\"down\"),1===this.F&&(this.dragAxis=null,i(this.startP1,this.p1)),this.F>1?(this.W(),this.isMultitouch=!0):this.isMultitouch=!1):t.preventDefault()}onPointerMove(t){this.H(t,\"move\"),this.F&&(this.K(t,\"move\"),this.pswp.dispatch(\"pointerMove\",{originalEvent:t}).defaultPrevented||(1!==this.F||this.isDragging?this.F>1&&!this.isZooming&&(this.j(),this.isZooming=!0,this.X(),this.zoomLevels.start(),this.Y(),this.J()):(this.dragAxis||this.tt(),this.dragAxis&&!this.isDragging&&(this.isZooming&&(this.isZooming=!1,this.zoomLevels.end()),this.isDragging=!0,this.W(),this.X(),this.U=Date.now(),this.V=!1,i(this.B,this.p1),this.velocity.x=0,this.velocity.y=0,this.drag.start(),this.Y(),this.J()))))}j(){this.isDragging&&(this.isDragging=!1,this.V||this.it(!0),this.drag.end(),this.dragAxis=null)}onPointerUp(t){this.F&&(this.K(t,\"up\"),this.pswp.dispatch(\"pointerUp\",{originalEvent:t}).defaultPrevented||(0===this.F&&(this.Y(),this.isDragging?this.j():this.isZooming||this.isMultitouch||this.st(t)),this.F<2&&this.isZooming&&(this.isZooming=!1,this.zoomLevels.end(),1===this.F&&(this.dragAxis=null,this.X()))))}J(){(this.isDragging||this.isZooming)&&(this.it(),this.isDragging?e(this.p1,this.prevP1)||this.drag.change():e(this.p1,this.prevP1)&&e(this.p2,this.prevP2)||this.zoomLevels.change(),this.ht(),this.raf=requestAnimationFrame(this.J.bind(this)))}it(t){const s=Date.now(),h=s-this.U;h<50&&!t||(this.velocity.x=this.et(\"x\",h),this.velocity.y=this.et(\"y\",h),this.U=s,i(this.B,this.p1),this.V=!0)}st(t){const{mainScroll:s}=this.pswp;if(s.isShifted())return void s.moveIndexBy(0,!0);if(t.type.indexOf(\"cancel\")>0)return;if(\"mouseup\"===t.type||\"mouse\"===t.pointerType)return void this.tapHandler.click(this.startP1,t);const e=this.pswp.options.doubleTapAction?300:0;this.G?(this.W(),h(this.Z,this.startP1)<25&&this.tapHandler.doubleTap(this.startP1,t)):(i(this.Z,this.startP1),this.G=setTimeout((()=>{this.tapHandler.tap(this.startP1,t),this.W()}),e))}W(){this.G&&(clearTimeout(this.G),this.G=null)}et(t,i){const s=this.p1[t]-this.B[t];return Math.abs(s)>1&&i>5?s/i:0}Y(){this.raf&&(cancelAnimationFrame(this.raf),this.raf=null)}H(t,i){this.pswp.applyFilters(\"preventPointerEvent\",!0,t,i)&&t.preventDefault()}K(t,s){if(this.N){const h=t,e=this.O.findIndex((t=>t.id===h.pointerId));\"up\"===s&&e>-1?this.O.splice(e,1):\"down\"===s&&-1===e?this.O.push(this.nt(h,{x:0,y:0})):e>-1&&this.nt(h,this.O[e]),this.F=this.O.length,this.F>0&&i(this.p1,this.O[0]),this.F>1&&i(this.p2,this.O[1])}else{const i=t;this.F=0,i.type.indexOf(\"touch\")>-1?i.touches&&i.touches.length>0&&(this.nt(i.touches[0],this.p1),this.F++,i.touches.length>1&&(this.nt(i.touches[1],this.p2),this.F++)):(this.nt(t,this.p1),\"up\"===s?this.F=0:this.F++)}}ht(){i(this.prevP1,this.p1),i(this.prevP2,this.p2)}X(){i(this.startP1,this.p1),i(this.startP2,this.p2),this.ht()}tt(){if(this.pswp.mainScroll.isShifted())this.dragAxis=\"x\";else{const t=Math.abs(this.p1.x-this.startP1.x)-Math.abs(this.p1.y-this.startP1.y);if(0!==t){const i=t>0?\"x\":\"y\";Math.abs(this.p1[i]-this.startP1[i])>=10&&(this.dragAxis=i)}}}nt(t,i){return i.x=t.pageX-this.pswp.offset.x,i.y=t.pageY-this.pswp.offset.y,\"pointerId\"in t?i.id=t.pointerId:void 0!==t.identifier&&(i.id=t.identifier),i}$(t){this.pswp.mainScroll.isShifted()&&(t.preventDefault(),t.stopPropagation())}}class A{constructor(t){this.pswp=t,this.x=0,this.slideWidth=0,this.ot=0,this.rt=0,this.lt=-1,this.itemHolders=[]}resize(t){const{pswp:i}=this,s=Math.round(i.viewportSize.x+i.viewportSize.x*i.options.spacing),h=s!==this.slideWidth;h&&(this.slideWidth=s,this.moveTo(this.getCurrSlideX())),this.itemHolders.forEach(((i,s)=>{h&&r(i.el,(s+this.lt)*this.slideWidth),t&&i.slide&&i.slide.resize()}))}resetPosition(){this.ot=0,this.rt=0,this.slideWidth=0,this.lt=-1}appendHolders(){this.itemHolders=[];for(let i=0;i<3;i++){const s=t(\"pswp__item\",\"div\",this.pswp.container);s.setAttribute(\"role\",\"group\"),s.setAttribute(\"aria-roledescription\",\"slide\"),s.setAttribute(\"aria-hidden\",\"true\"),s.style.display=1===i?\"block\":\"none\",this.itemHolders.push({el:s})}}canBeSwiped(){return this.pswp.getNumItems()>1}moveIndexBy(t,i,s){const{pswp:h}=this;let e=h.potentialIndex+t;const n=h.getNumItems();if(h.canLoop()){e=h.getLoopedIndex(e);const i=(t+n)%n;t=i<=n/2?i:i-n}else e<0?e=0:e>=n&&(e=n-1),t=e-h.potentialIndex;h.potentialIndex=e,this.ot-=t,h.animations.stopMainScroll();const o=this.getCurrSlideX();if(i){h.animations.startSpring({isMainScroll:!0,start:this.x,end:o,velocity:s||0,naturalFrequency:30,dampingRatio:1,onUpdate:t=>{this.moveTo(t)},onComplete:()=>{this.updateCurrItem(),h.appendHeavy()}});let t=h.potentialIndex-h.currIndex;if(h.canLoop()){const i=(t+n)%n;t=i<=n/2?i:i-n}Math.abs(t)>1&&this.updateCurrItem()}else this.moveTo(o),this.updateCurrItem();return Boolean(t)}getCurrSlideX(){return this.slideWidth*this.ot}isShifted(){return this.x!==this.getCurrSlideX()}updateCurrItem(){var t;const{pswp:i}=this,s=this.rt-this.ot;if(!s)return;this.rt=this.ot,i.currIndex=i.potentialIndex;let h,e=Math.abs(s);e>=3&&(this.lt+=s+(s>0?-3:3),e=3,this.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.destroy(),t.slide=void 0})));for(let t=0;t<e;t++)s>0?(h=this.itemHolders.shift(),h&&(this.itemHolders[2]=h,this.lt++,r(h.el,(this.lt+2)*this.slideWidth),i.setContent(h,i.currIndex-e+t+2))):(h=this.itemHolders.pop(),h&&(this.itemHolders.unshift(h),this.lt--,r(h.el,this.lt*this.slideWidth),i.setContent(h,i.currIndex+e-t-2)));Math.abs(this.lt)>50&&!this.isShifted()&&(this.resetPosition(),this.resize()),i.animations.stopAllPan(),this.itemHolders.forEach(((t,i)=>{t.slide&&t.slide.setIsActive(1===i)})),i.currSlide=null===(t=this.itemHolders[1])||void 0===t?void 0:t.slide,i.contentLoader.updateLazy(s),i.currSlide&&i.currSlide.applyCurrentZoomPan(),i.dispatch(\"change\")}moveTo(t,i){if(!this.pswp.canLoop()&&i){let i=(this.slideWidth*this.ot-t)/this.slideWidth;i+=this.pswp.currIndex;const s=Math.round(t-this.x);(i<0&&s>0||i>=this.pswp.getNumItems()-1&&s<0)&&(t=this.x+.35*s)}this.x=t,this.pswp.container&&r(this.pswp.container,t),this.pswp.dispatch(\"moveMainScroll\",{x:t,dragging:null!=i&&i})}}const D={Escape:27,z:90,ArrowLeft:37,ArrowUp:38,ArrowRight:39,ArrowDown:40,Tab:9},I=(t,i)=>i?t:D[t];class E{constructor(t){this.pswp=t,this.ct=!1,t.on(\"bindEvents\",(()=>{t.options.trapFocus&&(t.options.initialPointerPos||this.dt(),t.events.add(document,\"focusin\",this.ut.bind(this))),t.events.add(document,\"keydown\",this.vt.bind(this))}));const i=document.activeElement;t.on(\"destroy\",(()=>{t.options.returnFocus&&i&&this.ct&&i.focus()}))}dt(){!this.ct&&this.pswp.element&&(this.pswp.element.focus(),this.ct=!0)}vt(t){const{pswp:i}=this;if(i.dispatch(\"keydown\",{originalEvent:t}).defaultPrevented)return;if(function(t){return\"button\"in t&&1===t.button||t.ctrlKey||t.metaKey||t.altKey||t.shiftKey}(t))return;let s,h,e=!1;const n=\"key\"in t;switch(n?t.key:t.keyCode){case I(\"Escape\",n):i.options.escKey&&(s=\"close\");break;case I(\"z\",n):s=\"toggleZoom\";break;case I(\"ArrowLeft\",n):h=\"x\";break;case I(\"ArrowUp\",n):h=\"y\";break;case I(\"ArrowRight\",n):h=\"x\",e=!0;break;case I(\"ArrowDown\",n):e=!0,h=\"y\";break;case I(\"Tab\",n):this.dt()}if(h){t.preventDefault();const{currSlide:n}=i;i.options.arrowKeys&&\"x\"===h&&i.getNumItems()>1?s=e?\"next\":\"prev\":n&&n.currZoomLevel>n.zoomLevels.fit&&(n.pan[h]+=e?-80:80,n.panTo(n.pan.x,n.pan.y))}s&&(t.preventDefault(),i[s]())}ut(t){const{template:i}=this.pswp;i&&document!==t.target&&i!==t.target&&!i.contains(t.target)&&i.focus()}}const L=\"cubic-bezier(.4,0,.22,1)\";class k{constructor(t){var i;this.props=t;const{target:s,onComplete:h,transform:e,onFinish:n=(()=>{}),duration:o=333,easing:r=L}=t;this.onFinish=n;const l=e?\"transform\":\"opacity\",c=null!==(i=t[l])&&void 0!==i?i:\"\";this.ft=s,this.wt=h,this.gt=!1,this.yt=this.yt.bind(this),this._t=setTimeout((()=>{a(s,l,o,r),this._t=setTimeout((()=>{s.addEventListener(\"transitionend\",this.yt,!1),s.addEventListener(\"transitioncancel\",this.yt,!1),this._t=setTimeout((()=>{this.xt()}),o+500),s.style[l]=c}),30)}),0)}yt(t){t.target===this.ft&&this.xt()}xt(){this.gt||(this.gt=!0,this.onFinish(),this.wt&&this.wt())}destroy(){this._t&&clearTimeout(this._t),a(this.ft),this.ft.removeEventListener(\"transitionend\",this.yt,!1),this.ft.removeEventListener(\"transitioncancel\",this.yt,!1),this.gt||this.xt()}}class Z{constructor(t,i,s){this.velocity=1e3*t,this.bt=i||.75,this.St=s||12,this.zt=this.St,this.bt<1&&(this.zt*=Math.sqrt(1-this.bt*this.bt))}easeFrame(t,i){let s,h=0;i/=1e3;const e=Math.E**(-this.bt*this.St*i);if(1===this.bt)s=this.velocity+this.St*t,h=(t+s*i)*e,this.velocity=h*-this.St+s*e;else if(this.bt<1){s=1/this.zt*(this.bt*this.St*t+this.velocity);const n=Math.cos(this.zt*i),o=Math.sin(this.zt*i);h=e*(t*n+s*o),this.velocity=h*-this.St*this.bt+e*(-this.zt*t*o+this.zt*s*n)}return h}}class B{constructor(t){this.props=t,this.Mt=0;const{start:i,end:s,velocity:h,onUpdate:e,onComplete:n,onFinish:o=(()=>{}),dampingRatio:r,naturalFrequency:a}=t;this.onFinish=o;const l=new Z(h,r,a);let c=Date.now(),d=i-s;const u=()=>{this.Mt&&(d=l.easeFrame(d,Date.now()-c),Math.abs(d)<1&&Math.abs(l.velocity)<50?(e(s),n&&n(),this.onFinish()):(c=Date.now(),e(d+s),this.Mt=requestAnimationFrame(u)))};this.Mt=requestAnimationFrame(u)}destroy(){this.Mt>=0&&cancelAnimationFrame(this.Mt),this.Mt=0}}class F{constructor(){this.activeAnimations=[]}startSpring(t){this.Pt(t,!0)}startTransition(t){this.Pt(t)}Pt(t,i){const s=i?new B(t):new k(t);return this.activeAnimations.push(s),s.onFinish=()=>this.stop(s),s}stop(t){t.destroy();const i=this.activeAnimations.indexOf(t);i>-1&&this.activeAnimations.splice(i,1)}stopAll(){this.activeAnimations.forEach((t=>{t.destroy()})),this.activeAnimations=[]}stopAllPan(){this.activeAnimations=this.activeAnimations.filter((t=>!t.props.isPan||(t.destroy(),!1)))}stopMainScroll(){this.activeAnimations=this.activeAnimations.filter((t=>!t.props.isMainScroll||(t.destroy(),!1)))}isPanRunning(){return this.activeAnimations.some((t=>t.props.isPan))}}class O{constructor(t){this.pswp=t,t.events.add(t.element,\"wheel\",this.Ct.bind(this))}Ct(t){t.preventDefault();const{currSlide:i}=this.pswp;let{deltaX:s,deltaY:h}=t;if(i&&!this.pswp.dispatch(\"wheel\",{originalEvent:t}).defaultPrevented)if(t.ctrlKey||this.pswp.options.wheelToZoom){if(i.isZoomable()){let s=-h;1===t.deltaMode?s*=.05:s*=t.deltaMode?1:.002,s=2**s;const e=i.currZoomLevel*s;i.zoomTo(e,{x:t.clientX,y:t.clientY})}}else i.isPannable()&&(1===t.deltaMode&&(s*=18,h*=18),i.panTo(i.pan.x-s,i.pan.y-h))}}class R{constructor(i,s){var h;const e=s.name||s.className;let n=s.html;if(!1===i.options[e])return;\"string\"==typeof i.options[e+\"SVG\"]&&(n=i.options[e+\"SVG\"]),i.dispatch(\"uiElementCreate\",{data:s});let o=\"\";s.isButton?(o+=\"pswp__button \",o+=s.className||`pswp__button--${s.name}`):o+=s.className||`pswp__${s.name}`;let r=s.isButton?s.tagName||\"button\":s.tagName||\"div\";r=r.toLowerCase();const a=t(o,r);if(s.isButton){\"button\"===r&&(a.type=\"button\");let{title:t}=s;const{ariaLabel:h}=s;\"string\"==typeof i.options[e+\"Title\"]&&(t=i.options[e+\"Title\"]),t&&(a.title=t);const n=h||t;n&&a.setAttribute(\"aria-label\",n)}a.innerHTML=function(t){if(\"string\"==typeof t)return t;if(!t||!t.isCustomSVG)return\"\";const i=t;let s='<svg aria-hidden=\"true\" class=\"pswp__icn\" viewBox=\"0 0 %d %d\" width=\"%d\" height=\"%d\">';return s=s.split(\"%d\").join(i.size||32),i.outlineID&&(s+='<use class=\"pswp__icn-shadow\" xlink:href=\"#'+i.outlineID+'\"/>'),s+=i.inner,s+=\"</svg>\",s}(n),s.onInit&&s.onInit(a,i),s.onClick&&(a.onclick=t=>{\"string\"==typeof s.onClick?i[s.onClick]():\"function\"==typeof s.onClick&&s.onClick(t,a,i)});const l=s.appendTo||\"bar\";let c=i.element;\"bar\"===l?(i.topBar||(i.topBar=t(\"pswp__top-bar pswp__hide-on-close\",\"div\",i.scrollWrap)),c=i.topBar):(a.classList.add(\"pswp__hide-on-close\"),\"wrapper\"===l&&(c=i.scrollWrap)),null===(h=c)||void 0===h||h.appendChild(i.applyFilters(\"uiElement\",a,s))}}function N(t,i,s){t.classList.add(\"pswp__button--arrow\"),t.setAttribute(\"aria-controls\",\"pswp__items\"),i.on(\"change\",(()=>{i.options.loop||(t.disabled=s?!(i.currIndex<i.getNumItems()-1):!(i.currIndex>0))}))}const U={name:\"arrowPrev\",className:\"pswp__button--arrow--prev\",title:\"Previous\",order:10,isButton:!0,appendTo:\"wrapper\",html:{isCustomSVG:!0,size:60,inner:'<path d=\"M29 43l-3 3-16-16 16-16 3 3-13 13 13 13z\" id=\"pswp__icn-arrow\"/>',outlineID:\"pswp__icn-arrow\"},onClick:\"prev\",onInit:N},V={name:\"arrowNext\",className:\"pswp__button--arrow--next\",title:\"Next\",order:11,isButton:!0,appendTo:\"wrapper\",html:{isCustomSVG:!0,size:60,inner:'<use xlink:href=\"#pswp__icn-arrow\"/>',outlineID:\"pswp__icn-arrow\"},onClick:\"next\",onInit:(t,i)=>{N(t,i,!0)}},G={name:\"close\",title:\"Close\",order:20,isButton:!0,html:{isCustomSVG:!0,inner:'<path d=\"M24 10l-2-2-6 6-6-6-2 2 6 6-6 6 2 2 6-6 6 6 2-2-6-6z\" id=\"pswp__icn-close\"/>',outlineID:\"pswp__icn-close\"},onClick:\"close\"},$={name:\"zoom\",title:\"Zoom\",order:10,isButton:!0,html:{isCustomSVG:!0,inner:'<path d=\"M17.426 19.926a6 6 0 1 1 1.5-1.5L23 22.5 21.5 24l-4.074-4.074z\" id=\"pswp__icn-zoom\"/><path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-h\" d=\"M11 16v-2h6v2z\"/><path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-v\" d=\"M13 12h2v6h-2z\"/>',outlineID:\"pswp__icn-zoom\"},onClick:\"toggleZoom\"},q={name:\"preloader\",appendTo:\"bar\",order:7,html:{isCustomSVG:!0,inner:'<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M21.2 16a5.2 5.2 0 1 1-5.2-5.2V8a8 8 0 1 0 8 8h-2.8Z\" id=\"pswp__icn-loading\"/>',outlineID:\"pswp__icn-loading\"},onInit:(t,i)=>{let s,h=null;const e=i=>{var h,e;s!==i&&(s=i,h=\"active\",e=i,t.classList.toggle(\"pswp__preloader--\"+h,e))},n=()=>{var t;if(null===(t=i.currSlide)||void 0===t||!t.content.isLoading())return e(!1),void(h&&(clearTimeout(h),h=null));h||(h=setTimeout((()=>{var t;e(Boolean(null===(t=i.currSlide)||void 0===t?void 0:t.content.isLoading())),h=null}),i.options.preloaderDelay))};i.on(\"change\",n),i.on(\"loadComplete\",(t=>{i.currSlide===t.slide&&n()})),i.ui&&(i.ui.updatePreloaderVisibility=n)}},H={name:\"counter\",order:5,onInit:(t,i)=>{i.on(\"change\",(()=>{t.innerText=i.currIndex+1+i.options.indexIndicatorSep+i.getNumItems()}))}};function K(t,i){t.classList.toggle(\"pswp--zoomed-in\",i)}class W{constructor(t){this.pswp=t,this.isRegistered=!1,this.uiElementsData=[],this.items=[],this.updatePreloaderVisibility=()=>{},this.Tt=void 0}init(){const{pswp:t}=this;this.isRegistered=!1,this.uiElementsData=[G,U,V,$,q,H],t.dispatch(\"uiRegister\"),this.uiElementsData.sort(((t,i)=>(t.order||0)-(i.order||0))),this.items=[],this.isRegistered=!0,this.uiElementsData.forEach((t=>{this.registerElement(t)})),t.on(\"change\",(()=>{var i;null===(i=t.element)||void 0===i||i.classList.toggle(\"pswp--one-slide\",1===t.getNumItems())})),t.on(\"zoomPanUpdate\",(()=>this.At()))}registerElement(t){this.isRegistered?this.items.push(new R(this.pswp,t)):this.uiElementsData.push(t)}At(){const{template:t,currSlide:i,options:s}=this.pswp;if(this.pswp.opener.isClosing||!t||!i)return;let{currZoomLevel:h}=i;if(this.pswp.opener.isOpen||(h=i.zoomLevels.initial),h===this.Tt)return;this.Tt=h;const e=i.zoomLevels.initial-i.zoomLevels.secondary;if(Math.abs(e)<.01||!i.isZoomable())return K(t,!1),void t.classList.remove(\"pswp--zoom-allowed\");t.classList.add(\"pswp--zoom-allowed\");K(t,(h===i.zoomLevels.initial?i.zoomLevels.secondary:i.zoomLevels.initial)<=h),\"zoom\"!==s.imageClickAction&&\"zoom-or-close\"!==s.imageClickAction||t.classList.add(\"pswp--click-to-zoom\")}}class j{constructor(t,i){this.type=t,this.defaultPrevented=!1,i&&Object.assign(this,i)}preventDefault(){this.defaultPrevented=!0}}class X{constructor(i,s){if(this.element=t(\"pswp__img pswp__img--placeholder\",i?\"img\":\"div\",s),i){const t=this.element;t.decoding=\"async\",t.alt=\"\",t.src=i,t.setAttribute(\"role\",\"presentation\")}this.element.setAttribute(\"aria-hidden\",\"true\")}setDisplayedSize(t,i){this.element&&(\"IMG\"===this.element.tagName?(l(this.element,250,\"auto\"),this.element.style.transformOrigin=\"0 0\",this.element.style.transform=o(0,0,t/250)):l(this.element,t,i))}destroy(){var t;null!==(t=this.element)&&void 0!==t&&t.parentNode&&this.element.remove(),this.element=null}}class Y{constructor(t,i,s){this.instance=i,this.data=t,this.index=s,this.element=void 0,this.placeholder=void 0,this.slide=void 0,this.displayedImageWidth=0,this.displayedImageHeight=0,this.width=Number(this.data.w)||Number(this.data.width)||0,this.height=Number(this.data.h)||Number(this.data.height)||0,this.isAttached=!1,this.hasSlide=!1,this.isDecoding=!1,this.state=c,this.data.type?this.type=this.data.type:this.data.src?this.type=\"image\":this.type=\"html\",this.instance.dispatch(\"contentInit\",{content:this})}removePlaceholder(){this.placeholder&&!this.keepPlaceholder()&&setTimeout((()=>{this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0)}),1e3)}load(i,s){if(this.slide&&this.usePlaceholder())if(this.placeholder){const t=this.placeholder.element;t&&!t.parentElement&&this.slide.container.prepend(t)}else{const t=this.instance.applyFilters(\"placeholderSrc\",!(!this.data.msrc||!this.slide.isFirstSlide)&&this.data.msrc,this);this.placeholder=new X(t,this.slide.container)}this.element&&!s||this.instance.dispatch(\"contentLoad\",{content:this,isLazy:i}).defaultPrevented||(this.isImageContent()?(this.element=t(\"pswp__img\",\"img\"),this.displayedImageWidth&&this.loadImage(i)):(this.element=t(\"pswp__content\",\"div\"),this.element.innerHTML=this.data.html||\"\"),s&&this.slide&&this.slide.updateContentSize(!0))}loadImage(t){var i,s;if(!this.isImageContent()||!this.element||this.instance.dispatch(\"contentLoadImage\",{content:this,isLazy:t}).defaultPrevented)return;const h=this.element;this.updateSrcsetSizes(),this.data.srcset&&(h.srcset=this.data.srcset),h.src=null!==(i=this.data.src)&&void 0!==i?i:\"\",h.alt=null!==(s=this.data.alt)&&void 0!==s?s:\"\",this.state=d,h.complete?this.onLoaded():(h.onload=()=>{this.onLoaded()},h.onerror=()=>{this.onError()})}setSlide(t){this.slide=t,this.hasSlide=!0,this.instance=t.pswp}onLoaded(){this.state=u,this.slide&&this.element&&(this.instance.dispatch(\"loadComplete\",{slide:this.slide,content:this}),this.slide.isActive&&this.slide.heavyAppended&&!this.element.parentNode&&(this.append(),this.slide.updateContentSize(!0)),this.state!==u&&this.state!==p||this.removePlaceholder())}onError(){this.state=p,this.slide&&(this.displayError(),this.instance.dispatch(\"loadComplete\",{slide:this.slide,isError:!0,content:this}),this.instance.dispatch(\"loadError\",{slide:this.slide,content:this}))}isLoading(){return this.instance.applyFilters(\"isContentLoading\",this.state===d,this)}isError(){return this.state===p}isImageContent(){return\"image\"===this.type}setDisplayedSize(t,i){if(this.element&&(this.placeholder&&this.placeholder.setDisplayedSize(t,i),!this.instance.dispatch(\"contentResize\",{content:this,width:t,height:i}).defaultPrevented&&(l(this.element,t,i),this.isImageContent()&&!this.isError()))){const s=!this.displayedImageWidth&&t;this.displayedImageWidth=t,this.displayedImageHeight=i,s?this.loadImage(!1):this.updateSrcsetSizes(),this.slide&&this.instance.dispatch(\"imageSizeChange\",{slide:this.slide,width:t,height:i,content:this})}}isZoomable(){return this.instance.applyFilters(\"isContentZoomable\",this.isImageContent()&&this.state!==p,this)}updateSrcsetSizes(){if(!this.isImageContent()||!this.element||!this.data.srcset)return;const t=this.element,i=this.instance.applyFilters(\"srcsetSizesWidth\",this.displayedImageWidth,this);(!t.dataset.largestUsedSize||i>parseInt(t.dataset.largestUsedSize,10))&&(t.sizes=i+\"px\",t.dataset.largestUsedSize=String(i))}usePlaceholder(){return this.instance.applyFilters(\"useContentPlaceholder\",this.isImageContent(),this)}lazyLoad(){this.instance.dispatch(\"contentLazyLoad\",{content:this}).defaultPrevented||this.load(!0)}keepPlaceholder(){return this.instance.applyFilters(\"isKeepingPlaceholder\",this.isLoading(),this)}destroy(){this.hasSlide=!1,this.slide=void 0,this.instance.dispatch(\"contentDestroy\",{content:this}).defaultPrevented||(this.remove(),this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0),this.isImageContent()&&this.element&&(this.element.onload=null,this.element.onerror=null,this.element=void 0))}displayError(){if(this.slide){var i,s;let h=t(\"pswp__error-msg\",\"div\");h.innerText=null!==(i=null===(s=this.instance.options)||void 0===s?void 0:s.errorMsg)&&void 0!==i?i:\"\",h=this.instance.applyFilters(\"contentErrorElement\",h,this),this.element=t(\"pswp__content pswp__error-msg-container\",\"div\"),this.element.appendChild(h),this.slide.container.innerText=\"\",this.slide.container.appendChild(this.element),this.slide.updateContentSize(!0),this.removePlaceholder()}}append(){if(this.isAttached||!this.element)return;if(this.isAttached=!0,this.state===p)return void this.displayError();if(this.instance.dispatch(\"contentAppend\",{content:this}).defaultPrevented)return;const t=\"decode\"in this.element;this.isImageContent()?t&&this.slide&&(!this.slide.isActive||m())?(this.isDecoding=!0,this.element.decode().catch((()=>{})).finally((()=>{this.isDecoding=!1,this.appendImage()}))):this.appendImage():this.slide&&!this.element.parentNode&&this.slide.container.appendChild(this.element)}activate(){!this.instance.dispatch(\"contentActivate\",{content:this}).defaultPrevented&&this.slide&&(this.isImageContent()&&this.isDecoding&&!m()?this.appendImage():this.isError()&&this.load(!1,!0),this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"false\"))}deactivate(){this.instance.dispatch(\"contentDeactivate\",{content:this}),this.slide&&this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"true\")}remove(){this.isAttached=!1,this.instance.dispatch(\"contentRemove\",{content:this}).defaultPrevented||(this.element&&this.element.parentNode&&this.element.remove(),this.placeholder&&this.placeholder.element&&this.placeholder.element.remove())}appendImage(){this.isAttached&&(this.instance.dispatch(\"contentAppendImage\",{content:this}).defaultPrevented||(this.slide&&this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element),this.state!==u&&this.state!==p||this.removePlaceholder()))}}function J(t,i,s){const h=i.createContentFromData(t,s);let e;const{options:n}=i;if(n){let o;e=new x(n,t,-1),o=i.pswp?i.pswp.viewportSize:w(n,i);const r=y(n,o,t,s);e.update(h.width,h.height,r)}return h.lazyLoad(),e&&h.setDisplayedSize(Math.ceil(h.width*e.initial),Math.ceil(h.height*e.initial)),h}class Q{constructor(t){this.pswp=t,this.limit=Math.max(t.options.preload[0]+t.options.preload[1]+1,5),this.Dt=[]}updateLazy(t){const{pswp:i}=this;if(i.dispatch(\"lazyLoad\").defaultPrevented)return;const{preload:s}=i.options,h=void 0===t||t>=0;let e;for(e=0;e<=s[1];e++)this.loadSlideByIndex(i.currIndex+(h?e:-e));for(e=1;e<=s[0];e++)this.loadSlideByIndex(i.currIndex+(h?-e:e))}loadSlideByIndex(t){const i=this.pswp.getLoopedIndex(t);let s=this.getContentByIndex(i);s||(s=function(t,i){const s=i.getItemData(t);if(!i.dispatch(\"lazyLoadSlide\",{index:t,itemData:s}).defaultPrevented)return J(s,i,t)}(i,this.pswp),s&&this.addToCache(s))}getContentBySlide(t){let i=this.getContentByIndex(t.index);return i||(i=this.pswp.createContentFromData(t.data,t.index),this.addToCache(i)),i.setSlide(t),i}addToCache(t){if(this.removeByIndex(t.index),this.Dt.push(t),this.Dt.length>this.limit){const t=this.Dt.findIndex((t=>!t.isAttached&&!t.hasSlide));if(-1!==t){this.Dt.splice(t,1)[0].destroy()}}}removeByIndex(t){const i=this.Dt.findIndex((i=>i.index===t));-1!==i&&this.Dt.splice(i,1)}getContentByIndex(t){return this.Dt.find((i=>i.index===t))}destroy(){this.Dt.forEach((t=>t.destroy())),this.Dt=[]}}const tt=.003;class it{constructor(t){this.pswp=t,this.isClosed=!0,this.isOpen=!1,this.isClosing=!1,this.isOpening=!1,this.It=void 0,this.Et=!1,this.Lt=!1,this.kt=!1,this.Zt=!1,this.Bt=void 0,this.Ft=void 0,this.Ot=void 0,this.Rt=void 0,this.Nt=void 0,this.Ut=this.Ut.bind(this),t.on(\"firstZoomPan\",this.Ut)}open(){this.Ut(),this.Pt()}close(){if(this.isClosed||this.isClosing||this.isOpening)return;const t=this.pswp.currSlide;this.isOpen=!1,this.isOpening=!1,this.isClosing=!0,this.It=this.pswp.options.hideAnimationDuration,t&&t.currZoomLevel*t.width>=this.pswp.options.maxWidthToAnimate&&(this.It=0),this.Vt(),setTimeout((()=>{this.Pt()}),this.Lt?30:0)}Ut(){if(this.pswp.off(\"firstZoomPan\",this.Ut),!this.isOpening){const t=this.pswp.currSlide;this.isOpening=!0,this.isClosing=!1,this.It=this.pswp.options.showAnimationDuration,t&&t.zoomLevels.initial*t.width>=this.pswp.options.maxWidthToAnimate&&(this.It=0),this.Vt()}}Vt(){const{pswp:t}=this,i=this.pswp.currSlide,{options:s}=t;var h,e;(\"fade\"===s.showHideAnimationType?(s.showHideOpacity=!0,this.Nt=void 0):\"none\"===s.showHideAnimationType?(s.showHideOpacity=!1,this.It=0,this.Nt=void 0):this.isOpening&&t.Gt?this.Nt=t.Gt:this.Nt=this.pswp.getThumbBounds(),this.Bt=null==i?void 0:i.getPlaceholderElement(),t.animations.stopAll(),this.Et=Boolean(this.It&&this.It>50),this.$t=Boolean(this.Nt)&&(null==i?void 0:i.content.usePlaceholder())&&(!this.isClosing||!t.mainScroll.isShifted()),this.$t)?this.kt=null!==(h=s.showHideOpacity)&&void 0!==h&&h:(this.kt=!0,this.isOpening&&i&&(i.zoomAndPanToInitial(),i.applyCurrentZoomPan()));if(this.Zt=!this.kt&&this.pswp.options.bgOpacity>tt,this.Ft=this.kt?t.element:t.bg,!this.Et)return this.It=0,this.$t=!1,this.Zt=!1,this.kt=!0,void(this.isOpening&&(t.element&&(t.element.style.opacity=String(tt)),t.applyBgOpacity(1)));this.$t&&this.Nt&&this.Nt.innerRect?(this.Lt=!0,this.Ot=this.pswp.container,this.Rt=null===(e=this.pswp.currSlide)||void 0===e?void 0:e.holderElement,t.container&&(t.container.style.overflow=\"hidden\",t.container.style.width=t.viewportSize.x+\"px\")):this.Lt=!1;this.isOpening?(this.kt?(t.element&&(t.element.style.opacity=String(tt)),t.applyBgOpacity(1)):(this.Zt&&t.bg&&(t.bg.style.opacity=String(tt)),t.element&&(t.element.style.opacity=\"1\")),this.$t&&(this.qt(),this.Bt&&(this.Bt.style.willChange=\"transform\",this.Bt.style.opacity=String(tt)))):this.isClosing&&(t.mainScroll.itemHolders[0]&&(t.mainScroll.itemHolders[0].el.style.display=\"none\"),t.mainScroll.itemHolders[2]&&(t.mainScroll.itemHolders[2].el.style.display=\"none\"),this.Lt&&0!==t.mainScroll.x&&(t.mainScroll.resetPosition(),t.mainScroll.resize()))}Pt(){this.isOpening&&this.Et&&this.Bt&&\"IMG\"===this.Bt.tagName?new Promise((t=>{let i=!1,s=!0;var h;(h=this.Bt,\"decode\"in h?h.decode().catch((()=>{})):h.complete?Promise.resolve(h):new Promise(((t,i)=>{h.onload=()=>t(h),h.onerror=i}))).finally((()=>{i=!0,s||t(!0)})),setTimeout((()=>{s=!1,i&&t(!0)}),50),setTimeout(t,250)})).finally((()=>this.Ht())):this.Ht()}Ht(){var t,i;null===(t=this.pswp.element)||void 0===t||t.style.setProperty(\"--pswp-transition-duration\",this.It+\"ms\"),this.pswp.dispatch(this.isOpening?\"openingAnimationStart\":\"closingAnimationStart\"),this.pswp.dispatch(\"initialZoom\"+(this.isOpening?\"In\":\"Out\")),null===(i=this.pswp.element)||void 0===i||i.classList.toggle(\"pswp--ui-visible\",this.isOpening),this.isOpening?(this.Bt&&(this.Bt.style.opacity=\"1\"),this.Kt()):this.isClosing&&this.Wt(),this.Et||this.jt()}jt(){const{pswp:t}=this;if(this.isOpen=this.isOpening,this.isClosed=this.isClosing,this.isOpening=!1,this.isClosing=!1,t.dispatch(this.isOpen?\"openingAnimationEnd\":\"closingAnimationEnd\"),t.dispatch(\"initialZoom\"+(this.isOpen?\"InEnd\":\"OutEnd\")),this.isClosed)t.destroy();else if(this.isOpen){var i;this.$t&&t.container&&(t.container.style.overflow=\"visible\",t.container.style.width=\"100%\"),null===(i=t.currSlide)||void 0===i||i.applyCurrentZoomPan()}}Kt(){const{pswp:t}=this;this.$t&&(this.Lt&&this.Ot&&this.Rt&&(this.Xt(this.Ot,\"transform\",\"translate3d(0,0,0)\"),this.Xt(this.Rt,\"transform\",\"none\")),t.currSlide&&(t.currSlide.zoomAndPanToInitial(),this.Xt(t.currSlide.container,\"transform\",t.currSlide.getCurrentTransform()))),this.Zt&&t.bg&&this.Xt(t.bg,\"opacity\",String(t.options.bgOpacity)),this.kt&&t.element&&this.Xt(t.element,\"opacity\",\"1\")}Wt(){const{pswp:t}=this;this.$t&&this.qt(!0),this.Zt&&t.bgOpacity>.01&&t.bg&&this.Xt(t.bg,\"opacity\",\"0\"),this.kt&&t.element&&this.Xt(t.element,\"opacity\",\"0\")}qt(t){if(!this.Nt)return;const{pswp:s}=this,{innerRect:h}=this.Nt,{currSlide:e,viewportSize:n}=s;if(this.Lt&&h&&this.Ot&&this.Rt){const i=-n.x+(this.Nt.x-h.x)+h.w,s=-n.y+(this.Nt.y-h.y)+h.h,e=n.x-h.w,a=n.y-h.h;t?(this.Xt(this.Ot,\"transform\",o(i,s)),this.Xt(this.Rt,\"transform\",o(e,a))):(r(this.Ot,i,s),r(this.Rt,e,a))}e&&(i(e.pan,h||this.Nt),e.currZoomLevel=this.Nt.w/e.width,t?this.Xt(e.container,\"transform\",e.getCurrentTransform()):e.applyCurrentZoomPan())}Xt(t,i,s){if(!this.It)return void(t.style[i]=s);const{animations:h}=this.pswp,e={duration:this.It,easing:this.pswp.options.easing,onComplete:()=>{h.activeAnimations.length||this.jt()},target:t};e[i]=s,h.startTransition(e)}}const st={allowPanToNext:!0,spacing:.1,loop:!0,pinchToClose:!0,closeOnVerticalDrag:!0,hideAnimationDuration:333,showAnimationDuration:333,zoomAnimationDuration:333,escKey:!0,arrowKeys:!0,trapFocus:!0,returnFocus:!0,maxWidthToAnimate:4e3,clickToCloseNonZoomable:!0,imageClickAction:\"zoom-or-close\",bgClickAction:\"close\",tapAction:\"toggle-controls\",doubleTapAction:\"zoom\",indexIndicatorSep:\" / \",preloaderDelay:2e3,bgOpacity:.8,index:0,errorMsg:\"The image cannot be loaded\",preload:[1,2],easing:\"cubic-bezier(.4,0,.22,1)\"};return class extends class extends class{constructor(){this.Yt={},this.Jt={},this.pswp=void 0,this.options=void 0}addFilter(t,i,s=100){var h,e,n;this.Jt[t]||(this.Jt[t]=[]),null===(h=this.Jt[t])||void 0===h||h.push({fn:i,priority:s}),null===(e=this.Jt[t])||void 0===e||e.sort(((t,i)=>t.priority-i.priority)),null===(n=this.pswp)||void 0===n||n.addFilter(t,i,s)}removeFilter(t,i){this.Jt[t]&&(this.Jt[t]=this.Jt[t].filter((t=>t.fn!==i))),this.pswp&&this.pswp.removeFilter(t,i)}applyFilters(t,...i){var s;return null===(s=this.Jt[t])||void 0===s||s.forEach((t=>{i[0]=t.fn.apply(this,i)})),i[0]}on(t,i){var s,h;this.Yt[t]||(this.Yt[t]=[]),null===(s=this.Yt[t])||void 0===s||s.push(i),null===(h=this.pswp)||void 0===h||h.on(t,i)}off(t,i){var s;this.Yt[t]&&(this.Yt[t]=this.Yt[t].filter((t=>i!==t))),null===(s=this.pswp)||void 0===s||s.off(t,i)}dispatch(t,i){var s;if(this.pswp)return this.pswp.dispatch(t,i);const h=new j(t,i);return null===(s=this.Yt[t])||void 0===s||s.forEach((t=>{t.call(this,h)})),h}}{getNumItems(){var t;let i=0;const s=null===(t=this.options)||void 0===t?void 0:t.dataSource;s&&\"length\"in s?i=s.length:s&&\"gallery\"in s&&(s.items||(s.items=this.Qt(s.gallery)),s.items&&(i=s.items.length));const h=this.dispatch(\"numItems\",{dataSource:s,numItems:i});return this.applyFilters(\"numItems\",h.numItems,s)}createContentFromData(t,i){return new Y(t,this,i)}getItemData(t){var i;const s=null===(i=this.options)||void 0===i?void 0:i.dataSource;let h={};Array.isArray(s)?h=s[t]:s&&\"gallery\"in s&&(s.items||(s.items=this.Qt(s.gallery)),h=s.items[t]);let e=h;e instanceof Element&&(e=this.ti(e));const n=this.dispatch(\"itemData\",{itemData:e||{},index:t});return this.applyFilters(\"itemData\",n.itemData,t)}Qt(t){var i,s;return null!==(i=this.options)&&void 0!==i&&i.children||null!==(s=this.options)&&void 0!==s&&s.childSelector?function(t,i,s=document){let h=[];if(t instanceof Element)h=[t];else if(t instanceof NodeList||Array.isArray(t))h=Array.from(t);else{const e=\"string\"==typeof t?t:i;e&&(h=Array.from(s.querySelectorAll(e)))}return h}(this.options.children,this.options.childSelector,t)||[]:[t]}ti(t){const i={element:t},s=\"A\"===t.tagName?t:t.querySelector(\"a\");if(s){i.src=s.dataset.pswpSrc||s.href,s.dataset.pswpSrcset&&(i.srcset=s.dataset.pswpSrcset),i.width=s.dataset.pswpWidth?parseInt(s.dataset.pswpWidth,10):0,i.height=s.dataset.pswpHeight?parseInt(s.dataset.pswpHeight,10):0,i.w=i.width,i.h=i.height,s.dataset.pswpType&&(i.type=s.dataset.pswpType);const e=t.querySelector(\"img\");var h;if(e)i.msrc=e.currentSrc||e.src,i.alt=null!==(h=e.getAttribute(\"alt\"))&&void 0!==h?h:\"\";(s.dataset.pswpCropped||s.dataset.cropped)&&(i.thumbCropped=!0)}return this.applyFilters(\"domItemData\",i,t,s)}lazyLoadData(t,i){return J(t,this,i)}}{constructor(t){super(),this.options=this.ii(t||{}),this.offset={x:0,y:0},this.si={x:0,y:0},this.viewportSize={x:0,y:0},this.bgOpacity=1,this.currIndex=0,this.potentialIndex=0,this.isOpen=!1,this.isDestroying=!1,this.hasMouse=!1,this.hi={},this.Gt=void 0,this.topBar=void 0,this.element=void 0,this.template=void 0,this.container=void 0,this.scrollWrap=void 0,this.currSlide=void 0,this.events=new f,this.animations=new F,this.mainScroll=new A(this),this.gestures=new T(this),this.opener=new it(this),this.keyboard=new E(this),this.contentLoader=new Q(this)}init(){if(this.isOpen||this.isDestroying)return!1;this.isOpen=!0,this.dispatch(\"init\"),this.dispatch(\"beforeOpen\"),this.ei();let t=\"pswp--open\";return this.gestures.supportsTouch&&(t+=\" pswp--touch\"),this.options.mainClass&&(t+=\" \"+this.options.mainClass),this.element&&(this.element.className+=\" \"+t),this.currIndex=this.options.index||0,this.potentialIndex=this.currIndex,this.dispatch(\"firstUpdate\"),this.scrollWheel=new O(this),(Number.isNaN(this.currIndex)||this.currIndex<0||this.currIndex>=this.getNumItems())&&(this.currIndex=0),this.gestures.supportsTouch||this.mouseDetected(),this.updateSize(),this.offset.y=window.pageYOffset,this.hi=this.getItemData(this.currIndex),this.dispatch(\"gettingData\",{index:this.currIndex,data:this.hi,slide:void 0}),this.Gt=this.getThumbBounds(),this.dispatch(\"initialLayout\"),this.on(\"openingAnimationEnd\",(()=>{const{itemHolders:t}=this.mainScroll;t[0]&&(t[0].el.style.display=\"block\",this.setContent(t[0],this.currIndex-1)),t[2]&&(t[2].el.style.display=\"block\",this.setContent(t[2],this.currIndex+1)),this.appendHeavy(),this.contentLoader.updateLazy(),this.events.add(window,\"resize\",this.ni.bind(this)),this.events.add(window,\"scroll\",this.oi.bind(this)),this.dispatch(\"bindEvents\")})),this.mainScroll.itemHolders[1]&&this.setContent(this.mainScroll.itemHolders[1],this.currIndex),this.dispatch(\"change\"),this.opener.open(),this.dispatch(\"afterInit\"),!0}getLoopedIndex(t){const i=this.getNumItems();return this.options.loop&&(t>i-1&&(t-=i),t<0&&(t+=i)),n(t,0,i-1)}appendHeavy(){this.mainScroll.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.appendHeavy()}))}goTo(t){this.mainScroll.moveIndexBy(this.getLoopedIndex(t)-this.potentialIndex)}next(){this.goTo(this.potentialIndex+1)}prev(){this.goTo(this.potentialIndex-1)}zoomTo(...t){var i;null===(i=this.currSlide)||void 0===i||i.zoomTo(...t)}toggleZoom(){var t;null===(t=this.currSlide)||void 0===t||t.toggleZoom()}close(){this.opener.isOpen&&!this.isDestroying&&(this.isDestroying=!0,this.dispatch(\"close\"),this.events.removeAll(),this.opener.close())}destroy(){var t;if(!this.isDestroying)return this.options.showHideAnimationType=\"none\",void this.close();this.dispatch(\"destroy\"),this.Yt={},this.scrollWrap&&(this.scrollWrap.ontouchmove=null,this.scrollWrap.ontouchend=null),null===(t=this.element)||void 0===t||t.remove(),this.mainScroll.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.destroy()})),this.contentLoader.destroy(),this.events.removeAll()}refreshSlideContent(t){this.contentLoader.removeByIndex(t),this.mainScroll.itemHolders.forEach(((i,s)=>{var h,e;let n=(null!==(h=null===(e=this.currSlide)||void 0===e?void 0:e.index)&&void 0!==h?h:0)-1+s;var o;(this.canLoop()&&(n=this.getLoopedIndex(n)),n===t)&&(this.setContent(i,t,!0),1===s&&(this.currSlide=i.slide,null===(o=i.slide)||void 0===o||o.setIsActive(!0)))})),this.dispatch(\"change\")}setContent(t,i,s){if(this.canLoop()&&(i=this.getLoopedIndex(i)),t.slide){if(t.slide.index===i&&!s)return;t.slide.destroy(),t.slide=void 0}if(!this.canLoop()&&(i<0||i>=this.getNumItems()))return;const h=this.getItemData(i);t.slide=new b(h,i,this),i===this.currIndex&&(this.currSlide=t.slide),t.slide.append(t.el)}getViewportCenterPoint(){return{x:this.viewportSize.x/2,y:this.viewportSize.y/2}}updateSize(t){if(this.isDestroying)return;const s=w(this.options,this);!t&&e(s,this.si)||(i(this.si,s),this.dispatch(\"beforeResize\"),i(this.viewportSize,this.si),this.oi(),this.dispatch(\"viewportSize\"),this.mainScroll.resize(this.opener.isOpen),!this.hasMouse&&window.matchMedia(\"(any-hover: hover)\").matches&&this.mouseDetected(),this.dispatch(\"resize\"))}applyBgOpacity(t){this.bgOpacity=Math.max(t,0),this.bg&&(this.bg.style.opacity=String(this.bgOpacity*this.options.bgOpacity))}mouseDetected(){var t;this.hasMouse||(this.hasMouse=!0,null===(t=this.element)||void 0===t||t.classList.add(\"pswp--has_mouse\"))}ni(){this.updateSize(),/iPhone|iPad|iPod/i.test(window.navigator.userAgent)&&setTimeout((()=>{this.updateSize()}),500)}oi(){this.setScrollOffset(0,window.pageYOffset)}setScrollOffset(t,i){this.offset.x=t,this.offset.y=i,this.dispatch(\"updateScrollOffset\")}ei(){this.element=t(\"pswp\",\"div\"),this.element.setAttribute(\"tabindex\",\"-1\"),this.element.setAttribute(\"role\",\"dialog\"),this.template=this.element,this.bg=t(\"pswp__bg\",\"div\",this.element),this.scrollWrap=t(\"pswp__scroll-wrap\",\"section\",this.element),this.container=t(\"pswp__container\",\"div\",this.scrollWrap),this.scrollWrap.setAttribute(\"aria-roledescription\",\"carousel\"),this.container.setAttribute(\"aria-live\",\"off\"),this.container.setAttribute(\"id\",\"pswp__items\"),this.mainScroll.appendHolders(),this.ui=new W(this),this.ui.init(),(this.options.appendToEl||document.body).appendChild(this.element)}getThumbBounds(){return function(t,i,s){const h=s.dispatch(\"thumbBounds\",{index:t,itemData:i,instance:s});if(h.thumbBounds)return h.thumbBounds;const{element:e}=i;let n,o;if(e&&!1!==s.options.thumbSelector){const t=s.options.thumbSelector||\"img\";o=e.matches(t)?e:e.querySelector(t)}return o=s.applyFilters(\"thumbEl\",o,i,t),o&&(n=i.thumbCropped?function(t,i,s){const h=t.getBoundingClientRect(),e=h.width/i,n=h.height/s,o=e>n?e:n,r=(h.width-i*o)/2,a=(h.height-s*o)/2,l={x:h.left+r,y:h.top+a,w:i*o};return l.innerRect={w:h.width,h:h.height,x:r,y:a},l}(o,i.width||i.w||0,i.height||i.h||0):function(t){const i=t.getBoundingClientRect();return{x:i.left,y:i.top,w:i.width}}(o)),s.applyFilters(\"thumbBounds\",n,i,t)}(this.currIndex,this.currSlide?this.currSlide.data:this.hi,this)}canLoop(){return this.options.loop&&this.getNumItems()>2}ii(t){return window.matchMedia(\"(prefers-reduced-motion), (update: slow)\").matches&&(t.showHideAnimationType=\"none\",t.zoomAnimationDuration=0),{...st,...t}}}}));\n","/*!\n  * PhotoSwipe Lightbox 5.4.4 - https://photoswipe.com\n  * (c) 2024 Dmytro Semenov\n  */\n!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).PhotoSwipeLightbox=i()}(this,(function(){\"use strict\";function t(t,i,s){const h=document.createElement(i);return t&&(h.className=t),s&&s.appendChild(h),h}function i(t,i,s){t.style.width=\"number\"==typeof i?`${i}px`:i,t.style.height=\"number\"==typeof s?`${s}px`:s}const s=\"idle\",h=\"loading\",e=\"loaded\",n=\"error\";function o(t,i,s=document){let h=[];if(t instanceof Element)h=[t];else if(t instanceof NodeList||Array.isArray(t))h=Array.from(t);else{const e=\"string\"==typeof t?t:i;e&&(h=Array.from(s.querySelectorAll(e)))}return h}function r(){return!(!navigator.vendor||!navigator.vendor.match(/apple/i))}class l{constructor(t,i){this.type=t,this.defaultPrevented=!1,i&&Object.assign(this,i)}preventDefault(){this.defaultPrevented=!0}}class a{constructor(i,s){if(this.element=t(\"pswp__img pswp__img--placeholder\",i?\"img\":\"div\",s),i){const t=this.element;t.decoding=\"async\",t.alt=\"\",t.src=i,t.setAttribute(\"role\",\"presentation\")}this.element.setAttribute(\"aria-hidden\",\"true\")}setDisplayedSize(t,s){this.element&&(\"IMG\"===this.element.tagName?(i(this.element,250,\"auto\"),this.element.style.transformOrigin=\"0 0\",this.element.style.transform=function(t,i,s){let h=`translate3d(${t}px,${i||0}px,0)`;return void 0!==s&&(h+=` scale3d(${s},${s},1)`),h}(0,0,t/250)):i(this.element,t,s))}destroy(){var t;null!==(t=this.element)&&void 0!==t&&t.parentNode&&this.element.remove(),this.element=null}}class d{constructor(t,i,h){this.instance=i,this.data=t,this.index=h,this.element=void 0,this.placeholder=void 0,this.slide=void 0,this.displayedImageWidth=0,this.displayedImageHeight=0,this.width=Number(this.data.w)||Number(this.data.width)||0,this.height=Number(this.data.h)||Number(this.data.height)||0,this.isAttached=!1,this.hasSlide=!1,this.isDecoding=!1,this.state=s,this.data.type?this.type=this.data.type:this.data.src?this.type=\"image\":this.type=\"html\",this.instance.dispatch(\"contentInit\",{content:this})}removePlaceholder(){this.placeholder&&!this.keepPlaceholder()&&setTimeout((()=>{this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0)}),1e3)}load(i,s){if(this.slide&&this.usePlaceholder())if(this.placeholder){const t=this.placeholder.element;t&&!t.parentElement&&this.slide.container.prepend(t)}else{const t=this.instance.applyFilters(\"placeholderSrc\",!(!this.data.msrc||!this.slide.isFirstSlide)&&this.data.msrc,this);this.placeholder=new a(t,this.slide.container)}this.element&&!s||this.instance.dispatch(\"contentLoad\",{content:this,isLazy:i}).defaultPrevented||(this.isImageContent()?(this.element=t(\"pswp__img\",\"img\"),this.displayedImageWidth&&this.loadImage(i)):(this.element=t(\"pswp__content\",\"div\"),this.element.innerHTML=this.data.html||\"\"),s&&this.slide&&this.slide.updateContentSize(!0))}loadImage(t){var i,s;if(!this.isImageContent()||!this.element||this.instance.dispatch(\"contentLoadImage\",{content:this,isLazy:t}).defaultPrevented)return;const e=this.element;this.updateSrcsetSizes(),this.data.srcset&&(e.srcset=this.data.srcset),e.src=null!==(i=this.data.src)&&void 0!==i?i:\"\",e.alt=null!==(s=this.data.alt)&&void 0!==s?s:\"\",this.state=h,e.complete?this.onLoaded():(e.onload=()=>{this.onLoaded()},e.onerror=()=>{this.onError()})}setSlide(t){this.slide=t,this.hasSlide=!0,this.instance=t.pswp}onLoaded(){this.state=e,this.slide&&this.element&&(this.instance.dispatch(\"loadComplete\",{slide:this.slide,content:this}),this.slide.isActive&&this.slide.heavyAppended&&!this.element.parentNode&&(this.append(),this.slide.updateContentSize(!0)),this.state!==e&&this.state!==n||this.removePlaceholder())}onError(){this.state=n,this.slide&&(this.displayError(),this.instance.dispatch(\"loadComplete\",{slide:this.slide,isError:!0,content:this}),this.instance.dispatch(\"loadError\",{slide:this.slide,content:this}))}isLoading(){return this.instance.applyFilters(\"isContentLoading\",this.state===h,this)}isError(){return this.state===n}isImageContent(){return\"image\"===this.type}setDisplayedSize(t,s){if(this.element&&(this.placeholder&&this.placeholder.setDisplayedSize(t,s),!this.instance.dispatch(\"contentResize\",{content:this,width:t,height:s}).defaultPrevented&&(i(this.element,t,s),this.isImageContent()&&!this.isError()))){const i=!this.displayedImageWidth&&t;this.displayedImageWidth=t,this.displayedImageHeight=s,i?this.loadImage(!1):this.updateSrcsetSizes(),this.slide&&this.instance.dispatch(\"imageSizeChange\",{slide:this.slide,width:t,height:s,content:this})}}isZoomable(){return this.instance.applyFilters(\"isContentZoomable\",this.isImageContent()&&this.state!==n,this)}updateSrcsetSizes(){if(!this.isImageContent()||!this.element||!this.data.srcset)return;const t=this.element,i=this.instance.applyFilters(\"srcsetSizesWidth\",this.displayedImageWidth,this);(!t.dataset.largestUsedSize||i>parseInt(t.dataset.largestUsedSize,10))&&(t.sizes=i+\"px\",t.dataset.largestUsedSize=String(i))}usePlaceholder(){return this.instance.applyFilters(\"useContentPlaceholder\",this.isImageContent(),this)}lazyLoad(){this.instance.dispatch(\"contentLazyLoad\",{content:this}).defaultPrevented||this.load(!0)}keepPlaceholder(){return this.instance.applyFilters(\"isKeepingPlaceholder\",this.isLoading(),this)}destroy(){this.hasSlide=!1,this.slide=void 0,this.instance.dispatch(\"contentDestroy\",{content:this}).defaultPrevented||(this.remove(),this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0),this.isImageContent()&&this.element&&(this.element.onload=null,this.element.onerror=null,this.element=void 0))}displayError(){if(this.slide){var i,s;let h=t(\"pswp__error-msg\",\"div\");h.innerText=null!==(i=null===(s=this.instance.options)||void 0===s?void 0:s.errorMsg)&&void 0!==i?i:\"\",h=this.instance.applyFilters(\"contentErrorElement\",h,this),this.element=t(\"pswp__content pswp__error-msg-container\",\"div\"),this.element.appendChild(h),this.slide.container.innerText=\"\",this.slide.container.appendChild(this.element),this.slide.updateContentSize(!0),this.removePlaceholder()}}append(){if(this.isAttached||!this.element)return;if(this.isAttached=!0,this.state===n)return void this.displayError();if(this.instance.dispatch(\"contentAppend\",{content:this}).defaultPrevented)return;const t=\"decode\"in this.element;this.isImageContent()?t&&this.slide&&(!this.slide.isActive||r())?(this.isDecoding=!0,this.element.decode().catch((()=>{})).finally((()=>{this.isDecoding=!1,this.appendImage()}))):this.appendImage():this.slide&&!this.element.parentNode&&this.slide.container.appendChild(this.element)}activate(){!this.instance.dispatch(\"contentActivate\",{content:this}).defaultPrevented&&this.slide&&(this.isImageContent()&&this.isDecoding&&!r()?this.appendImage():this.isError()&&this.load(!1,!0),this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"false\"))}deactivate(){this.instance.dispatch(\"contentDeactivate\",{content:this}),this.slide&&this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"true\")}remove(){this.isAttached=!1,this.instance.dispatch(\"contentRemove\",{content:this}).defaultPrevented||(this.element&&this.element.parentNode&&this.element.remove(),this.placeholder&&this.placeholder.element&&this.placeholder.element.remove())}appendImage(){this.isAttached&&(this.instance.dispatch(\"contentAppendImage\",{content:this}).defaultPrevented||(this.slide&&this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element),this.state!==e&&this.state!==n||this.removePlaceholder()))}}function c(t,i,s,h,e){let n=0;if(i.paddingFn)n=i.paddingFn(s,h,e)[t];else if(i.padding)n=i.padding[t];else{const s=\"padding\"+t[0].toUpperCase()+t.slice(1);i[s]&&(n=i[s])}return Number(n)||0}class u{constructor(t,i,s,h){this.pswp=h,this.options=t,this.itemData=i,this.index=s,this.panAreaSize=null,this.elementSize=null,this.fit=1,this.fill=1,this.vFill=1,this.initial=1,this.secondary=1,this.max=1,this.min=1}update(t,i,s){const h={x:t,y:i};this.elementSize=h,this.panAreaSize=s;const e=s.x/h.x,n=s.y/h.y;this.fit=Math.min(1,e<n?e:n),this.fill=Math.min(1,e>n?e:n),this.vFill=Math.min(1,n),this.initial=this.t(),this.secondary=this.i(),this.max=Math.max(this.initial,this.secondary,this.o()),this.min=Math.min(this.fit,this.initial,this.secondary),this.pswp&&this.pswp.dispatch(\"zoomLevelsUpdate\",{zoomLevels:this,slideData:this.itemData})}l(t){const i=t+\"ZoomLevel\",s=this.options[i];if(s)return\"function\"==typeof s?s(this):\"fill\"===s?this.fill:\"fit\"===s?this.fit:Number(s)}i(){let t=this.l(\"secondary\");return t||(t=Math.min(1,3*this.fit),this.elementSize&&t*this.elementSize.x>4e3&&(t=4e3/this.elementSize.x),t)}t(){return this.l(\"initial\")||this.fit}o(){return this.l(\"max\")||Math.max(1,4*this.fit)}}function p(t,i,s){const h=i.createContentFromData(t,s);let e;const{options:n}=i;if(n){let o;e=new u(n,t,-1),o=i.pswp?i.pswp.viewportSize:function(t,i){if(t.getViewportSizeFn){const s=t.getViewportSizeFn(t,i);if(s)return s}return{x:document.documentElement.clientWidth,y:window.innerHeight}}(n,i);const r=function(t,i,s,h){return{x:i.x-c(\"left\",t,i,s,h)-c(\"right\",t,i,s,h),y:i.y-c(\"top\",t,i,s,h)-c(\"bottom\",t,i,s,h)}}(n,o,t,s);e.update(h.width,h.height,r)}return h.lazyLoad(),e&&h.setDisplayedSize(Math.ceil(h.width*e.initial),Math.ceil(h.height*e.initial)),h}return class extends class extends class{constructor(){this.u={},this.p={},this.pswp=void 0,this.options=void 0}addFilter(t,i,s=100){var h,e,n;this.p[t]||(this.p[t]=[]),null===(h=this.p[t])||void 0===h||h.push({fn:i,priority:s}),null===(e=this.p[t])||void 0===e||e.sort(((t,i)=>t.priority-i.priority)),null===(n=this.pswp)||void 0===n||n.addFilter(t,i,s)}removeFilter(t,i){this.p[t]&&(this.p[t]=this.p[t].filter((t=>t.fn!==i))),this.pswp&&this.pswp.removeFilter(t,i)}applyFilters(t,...i){var s;return null===(s=this.p[t])||void 0===s||s.forEach((t=>{i[0]=t.fn.apply(this,i)})),i[0]}on(t,i){var s,h;this.u[t]||(this.u[t]=[]),null===(s=this.u[t])||void 0===s||s.push(i),null===(h=this.pswp)||void 0===h||h.on(t,i)}off(t,i){var s;this.u[t]&&(this.u[t]=this.u[t].filter((t=>i!==t))),null===(s=this.pswp)||void 0===s||s.off(t,i)}dispatch(t,i){var s;if(this.pswp)return this.pswp.dispatch(t,i);const h=new l(t,i);return null===(s=this.u[t])||void 0===s||s.forEach((t=>{t.call(this,h)})),h}}{getNumItems(){var t;let i=0;const s=null===(t=this.options)||void 0===t?void 0:t.dataSource;s&&\"length\"in s?i=s.length:s&&\"gallery\"in s&&(s.items||(s.items=this.v(s.gallery)),s.items&&(i=s.items.length));const h=this.dispatch(\"numItems\",{dataSource:s,numItems:i});return this.applyFilters(\"numItems\",h.numItems,s)}createContentFromData(t,i){return new d(t,this,i)}getItemData(t){var i;const s=null===(i=this.options)||void 0===i?void 0:i.dataSource;let h={};Array.isArray(s)?h=s[t]:s&&\"gallery\"in s&&(s.items||(s.items=this.v(s.gallery)),h=s.items[t]);let e=h;e instanceof Element&&(e=this.m(e));const n=this.dispatch(\"itemData\",{itemData:e||{},index:t});return this.applyFilters(\"itemData\",n.itemData,t)}v(t){var i,s;return null!==(i=this.options)&&void 0!==i&&i.children||null!==(s=this.options)&&void 0!==s&&s.childSelector?o(this.options.children,this.options.childSelector,t)||[]:[t]}m(t){const i={element:t},s=\"A\"===t.tagName?t:t.querySelector(\"a\");if(s){i.src=s.dataset.pswpSrc||s.href,s.dataset.pswpSrcset&&(i.srcset=s.dataset.pswpSrcset),i.width=s.dataset.pswpWidth?parseInt(s.dataset.pswpWidth,10):0,i.height=s.dataset.pswpHeight?parseInt(s.dataset.pswpHeight,10):0,i.w=i.width,i.h=i.height,s.dataset.pswpType&&(i.type=s.dataset.pswpType);const e=t.querySelector(\"img\");var h;if(e)i.msrc=e.currentSrc||e.src,i.alt=null!==(h=e.getAttribute(\"alt\"))&&void 0!==h?h:\"\";(s.dataset.pswpCropped||s.dataset.cropped)&&(i.thumbCropped=!0)}return this.applyFilters(\"domItemData\",i,t,s)}lazyLoadData(t,i){return p(t,this,i)}}{constructor(t){super(),this.options=t||{},this.g=0,this.shouldOpen=!1,this._=void 0,this.onThumbnailsClick=this.onThumbnailsClick.bind(this)}init(){o(this.options.gallery,this.options.gallerySelector).forEach((t=>{t.addEventListener(\"click\",this.onThumbnailsClick,!1)}))}onThumbnailsClick(t){if(function(t){return\"button\"in t&&1===t.button||t.ctrlKey||t.metaKey||t.altKey||t.shiftKey}(t)||window.pswp)return;let i={x:t.clientX,y:t.clientY};i.x||i.y||(i=null);let s=this.getClickedIndex(t);s=this.applyFilters(\"clickedIndex\",s,t,this);const h={gallery:t.currentTarget};s>=0&&(t.preventDefault(),this.loadAndOpen(s,h,i))}getClickedIndex(t){if(this.options.getClickedIndexFn)return this.options.getClickedIndexFn.call(this,t);const i=t.target,s=o(this.options.children,this.options.childSelector,t.currentTarget).findIndex((t=>t===i||t.contains(i)));return-1!==s?s:this.options.children||this.options.childSelector?-1:0}loadAndOpen(t,i,s){if(window.pswp||!this.options)return!1;if(!i&&this.options.gallery&&this.options.children){const t=o(this.options.gallery);t[0]&&(i={gallery:t[0]})}return this.options.index=t,this.options.initialPointerPos=s,this.shouldOpen=!0,this.preload(t,i),!0}preload(t,i){const{options:s}=this;i&&(s.dataSource=i);const h=[],e=typeof s.pswpModule;if(\"function\"==typeof(n=s.pswpModule)&&n.prototype&&n.prototype.goTo)h.push(Promise.resolve(s.pswpModule));else{if(\"string\"===e)throw new Error(\"pswpModule as string is no longer supported\");if(\"function\"!==e)throw new Error(\"pswpModule is not valid\");h.push(s.pswpModule())}var n;\"function\"==typeof s.openPromise&&h.push(s.openPromise()),!1!==s.preloadFirstSlide&&t>=0&&(this._=function(t,i){const s=i.getItemData(t);if(!i.dispatch(\"lazyLoadSlide\",{index:t,itemData:s}).defaultPrevented)return p(s,i,t)}(t,this));const o=++this.g;Promise.all(h).then((t=>{if(this.shouldOpen){const i=t[0];this.I(i,o)}}))}I(t,i){if(i!==this.g&&this.shouldOpen)return;if(this.shouldOpen=!1,window.pswp)return;const s=\"object\"==typeof t?new t.default(this.options):new t(this.options);this.pswp=s,window.pswp=s,Object.keys(this.u).forEach((t=>{var i;null===(i=this.u[t])||void 0===i||i.forEach((i=>{s.on(t,i)}))})),Object.keys(this.p).forEach((t=>{var i;null===(i=this.p[t])||void 0===i||i.forEach((i=>{s.addFilter(t,i.fn,i.priority)}))})),this._&&(s.contentLoader.addToCache(this._),this._=void 0),s.on(\"destroy\",(()=>{this.pswp=void 0,delete window.pswp})),s.init()}destroy(){var t;null===(t=this.pswp)||void 0===t||t.destroy(),this.shouldOpen=!1,this.u={},o(this.options.gallery,this.options.gallerySelector).forEach((t=>{t.removeEventListener(\"click\",this.onThumbnailsClick,!1)}))}}}));\n","var AMURL = {\n    build: function(parts) {\n        var url = parts.path;\n\n        parts.querystring = parts.querystring.replace('?', '');\n        if (parts.querystring !== '') {\n            url += '?' + parts.querystring;\n        }\n\n        parts.hash = parts.hash.replace('#', '');\n        if (parts.hash !== '') {\n            url += '#' + parts.hash;\n        }\n\n        return url;\n    },\n\n    parts: function(url) {\n        var parts = url.toString().split('#');\n        url = parts[0];\n        var hash = parts.length > 1 ? '#' + parts[1] : '';\n\n        parts = url.split('?');\n        var path = parts[0];\n        var qs   = parts.length > 1 ? parts[1] : '';\n\n        return {'path': path, 'querystring': qs, 'hash': hash};\n    },\n\n    paramsToQueryString: function(params) {\n        var pairs = [];\n        for (var key in params) {\n            var val = params[key];\n\n            if (key != '' && val != null && val != undefined && val != '') {\n                pairs.push(key + '=' + params[key]);\n            }\n        }\n\n        if (pairs.length > 0) {\n            return '?' + pairs.join('&');\n        } else {\n            return '';\n        }\n    },\n\n\n    queryStringToParams: function(queryString) {\n        if (queryString.indexOf('?') > -1) {\n            var queryString = queryString.split('?')[1];\n        }\n\n        var pairs = queryString.split('&');\n\n        params = [];\n        for (var i=0; i<pairs.length; i++) {\n            var pair = pairs[i].split('=');\n            params[pair[0]] = pair[1];\n        }\n\n        return params;\n    },\n\n    setQueryStringParam: function(queryString, key, value) {\n        var params = this.queryStringToParams(queryString);\n        params[key] = value;\n        return this.paramsToQueryString(params);\n    }\n};\n","var STATE = {\n    params: null,\n    enabled: true,\n\n    disable: function() {\n        this.enabled = false;\n    },\n\n    enable: function() {\n        this.enabled = true;\n    },\n\n    getParams: function(force) {\n        if (this.params == null || force) {\n            var query = window.location.search.substring(1);\n            this.params = AMURL.queryStringToParams(query);\n        }\n\n        return this.params;\n    },\n\n    getChanged: function() {\n        var oldParams = this.params;\n        this.getParams(true);\n        var changed = [];\n\n        if (oldParams) {\n            for (var key in this.params) {\n                if (this.params[key] != oldParams[key]) {\n                    changed[key] = this.params[key];\n                }\n            }\n\n            for (var key in oldParams) {\n                if (this.params[key] != oldParams[key]) {\n                    changed[key] = this.params[key];\n                }\n            }\n        } else {\n            changed = this.params;\n        }\n\n        return changed;\n    },\n\n    setParam: function(key, val) {\n        this.getParams();\n\n        if (val == null) {\n            delete this.params[key];\n        } else {\n            this.params[key] = val;\n        }\n\n        return this;\n    },\n\n    setState: function(state) {\n        var pair = state.split('=');\n        var key = pair[0];\n        var val = pair[1];\n\n        this.setParam(key, val);\n\n        return this;\n    },\n\n    setHash: function(hash) {\n        if (hash.indexOf('#') == -1) {\n            hash = '#' + hash;\n        }\n\n        var url = window.location.protocol + '//' + window.location.hostname + window.location.pathname + window.location.search + hash;\n\n        if (window.location != url) {\n            history.pushState({}, null, url);\n        }\n    },\n\n    getUrl: function() {\n        var url = AMURL.parts(window.location);\n        this.getParams();\n        url.querystring = AMURL.paramsToQueryString(this.params);\n\n        return url.path + url.querystring + url.hash;\n    },\n\n    pushUrl: function(url) {\n        if (this.enabled) {\n            if (url == undefined) {\n                url = this.getUrl();\n            }\n\n            if (window.location != url) {\n                history.pushState({}, null, url);\n            }\n        }\n\n        return this;\n    },\n\n    replaceUrl: function(url) {\n        if (this.enabled) {\n            if (url == undefined) {\n                url = this.getUrl();\n            }\n\n            history.replaceState({}, null, url);\n        }\n\n        return this;\n    },\n\n    getStorage: function($option, name) {\n        if ($option.hasClass('js-store_state')) {\n            return localStorage[name];\n        } else {\n            return sessionStorage[name];\n        }\n    },\n\n    save: function($option) {\n        if (!this.enabled) {\n            return;\n        }\n\n        var name  = undefined;\n        var value = undefined;\n\n\n        if ($option.data('state')) {\n            var s = $option.data('state').split('=');\n            name  = s[0];\n            value = s[1];\n\n            if ($option.hasClass('js-toggle_active')) {\n                var activate_sel = $option.data('activate');\n                var $activate    = activate_sel ? $(activate_sel) : $option;\n\n                if (!$activate.hasClass('js-is_active')) {\n                    value = undefined;\n                }\n            }\n        } else {\n            name  = $option.prop('name');\n            value = $option.val();\n\n            if ($option.prop('tagName') == 'INPUT') {\n                var type  = $option.prop('type');\n\n                if ((type == 'checkbox' || type == 'radio') && $option.not(':checked')) {\n                    value = undefined;\n                }\n            }\n        }\n\n        if ($option.hasClass('js-history_state')) {\n            STATE.setParam(name, value);\n            STATE.pushUrl();\n        }\n\n        if ($option.hasClass('js-store_state')) {\n            localStorage.setItem(name, value);\n        }\n\n        if ($option.hasClass('js-session_state')) {\n            sessionStorage.setItem(name, value);\n        }\n    },\n\n    load: function(scope) {\n        var $scope = $(scope);\n\n        this.disable();\n\n        $scope.find('a.js-store_state, a.js-session_state, button.js-store_state, button.js-session_state').each(function() {\n            var $option = $(this);\n            var s = $option.data('state').split('=');\n            name  = s[0];\n            value = s[1];\n            var stored  = STATE.getStorage($option, name);\n\n            if (value == stored) {\n                $option.trigger('click');\n            }\n        });\n\n        $scope.find('input.js-store_state, input.js-session_state').each(function() {\n            var $option = $(this);\n            var name    = $option.prop('name');\n            var type    = $option.prop('type');\n            var value   = $option.val();\n            var stored  = STATE.getStorage($option, name);\n\n            if (stored != undefined) {\n                if (type == 'checkbox' || type == 'radio') {\n                    if (value == stored) {\n                        $option.trigger('click');\n                    }\n                } else {\n                    $option.val(stored).trigger('change');\n                }\n            }\n        });\n\n        $scope.find('select.js-store_state, select.js-session_state').each(function() {\n            var $option = $(this);\n            var name    = $option.prop('name');\n            var stored  = STATE.getStorage($option, name);\n\n            if (stored != undefined) {\n                $option.val(stored).trigger('change');\n            }\n        });\n\n        var changed = this.getChanged();\n\n        for (var key in changed) {\n            var val = changed[key];\n            if (val == null || val == undefined) {\n                val = '';\n            }\n            var kav = key + '=' + val;\n            var triggered = false;\n\n            $scope.find('a.js-history_state[data-state=\"' + kav + '\"]:first').each(function() {\n                triggered  = true;\n                $(this).trigger('click');\n            });\n\n            if (triggered) {\n                continue;\n            }\n\n            if (val == '') {\n                // no matches for no value, so maybe it's just the default option like house fabric\n                $scope.find('a.js-history_state[data-state^=\"' + kav + '\"]:first').each(function() {\n                    triggered  = true;\n                    $(this).trigger('click');\n                });\n\n                if (triggered) {\n                    continue;\n                }\n            }\n\n            $scope.find('input.js-history_state[name=\"' + key + '\"][value=\"' + val + '\"]').each(function() {\n                triggered  = true;\n                $(this).trigger('click');\n            });\n\n            if (triggered) {\n                continue;\n            }\n\n            $scope.find('select.js-history_state[name=\"' + key + '\"]:first').each(function() {\n                triggered  = true;\n                $(this).val(val).trigger('change');\n            });\n        }\n\n        this.enable();\n    },\n\n    loadHandlers: function(scope) {\n        var $scope = $(scope);\n\n        $scope.find('.js-history_state, .js-store_state, .js-session_state').each(function() {\n            var option  = this;\n            var $option = $(this);\n\n            if (option.tagName == 'A' || option.tagName == 'BUTTON') {\n                $option.on('click _update', function(e) {\n                    e.preventDefault();\n                    STATE.save($option);\n                });\n            }\n\n            if (option.tagName == 'INPUT') {\n                $option.on('change _update', function(e) {\n                    STATE.save($option);\n                });\n            }\n\n            if (option.tagName == 'SELECT') {\n                $option.on('change _update', function(e, initial) {\n                    if (initial) {\n                        // change is called by selectReplace on page load - not a real 'change' so ignore\n                        return;\n                    }\n                    STATE.save($option);\n                });\n            }\n        });\n\n        STATE.load(scope);\n    }\n};\n\n$(function () {\n    // eg $('#simplemodal-container').trigger('_loadHandlers');\n    $(document).on('_loadHandlers', function(e) {\n        STATE.loadHandlers(e.target);\n    });\n\n    STATE.loadHandlers(document);\n});\n","function updateHeaderBasket(price, qty) {\n    $('.header__nav__item--basket, .header__basket').each(function() {\n        $('.tag', $(this)).html(qty);\n        $('.header__basket__price', $(this)).html(price);\n    });\n}\n\nfunction disableCheckoutButton(disable) {\n    $('.basket__checkout a').toggleClass('button--disabled', disable);\n}\n\nfunction checkMaxStock() {\n\n    var disableButton = false;\n\n    $('.basket__qty__input').each(function () {\n        var input = $(this);\n        var maximum = typeof input.data('max') !== 'undefined' ? input.data('max') : false;\n\n        if (maximum !== false) {\n            if (parseFloat(input.val()) > maximum) {\n                input.closest( \".basket__item\" ).find(\".basket__detail__stock-warning\").show()\n                disableButton = true;\n            } else {\n                input.closest( \".basket__item\" ).find(\".basket__detail__stock-warning\").hide()\n            }\n        }\n    })\n\n    if (disableButton === true) {\n        disableCheckoutButton(true);\n    } else {\n        disableCheckoutButton(false);\n    }\n}\n\nvar basketChange;\nvar basketChangeTimeout;\nvar updateBufferTime = 2000;\n\n$(document).on('change', '.basket__qty__input', function() {\n    clearTimeout(basketChangeTimeout);\n    basketChangeTimeout = setTimeout(function(){\n        if (basketChange != null) {\n            basketChange.abort();\n        }\n        basketChange = $.ajax('/basket/update', {\n            type: 'POST',\n            data: $('.basket__table input').serialize(),\n            success: function(data) {\n                if (data.result) {\n                    $('.basket__wrapper').html(data.payload.table);\n                }\n                updateHeaderBasket(data.payload.price, data.payload.qty);\n                checkMaxStock();\n            }\n        });\n    }, 1000)\n});\n\ncheckMaxStock();\n","var sliders = {};\nvar sliding = false;\nvar filterUrl = null;\n\nfunction updateAjax(url) {\n    $.ajax(url, {\n        success: function(data) {\n            window.history.pushState(null, null, url);\n            filterUrl = url;\n            var grid = $('#products_container');\n            grid.find('.product-listing').addClass('product-listing--to-load');\n\n            setTimeout(function(){\n                grid.replaceWith(data.payload.html);\n                if (typeof AndrewMartin.listingItem == 'undefined') {\n                    AndrewMartin.listingItem = new ListingItem();\n                }\n                AndrewMartin.listingItem.init();\n\n                $('#product_fromitemnum').text(data.payload.fromItemNum);\n                $('#product_toitemnum').text(data.payload.toItemNum);\n                $('.product_count').text(data.payload.productCount);\n                if ($('.filterable').hasClass('filterable--active')) {\n                    $('[hide-from-filters]').addClass('hide-from-filters');\n                }\n                $('.product-listing--to-load').removeClass('product-listing--to-load');\n                handlePaintLinks();\n            }, 300);\n        }\n    });\n}\n\nwindow.onpopstate = function(event) {\n    if (filterUrl && filterUrl !== document.location.pathname + document.location.search) {\n        document.location.reload();\n    }\n};\n\ncheckFilterCount();\n\n$(document).on('change', '.filterable :input:not(.filterable--ignore)', function () {\n\n    if (this.getAttribute('data-validation')) {\n        // If value is not a number, set it to the minimum value\n        if (isNaN(parseInt(this.value))) {\n            if (this.hasAttribute('min')) {\n                this.value = this.min;\n            } else {\n                this.value = 0;\n            }\n        }\n\n        // If value is lower than the minimum value, set it to the minimum value\n        if (this.hasAttribute('min')) {\n            if (parseInt(this.value) < parseInt(this.min)) {\n                this.value = this.min;\n            }\n        }\n\n        // If value is higher than the maximum value, set it to the maximum value\n        if (this.hasAttribute('max')) {\n            if (parseInt(this.value) > parseInt(this.max)) {\n                this.value = this.max;\n            }\n        }\n    }\n\n    if ($(this).parents('.js-filter-ranges').length > 0) {\n        new updateFilterRanges($(this).parents('.js-filter-ranges'));\n    }\n\n    var url = '';\n    var form = $('#filters_form');\n\n    $('.filterable .filterable__dimension :input:not(.filterable--ignore), .filterable .filterable__option :input:not(.filterable--ignore)').each(function() {\n        var key = this.name;\n        var value = $(this).val();\n        var tag = $(this).prop('tagName');\n        var type = $(this).prop('type');\n        var valid = false;\n\n        if (key && value) {\n            if (tag == 'SELECT') {\n                valid = true;\n            } else if (tag == 'INPUT') {\n                if (type == 'radio' || type == 'checkbox') {\n                    if ($(this).is(':checked')) {\n                        valid = true;\n                    }\n                } else {\n                    valid = true;\n                }\n            }\n\n            if (valid) {\n                if (Array.isArray(value)) {\n                    for (var i = 0; i < value.length; i++) {\n                        (function(i) {\n                            if (url == '') {\n                                url += '?';\n                            } else {\n                                url += '&';\n                            }\n                            url += key + '[]=' + encodeURIComponent(value[i]);\n                        })(i);\n                    }\n                } else {\n                    if (rangeIsDefault($(this))) {\n                        return;\n                    }\n                    if (url == '') {\n                        url += '?';\n                    } else {\n                        url += '&';\n                    }\n                    url += key + '=' + encodeURIComponent(value);\n                }\n            }\n        }\n    });\n\n    checkFilterCount();\n\n    url = window.location.pathname + url;\n\n    $('#products_container').addClass('product-listing--loading');\n\n    // If a related slider exists, then update it\n    if (this.getAttribute('data-field')) {\n        var field = this.getAttribute('data-field');//.split('---');\n        var slider = sliders[field];\n\n        if (slider) {\n            if (!sliding) {\n                var values = this.getAttribute('data-value') == 'min' ? [this.value, null] : [null, this.value];\n                slider.noUiSlider.set(values);\n            }\n            sliding = false;\n        }\n    }\n\n    clearTimeout(form.data('timer'));\n    form.data('timer', setTimeout(function() {\n        updateAjax(url);\n    }, 750));\n});\n\n$('.js-filter-ranges').each(function() {\n    new updateFilterRanges($(this));\n});\n\nfunction updateFilterRanges(el) {\n    this.selected = {};\n    this.allRanges = {};\n    this.el = el;\n\n    var self = this;\n\n    this.updateFilterRangesOverview = function() {\n       this.el.find(':input:not(.filterable--ignore)').each(function() {\n            var value = $(this).attr('data-value');\n            var column = $(this).attr('data-column');\n            if (!rangeIsDefault($(this))) {\n                if (!self.selected[column]) {\n                    self.selected[column] = {};\n                }\n                self.selected[column][value] = $(this).val();\n            }\n            if (!self.allRanges[column]) {\n                self.allRanges[column] = {};\n            }\n            self.allRanges[column][value] = $(this).val();\n        });\n\n        if (Object.keys(this.selected).length > 0) {\n            this.el.addClass('filter-ranges--selected');\n        } else {\n            this.el.removeClass('filter-ranges--selected');\n        }\n\n        var label = Object.keys(this.selected).length > 0 ? Object.keys(this.selected).length + ' selected' : 'Select&hellip;';\n\n        this.el.find('.js-filter-ranges__overview').html(label);\n    }\n\n    this.updateFilterRangesSelection = function() {\n        var keys = Object.keys(this.selected);\n        var label = '';\n\n        for (var i = 0; i < keys.length; i++) {\n            (function(i) {\n                var values = self.allRanges[keys[i]];\n                label += self.capitalize(keys[i]) + ': ' + values.min + '-' + values.max + 'cm';\n\n                if (i < keys.length - 1) {\n                    label += ', ';\n                }\n            })(i);\n        }\n\n        this.el.find('.js-filter-ranges__selection').html(label);\n        this.el.find('.js-filter-ranges__selection-mobile').html(keys.length);\n        this.el.find('.js-filterable__count').html(keys.length ? '(' + keys.length + ')' : '');\n\n        if (keys.length) {\n            this.el.parents('.filterable__dimension').addClass('filterable__dimension--has-selection');\n        } else {\n            this.el.parents('.filterable__dimension').removeClass('filterable__dimension--has-selection');\n        }\n    }\n\n    this.capitalize = function(string) {\n        return string.charAt(0).toUpperCase() + string.slice(1);\n    }\n\n    this.updateFilterRangesOverview();\n    this.updateFilterRangesSelection();\n\n    $(document).on('click', '.js-filter-ranges__clear', function(e) {\n        sliding = true;\n\n        self.el.find('.js-filter-range__slider').each(function() {\n            var range = this.noUiSlider.options.range;\n            this.noUiSlider.set([range.min, range.max]);\n        });\n    });\n}\n\n// Toggle visibility of the clicked filter range\n$(document).on('click', '.js-filter-ranges__top', function(e) {\n    var el = $(this).closest('.js-filter-ranges');\n    if (el.hasClass('filter-ranges--active')) {\n        deactivateFilterRanges(el);\n    } else {\n        activateFilterRanges(el);\n    }\n});\n\n$(document).on('click', '.js-filter-ranges__back', function(e) {\n    var el = $(this).closest('.js-filter-ranges');\n    deactivateFilterRanges(el);\n});\n\n$(document).on('click', '.js-filter-ranges label', function(e) {\n    var el = $(this).closest('.js-filter-ranges').find('.js-filter-ranges__top');\n    el.trigger('click');\n});\n\n// Deactivate any active filter ranges when document is clicked\n$(document).on('click', function(e) {\n    var el = e.target.closest('.js-filter-ranges');\n\n    if (!el && $('.filter-ranges--active').length) {\n        $('.js-filter-ranges').removeClass('filter-ranges--active');\n    }\n});\n\nfunction rangeIsDefault(el) {\n    return (el.attr('data-value') == 'min' && el.val() == el.attr('min')) || (el.attr('data-value') == 'max' && el.val() == el.attr('max'))\n}\n\n$(document).on('click', '.js-filterable-toggle', function(e) {\n    e.preventDefault();\n    $('.filterable').toggleClass('filterable--active');\n    $('#filters_form').toggleClass('filterable--absolute');\n    $('.footer').toggleClass('hide-from-filters');\n    if ($('.filterable').hasClass('filterable--active')) {\n        $('[hide-from-filters]').addClass('hide-from-filters');\n    } else {\n        $('[hide-from-filters]').removeClass('hide-from-filters');\n        deactivateFilterRanges($('.js-filter-ranges'));\n    }\n});\n\n$(document).on('click', function(e) {\n\n    if (!(e.target.closest('.js-filter-ranges'))) {\n        deactivateFilterRanges($('.js-filter-ranges'))\n    }\n})\n\nfunction activateFilterRanges(el) {\n    el.addClass('filter-ranges--active');\n    el.parents('.filterable__dimension').addClass('filterable__dimension--active');\n    el.parents('.filterable__content').addClass('filterable__content--active');\n}\n\nfunction deactivateFilterRanges(el) {\n    el.removeClass('filter-ranges--active');\n    el.parents('.filterable__dimension').removeClass('filterable__dimension--active');\n    el.parents('.filterable__content').removeClass('filterable__content--active');\n}\n\n// Check the number of filters that have been set\nfunction checkFilterCount() {\n    var filterCount = [];\n\n    $('.filterable .filterable__dimension :input:not(.filterable--ignore)').each(function() {\n        var key = this.name;\n        var value = $(this).val();\n        if (key && value) {\n            if (Array.isArray(value)) {\n                for (var i = 0; i < value.length; i++) {\n                    (function(i) {\n                        var filterType = key;\n\n                        if (filterCount.indexOf(filterType) == -1) {\n                            filterCount.push(filterType);\n                        }\n                    })(i);\n                }\n            } else {\n                if (rangeIsDefault($(this))) {\n                    return;\n                }\n\n                var filterType = $(this).attr('data-dimension');\n\n                if (filterCount.indexOf(filterType) == -1) {\n                    filterCount.push(filterType);\n                }\n            }\n        }\n    });\n\n    if (filterCount.length > 0) {\n        $('.filterable').addClass('filterable--has-filter-selected');\n    } else {\n        $('.filterable').removeClass('filterable--has-filter-selected');\n    }\n\n    $('.js-filterable__total-count').html(filterCount.length);\n}\n\n$(function() {\n    var windowResizing;\n    var mode;\n    var oldMode;\n\n    function moveElement() {\n        mode = window.matchMedia('(max-width: 580px)').matches ? 'mobile' : 'desktop';\n\n        if (mode != oldMode) {\n            var from = 'desktop';\n            var to = 'mobile';\n\n            if (mode == 'desktop') {\n                from = 'mobile';\n                to = 'desktop';\n            }\n\n            $('.js-moveable-content[data-visible=\"' + from + '\"]').children().eq(0).appendTo($('.js-moveable-content[data-visible=\"' + to + '\"]'));\n        }\n\n        oldMode = mode;\n    }\n\n    moveElement();\n\n    $(window).on('resize', function() {\n        clearTimeout(windowResizing);\n        windowResizing = setTimeout(function() {\n            moveElement();\n        }, 100);\n    });\n});\n\n$(function() {\n    var slider = document.querySelectorAll('.js-filter-range__slider');\n    var setBoth = document.querySelectorAll('.js-filter-range__set-both');\n    var input = document.querySelectorAll('.js-filter-range__input');\n    var allowed = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57] // 0-9\n    var range = {};\n\n    for (var i = 0; i < input.length; i++) {\n        (function(i) {\n            input[i].setAttribute('data-validation', 'number');\n            input[i].type = 'text';\n\n            input[i].onfocus = function() {\n                this.onkeypress = function(e) {\n                    // If the key is not in the array of allowed keys, then prevent it\n                    if (allowed.indexOf(e.charCode) == -1) {\n                        e.preventDefault();\n                    }\n                }\n            }\n\n            var dimension = input[i].getAttribute('data-dimension');\n            var column = input[i].getAttribute('data-column');\n            var min = input[i].getAttribute('min');\n            var max = input[i].getAttribute('max');\n\n            range[dimension + '-' + column] = {\n                'min': parseInt(min),\n                'max': parseInt(max)\n            };\n        })(i);\n    }\n\n    for (var i = 0; i < setBoth.length; i++) {\n        (function(i) {\n            var field = setBoth[i].getAttribute('data-field');\n            var minInput = document.querySelector('.js-filter-range__input[data-value=\"min\"][data-field=\"' + field + '\"]');\n            var maxInput = document.querySelector('.js-filter-range__input[data-value=\"max\"][data-field=\"' + field + '\"]');\n\n            setBoth[i].onchange = function() {\n                var range = this.value.split('-');\n                minInput.value = range[0];\n                maxInput.value = range[1];\n\n                $(minInput).trigger('change');\n                $(maxInput).trigger('change');\n            }\n        })(i);\n    }\n\n    for (var i = 0; i < slider.length; i++) {\n        (function(i) {\n            var field = slider[i].getAttribute('data-field');\n            var minInput = document.querySelector('input[data-value=\"min\"][data-field=\"' + field + '\"]');\n            var maxInput = document.querySelector('input[data-value=\"max\"][data-field=\"' + field + '\"]');\n            var params = {\n                start: [\n                    minInput.value,\n                    maxInput.value\n                ],\n                range: range[field],\n                format: wNumb({\n                    decimals: 0\n                }),\n                step: 1,\n                connect: true\n            }\n\n            noUiSlider.create(slider[i], params);\n\n            slider[i].noUiSlider.on('update', function(values, handle) {\n                var value = handle == 1 ? 'max' : 'min';\n                var input = document.querySelector('input[data-value=\"' + value + '\"][data-field=\"' + field + '\"]');\n\n                input.value = values[handle];\n\n                if (sliding) {\n                    $(input).trigger('change');\n                }\n            });\n\n            slider[i].noUiSlider.on('slide', function(values, handle) {\n                sliding = true;\n            });\n\n            sliders[slider[i].getAttribute('data-field')] = slider[i];\n        })(i);\n    }\n})\n","$('.js-grid-load-more').on('click', function(e) {\n    e.preventDefault();\n\n    var grid = $(this).siblings('.wrap').find('.grid');\n    var current = $(this).addClass('load-more--loading');\n\n    $.ajax($(this).attr('href'), {\n        success: function(data) {\n            grid.children(':hidden').children('.product-listing').addClass('product-listing--to-load');\n\n            grid.children().removeClass('s-hidden-true m-hidden-true ph-hidden-true ml-hidden-true l-hidden-true');\n            grid.append(data.payload.html);\n\n            url = new URL(window.location.href);\n\n            load_more = url.searchParams.get('load_more');\n            if (!load_more) {\n                load_more = 1;\n            }\n            load_more++;\n            url.searchParams.set('load_more', load_more);\n\n            window.history.pushState({load_more: load_more}, document.title, url.toString());\n\n            if (data.payload.page && data.payload.more) {\n                current.attr('href', data.payload.more).removeClass('load-more--loading');\n            } else {\n                current.remove();\n            }\n            setTimeout(function(){\n                $('.product-listing--to-load').removeClass('product-listing--to-load');\n            }, 100);\n        }\n    });\n});\n","var initProductGallery = function() {\n    var gallery = $('.product__gallery .product__photo');\n    var videoContainer = $('.product__gallery .product__video');\n    var video = $('.product__gallery .product__video video');\n    var thumbnail = $('.product__thumbnail');\n    var className = 'product__thumbnail--active';\n\n    if (!gallery.length) {\n        return;\n    }\n\n    if (video.length > 0) {\n        var player = videojs(video[0].id);\n    }\n\n    function update(i) {\n        thumbnail.eq(i).addClass(className);\n    }\n\n    function watchVideo() {\n        if (video.length > 0) {\n            player.aspectRatio('1:1');\n            // Not using the `video` variable as slick removes the DocElement and re-adds so breaks this listener\n            gallery.on('touchend click', '.product__video video', function(e) {\n                if (player.paused()) {\n                    playVideo();\n                } else {\n                    pauseVideo()\n                }\n            });\n        }\n    }\n\n    function playVideo() {\n        player.play();\n        videoContainer.addClass('product__video--playing');\n    }\n\n    function pauseVideo() {\n        player.pause();\n        videoContainer.removeClass('product__video--playing');\n    }\n\n    gallery.on('init', function() {\n        update(0);\n        watchVideo();\n\n        if (window.matchMedia('(min-width: 999px)').matches) {\n            $('.zoom--pdp').zoom({\n                canvas: '.zoom__canvas--pdp',\n                trigger: '.zoom__trigger--pdp',\n                backdrop: '.zoom__backdrop--pdp',\n            });\n        }\n    });\n    gallery.on('afterChange', function() {\n        $('.' + className).removeClass(className);\n        update($(this).slick('slickCurrentSlide'));\n        if (player) {\n            if (!player.paused()) {\n                pauseVideo();\n            }\n        }\n    });\n    thumbnail.on('click', function() {\n        gallery.slick('slickGoTo', $(this).index());\n    });\n\n    gallery.slick({\n        nextArrow: '<button class=\"slick-arrow slick-next\">' +\n            '<svg class=\"icon-arrow-large-right\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-right\" />' +\n            '</svg>' +\n            '</button>',\n        prevArrow: '<button class=\"slick-arrow slick-prev\">' +\n            '<svg class=\"icon-arrow-large-left\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-left\" />' +\n            '</svg>' +\n            '</button>',\n        dots: true\n    });\n\n    $('button', gallery).on('click', function(e) {\n        e.preventDefault();\n    });\n};\n\ninitProductGallery();\n\nvar initGalery = function() {\n    var gallery = $('.carousel');\n    gallery.each(function() {\n        var el = $(this);\n        var infinite = el.data('noloop') == undefined;\n        var img = $('.carousel__item', el);\n\n        el.on('init', function(e, slick) {\n            updateArrows(slick.currentSlide + 1, slick.slideCount);\n        });\n\n        el.on('afterChange', function(e, slick) {\n            updateArrows(slick.currentSlide + 1, slick.slideCount);\n        });\n\n        el.slick({\n            nextArrow: '<button class=\"slick-arrow slick-next\">' +\n            '<svg class=\"icon-arrow-large-right\">' +\n            '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-right\" />' +\n            '</svg>' +\n            '</button>',\n            prevArrow: '<button class=\"slick-arrow slick-prev\">' +\n            '<svg class=\"icon-arrow-large-left\">' +\n            '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-left\" />' +\n            '</svg>' +\n            '</button>',\n            dots: true,\n            infinite: infinite\n        });\n\n        function updateArrows(current, total) {\n            if (current == 1) {\n                el.addClass('carousel--at-start');\n            } else {\n                el.removeClass('carousel--at-start');\n            }\n\n            if (current == total) {\n                el.addClass('carousel--at-end');\n            } else {\n                el.removeClass('carousel--at-end');\n            }\n        }\n    });\n};\n\ninitGalery();\n\n$(function () {\n    if (document.getElementById('js-haze_viewer') !== null) {\n        if (window.HAZE !== undefined) {\n            HAZE.instantiate('js-haze_viewer', 'gallery', window.hazeGallery);\n            console.log('HAZE', 'Haze gallery will initialize on page load');\n            return;\n        } else {\n            console.error('HAZE is not defined (gallery.js)');\n        }\n    } else if (window.matchMedia('(max-width: 999px)').matches) {\n        const popupScroll = document.querySelector('.js-haze-popup');\n        $(document).on('click', '.js-haze-open', function(e) {\n            e.preventDefault();\n\n            var $button = $(this);\n            var $popup = $($button.data('popup'));\n\n            /** Apparently the viewer is binned off from the DOM by slick :D */\n            // var $hazeLocation = document.getElementById('js-haze_viewer_location');\n            // var $haze = document.getElementById($button.data('haze'));\n            // $haze.appendTo($hazeLocation);\n\n            $popup.appendTo('body').fadeIn('fast');\n\n            if (document.getElementById('js-haze_mobile') !== null) {\n                if (window.HAZE !== undefined) {\n                    HAZE.instantiate('js-haze_mobile', 'gallery', window.hazeGallery);\n                }\n\n                if (window.matchMedia('(max-width: 999px)').matches) {\n                    scrollLock.disablePageScroll(popupScroll);\n                }\n            }\n        });\n\n        $(document).on('click', '.js-haze-close', function(e) {\n            e.preventDefault();\n\n            var $button = $(this);\n            var $popup = $button.closest('.js-haze-popup');\n            $popup.fadeOut('fast');\n\n            scrollLock.enablePageScroll(popupScroll);\n        });\n    }\n\n    if (window.CYLINDO !== undefined) {\n        const popupScroll = document.querySelector('.js-cylindo-popup');\n\n        if (window.matchMedia('(max-width: 999px)').matches) {\n            CYLINDO.instantiate('js-cylindo_mobile', 'mobile-popup', window.cylindoGallery);\n        } else {\n            CYLINDO.instantiate('js-cylindo_viewer', 'gallery', window.cylindoGallery);\n        }\n\n        $(document).on('click', '.js-cylindo-open', function(e) {\n            e.preventDefault();\n\n            var $button = $(this);\n            var $popup   = $($button.data('popup'));\n            var $cylindo = $($button.data('cylindo'));\n\n            $cylindo.appendTo($popup);\n\n            $popup.appendTo('body').fadeIn('fast');\n\n            if (window.matchMedia('(max-width: 999px)').matches) {\n                scrollLock.disablePageScroll(popupScroll);\n            }\n        });\n\n        $(document).on('click', '.js-cylindo-close', function(e) {\n            e.preventDefault();\n\n            // Add unzoom functionality to the back button for mobile\n\n            if (document.querySelector('html').classList.contains('cylindo-zoom')) {\n                var cylindo = $(this).data('cylindo-mobile');\n\n                CYLINDO.zoom(cylindo, false);\n            } else {\n                var $button = $(this);\n                var $popup = $button.closest('.js-cylindo-popup');\n                $popup.fadeOut('fast');\n\n                scrollLock.enablePageScroll(popupScroll);\n            }\n        });\n\n        $(document).on('click', '.js-cylindo-zoom', function(e) {\n            e.preventDefault();\n\n            var cylindo;\n\n            if (window.matchMedia('(max-width: 999px)').matches) {\n                cylindo = $(this).data('cylindo-mobile');\n            } else {\n                cylindo = $(this).data('cylindo');\n            }\n\n            CYLINDO.zoom(cylindo, true);\n        });\n\n        $(document).on('click', '.js-cylindo-unzoom', function(e) {\n            e.preventDefault();\n\n            var cylindo;\n\n            if (window.matchMedia('(max-width: 999px)').matches) {\n                cylindo = $(this).data('cylindo-mobile');\n            } else {\n                cylindo = $(this).data('cylindo');\n            }\n\n            CYLINDO.zoom(cylindo, false);\n        });\n    }\n});\n","var newsletter;\n$(document).on('submit', '.signup-form', function(e) {\n    e.preventDefault();\n\n    var form = this;\n\n    if (newsletter != null) {\n        newsletter.abort();\n    }\n    newsletter = $.ajax($(this).attr('action'), {\n        type: $(this).attr('method'),\n        data: $(this).serialize(),\n        success: function(data) {\n            if (data.result) {\n                $(form).fadeTo(400, 0, function() {\n                    $(form).parent().append('<label class=\"signup-form__thanks\">Thank you</label>');\n                });\n            }\n        }\n    });\n});\n","// $('.js-kit-price input').on('change', function() {\n//     var input = $(this);\n//     var sku = input.data('frame-sku');\n\n//     var form = $('#basket-add');\n//     form.find('button.product__button').prop('disabled', 'disabled');\n\n//     $.ajax('/products/kit-price', {\n//         type: 'post',\n//         data: $('.product-piece input').serialize(),\n//         success: function(data) {\n//             form.find(\"input.\" + sku).val(input.val());\n\n//             if (typeof(fdPrice) != 'undefined') {\n//                 fdPrice = parseFloat(data.payload.price_raw).toFixed(2);\n//                 updateFinancing();\n//                 initPopups();\n//             }\n\n//             $('.product__total-price span.value').html(data.payload.price);\n\n//             if (data.payload.price_raw > 0) {\n//                 form.find('button.product__button').prop('disabled', false).removeClass('button--disabled');\n//                 $('.product__total-price').show();\n//                 $('.product__finance-option').show();\n//             } else {\n//                 $('.product__total-price').hide();\n//                 $('.product__finance-option').hide();\n//             }\n//         }\n//     });\n// });\n","\n$(function() {\n    $('.design-directory__filters').find('input, select').on('change', function() {\n        $(this).parents('form').trigger('submit');\n    });\n\n    $(document).on('click', '.js-design-directory-load-more', function(event) {\n        event.preventDefault();\n        $('.load-more').addClass('load-more--loading');\n        $.ajax(\n            $(this).attr('href')\n        ).done(function(payload) {\n            newItems = $(payload).find('.design-directory__list .grid > *').css('display', 'none').addClass('js-should-fade-in');\n            loadMore = $(payload).find('.design-directory__load-more');\n            $('.design-directory__list .grid').append(newItems);\n            $('.js-should-fade-in').fadeIn().removeClass('js-should-fade-in');\n            $('.design-directory__load-more').replaceWith(loadMore);\n        });\n    });\n\n});\n","$(document).on('click', '.product__qty a, .product-piece__qty a, .product-piece__qty button', function(e){\n    e.preventDefault();\n    var input = $(this).siblings('.input');\n    var step = typeof input.data('step') !== 'undefined' ? input.data('step') : 1;\n    var decimal_places = typeof input.data('places') !== 'undefined' ? input.data('places') : 0;\n    var minimum = typeof input.data('min') !== 'undefined' ? input.data('min') : 1;\n    var maximum = typeof input.data('max') !== 'undefined' ? input.data('max') : false;\n\n    if ($('svg', $(this)).hasClass('icon-plus')) {\n        input.val((parseFloat(input.val()) + step).toFixed(decimal_places));\n    } else if (parseInt(input.val()) >= 0) {\n        input.val((parseFloat(input.val()) - step).toFixed(decimal_places));\n    }\n\n    if (maximum !== false && parseFloat(input.val()) > maximum) {\n        input.val(maximum);\n    }\n    if (minimum !== false && parseFloat(input.val()) < minimum) {\n        input.val(minimum);\n    }\n\n    input.trigger('change');\n});\n\n$(document).on('input change', '.product__qty input, .product-piece__qty input', function(e) {\n    if ($('.product__custom-qty').length > 0) {\n        const target = $('.js-customise-price-target');\n\n        var price = 0.00;\n        var qty = $(this).val();\n\n        price = target.data('price') * qty;\n\n        if (price.toFixed(2) % 1 > 0) {\n            price = price.toFixed(2);\n        } else {\n            price = price.toFixed(0);\n        }\n\n        target.find('.value').html(target.data('currency') + price.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\n    }\n\n    if ($('.product__multi__size__qty').length > 0) {\n        var price = 0.00;\n        var total_qty = 0;\n        const quantities = $('.product__multi__size__qty:visible');\n        let products = {};\n\n        quantities.each(function (index, element) {\n            let sku = $(element).data('sku');\n            const qty = parseInt($(element).find('input[name=qty]').val());\n            const product_price = parseFloat(parseFloat($(this).data('price')).toFixed(2));\n\n            if (qty > 0) {\n                price += (product_price * qty);\n                total_qty += qty;\n                products[sku] = qty;\n            }\n        });\n\n        const keys = Object.keys(products);\n        if (keys.length > 0) {\n            $('.js-wishlist-action').removeClass('product__wishlist--disabled');\n            $('.js-wishlist-action').attr('data-sku', keys.join(','));\n        } else {\n            $('.js-wishlist-action').addClass('product__wishlist--disabled');\n        }\n\n        if (price === 0) {\n            var fromPrice = null;\n\n            $('.product__multi__size').each(function() {\n                var sizePrice = parseFloat($(this).find('.product__multi__size__price').data('price'));\n\n                if (sizePrice < fromPrice || fromPrice === null) {\n                    fromPrice = sizePrice;\n                }\n            })\n\n            price = fromPrice;\n\n            $('.product__multi__total_label').html('From:');\n        } else {\n            $('.product__multi__total_label').html('Total Price:');\n        }\n\n        if (price.toFixed(2) % 1 > 0) {\n            price = price.toFixed(2);\n        } else {\n            price = price.toFixed(0);\n        }\n\n        $('.product__multi__total_value').html($('.product__multi__total_value').data('currency') + price.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\n\n        var disable = total_qty <= 0;\n        $('.product__button').toggleClass('button--disabled', disable);\n    }\n\n    if ($('.product__price__total_value').length > 0) {\n        var product_price = parseFloat($('.product__qty').data('price'));\n        var qty = parseFloat($(this).val());\n\n        var price = product_price * qty;\n\n        if (price.toFixed(2) % 1 > 0) {\n            price = price.toFixed(2);\n        } else {\n            price = price.toFixed(0);\n        }\n\n        $('.product__price__total_value').html($('.product__price__total_value').data('currency') + price.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\n    }\n\n    var maximum = typeof $(this).data('max') !== 'undefined' ? $(this).data('max') : false;\n    var minimum = typeof $(this).data('min') !== 'undefined' ? $(this).data('min') : 1;\n    if (maximum !== false && parseFloat($(this).val()) > maximum) {\n        $(this).val(maximum);\n    }\n    if (minimum !== false && parseFloat($(this).val()) < minimum && parseFloat($(this).val()) >= 0) {\n        $(this).val(minimum);\n    }\n    if ($('.batches__totals').length > 0) {\n        updateBatchPrices();\n    }\n})\n\nvar updateBatchPrices = function() {\n    var price = 0.00;\n    var total_qty = 0;\n    var quantities = $('.batches__piece-qty:visible');\n    var product_price = parseFloat(parseFloat($('.batches').attr('data-price')).toFixed(2));\n\n    quantities.each(function(){\n        var qty = parseFloat($(this).find('input[name=qty]').val());\n\n        if (qty > 0) {\n            price += product_price * qty;\n            total_qty += qty;\n        }\n    });\n\n    $('.batches__totals-main span').html($('.batches__totals-main').data('currency') + price.toFixed(2));\n    $('.batches__totals-info span').html(total_qty.toFixed(1));\n    $('.js-material-length').html(total_qty.toFixed(1));\n\n    if (total_qty > 0) {\n        $('.product__button').toggleClass('button--disabled', false);\n        $('.js-wishlist-action').toggleClass('product__wishlist--disabled', false);\n    } else {\n        $('.product__button').toggleClass('button--disabled', true);\n        $('.js-wishlist-action').toggleClass('product__wishlist--disabled', true);\n    }\n}\n","function getQueryParameters() {\n    var queryString = location.search.slice(1),\n        params = {};\n\n    queryString.replace(/([^=]*)=([^&]*)&*/g, function (_, key, value) {\n        params[key] = value;\n    });\n\n    return params;\n}\n\n\nfunction setQueryParameters(params) {\n    var query = [],\n        key, value;\n\n    for (key in params) {\n        if (!params.hasOwnProperty(key)) continue;\n        value = params[key];\n        query.push(key + \"=\" + value);\n    }\n\n    location.search = query.join(\"&\");\n}\n\nfunction showAllColours(e) {\n    e.preventDefault()\n    let active = 'filterable__unslick--active'\n\n    if (this.classList.contains(active)) {\n        this.classList.remove(active);\n        this.firstElementChild.textContent = 'show more colours'\n    } else {\n        this.classList.add(active)\n        this.firstElementChild.textContent = 'show fewer colours'\n    }\n}\n\nvar showMoreButton = document.querySelector('.js-unslick');\n\nif (showMoreButton) {\n    showMoreButton.addEventListener('click', showAllColours)\n}\n","$('.product__sizes li.sizes__option').on('click', function() {\n    var selection = $(this);\n\n    // don't do anything if the size is already selected\n    if (selection.hasClass('sizes__option--active') && !selection.hasClass('sizes__option--active--first')) {\n        return;\n    }\n\n    $.ajax({\n        url: selection.data('url'),\n        type: 'GET',\n        success: function(data) {\n            if (data.payload.specification) {\n                $.each(data.payload.specification, function(index, value) {\n                    $('#spec_key--'+index).find('.spec_value').text(value.value)\n                });\n            }\n\n            var html = '';\n            if (data.payload.offer.has_offer) {\n                html = '<span class=\"product__price--was\">was '+data.payload.price+'</span> '\n                    + '<span class=\"product__price--discount\">now '+data.payload.offer.price+'</span>'\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.offer.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            } else {\n                html = data.payload.price\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            }\n\n            $('.product__price').html(html);\n            $('.product__form--addbasket').attr('action', data.payload.basket_url);\n            $('.product__availability__status').text(data.payload.stock_message.status);\n            $('.product__availability__information').text('- '+data.payload.stock_message.message);\n\n            // Update the financing calculations\n            if (typeof(fdPrice) != \"undefined\") {\n                fdPrice = parseFloat(data.payload.price_raw).toFixed(2);\n                updateFinancing();\n            }\n        }\n    });\n\n    $('.product__sizes .sizes__option').removeClass('sizes__option--active');\n    selection.addClass('sizes__option--active');\n    selection.removeClass('sizes__option--active--first');\n});\n\n$('.product__sizes .d3r-size-select').on('change', function() {\n    var select = $(this);\n\n    if (!select.find(':selected').data('url')) {\n        return;\n    }\n\n    $.ajax({\n        url: select.find(':selected').data('url'),\n        type: 'GET',\n        success: function(data) {\n            if (data.payload.specification) {\n                $.each(data.payload.specification, function(index, value) {\n                    $('#spec_key--'+index).find('.spec_value').text(value.value)\n                });\n            }\n\n            var html = '';\n            if (data.payload.offer.has_offer) {\n                html = '<span class=\"product__price--was\">was '+data.payload.price+'</span> '\n                    + '<span class=\"product__price--discount\">now '+data.payload.offer.price+'</span>'\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.offer.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            } else {\n                html = data.payload.price\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            }\n\n            $('.product__price').html(html);\n            $('.product__form--addbasket').attr('action', data.payload.basket_url);\n            $('.product__availability__status').text(data.payload.stock_message.status);\n            $('.product__availability__information').text('- '+data.payload.stock_message.message);\n            $('.product__delivery-information__text').html(data.payload.delivery_information);\n\n            // Update the financing calculations\n            if (typeof(fdPrice) != \"undefined\") {\n                fdPrice = parseFloat(data.payload.price_raw).toFixed(2);\n                updateFinancing();\n            }\n        }\n    });\n});\n\n$('.colourways__item').on('mouseover', function(){\n    $('.colourways__text').html('<span>Colour: </span>' + $(this).data('colour'));\n});\n\n$('.colourways__item').on('mouseout', function(){\n    $('.colourways__text').html('<span>Colour: </span>' + $('.colourways__text').data('colour'));\n});\n\nfunction updateFinancing() {\n    if ($('.product__financing').length == 0 || typeof(fdOptions) == \"undefined\") {\n        return;\n    }\n\n    var $finTable  = $('#finance-calculator table tbody'),\n        price      = parseFloat(fdPrice),\n        tdDetails  = [];\n\n    if (price < fdMinPrice) {\n        $('.product__financing').hide();\n        return;\n    }\n    $('.product__financing').show();\n\n    $('select', $finTable).empty();\n\n    var i = 0;\n    for (var fdOpt in fdOptions) {\n        var code        = fdOptions[fdOpt]['code'],\n            depositPerc = fdOptions[fdOpt]['deposit'],\n            depositVal  = depositPerc / 100,\n            depositAmt  = price * depositVal;\n\n        var opt = new FinanceDetails(code, price, depositPerc, depositAmt);\n        if (opt) {\n            tdDetails.push(opt);\n\n            // Only show the first option on the PDP directly\n            if (i == 0) {\n                $('.product__financing--message').html(\n                    '&pound;' + parseFloat(opt.m_inst).toFixed(2) +\n                    ' per month with a &pound;' + parseFloat(opt.d_amount).toFixed(2) +\n                    ' deposit (' + opt.apr + '% interest).'\n                );\n                $('.product__financing').fadeIn();\n            }\n\n            $('select', $finTable).append($('<option>', {\n                value: i,\n                text: opt.p_name\n            }));\n\n            ++i;\n        }\n    }\n\n    $('select', $finTable).on('change', function() {\n        var opt = tdDetails[$(this).prop('selectedIndex')],\n            cur = '&pound;';\n\n        $('#cost_of_goods', $finTable).html(cur + parseFloat(opt.goods_val).toFixed(2));\n        $('#deposit_percentage', $finTable).html(opt.d_pc + '%');\n        $('#deposit_amount', $finTable).html(cur + parseFloat(opt.d_amount).toFixed(2));\n        $('#credit_amount', $finTable).html(cur + parseFloat(opt.l_amount).toFixed(2));\n        $('#finance_term', $finTable).html(opt.term + ' months');\n        $('#apr', $finTable).html(opt.apr + '%');\n        $('#cost_per_month', $finTable).html(cur + parseFloat(opt.m_inst).toFixed(2));\n        $('#monthly_repayment', $finTable).html(cur + parseFloat(opt.l_repay).toFixed(2));\n        $('#total', $finTable).html(cur + parseFloat(opt.total).toFixed(2));\n    }).trigger('change');\n}\n$(updateFinancing);\n","/*! nouislider - 10.0.0 - 2017-05-28 14:52:48 */\r\n\r\n(function (factory) {\r\n\r\n    if ( typeof define === 'function' && define.amd ) {\r\n\r\n        // AMD. Register as an anonymous module.\r\n        define([], factory);\r\n\r\n    } else if ( typeof exports === 'object' ) {\r\n\r\n        // Node/CommonJS\r\n        module.exports = factory();\r\n\r\n    } else {\r\n\r\n        // Browser globals\r\n        window.noUiSlider = factory();\r\n    }\r\n\r\n}(function( ){\r\n\r\n\t'use strict';\r\n\r\n\tvar VERSION = '10.0.0';\r\n\r\n\r\n\tfunction isValidFormatter ( entry ) {\r\n\t\treturn typeof entry === 'object' && typeof entry.to === 'function' && typeof entry.from === 'function';\r\n\t}\r\n\r\n\tfunction removeElement ( el ) {\r\n\t\tel.parentElement.removeChild(el);\r\n\t}\r\n\r\n\t// Bindable version\r\n\tfunction preventDefault ( e ) {\r\n\t\te.preventDefault();\r\n\t}\r\n\r\n\t// Removes duplicates from an array.\r\n\tfunction unique ( array ) {\r\n\t\treturn array.filter(function(a){\r\n\t\t\treturn !this[a] ? this[a] = true : false;\r\n\t\t}, {});\r\n\t}\r\n\r\n\t// Round a value to the closest 'to'.\r\n\tfunction closest ( value, to ) {\r\n\t\treturn Math.round(value / to) * to;\r\n\t}\r\n\r\n\t// Current position of an element relative to the document.\r\n\tfunction offset ( elem, orientation ) {\r\n\r\n\t\tvar rect = elem.getBoundingClientRect();\r\n\t\tvar doc = elem.ownerDocument;\r\n\t\tvar docElem = doc.documentElement;\r\n\t\tvar pageOffset = getPageOffset(doc);\r\n\r\n\t\t// getBoundingClientRect contains left scroll in Chrome on Android.\r\n\t\t// I haven't found a feature detection that proves this. Worst case\r\n\t\t// scenario on mis-match: the 'tap' feature on horizontal sliders breaks.\r\n\t\tif ( /webkit.*Chrome.*Mobile/i.test(navigator.userAgent) ) {\r\n\t\t\tpageOffset.x = 0;\r\n\t\t}\r\n\r\n\t\treturn orientation ? (rect.top + pageOffset.y - docElem.clientTop) : (rect.left + pageOffset.x - docElem.clientLeft);\r\n\t}\r\n\r\n\t// Checks whether a value is numerical.\r\n\tfunction isNumeric ( a ) {\r\n\t\treturn typeof a === 'number' && !isNaN( a ) && isFinite( a );\r\n\t}\r\n\r\n\t// Sets a class and removes it after [duration] ms.\r\n\tfunction addClassFor ( element, className, duration ) {\r\n\t\tif (duration > 0) {\r\n\t\taddClass(element, className);\r\n\t\t\tsetTimeout(function(){\r\n\t\t\t\tremoveClass(element, className);\r\n\t\t\t}, duration);\r\n\t\t}\r\n\t}\r\n\r\n\t// Limits a value to 0 - 100\r\n\tfunction limit ( a ) {\r\n\t\treturn Math.max(Math.min(a, 100), 0);\r\n\t}\r\n\r\n\t// Wraps a variable as an array, if it isn't one yet.\r\n\t// Note that an input array is returned by reference!\r\n\tfunction asArray ( a ) {\r\n\t\treturn Array.isArray(a) ? a : [a];\r\n\t}\r\n\r\n\t// Counts decimals\r\n\tfunction countDecimals ( numStr ) {\r\n\t\tnumStr = String(numStr);\r\n\t\tvar pieces = numStr.split(\".\");\r\n\t\treturn pieces.length > 1 ? pieces[1].length : 0;\r\n\t}\r\n\r\n\t// http://youmightnotneedjquery.com/#add_class\r\n\tfunction addClass ( el, className ) {\r\n\t\tif ( el.classList ) {\r\n\t\t\tel.classList.add(className);\r\n\t\t} else {\r\n\t\t\tel.className += ' ' + className;\r\n\t\t}\r\n\t}\r\n\r\n\t// http://youmightnotneedjquery.com/#remove_class\r\n\tfunction removeClass ( el, className ) {\r\n\t\tif ( el.classList ) {\r\n\t\t\tel.classList.remove(className);\r\n\t\t} else {\r\n\t\t\tel.className = el.className.replace(new RegExp('(^|\\\\b)' + className.split(' ').join('|') + '(\\\\b|$)', 'gi'), ' ');\r\n\t\t}\r\n\t}\r\n\r\n\t// https://plainjs.com/javascript/attributes/adding-removing-and-testing-for-classes-9/\r\n\tfunction hasClass ( el, className ) {\r\n\t\treturn el.classList ? el.classList.contains(className) : new RegExp('\\\\b' + className + '\\\\b').test(el.className);\r\n\t}\r\n\r\n\t// https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY#Notes\r\n\tfunction getPageOffset ( doc ) {\r\n\r\n\t\tvar supportPageOffset = window.pageXOffset !== undefined;\r\n\t\tvar isCSS1Compat = ((doc.compatMode || \"\") === \"CSS1Compat\");\r\n\t\tvar x = supportPageOffset ? window.pageXOffset : isCSS1Compat ? doc.documentElement.scrollLeft : doc.body.scrollLeft;\r\n\t\tvar y = supportPageOffset ? window.pageYOffset : isCSS1Compat ? doc.documentElement.scrollTop : doc.body.scrollTop;\r\n\r\n\t\treturn {\r\n\t\t\tx: x,\r\n\t\t\ty: y\r\n\t\t};\r\n\t}\r\n\r\n\t// we provide a function to compute constants instead\r\n\t// of accessing window.* as soon as the module needs it\r\n\t// so that we do not compute anything if not needed\r\n\tfunction getActions ( ) {\r\n\r\n\t\t// Determine the events to bind. IE11 implements pointerEvents without\r\n\t\t// a prefix, which breaks compatibility with the IE10 implementation.\r\n\t\treturn window.navigator.pointerEnabled ? {\r\n\t\t\tstart: 'pointerdown',\r\n\t\t\tmove: 'pointermove',\r\n\t\t\tend: 'pointerup'\r\n\t\t} : window.navigator.msPointerEnabled ? {\r\n\t\t\tstart: 'MSPointerDown',\r\n\t\t\tmove: 'MSPointerMove',\r\n\t\t\tend: 'MSPointerUp'\r\n\t\t} : {\r\n\t\t\tstart: 'mousedown touchstart',\r\n\t\t\tmove: 'mousemove touchmove',\r\n\t\t\tend: 'mouseup touchend'\r\n\t\t};\r\n\t}\r\n\r\n\t// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\r\n\t// Issue #785\r\n\tfunction getSupportsPassive ( ) {\r\n\r\n\t\tvar supportsPassive = false;\r\n\r\n\t\ttry {\r\n\r\n\t\t\tvar opts = Object.defineProperty({}, 'passive', {\r\n\t\t\t\tget: function() {\r\n\t\t\t\t\tsupportsPassive = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\twindow.addEventListener('test', null, opts);\r\n\r\n\t\t} catch (e) {}\r\n\r\n\t\treturn supportsPassive;\r\n\t}\r\n\r\n\tfunction getSupportsTouchActionNone ( ) {\r\n\t\treturn window.CSS && CSS.supports && CSS.supports('touch-action', 'none');\r\n\t}\r\n\r\n\r\n// Value calculation\r\n\r\n\t// Determine the size of a sub-range in relation to a full range.\r\n\tfunction subRangeRatio ( pa, pb ) {\r\n\t\treturn (100 / (pb - pa));\r\n\t}\r\n\r\n\t// (percentage) How many percent is this value of this range?\r\n\tfunction fromPercentage ( range, value ) {\r\n\t\treturn (value * 100) / ( range[1] - range[0] );\r\n\t}\r\n\r\n\t// (percentage) Where is this value on this range?\r\n\tfunction toPercentage ( range, value ) {\r\n\t\treturn fromPercentage( range, range[0] < 0 ?\r\n\t\t\tvalue + Math.abs(range[0]) :\r\n\t\t\t\tvalue - range[0] );\r\n\t}\r\n\r\n\t// (value) How much is this percentage on this range?\r\n\tfunction isPercentage ( range, value ) {\r\n\t\treturn ((value * ( range[1] - range[0] )) / 100) + range[0];\r\n\t}\r\n\r\n\r\n// Range conversion\r\n\r\n\tfunction getJ ( value, arr ) {\r\n\r\n\t\tvar j = 1;\r\n\r\n\t\twhile ( value >= arr[j] ){\r\n\t\t\tj += 1;\r\n\t\t}\r\n\r\n\t\treturn j;\r\n\t}\r\n\r\n\t// (percentage) Input a value, find where, on a scale of 0-100, it applies.\r\n\tfunction toStepping ( xVal, xPct, value ) {\r\n\r\n\t\tif ( value >= xVal.slice(-1)[0] ){\r\n\t\t\treturn 100;\r\n\t\t}\r\n\r\n\t\tvar j = getJ( value, xVal ), va, vb, pa, pb;\r\n\r\n\t\tva = xVal[j-1];\r\n\t\tvb = xVal[j];\r\n\t\tpa = xPct[j-1];\r\n\t\tpb = xPct[j];\r\n\r\n\t\treturn pa + (toPercentage([va, vb], value) / subRangeRatio (pa, pb));\r\n\t}\r\n\r\n\t// (value) Input a percentage, find where it is on the specified range.\r\n\tfunction fromStepping ( xVal, xPct, value ) {\r\n\r\n\t\t// There is no range group that fits 100\r\n\t\tif ( value >= 100 ){\r\n\t\t\treturn xVal.slice(-1)[0];\r\n\t\t}\r\n\r\n\t\tvar j = getJ( value, xPct ), va, vb, pa, pb;\r\n\r\n\t\tva = xVal[j-1];\r\n\t\tvb = xVal[j];\r\n\t\tpa = xPct[j-1];\r\n\t\tpb = xPct[j];\r\n\r\n\t\treturn isPercentage([va, vb], (value - pa) * subRangeRatio (pa, pb));\r\n\t}\r\n\r\n\t// (percentage) Get the step that applies at a certain value.\r\n\tfunction getStep ( xPct, xSteps, snap, value ) {\r\n\r\n\t\tif ( value === 100 ) {\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tvar j = getJ( value, xPct ), a, b;\r\n\r\n\t\t// If 'snap' is set, steps are used as fixed points on the slider.\r\n\t\tif ( snap ) {\r\n\r\n\t\t\ta = xPct[j-1];\r\n\t\t\tb = xPct[j];\r\n\r\n\t\t\t// Find the closest position, a or b.\r\n\t\t\tif ((value - a) > ((b-a)/2)){\r\n\t\t\t\treturn b;\r\n\t\t\t}\r\n\r\n\t\t\treturn a;\r\n\t\t}\r\n\r\n\t\tif ( !xSteps[j-1] ){\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\treturn xPct[j-1] + closest(\r\n\t\t\tvalue - xPct[j-1],\r\n\t\t\txSteps[j-1]\r\n\t\t);\r\n\t}\r\n\r\n\r\n// Entry parsing\r\n\r\n\tfunction handleEntryPoint ( index, value, that ) {\r\n\r\n\t\tvar percentage;\r\n\r\n\t\t// Wrap numerical input in an array.\r\n\t\tif ( typeof value === \"number\" ) {\r\n\t\t\tvalue = [value];\r\n\t\t}\r\n\r\n\t\t// Reject any invalid input, by testing whether value is an array.\r\n\t\tif ( Object.prototype.toString.call( value ) !== '[object Array]' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' contains invalid value.\");\r\n\t\t}\r\n\r\n\t\t// Covert min/max syntax to 0 and 100.\r\n\t\tif ( index === 'min' ) {\r\n\t\t\tpercentage = 0;\r\n\t\t} else if ( index === 'max' ) {\r\n\t\t\tpercentage = 100;\r\n\t\t} else {\r\n\t\t\tpercentage = parseFloat( index );\r\n\t\t}\r\n\r\n\t\t// Check for correct input.\r\n\t\tif ( !isNumeric( percentage ) || !isNumeric( value[0] ) ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' value isn't numeric.\");\r\n\t\t}\r\n\r\n\t\t// Store values.\r\n\t\tthat.xPct.push( percentage );\r\n\t\tthat.xVal.push( value[0] );\r\n\r\n\t\t// NaN will evaluate to false too, but to keep\r\n\t\t// logging clear, set step explicitly. Make sure\r\n\t\t// not to override the 'step' setting with false.\r\n\t\tif ( !percentage ) {\r\n\t\t\tif ( !isNaN( value[1] ) ) {\r\n\t\t\t\tthat.xSteps[0] = value[1];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthat.xSteps.push( isNaN(value[1]) ? false : value[1] );\r\n\t\t}\r\n\r\n\t\tthat.xHighestCompleteStep.push(0);\r\n\t}\r\n\r\n\tfunction handleStepPoint ( i, n, that ) {\r\n\r\n\t\t// Ignore 'false' stepping.\r\n\t\tif ( !n ) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// Factor to range ratio\r\n\t\tthat.xSteps[i] = fromPercentage([\r\n\t\t\t that.xVal[i]\r\n\t\t\t,that.xVal[i+1]\r\n\t\t], n) / subRangeRatio (\r\n\t\t\tthat.xPct[i],\r\n\t\t\tthat.xPct[i+1] );\r\n\r\n\t\tvar totalSteps = (that.xVal[i+1] - that.xVal[i]) / that.xNumSteps[i];\r\n\t\tvar highestStep = Math.ceil(Number(totalSteps.toFixed(3)) - 1);\r\n\t\tvar step = that.xVal[i] + (that.xNumSteps[i] * highestStep);\r\n\r\n\t\tthat.xHighestCompleteStep[i] = step;\r\n\t}\r\n\r\n\r\n// Interface\r\n\r\n\tfunction Spectrum ( entry, snap, singleStep ) {\r\n\r\n\t\tthis.xPct = [];\r\n\t\tthis.xVal = [];\r\n\t\tthis.xSteps = [ singleStep || false ];\r\n\t\tthis.xNumSteps = [ false ];\r\n\t\tthis.xHighestCompleteStep = [];\r\n\r\n\t\tthis.snap = snap;\r\n\r\n\t\tvar index, ordered = [ /* [0, 'min'], [1, '50%'], [2, 'max'] */ ];\r\n\r\n\t\t// Map the object keys to an array.\r\n\t\tfor ( index in entry ) {\r\n\t\t\tif ( entry.hasOwnProperty(index) ) {\r\n\t\t\t\tordered.push([entry[index], index]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Sort all entries by value (numeric sort).\r\n\t\tif ( ordered.length && typeof ordered[0][0] === \"object\" ) {\r\n\t\t\tordered.sort(function(a, b) { return a[0][0] - b[0][0]; });\r\n\t\t} else {\r\n\t\t\tordered.sort(function(a, b) { return a[0] - b[0]; });\r\n\t\t}\r\n\r\n\r\n\t\t// Convert all entries to subranges.\r\n\t\tfor ( index = 0; index < ordered.length; index++ ) {\r\n\t\t\thandleEntryPoint(ordered[index][1], ordered[index][0], this);\r\n\t\t}\r\n\r\n\t\t// Store the actual step values.\r\n\t\t// xSteps is sorted in the same order as xPct and xVal.\r\n\t\tthis.xNumSteps = this.xSteps.slice(0);\r\n\r\n\t\t// Convert all numeric steps to the percentage of the subrange they represent.\r\n\t\tfor ( index = 0; index < this.xNumSteps.length; index++ ) {\r\n\t\t\thandleStepPoint(index, this.xNumSteps[index], this);\r\n\t\t}\r\n\t}\r\n\r\n\tSpectrum.prototype.getMargin = function ( value ) {\r\n\r\n\t\tvar step = this.xNumSteps[0];\r\n\r\n\t\tif ( step && ((value / step) % 1) !== 0 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'limit', 'margin' and 'padding' must be divisible by step.\");\r\n\t\t}\r\n\r\n\t\treturn this.xPct.length === 2 ? fromPercentage(this.xVal, value) : false;\r\n\t};\r\n\r\n\tSpectrum.prototype.toStepping = function ( value ) {\r\n\r\n\t\tvalue = toStepping( this.xVal, this.xPct, value );\r\n\r\n\t\treturn value;\r\n\t};\r\n\r\n\tSpectrum.prototype.fromStepping = function ( value ) {\r\n\r\n\t\treturn fromStepping( this.xVal, this.xPct, value );\r\n\t};\r\n\r\n\tSpectrum.prototype.getStep = function ( value ) {\r\n\r\n\t\tvalue = getStep(this.xPct, this.xSteps, this.snap, value );\r\n\r\n\t\treturn value;\r\n\t};\r\n\r\n\tSpectrum.prototype.getNearbySteps = function ( value ) {\r\n\r\n\t\tvar j = getJ(value, this.xPct);\r\n\r\n\t\treturn {\r\n\t\t\tstepBefore: { startValue: this.xVal[j-2], step: this.xNumSteps[j-2], highestStep: this.xHighestCompleteStep[j-2] },\r\n\t\t\tthisStep: { startValue: this.xVal[j-1], step: this.xNumSteps[j-1], highestStep: this.xHighestCompleteStep[j-1] },\r\n\t\t\tstepAfter: { startValue: this.xVal[j-0], step: this.xNumSteps[j-0], highestStep: this.xHighestCompleteStep[j-0] }\r\n\t\t};\r\n\t};\r\n\r\n\tSpectrum.prototype.countStepDecimals = function () {\r\n\t\tvar stepDecimals = this.xNumSteps.map(countDecimals);\r\n\t\treturn Math.max.apply(null, stepDecimals);\r\n \t};\r\n\r\n\t// Outside testing\r\n\tSpectrum.prototype.convert = function ( value ) {\r\n\t\treturn this.getStep(this.toStepping(value));\r\n\t};\r\n\r\n/*\tEvery input option is tested and parsed. This'll prevent\r\n\tendless validation in internal methods. These tests are\r\n\tstructured with an item for every option available. An\r\n\toption can be marked as required by setting the 'r' flag.\r\n\tThe testing function is provided with three arguments:\r\n\t\t- The provided value for the option;\r\n\t\t- A reference to the options object;\r\n\t\t- The name for the option;\r\n\r\n\tThe testing function returns false when an error is detected,\r\n\tor true when everything is OK. It can also modify the option\r\n\tobject, to make sure all values can be correctly looped elsewhere. */\r\n\r\n\tvar defaultFormatter = { 'to': function( value ){\r\n\t\treturn value !== undefined && value.toFixed(2);\r\n\t}, 'from': Number };\r\n\r\n\tfunction validateFormat ( entry ) {\r\n\r\n\t\t// Any object with a to and from method is supported.\r\n\t\tif ( isValidFormatter(entry) ) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'format' requires 'to' and 'from' methods.\");\r\n\t}\r\n\r\n\tfunction testStep ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric( entry ) ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'step' is not numeric.\");\r\n\t\t}\r\n\r\n\t\t// The step option can still be used to set stepping\r\n\t\t// for linear sliders. Overwritten if set in 'range'.\r\n\t\tparsed.singleStep = entry;\r\n\t}\r\n\r\n\tfunction testRange ( parsed, entry ) {\r\n\r\n\t\t// Filter incorrect input.\r\n\t\tif ( typeof entry !== 'object' || Array.isArray(entry) ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' is not an object.\");\r\n\t\t}\r\n\r\n\t\t// Catch missing start or end.\r\n\t\tif ( entry.min === undefined || entry.max === undefined ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): Missing 'min' or 'max' in 'range'.\");\r\n\t\t}\r\n\r\n\t\t// Catch equal start or end.\r\n\t\tif ( entry.min === entry.max ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' 'min' and 'max' cannot be equal.\");\r\n\t\t}\r\n\r\n\t\tparsed.spectrum = new Spectrum(entry, parsed.snap, parsed.singleStep);\r\n\t}\r\n\r\n\tfunction testStart ( parsed, entry ) {\r\n\r\n\t\tentry = asArray(entry);\r\n\r\n\t\t// Validate input. Values aren't tested, as the public .val method\r\n\t\t// will always provide a valid location.\r\n\t\tif ( !Array.isArray( entry ) || !entry.length ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'start' option is incorrect.\");\r\n\t\t}\r\n\r\n\t\t// Store the number of handles.\r\n\t\tparsed.handles = entry.length;\r\n\r\n\t\t// When the slider is initialized, the .val method will\r\n\t\t// be called with the start options.\r\n\t\tparsed.start = entry;\r\n\t}\r\n\r\n\tfunction testSnap ( parsed, entry ) {\r\n\r\n\t\t// Enforce 100% stepping within subranges.\r\n\t\tparsed.snap = entry;\r\n\r\n\t\tif ( typeof entry !== 'boolean' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'snap' option must be a boolean.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testAnimate ( parsed, entry ) {\r\n\r\n\t\t// Enforce 100% stepping within subranges.\r\n\t\tparsed.animate = entry;\r\n\r\n\t\tif ( typeof entry !== 'boolean' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'animate' option must be a boolean.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testAnimationDuration ( parsed, entry ) {\r\n\r\n\t\tparsed.animationDuration = entry;\r\n\r\n\t\tif ( typeof entry !== 'number' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'animationDuration' option must be a number.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testConnect ( parsed, entry ) {\r\n\r\n\t\tvar connect = [false];\r\n\t\tvar i;\r\n\r\n\t\t// Map legacy options\r\n\t\tif ( entry === 'lower' ) {\r\n\t\t\tentry = [true, false];\r\n\t\t}\r\n\r\n\t\telse if ( entry === 'upper' ) {\r\n\t\t\tentry = [false, true];\r\n\t\t}\r\n\r\n\t\t// Handle boolean options\r\n\t\tif ( entry === true || entry === false ) {\r\n\r\n\t\t\tfor ( i = 1; i < parsed.handles; i++ ) {\r\n\t\t\t\tconnect.push(entry);\r\n\t\t\t}\r\n\r\n\t\t\tconnect.push(false);\r\n\t\t}\r\n\r\n\t\t// Reject invalid input\r\n\t\telse if ( !Array.isArray( entry ) || !entry.length || entry.length !== parsed.handles + 1 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'connect' option doesn't match handle count.\");\r\n\t\t}\r\n\r\n\t\telse {\r\n\t\t\tconnect = entry;\r\n\t\t}\r\n\r\n\t\tparsed.connect = connect;\r\n\t}\r\n\r\n\tfunction testOrientation ( parsed, entry ) {\r\n\r\n\t\t// Set orientation to an a numerical value for easy\r\n\t\t// array selection.\r\n\t\tswitch ( entry ){\r\n\t\t  case 'horizontal':\r\n\t\t\tparsed.ort = 0;\r\n\t\t\tbreak;\r\n\t\t  case 'vertical':\r\n\t\t\tparsed.ort = 1;\r\n\t\t\tbreak;\r\n\t\t  default:\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'orientation' option is invalid.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testMargin ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric(entry) ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'margin' option must be numeric.\");\r\n\t\t}\r\n\r\n\t\t// Issue #582\r\n\t\tif ( entry === 0 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tparsed.margin = parsed.spectrum.getMargin(entry);\r\n\r\n\t\tif ( !parsed.margin ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'margin' option is only supported on linear sliders.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testLimit ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric(entry) ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'limit' option must be numeric.\");\r\n\t\t}\r\n\r\n\t\tparsed.limit = parsed.spectrum.getMargin(entry);\r\n\r\n\t\tif ( !parsed.limit || parsed.handles < 2 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'limit' option is only supported on linear sliders with 2 or more handles.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testPadding ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric(entry) ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must be numeric.\");\r\n\t\t}\r\n\r\n\t\tif ( entry === 0 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tparsed.padding = parsed.spectrum.getMargin(entry);\r\n\r\n\t\tif ( !parsed.padding ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option is only supported on linear sliders.\");\r\n\t\t}\r\n\r\n\t\tif ( parsed.padding < 0 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must be a positive number.\");\r\n\t\t}\r\n\r\n\t\tif ( parsed.padding >= 50 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must be less than half the range.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testDirection ( parsed, entry ) {\r\n\r\n\t\t// Set direction as a numerical value for easy parsing.\r\n\t\t// Invert connection for RTL sliders, so that the proper\r\n\t\t// handles get the connect/background classes.\r\n\t\tswitch ( entry ) {\r\n\t\t  case 'ltr':\r\n\t\t\tparsed.dir = 0;\r\n\t\t\tbreak;\r\n\t\t  case 'rtl':\r\n\t\t\tparsed.dir = 1;\r\n\t\t\tbreak;\r\n\t\t  default:\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'direction' option was not recognized.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testBehaviour ( parsed, entry ) {\r\n\r\n\t\t// Make sure the input is a string.\r\n\t\tif ( typeof entry !== 'string' ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'behaviour' must be a string containing options.\");\r\n\t\t}\r\n\r\n\t\t// Check if the string contains any keywords.\r\n\t\t// None are required.\r\n\t\tvar tap = entry.indexOf('tap') >= 0;\r\n\t\tvar drag = entry.indexOf('drag') >= 0;\r\n\t\tvar fixed = entry.indexOf('fixed') >= 0;\r\n\t\tvar snap = entry.indexOf('snap') >= 0;\r\n\t\tvar hover = entry.indexOf('hover') >= 0;\r\n\r\n\t\tif ( fixed ) {\r\n\r\n\t\t\tif ( parsed.handles !== 2 ) {\r\n\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'fixed' behaviour must be used with 2 handles\");\r\n\t\t\t}\r\n\r\n\t\t\t// Use margin to enforce fixed state\r\n\t\t\ttestMargin(parsed, parsed.start[1] - parsed.start[0]);\r\n\t\t}\r\n\r\n\t\tparsed.events = {\r\n\t\t\ttap: tap || snap,\r\n\t\t\tdrag: drag,\r\n\t\t\tfixed: fixed,\r\n\t\t\tsnap: snap,\r\n\t\t\thover: hover\r\n\t\t};\r\n\t}\r\n\r\n\tfunction testTooltips ( parsed, entry ) {\r\n\r\n\t\tif ( entry === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\telse if ( entry === true ) {\r\n\r\n\t\t\tparsed.tooltips = [];\r\n\r\n\t\t\tfor ( var i = 0; i < parsed.handles; i++ ) {\r\n\t\t\t\tparsed.tooltips.push(true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\telse {\r\n\r\n\t\t\tparsed.tooltips = asArray(entry);\r\n\r\n\t\t\tif ( parsed.tooltips.length !== parsed.handles ) {\r\n\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): must pass a formatter for all handles.\");\r\n\t\t\t}\r\n\r\n\t\t\tparsed.tooltips.forEach(function(formatter){\r\n\t\t\t\tif ( typeof formatter !== 'boolean' && (typeof formatter !== 'object' || typeof formatter.to !== 'function') ) {\r\n\t\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'tooltips' must be passed a formatter or 'false'.\");\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testAriaFormat ( parsed, entry ) {\r\n\t\tparsed.ariaFormat = entry;\r\n\t\tvalidateFormat(entry);\r\n\t}\r\n\r\n\tfunction testFormat ( parsed, entry ) {\r\n\t\tparsed.format = entry;\r\n\t\tvalidateFormat(entry);\r\n\t}\r\n\r\n\tfunction testCssPrefix ( parsed, entry ) {\r\n\r\n\t\tif ( entry !== undefined && typeof entry !== 'string' && entry !== false ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'cssPrefix' must be a string or `false`.\");\r\n\t\t}\r\n\r\n\t\tparsed.cssPrefix = entry;\r\n\t}\r\n\r\n\tfunction testCssClasses ( parsed, entry ) {\r\n\r\n\t\tif ( entry !== undefined && typeof entry !== 'object' ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'cssClasses' must be an object.\");\r\n\t\t}\r\n\r\n\t\tif ( typeof parsed.cssPrefix === 'string' ) {\r\n\t\t\tparsed.cssClasses = {};\r\n\r\n\t\t\tfor ( var key in entry ) {\r\n\t\t\t\tif ( !entry.hasOwnProperty(key) ) { continue; }\r\n\r\n\t\t\t\tparsed.cssClasses[key] = parsed.cssPrefix + entry[key];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tparsed.cssClasses = entry;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testUseRaf ( parsed, entry ) {\r\n\t\tif ( entry === true || entry === false ) {\r\n\t\t\tparsed.useRequestAnimationFrame = entry;\r\n\t\t} else {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'useRequestAnimationFrame' option should be true (default) or false.\");\r\n\t\t}\r\n\t}\r\n\r\n\t// Test all developer settings and parse to assumption-safe values.\r\n\tfunction testOptions ( options ) {\r\n\r\n\t\t// To prove a fix for #537, freeze options here.\r\n\t\t// If the object is modified, an error will be thrown.\r\n\t\t// Object.freeze(options);\r\n\r\n\t\tvar parsed = {\r\n\t\t\tmargin: 0,\r\n\t\t\tlimit: 0,\r\n\t\t\tpadding: 0,\r\n\t\t\tanimate: true,\r\n\t\t\tanimationDuration: 300,\r\n\t\t\tariaFormat: defaultFormatter,\r\n\t\t\tformat: defaultFormatter\r\n\t\t};\r\n\r\n\t\t// Tests are executed in the order they are presented here.\r\n\t\tvar tests = {\r\n\t\t\t'step': { r: false, t: testStep },\r\n\t\t\t'start': { r: true, t: testStart },\r\n\t\t\t'connect': { r: true, t: testConnect },\r\n\t\t\t'direction': { r: true, t: testDirection },\r\n\t\t\t'snap': { r: false, t: testSnap },\r\n\t\t\t'animate': { r: false, t: testAnimate },\r\n\t\t\t'animationDuration': { r: false, t: testAnimationDuration },\r\n\t\t\t'range': { r: true, t: testRange },\r\n\t\t\t'orientation': { r: false, t: testOrientation },\r\n\t\t\t'margin': { r: false, t: testMargin },\r\n\t\t\t'limit': { r: false, t: testLimit },\r\n\t\t\t'padding': { r: false, t: testPadding },\r\n\t\t\t'behaviour': { r: true, t: testBehaviour },\r\n\t\t\t'ariaFormat': { r: false, t: testAriaFormat },\r\n\t\t\t'format': { r: false, t: testFormat },\r\n\t\t\t'tooltips': { r: false, t: testTooltips },\r\n\t\t\t'cssPrefix': { r: false, t: testCssPrefix },\r\n\t\t\t'cssClasses': { r: false, t: testCssClasses },\r\n\t\t\t'useRequestAnimationFrame': { r: false, t: testUseRaf }\r\n\t\t};\r\n\r\n\t\tvar defaults = {\r\n\t\t\t'connect': false,\r\n\t\t\t'direction': 'ltr',\r\n\t\t\t'behaviour': 'tap',\r\n\t\t\t'orientation': 'horizontal',\r\n\t\t\t'cssPrefix' : 'noUi-',\r\n\t\t\t'cssClasses': {\r\n\t\t\t\ttarget: 'target',\r\n\t\t\t\tbase: 'base',\r\n\t\t\t\torigin: 'origin',\r\n\t\t\t\thandle: 'handle',\r\n\t\t\t\thandleLower: 'handle-lower',\r\n\t\t\t\thandleUpper: 'handle-upper',\r\n\t\t\t\thorizontal: 'horizontal',\r\n\t\t\t\tvertical: 'vertical',\r\n\t\t\t\tbackground: 'background',\r\n\t\t\t\tconnect: 'connect',\r\n\t\t\t\tltr: 'ltr',\r\n\t\t\t\trtl: 'rtl',\r\n\t\t\t\tdraggable: 'draggable',\r\n\t\t\t\tdrag: 'state-drag',\r\n\t\t\t\ttap: 'state-tap',\r\n\t\t\t\tactive: 'active',\r\n\t\t\t\ttooltip: 'tooltip',\r\n\t\t\t\tpips: 'pips',\r\n\t\t\t\tpipsHorizontal: 'pips-horizontal',\r\n\t\t\t\tpipsVertical: 'pips-vertical',\r\n\t\t\t\tmarker: 'marker',\r\n\t\t\t\tmarkerHorizontal: 'marker-horizontal',\r\n\t\t\t\tmarkerVertical: 'marker-vertical',\r\n\t\t\t\tmarkerNormal: 'marker-normal',\r\n\t\t\t\tmarkerLarge: 'marker-large',\r\n\t\t\t\tmarkerSub: 'marker-sub',\r\n\t\t\t\tvalue: 'value',\r\n\t\t\t\tvalueHorizontal: 'value-horizontal',\r\n\t\t\t\tvalueVertical: 'value-vertical',\r\n\t\t\t\tvalueNormal: 'value-normal',\r\n\t\t\t\tvalueLarge: 'value-large',\r\n\t\t\t\tvalueSub: 'value-sub'\r\n\t\t\t},\r\n\t\t\t'useRequestAnimationFrame': true\r\n\t\t};\r\n\r\n\t\t// AriaFormat defaults to regular format, if any.\r\n\t\tif ( options.format && !options.ariaFormat ) {\r\n\t\t\toptions.ariaFormat = options.format;\r\n\t\t}\r\n\r\n\t\t// Run all options through a testing mechanism to ensure correct\r\n\t\t// input. It should be noted that options might get modified to\r\n\t\t// be handled properly. E.g. wrapping integers in arrays.\r\n\t\tObject.keys(tests).forEach(function( name ){\r\n\r\n\t\t\t// If the option isn't set, but it is required, throw an error.\r\n\t\t\tif ( options[name] === undefined && defaults[name] === undefined ) {\r\n\r\n\t\t\t\tif ( tests[name].r ) {\r\n\t\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): '\" + name + \"' is required.\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\ttests[name].t( parsed, options[name] === undefined ? defaults[name] : options[name] );\r\n\t\t});\r\n\r\n\t\t// Forward pips options\r\n\t\tparsed.pips = options.pips;\r\n\r\n\t\tvar styles = [['left', 'top'], ['right', 'bottom']];\r\n\r\n\t\t// Pre-define the styles.\r\n\t\tparsed.style = styles[parsed.dir][parsed.ort];\r\n\t\tparsed.styleOposite = styles[parsed.dir?0:1][parsed.ort];\r\n\r\n\t\treturn parsed;\r\n\t}\r\n\r\n\r\nfunction closure ( target, options, originalOptions ){\r\n\r\n\tvar actions = getActions();\r\n\tvar supportsTouchActionNone = getSupportsTouchActionNone();\r\n\tvar supportsPassive = supportsTouchActionNone && getSupportsPassive();\r\n\r\n\t// All variables local to 'closure' are prefixed with 'scope_'\r\n\tvar scope_Target = target;\r\n\tvar scope_Locations = [];\r\n\tvar scope_Base;\r\n\tvar scope_Handles;\r\n\tvar scope_HandleNumbers = [];\r\n\tvar scope_ActiveHandle = false;\r\n\tvar scope_Connects;\r\n\tvar scope_Spectrum = options.spectrum;\r\n\tvar scope_Values = [];\r\n\tvar scope_Events = {};\r\n\tvar scope_Self;\r\n\tvar scope_Pips;\r\n\tvar scope_Listeners = null;\r\n\tvar scope_Document = target.ownerDocument;\r\n\tvar scope_DocumentElement = scope_Document.documentElement;\r\n\tvar scope_Body = scope_Document.body;\r\n\r\n\r\n\t// Creates a node, adds it to target, returns the new node.\r\n\tfunction addNodeTo ( target, className ) {\r\n\r\n\t\tvar div = scope_Document.createElement('div');\r\n\r\n\t\tif ( className ) {\r\n\t\t\taddClass(div, className);\r\n\t\t}\r\n\r\n\t\ttarget.appendChild(div);\r\n\r\n\t\treturn div;\r\n\t}\r\n\r\n\t// Append a origin to the base\r\n\tfunction addOrigin ( base, handleNumber ) {\r\n\r\n\t\tvar origin = addNodeTo(base, options.cssClasses.origin);\r\n\t\tvar handle = addNodeTo(origin, options.cssClasses.handle);\r\n\r\n\t\thandle.setAttribute('data-handle', handleNumber);\r\n\r\n\t\t// https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex\r\n\t\t// 0 = focusable and reachable\r\n\t\thandle.setAttribute('tabindex', '0');\r\n\t\thandle.setAttribute('role', 'slider');\r\n\t\thandle.setAttribute('aria-orientation', options.ort ? 'vertical' : 'horizontal');\r\n\r\n\t\tif ( handleNumber === 0 ) {\r\n\t\t\taddClass(handle, options.cssClasses.handleLower);\r\n\t\t}\r\n\r\n\t\telse if ( handleNumber === options.handles - 1 ) {\r\n\t\t\taddClass(handle, options.cssClasses.handleUpper);\r\n\t\t}\r\n\r\n\t\treturn origin;\r\n\t}\r\n\r\n\t// Insert nodes for connect elements\r\n\tfunction addConnect ( base, add ) {\r\n\r\n\t\tif ( !add ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn addNodeTo(base, options.cssClasses.connect);\r\n\t}\r\n\r\n\t// Add handles to the slider base.\r\n\tfunction addElements ( connectOptions, base ) {\r\n\r\n\t\tscope_Handles = [];\r\n\t\tscope_Connects = [];\r\n\r\n\t\tscope_Connects.push(addConnect(base, connectOptions[0]));\r\n\r\n\t\t// [::::O====O====O====]\r\n\t\t// connectOptions = [0, 1, 1, 1]\r\n\r\n\t\tfor ( var i = 0; i < options.handles; i++ ) {\r\n\t\t\t// Keep a list of all added handles.\r\n\t\t\tscope_Handles.push(addOrigin(base, i));\r\n\t\t\tscope_HandleNumbers[i] = i;\r\n\t\t\tscope_Connects.push(addConnect(base, connectOptions[i + 1]));\r\n\t\t}\r\n\t}\r\n\r\n\t// Initialize a single slider.\r\n\tfunction addSlider ( target ) {\r\n\r\n\t\t// Apply classes and data to the target.\r\n\t\taddClass(target, options.cssClasses.target);\r\n\r\n\t\tif ( options.dir === 0 ) {\r\n\t\t\taddClass(target, options.cssClasses.ltr);\r\n\t\t} else {\r\n\t\t\taddClass(target, options.cssClasses.rtl);\r\n\t\t}\r\n\r\n\t\tif ( options.ort === 0 ) {\r\n\t\t\taddClass(target, options.cssClasses.horizontal);\r\n\t\t} else {\r\n\t\t\taddClass(target, options.cssClasses.vertical);\r\n\t\t}\r\n\r\n\t\tscope_Base = addNodeTo(target, options.cssClasses.base);\r\n\t}\r\n\r\n\r\n\tfunction addTooltip ( handle, handleNumber ) {\r\n\r\n\t\tif ( !options.tooltips[handleNumber] ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn addNodeTo(handle.firstChild, options.cssClasses.tooltip);\r\n\t}\r\n\r\n\t// The tooltips option is a shorthand for using the 'update' event.\r\n\tfunction tooltips ( ) {\r\n\r\n\t\t// Tooltips are added with options.tooltips in original order.\r\n\t\tvar tips = scope_Handles.map(addTooltip);\r\n\r\n\t\tbindEvent('update', function(values, handleNumber, unencoded) {\r\n\r\n\t\t\tif ( !tips[handleNumber] ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar formattedValue = values[handleNumber];\r\n\r\n\t\t\tif ( options.tooltips[handleNumber] !== true ) {\r\n\t\t\t\tformattedValue = options.tooltips[handleNumber].to(unencoded[handleNumber]);\r\n\t\t\t}\r\n\r\n\t\t\ttips[handleNumber].innerHTML = formattedValue;\r\n\t\t});\r\n\t}\r\n\r\n\r\n\tfunction aria ( ) {\r\n\r\n\t\tbindEvent('update', function ( values, handleNumber, unencoded, tap, positions ) {\r\n\r\n\t\t\t// Update Aria Values for all handles, as a change in one changes min and max values for the next.\r\n\t\t\tscope_HandleNumbers.forEach(function( handleNumber ){\r\n\r\n\t\t\t\tvar handle = scope_Handles[handleNumber];\r\n\r\n\t\t\t\tvar min = checkHandlePosition(scope_Locations, handleNumber, 0, true, true, true);\r\n\t\t\t\tvar max = checkHandlePosition(scope_Locations, handleNumber, 100, true, true, true);\r\n\r\n\t\t\t\tvar now = positions[handleNumber];\r\n\t\t\t\tvar text = options.ariaFormat.to(unencoded[handleNumber]);\r\n\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuemin', min.toFixed(1));\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuemax', max.toFixed(1));\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuenow', now.toFixed(1));\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuetext', text);\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\r\n\tfunction getGroup ( mode, values, stepped ) {\r\n\r\n\t\t// Use the range.\r\n\t\tif ( mode === 'range' || mode === 'steps' ) {\r\n\t\t\treturn scope_Spectrum.xVal;\r\n\t\t}\r\n\r\n\t\tif ( mode === 'count' ) {\r\n\r\n\t\t\tif ( !values ) {\r\n\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'values' required for mode 'count'.\");\r\n\t\t\t}\r\n\r\n\t\t\t// Divide 0 - 100 in 'count' parts.\r\n\t\t\tvar spread = ( 100 / (values - 1) );\r\n\t\t\tvar v;\r\n\t\t\tvar i = 0;\r\n\r\n\t\t\tvalues = [];\r\n\r\n\t\t\t// List these parts and have them handled as 'positions'.\r\n\t\t\twhile ( (v = i++ * spread) <= 100 ) {\r\n\t\t\t\tvalues.push(v);\r\n\t\t\t}\r\n\r\n\t\t\tmode = 'positions';\r\n\t\t}\r\n\r\n\t\tif ( mode === 'positions' ) {\r\n\r\n\t\t\t// Map all percentages to on-range values.\r\n\t\t\treturn values.map(function( value ){\r\n\t\t\t\treturn scope_Spectrum.fromStepping( stepped ? scope_Spectrum.getStep( value ) : value );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( mode === 'values' ) {\r\n\r\n\t\t\t// If the value must be stepped, it needs to be converted to a percentage first.\r\n\t\t\tif ( stepped ) {\r\n\r\n\t\t\t\treturn values.map(function( value ){\r\n\r\n\t\t\t\t\t// Convert to percentage, apply step, return to value.\r\n\t\t\t\t\treturn scope_Spectrum.fromStepping( scope_Spectrum.getStep( scope_Spectrum.toStepping( value ) ) );\r\n\t\t\t\t});\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Otherwise, we can simply use the values.\r\n\t\t\treturn values;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction generateSpread ( density, mode, group ) {\r\n\r\n\t\tfunction safeIncrement(value, increment) {\r\n\t\t\t// Avoid floating point variance by dropping the smallest decimal places.\r\n\t\t\treturn (value + increment).toFixed(7) / 1;\r\n\t\t}\r\n\r\n\t\tvar indexes = {};\r\n\t\tvar firstInRange = scope_Spectrum.xVal[0];\r\n\t\tvar lastInRange = scope_Spectrum.xVal[scope_Spectrum.xVal.length-1];\r\n\t\tvar ignoreFirst = false;\r\n\t\tvar ignoreLast = false;\r\n\t\tvar prevPct = 0;\r\n\r\n\t\t// Create a copy of the group, sort it and filter away all duplicates.\r\n\t\tgroup = unique(group.slice().sort(function(a, b){ return a - b; }));\r\n\r\n\t\t// Make sure the range starts with the first element.\r\n\t\tif ( group[0] !== firstInRange ) {\r\n\t\t\tgroup.unshift(firstInRange);\r\n\t\t\tignoreFirst = true;\r\n\t\t}\r\n\r\n\t\t// Likewise for the last one.\r\n\t\tif ( group[group.length - 1] !== lastInRange ) {\r\n\t\t\tgroup.push(lastInRange);\r\n\t\t\tignoreLast = true;\r\n\t\t}\r\n\r\n\t\tgroup.forEach(function ( current, index ) {\r\n\r\n\t\t\t// Get the current step and the lower + upper positions.\r\n\t\t\tvar step;\r\n\t\t\tvar i;\r\n\t\t\tvar q;\r\n\t\t\tvar low = current;\r\n\t\t\tvar high = group[index+1];\r\n\t\t\tvar newPct;\r\n\t\t\tvar pctDifference;\r\n\t\t\tvar pctPos;\r\n\t\t\tvar type;\r\n\t\t\tvar steps;\r\n\t\t\tvar realSteps;\r\n\t\t\tvar stepsize;\r\n\r\n\t\t\t// When using 'steps' mode, use the provided steps.\r\n\t\t\t// Otherwise, we'll step on to the next subrange.\r\n\t\t\tif ( mode === 'steps' ) {\r\n\t\t\t\tstep = scope_Spectrum.xNumSteps[ index ];\r\n\t\t\t}\r\n\r\n\t\t\t// Default to a 'full' step.\r\n\t\t\tif ( !step ) {\r\n\t\t\t\tstep = high-low;\r\n\t\t\t}\r\n\r\n\t\t\t// Low can be 0, so test for false. If high is undefined,\r\n\t\t\t// we are at the last subrange. Index 0 is already handled.\r\n\t\t\tif ( low === false || high === undefined ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Make sure step isn't 0, which would cause an infinite loop (#654)\r\n\t\t\tstep = Math.max(step, 0.0000001);\r\n\r\n\t\t\t// Find all steps in the subrange.\r\n\t\t\tfor ( i = low; i <= high; i = safeIncrement(i, step) ) {\r\n\r\n\t\t\t\t// Get the percentage value for the current step,\r\n\t\t\t\t// calculate the size for the subrange.\r\n\t\t\t\tnewPct = scope_Spectrum.toStepping( i );\r\n\t\t\t\tpctDifference = newPct - prevPct;\r\n\r\n\t\t\t\tsteps = pctDifference / density;\r\n\t\t\t\trealSteps = Math.round(steps);\r\n\r\n\t\t\t\t// This ratio represents the ammount of percentage-space a point indicates.\r\n\t\t\t\t// For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-devided.\r\n\t\t\t\t// Round the percentage offset to an even number, then divide by two\r\n\t\t\t\t// to spread the offset on both sides of the range.\r\n\t\t\t\tstepsize = pctDifference/realSteps;\r\n\r\n\t\t\t\t// Divide all points evenly, adding the correct number to this subrange.\r\n\t\t\t\t// Run up to <= so that 100% gets a point, event if ignoreLast is set.\r\n\t\t\t\tfor ( q = 1; q <= realSteps; q += 1 ) {\r\n\r\n\t\t\t\t\t// The ratio between the rounded value and the actual size might be ~1% off.\r\n\t\t\t\t\t// Correct the percentage offset by the number of points\r\n\t\t\t\t\t// per subrange. density = 1 will result in 100 points on the\r\n\t\t\t\t\t// full range, 2 for 50, 4 for 25, etc.\r\n\t\t\t\t\tpctPos = prevPct + ( q * stepsize );\r\n\t\t\t\t\tindexes[pctPos.toFixed(5)] = ['x', 0];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Determine the point type.\r\n\t\t\t\ttype = (group.indexOf(i) > -1) ? 1 : ( mode === 'steps' ? 2 : 0 );\r\n\r\n\t\t\t\t// Enforce the 'ignoreFirst' option by overwriting the type for 0.\r\n\t\t\t\tif ( !index && ignoreFirst ) {\r\n\t\t\t\t\ttype = 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( !(i === high && ignoreLast)) {\r\n\t\t\t\t\t// Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value.\r\n\t\t\t\t\tindexes[newPct.toFixed(5)] = [i, type];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Update the percentage count.\r\n\t\t\t\tprevPct = newPct;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn indexes;\r\n\t}\r\n\r\n\tfunction addMarking ( spread, filterFunc, formatter ) {\r\n\r\n\t\tvar element = scope_Document.createElement('div');\r\n\r\n\t\tvar valueSizeClasses = [\r\n\t\t\toptions.cssClasses.valueNormal,\r\n\t\t\toptions.cssClasses.valueLarge,\r\n\t\t\toptions.cssClasses.valueSub\r\n\t\t];\r\n\t\tvar markerSizeClasses = [\r\n\t\t\toptions.cssClasses.markerNormal,\r\n\t\t\toptions.cssClasses.markerLarge,\r\n\t\t\toptions.cssClasses.markerSub\r\n\t\t];\r\n\t\tvar valueOrientationClasses = [\r\n\t\t\toptions.cssClasses.valueHorizontal,\r\n\t\t\toptions.cssClasses.valueVertical\r\n\t\t];\r\n\t\tvar markerOrientationClasses = [\r\n\t\t\toptions.cssClasses.markerHorizontal,\r\n\t\t\toptions.cssClasses.markerVertical\r\n\t\t];\r\n\r\n\t\taddClass(element, options.cssClasses.pips);\r\n\t\taddClass(element, options.ort === 0 ? options.cssClasses.pipsHorizontal : options.cssClasses.pipsVertical);\r\n\r\n\t\tfunction getClasses( type, source ){\r\n\t\t\tvar a = source === options.cssClasses.value;\r\n\t\t\tvar orientationClasses = a ? valueOrientationClasses : markerOrientationClasses;\r\n\t\t\tvar sizeClasses = a ? valueSizeClasses : markerSizeClasses;\r\n\r\n\t\t\treturn source + ' ' + orientationClasses[options.ort] + ' ' + sizeClasses[type];\r\n\t\t}\r\n\r\n\t\tfunction addSpread ( offset, values ){\r\n\r\n\t\t\t// Apply the filter function, if it is set.\r\n\t\t\tvalues[1] = (values[1] && filterFunc) ? filterFunc(values[0], values[1]) : values[1];\r\n\r\n\t\t\t// Add a marker for every point\r\n\t\t\tvar node = addNodeTo(element, false);\r\n\t\t\t\tnode.className = getClasses(values[1], options.cssClasses.marker);\r\n\t\t\t\tnode.style[options.style] = offset + '%';\r\n\r\n\t\t\t// Values are only appended for points marked '1' or '2'.\r\n\t\t\tif ( values[1] ) {\r\n\t\t\t\tnode = addNodeTo(element, false);\r\n\t\t\t\tnode.className = getClasses(values[1], options.cssClasses.value);\r\n\t\t\t\tnode.style[options.style] = offset + '%';\r\n\t\t\t\tnode.innerText = formatter.to(values[0]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Append all points.\r\n\t\tObject.keys(spread).forEach(function(a){\r\n\t\t\taddSpread(a, spread[a]);\r\n\t\t});\r\n\r\n\t\treturn element;\r\n\t}\r\n\r\n\tfunction removePips ( ) {\r\n\t\tif ( scope_Pips ) {\r\n\t\t\tremoveElement(scope_Pips);\r\n\t\t\tscope_Pips = null;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction pips ( grid ) {\r\n\r\n\t\t// Fix #669\r\n\t\tremovePips();\r\n\r\n\t\tvar mode = grid.mode;\r\n\t\tvar density = grid.density || 1;\r\n\t\tvar filter = grid.filter || false;\r\n\t\tvar values = grid.values || false;\r\n\t\tvar stepped = grid.stepped || false;\r\n\t\tvar group = getGroup( mode, values, stepped );\r\n\t\tvar spread = generateSpread( density, mode, group );\r\n\t\tvar format = grid.format || {\r\n\t\t\tto: Math.round\r\n\t\t};\r\n\r\n\t\tscope_Pips = scope_Target.appendChild(addMarking(\r\n\t\t\tspread,\r\n\t\t\tfilter,\r\n\t\t\tformat\r\n\t\t));\r\n\r\n\t\treturn scope_Pips;\r\n\t}\r\n\r\n\r\n\t// Shorthand for base dimensions.\r\n\tfunction baseSize ( ) {\r\n\t\tvar rect = scope_Base.getBoundingClientRect(), alt = 'offset' + ['Width', 'Height'][options.ort];\r\n\t\treturn options.ort === 0 ? (rect.width||scope_Base[alt]) : (rect.height||scope_Base[alt]);\r\n\t}\r\n\r\n\t// Handler for attaching events trough a proxy.\r\n\tfunction attachEvent ( events, element, callback, data ) {\r\n\r\n\t\t// This function can be used to 'filter' events to the slider.\r\n\t\t// element is a node, not a nodeList\r\n\r\n\t\tvar method = function ( e ){\r\n\r\n\t\t\tif ( scope_Target.hasAttribute('disabled') ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Stop if an active 'tap' transition is taking place.\r\n\t\t\tif ( hasClass(scope_Target, options.cssClasses.tap) ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\te = fixEvent(e, data.pageOffset);\r\n\r\n\t\t\t// Handle reject of multitouch\r\n\t\t\tif ( !e ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Ignore right or middle clicks on start #454\r\n\t\t\tif ( events === actions.start && e.buttons !== undefined && e.buttons > 1 ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Ignore right or middle clicks on start #454\r\n\t\t\tif ( data.hover && e.buttons ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// 'supportsPassive' is only true if a browser also supports touch-action: none in CSS.\r\n\t\t\t// iOS safari does not, so it doesn't get to benefit from passive scrolling. iOS does support\r\n\t\t\t// touch-action: manipulation, but that allows panning, which breaks\r\n\t\t\t// sliders after zooming/on non-responsive pages.\r\n\t\t\t// See: https://bugs.webkit.org/show_bug.cgi?id=133112\r\n\t\t\tif ( !supportsPassive ) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t}\r\n\r\n\t\t\te.calcPoint = e.points[ options.ort ];\r\n\r\n\t\t\t// Call the event handler with the event [ and additional data ].\r\n\t\t\tcallback ( e, data );\r\n\t\t};\r\n\r\n\t\tvar methods = [];\r\n\r\n\t\t// Bind a closure on the target for every event type.\r\n\t\tevents.split(' ').forEach(function( eventName ){\r\n\t\t\telement.addEventListener(eventName, method, supportsPassive ? { passive: true } : false);\r\n\t\t\tmethods.push([eventName, method]);\r\n\t\t});\r\n\r\n\t\treturn methods;\r\n\t}\r\n\r\n\t// Provide a clean event with standardized offset values.\r\n\tfunction fixEvent ( e, pageOffset ) {\r\n\r\n\t\t// Filter the event to register the type, which can be\r\n\t\t// touch, mouse or pointer. Offset changes need to be\r\n\t\t// made on an event specific basis.\r\n\t\tvar touch = e.type.indexOf('touch') === 0;\r\n\t\tvar mouse = e.type.indexOf('mouse') === 0;\r\n\t\tvar pointer = e.type.indexOf('pointer') === 0;\r\n\r\n\t\tvar x;\r\n\t\tvar y;\r\n\r\n\t\t// IE10 implemented pointer events with a prefix;\r\n\t\tif ( e.type.indexOf('MSPointer') === 0 ) {\r\n\t\t\tpointer = true;\r\n\t\t}\r\n\r\n\t\tif ( touch ) {\r\n\r\n\t\t\t// Fix bug when user touches with two or more fingers on mobile devices.\r\n\t\t\t// It's useful when you have two or more sliders on one page,\r\n\t\t\t// that can be touched simultaneously.\r\n\t\t\t// #649, #663, #668\r\n\t\t\tif ( e.touches.length > 1 ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// noUiSlider supports one movement at a time,\r\n\t\t\t// so we can select the first 'changedTouch'.\r\n\t\t\tx = e.changedTouches[0].pageX;\r\n\t\t\ty = e.changedTouches[0].pageY;\r\n\t\t}\r\n\r\n\t\tpageOffset = pageOffset || getPageOffset(scope_Document);\r\n\r\n\t\tif ( mouse || pointer ) {\r\n\t\t\tx = e.clientX + pageOffset.x;\r\n\t\t\ty = e.clientY + pageOffset.y;\r\n\t\t}\r\n\r\n\t\te.pageOffset = pageOffset;\r\n\t\te.points = [x, y];\r\n\t\te.cursor = mouse || pointer; // Fix #435\r\n\r\n\t\treturn e;\r\n\t}\r\n\r\n\t// Translate a coordinate in the document to a percentage on the slider\r\n\tfunction calcPointToPercentage ( calcPoint ) {\r\n\t\tvar location = calcPoint - offset(scope_Base, options.ort);\r\n\t\tvar proposal = ( location * 100 ) / baseSize();\r\n\t\treturn options.dir ? 100 - proposal : proposal;\r\n\t}\r\n\r\n\t// Find handle closest to a certain percentage on the slider\r\n\tfunction getClosestHandle ( proposal ) {\r\n\r\n\t\tvar closest = 100;\r\n\t\tvar handleNumber = false;\r\n\r\n\t\tscope_Handles.forEach(function(handle, index){\r\n\r\n\t\t\t// Disabled handles are ignored\r\n\t\t\tif ( handle.hasAttribute('disabled') ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar pos = Math.abs(scope_Locations[index] - proposal);\r\n\r\n\t\t\tif ( pos < closest ) {\r\n\t\t\t\thandleNumber = index;\r\n\t\t\t\tclosest = pos;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn handleNumber;\r\n\t}\r\n\r\n\t// Moves handle(s) by a percentage\r\n\t// (bool, % to move, [% where handle started, ...], [index in scope_Handles, ...])\r\n\tfunction moveHandles ( upward, proposal, locations, handleNumbers ) {\r\n\r\n\t\tvar proposals = locations.slice();\r\n\r\n\t\tvar b = [!upward, upward];\r\n\t\tvar f = [upward, !upward];\r\n\r\n\t\t// Copy handleNumbers so we don't change the dataset\r\n\t\thandleNumbers = handleNumbers.slice();\r\n\r\n\t\t// Check to see which handle is 'leading'.\r\n\t\t// If that one can't move the second can't either.\r\n\t\tif ( upward ) {\r\n\t\t\thandleNumbers.reverse();\r\n\t\t}\r\n\r\n\t\t// Step 1: get the maximum percentage that any of the handles can move\r\n\t\tif ( handleNumbers.length > 1 ) {\r\n\r\n\t\t\thandleNumbers.forEach(function(handleNumber, o) {\r\n\r\n\t\t\t\tvar to = checkHandlePosition(proposals, handleNumber, proposals[handleNumber] + proposal, b[o], f[o], false);\r\n\r\n\t\t\t\t// Stop if one of the handles can't move.\r\n\t\t\t\tif ( to === false ) {\r\n\t\t\t\t\tproposal = 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tproposal = to - proposals[handleNumber];\r\n\t\t\t\t\tproposals[handleNumber] = to;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// If using one handle, check backward AND forward\r\n\t\telse {\r\n\t\t\tb = f = [true];\r\n\t\t}\r\n\r\n\t\tvar state = false;\r\n\r\n\t\t// Step 2: Try to set the handles with the found percentage\r\n\t\thandleNumbers.forEach(function(handleNumber, o) {\r\n\t\t\tstate = setHandle(handleNumber, locations[handleNumber] + proposal, b[o], f[o]) || state;\r\n\t\t});\r\n\r\n\t\t// Step 3: If a handle moved, fire events\r\n\t\tif ( state ) {\r\n\t\t\thandleNumbers.forEach(function(handleNumber){\r\n\t\t\t\tfireEvent('update', handleNumber);\r\n\t\t\t\tfireEvent('slide', handleNumber);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// External event handling\r\n\tfunction fireEvent ( eventName, handleNumber, tap ) {\r\n\r\n\t\tObject.keys(scope_Events).forEach(function( targetEvent ) {\r\n\r\n\t\t\tvar eventType = targetEvent.split('.')[0];\r\n\r\n\t\t\tif ( eventName === eventType ) {\r\n\t\t\t\tscope_Events[targetEvent].forEach(function( callback ) {\r\n\r\n\t\t\t\t\tcallback.call(\r\n\t\t\t\t\t\t// Use the slider public API as the scope ('this')\r\n\t\t\t\t\t\tscope_Self,\r\n\t\t\t\t\t\t// Return values as array, so arg_1[arg_2] is always valid.\r\n\t\t\t\t\t\tscope_Values.map(options.format.to),\r\n\t\t\t\t\t\t// Handle index, 0 or 1\r\n\t\t\t\t\t\thandleNumber,\r\n\t\t\t\t\t\t// Unformatted slider values\r\n\t\t\t\t\t\tscope_Values.slice(),\r\n\t\t\t\t\t\t// Event is fired by tap, true or false\r\n\t\t\t\t\t\ttap || false,\r\n\t\t\t\t\t\t// Left offset of the handle, in relation to the slider\r\n\t\t\t\t\t\tscope_Locations.slice()\r\n\t\t\t\t\t);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\r\n\t// Fire 'end' when a mouse or pen leaves the document.\r\n\tfunction documentLeave ( event, data ) {\r\n\t\tif ( event.type === \"mouseout\" && event.target.nodeName === \"HTML\" && event.relatedTarget === null ){\r\n\t\t\teventEnd (event, data);\r\n\t\t}\r\n\t}\r\n\r\n\t// Handle movement on document for handle and range drag.\r\n\tfunction eventMove ( event, data ) {\r\n\r\n\t\t// Fix #498\r\n\t\t// Check value of .buttons in 'start' to work around a bug in IE10 mobile (data.buttonsProperty).\r\n\t\t// https://connect.microsoft.com/IE/feedback/details/927005/mobile-ie10-windows-phone-buttons-property-of-pointermove-event-always-zero\r\n\t\t// IE9 has .buttons and .which zero on mousemove.\r\n\t\t// Firefox breaks the spec MDN defines.\r\n\t\tif ( navigator.appVersion.indexOf(\"MSIE 9\") === -1 && event.buttons === 0 && data.buttonsProperty !== 0 ) {\r\n\t\t\treturn eventEnd(event, data);\r\n\t\t}\r\n\r\n\t\t// Check if we are moving up or down\r\n\t\tvar movement = (options.dir ? -1 : 1) * (event.calcPoint - data.startCalcPoint);\r\n\r\n\t\t// Convert the movement into a percentage of the slider width/height\r\n\t\tvar proposal = (movement * 100) / data.baseSize;\r\n\r\n\t\tmoveHandles(movement > 0, proposal, data.locations, data.handleNumbers);\r\n\t}\r\n\r\n\t// Unbind move events on document, call callbacks.\r\n\tfunction eventEnd ( event, data ) {\r\n\r\n\t\t// The handle is no longer active, so remove the class.\r\n\t\tif ( scope_ActiveHandle ) {\r\n\t\t\tremoveClass(scope_ActiveHandle, options.cssClasses.active);\r\n\t\t\tscope_ActiveHandle = false;\r\n\t\t}\r\n\r\n\t\t// Remove cursor styles and text-selection events bound to the body.\r\n\t\tif ( event.cursor ) {\r\n\t\t\tscope_Body.style.cursor = '';\r\n\t\t\tscope_Body.removeEventListener('selectstart', preventDefault);\r\n\t\t}\r\n\r\n\t\t// Unbind the move and end events, which are added on 'start'.\r\n\t\tscope_Listeners.forEach(function( c ) {\r\n\t\t\tscope_DocumentElement.removeEventListener(c[0], c[1]);\r\n\t\t});\r\n\r\n\t\t// Remove dragging class.\r\n\t\tremoveClass(scope_Target, options.cssClasses.drag);\r\n\r\n\t\tsetZindex();\r\n\r\n\t\tdata.handleNumbers.forEach(function(handleNumber){\r\n\t\t\tfireEvent('change', handleNumber);\r\n\t\t\tfireEvent('set', handleNumber);\r\n\t\t\tfireEvent('end', handleNumber);\r\n\t\t});\r\n\t}\r\n\r\n\t// Bind move events on document.\r\n\tfunction eventStart ( event, data ) {\r\n\r\n\t\tif ( data.handleNumbers.length === 1 ) {\r\n\r\n\t\t\tvar handle = scope_Handles[data.handleNumbers[0]];\r\n\r\n\t\t\t// Ignore 'disabled' handles\r\n\t\t\tif ( handle.hasAttribute('disabled') ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Mark the handle as 'active' so it can be styled.\r\n\t\t\tscope_ActiveHandle = handle.children[0];\r\n\t\t\taddClass(scope_ActiveHandle, options.cssClasses.active);\r\n\t\t}\r\n\r\n\t\t// A drag should never propagate up to the 'tap' event.\r\n\t\tevent.stopPropagation();\r\n\r\n\t\t// Attach the move and end events.\r\n\t\tvar moveEvent = attachEvent(actions.move, scope_DocumentElement, eventMove, {\r\n\t\t\tstartCalcPoint: event.calcPoint,\r\n\t\t\tbaseSize: baseSize(),\r\n\t\t\tpageOffset: event.pageOffset,\r\n\t\t\thandleNumbers: data.handleNumbers,\r\n\t\t\tbuttonsProperty: event.buttons,\r\n\t\t\tlocations: scope_Locations.slice()\r\n\t\t});\r\n\r\n\t\tvar endEvent = attachEvent(actions.end, scope_DocumentElement, eventEnd, {\r\n\t\t\thandleNumbers: data.handleNumbers\r\n\t\t});\r\n\r\n\t\tvar outEvent = attachEvent(\"mouseout\", scope_DocumentElement, documentLeave, {\r\n\t\t\thandleNumbers: data.handleNumbers\r\n\t\t});\r\n\r\n\t\tscope_Listeners = moveEvent.concat(endEvent, outEvent);\r\n\r\n\t\t// Text selection isn't an issue on touch devices,\r\n\t\t// so adding cursor styles can be skipped.\r\n\t\tif ( event.cursor ) {\r\n\r\n\t\t\t// Prevent the 'I' cursor and extend the range-drag cursor.\r\n\t\t\tscope_Body.style.cursor = getComputedStyle(event.target).cursor;\r\n\r\n\t\t\t// Mark the target with a dragging state.\r\n\t\t\tif ( scope_Handles.length > 1 ) {\r\n\t\t\t\taddClass(scope_Target, options.cssClasses.drag);\r\n\t\t\t}\r\n\r\n\t\t\t// Prevent text selection when dragging the handles.\r\n\t\t\t// In noUiSlider <= 9.2.0, this was handled by calling preventDefault on mouse/touch start/move,\r\n\t\t\t// which is scroll blocking. The selectstart event is supported by FireFox starting from version 52,\r\n\t\t\t// meaning the only holdout is iOS Safari. This doesn't matter: text selection isn't triggered there.\r\n\t\t\t// The 'cursor' flag is false.\r\n\t\t\t// See: http://caniuse.com/#search=selectstart\r\n\t\t\tscope_Body.addEventListener('selectstart', preventDefault, false);\r\n\t\t}\r\n\r\n\t\tdata.handleNumbers.forEach(function(handleNumber){\r\n\t\t\tfireEvent('start', handleNumber);\r\n\t\t});\r\n\t}\r\n\r\n\t// Move closest handle to tapped location.\r\n\tfunction eventTap ( event ) {\r\n\r\n\t\t// The tap event shouldn't propagate up\r\n\t\tevent.stopPropagation();\r\n\r\n\t\tvar proposal = calcPointToPercentage(event.calcPoint);\r\n\t\tvar handleNumber = getClosestHandle(proposal);\r\n\r\n\t\t// Tackle the case that all handles are 'disabled'.\r\n\t\tif ( handleNumber === false ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Flag the slider as it is now in a transitional state.\r\n\t\t// Transition takes a configurable amount of ms (default 300). Re-enable the slider after that.\r\n\t\tif ( !options.events.snap ) {\r\n\t\t\taddClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);\r\n\t\t}\r\n\r\n\t\tsetHandle(handleNumber, proposal, true, true);\r\n\r\n\t\tsetZindex();\r\n\r\n\t\tfireEvent('slide', handleNumber, true);\r\n\t\tfireEvent('update', handleNumber, true);\r\n\t\tfireEvent('change', handleNumber, true);\r\n\t\tfireEvent('set', handleNumber, true);\r\n\r\n\t\tif ( options.events.snap ) {\r\n\t\t\teventStart(event, { handleNumbers: [handleNumber] });\r\n\t\t}\r\n\t}\r\n\r\n\t// Fires a 'hover' event for a hovered mouse/pen position.\r\n\tfunction eventHover ( event ) {\r\n\r\n\t\tvar proposal = calcPointToPercentage(event.calcPoint);\r\n\r\n\t\tvar to = scope_Spectrum.getStep(proposal);\r\n\t\tvar value = scope_Spectrum.fromStepping(to);\r\n\r\n\t\tObject.keys(scope_Events).forEach(function( targetEvent ) {\r\n\t\t\tif ( 'hover' === targetEvent.split('.')[0] ) {\r\n\t\t\t\tscope_Events[targetEvent].forEach(function( callback ) {\r\n\t\t\t\t\tcallback.call( scope_Self, value );\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Attach events to several slider parts.\r\n\tfunction bindSliderEvents ( behaviour ) {\r\n\r\n\t\t// Attach the standard drag event to the handles.\r\n\t\tif ( !behaviour.fixed ) {\r\n\r\n\t\t\tscope_Handles.forEach(function( handle, index ){\r\n\r\n\t\t\t\t// These events are only bound to the visual handle\r\n\t\t\t\t// element, not the 'real' origin element.\r\n\t\t\t\tattachEvent ( actions.start, handle.children[0], eventStart, {\r\n\t\t\t\t\thandleNumbers: [index]\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Attach the tap event to the slider base.\r\n\t\tif ( behaviour.tap ) {\r\n\t\t\tattachEvent (actions.start, scope_Base, eventTap, {});\r\n\t\t}\r\n\r\n\t\t// Fire hover events\r\n\t\tif ( behaviour.hover ) {\r\n\t\t\tattachEvent (actions.move, scope_Base, eventHover, { hover: true });\r\n\t\t}\r\n\r\n\t\t// Make the range draggable.\r\n\t\tif ( behaviour.drag ){\r\n\r\n\t\t\tscope_Connects.forEach(function( connect, index ){\r\n\r\n\t\t\t\tif ( connect === false || index === 0 || index === scope_Connects.length - 1 ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar handleBefore = scope_Handles[index - 1];\r\n\t\t\t\tvar handleAfter = scope_Handles[index];\r\n\t\t\t\tvar eventHolders = [connect];\r\n\r\n\t\t\t\taddClass(connect, options.cssClasses.draggable);\r\n\r\n\t\t\t\t// When the range is fixed, the entire range can\r\n\t\t\t\t// be dragged by the handles. The handle in the first\r\n\t\t\t\t// origin will propagate the start event upward,\r\n\t\t\t\t// but it needs to be bound manually on the other.\r\n\t\t\t\tif ( behaviour.fixed ) {\r\n\t\t\t\t\teventHolders.push(handleBefore.children[0]);\r\n\t\t\t\t\teventHolders.push(handleAfter.children[0]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\teventHolders.forEach(function( eventHolder ) {\r\n\t\t\t\t\tattachEvent ( actions.start, eventHolder, eventStart, {\r\n\t\t\t\t\t\thandles: [handleBefore, handleAfter],\r\n\t\t\t\t\t\thandleNumbers: [index - 1, index]\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t// Split out the handle positioning logic so the Move event can use it, too\r\n\tfunction checkHandlePosition ( reference, handleNumber, to, lookBackward, lookForward, getValue ) {\r\n\r\n\t\t// For sliders with multiple handles, limit movement to the other handle.\r\n\t\t// Apply the margin option by adding it to the handle positions.\r\n\t\tif ( scope_Handles.length > 1 ) {\r\n\r\n\t\t\tif ( lookBackward && handleNumber > 0 ) {\r\n\t\t\t\tto = Math.max(to, reference[handleNumber - 1] + options.margin);\r\n\t\t\t}\r\n\r\n\t\t\tif ( lookForward && handleNumber < scope_Handles.length - 1 ) {\r\n\t\t\t\tto = Math.min(to, reference[handleNumber + 1] - options.margin);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// The limit option has the opposite effect, limiting handles to a\r\n\t\t// maximum distance from another. Limit must be > 0, as otherwise\r\n\t\t// handles would be unmoveable.\r\n\t\tif ( scope_Handles.length > 1 && options.limit ) {\r\n\r\n\t\t\tif ( lookBackward && handleNumber > 0 ) {\r\n\t\t\t\tto = Math.min(to, reference[handleNumber - 1] + options.limit);\r\n\t\t\t}\r\n\r\n\t\t\tif ( lookForward && handleNumber < scope_Handles.length - 1 ) {\r\n\t\t\t\tto = Math.max(to, reference[handleNumber + 1] - options.limit);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// The padding option keeps the handles a certain distance from the\r\n\t\t// edges of the slider. Padding must be > 0.\r\n\t\tif ( options.padding ) {\r\n\r\n\t\t\tif ( handleNumber === 0 ) {\r\n\t\t\t\tto = Math.max(to, options.padding);\r\n\t\t\t}\r\n\r\n\t\t\tif ( handleNumber === scope_Handles.length - 1 ) {\r\n\t\t\t\tto = Math.min(to, 100 - options.padding);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tto = scope_Spectrum.getStep(to);\r\n\r\n\t\t// Limit percentage to the 0 - 100 range\r\n\t\tto = limit(to);\r\n\r\n\t\t// Return false if handle can't move\r\n\t\tif ( to === reference[handleNumber] && !getValue ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn to;\r\n\t}\r\n\r\n\tfunction toPct ( pct ) {\r\n\t\treturn pct + '%';\r\n\t}\r\n\r\n\t// Updates scope_Locations and scope_Values, updates visual state\r\n\tfunction updateHandlePosition ( handleNumber, to ) {\r\n\r\n\t\t// Update locations.\r\n\t\tscope_Locations[handleNumber] = to;\r\n\r\n\t\t// Convert the value to the slider stepping/range.\r\n\t\tscope_Values[handleNumber] = scope_Spectrum.fromStepping(to);\r\n\r\n\t\t// Called synchronously or on the next animationFrame\r\n\t\tvar stateUpdate = function() {\r\n\t\t\tscope_Handles[handleNumber].style[options.style] = toPct(to);\r\n\t\t\tupdateConnect(handleNumber);\r\n\t\t\tupdateConnect(handleNumber + 1);\r\n\t\t};\r\n\r\n\t\t// Set the handle to the new position.\r\n\t\t// Use requestAnimationFrame for efficient painting.\r\n\t\t// No significant effect in Chrome, Edge sees dramatic performace improvements.\r\n\t\t// Option to disable is useful for unit tests, and single-step debugging.\r\n\t\tif ( window.requestAnimationFrame && options.useRequestAnimationFrame ) {\r\n\t\t\twindow.requestAnimationFrame(stateUpdate);\r\n\t\t} else {\r\n\t\t\tstateUpdate();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction setZindex ( ) {\r\n\r\n\t\tscope_HandleNumbers.forEach(function(handleNumber){\r\n\t\t\t// Handles before the slider middle are stacked later = higher,\r\n\t\t\t// Handles after the middle later is lower\r\n\t\t\t// [[7] [8] .......... | .......... [5] [4]\r\n\t\t\tvar dir = (scope_Locations[handleNumber] > 50 ? -1 : 1);\r\n\t\t\tvar zIndex = 3 + (scope_Handles.length + (dir * handleNumber));\r\n\t\t\tscope_Handles[handleNumber].childNodes[0].style.zIndex = zIndex;\r\n\t\t});\r\n\t}\r\n\r\n\t// Test suggested values and apply margin, step.\r\n\tfunction setHandle ( handleNumber, to, lookBackward, lookForward ) {\r\n\r\n\t\tto = checkHandlePosition(scope_Locations, handleNumber, to, lookBackward, lookForward, false);\r\n\r\n\t\tif ( to === false ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tupdateHandlePosition(handleNumber, to);\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// Updates style attribute for connect nodes\r\n\tfunction updateConnect ( index ) {\r\n\r\n\t\t// Skip connects set to false\r\n\t\tif ( !scope_Connects[index] ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar l = 0;\r\n\t\tvar h = 100;\r\n\r\n\t\tif ( index !== 0 ) {\r\n\t\t\tl = scope_Locations[index - 1];\r\n\t\t}\r\n\r\n\t\tif ( index !== scope_Connects.length - 1 ) {\r\n\t\t\th = scope_Locations[index];\r\n\t\t}\r\n\r\n\t\tscope_Connects[index].style[options.style] = toPct(l);\r\n\t\tscope_Connects[index].style[options.styleOposite] = toPct(100 - h);\r\n\t}\r\n\r\n\t// ...\r\n\tfunction setValue ( to, handleNumber ) {\r\n\r\n\t\t// Setting with null indicates an 'ignore'.\r\n\t\t// Inputting 'false' is invalid.\r\n\t\tif ( to === null || to === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// If a formatted number was passed, attemt to decode it.\r\n\t\tif ( typeof to === 'number' ) {\r\n\t\t\tto = String(to);\r\n\t\t}\r\n\r\n\t\tto = options.format.from(to);\r\n\r\n\t\t// Request an update for all links if the value was invalid.\r\n\t\t// Do so too if setting the handle fails.\r\n\t\tif ( to !== false && !isNaN(to) ) {\r\n\t\t\tsetHandle(handleNumber, scope_Spectrum.toStepping(to), false, false);\r\n\t\t}\r\n\t}\r\n\r\n\t// Set the slider value.\r\n\tfunction valueSet ( input, fireSetEvent ) {\r\n\r\n\t\tvar values = asArray(input);\r\n\t\tvar isInit = scope_Locations[0] === undefined;\r\n\r\n\t\t// Event fires by default\r\n\t\tfireSetEvent = (fireSetEvent === undefined ? true : !!fireSetEvent);\r\n\r\n\t\tvalues.forEach(setValue);\r\n\r\n\t\t// Animation is optional.\r\n\t\t// Make sure the initial values were set before using animated placement.\r\n\t\tif ( options.animate && !isInit ) {\r\n\t\t\taddClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);\r\n\t\t}\r\n\r\n\t\t// Now that all base values are set, apply constraints\r\n\t\tscope_HandleNumbers.forEach(function(handleNumber){\r\n\t\t\tsetHandle(handleNumber, scope_Locations[handleNumber], true, false);\r\n\t\t});\r\n\r\n\t\tsetZindex();\r\n\r\n\t\tscope_HandleNumbers.forEach(function(handleNumber){\r\n\r\n\t\t\tfireEvent('update', handleNumber);\r\n\r\n\t\t\t// Fire the event only for handles that received a new value, as per #579\r\n\t\t\tif ( values[handleNumber] !== null && fireSetEvent ) {\r\n\t\t\t\tfireEvent('set', handleNumber);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Reset slider to initial values\r\n\tfunction valueReset ( fireSetEvent ) {\r\n\t\tvalueSet(options.start, fireSetEvent);\r\n\t}\r\n\r\n\t// Get the slider value.\r\n\tfunction valueGet ( ) {\r\n\r\n\t\tvar values = scope_Values.map(options.format.to);\r\n\r\n\t\t// If only one handle is used, return a single value.\r\n\t\tif ( values.length === 1 ){\r\n\t\t\treturn values[0];\r\n\t\t}\r\n\r\n\t\treturn values;\r\n\t}\r\n\r\n\t// Removes classes from the root and empties it.\r\n\tfunction destroy ( ) {\r\n\r\n\t\tfor ( var key in options.cssClasses ) {\r\n\t\t\tif ( !options.cssClasses.hasOwnProperty(key) ) { continue; }\r\n\t\t\tremoveClass(scope_Target, options.cssClasses[key]);\r\n\t\t}\r\n\r\n\t\twhile (scope_Target.firstChild) {\r\n\t\t\tscope_Target.removeChild(scope_Target.firstChild);\r\n\t\t}\r\n\r\n\t\tdelete scope_Target.noUiSlider;\r\n\t}\r\n\r\n\t// Get the current step size for the slider.\r\n\tfunction getCurrentStep ( ) {\r\n\r\n\t\t// Check all locations, map them to their stepping point.\r\n\t\t// Get the step point, then find it in the input list.\r\n\t\treturn scope_Locations.map(function( location, index ){\r\n\r\n\t\t\tvar nearbySteps = scope_Spectrum.getNearbySteps( location );\r\n\t\t\tvar value = scope_Values[index];\r\n\t\t\tvar increment = nearbySteps.thisStep.step;\r\n\t\t\tvar decrement = null;\r\n\r\n\t\t\t// If the next value in this step moves into the next step,\r\n\t\t\t// the increment is the start of the next step - the current value\r\n\t\t\tif ( increment !== false ) {\r\n\t\t\t\tif ( value + increment > nearbySteps.stepAfter.startValue ) {\r\n\t\t\t\t\tincrement = nearbySteps.stepAfter.startValue - value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\t// If the value is beyond the starting point\r\n\t\t\tif ( value > nearbySteps.thisStep.startValue ) {\r\n\t\t\t\tdecrement = nearbySteps.thisStep.step;\r\n\t\t\t}\r\n\r\n\t\t\telse if ( nearbySteps.stepBefore.step === false ) {\r\n\t\t\t\tdecrement = false;\r\n\t\t\t}\r\n\r\n\t\t\t// If a handle is at the start of a step, it always steps back into the previous step first\r\n\t\t\telse {\r\n\t\t\t\tdecrement = value - nearbySteps.stepBefore.highestStep;\r\n\t\t\t}\r\n\r\n\r\n\t\t\t// Now, if at the slider edges, there is not in/decrement\r\n\t\t\tif ( location === 100 ) {\r\n\t\t\t\tincrement = null;\r\n\t\t\t}\r\n\r\n\t\t\telse if ( location === 0 ) {\r\n\t\t\t\tdecrement = null;\r\n\t\t\t}\r\n\r\n\t\t\t// As per #391, the comparison for the decrement step can have some rounding issues.\r\n\t\t\tvar stepDecimals = scope_Spectrum.countStepDecimals();\r\n\r\n\t\t\t// Round per #391\r\n\t\t\tif ( increment !== null && increment !== false ) {\r\n\t\t\t\tincrement = Number(increment.toFixed(stepDecimals));\r\n\t\t\t}\r\n\r\n\t\t\tif ( decrement !== null && decrement !== false ) {\r\n\t\t\t\tdecrement = Number(decrement.toFixed(stepDecimals));\r\n\t\t\t}\r\n\r\n\t\t\treturn [decrement, increment];\r\n\t\t});\r\n\t}\r\n\r\n\t// Attach an event to this slider, possibly including a namespace\r\n\tfunction bindEvent ( namespacedEvent, callback ) {\r\n\t\tscope_Events[namespacedEvent] = scope_Events[namespacedEvent] || [];\r\n\t\tscope_Events[namespacedEvent].push(callback);\r\n\r\n\t\t// If the event bound is 'update,' fire it immediately for all handles.\r\n\t\tif ( namespacedEvent.split('.')[0] === 'update' ) {\r\n\t\t\tscope_Handles.forEach(function(a, index){\r\n\t\t\t\tfireEvent('update', index);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// Undo attachment of event\r\n\tfunction removeEvent ( namespacedEvent ) {\r\n\r\n\t\tvar event = namespacedEvent && namespacedEvent.split('.')[0];\r\n\t\tvar namespace = event && namespacedEvent.substring(event.length);\r\n\r\n\t\tObject.keys(scope_Events).forEach(function( bind ){\r\n\r\n\t\t\tvar tEvent = bind.split('.')[0],\r\n\t\t\t\ttNamespace = bind.substring(tEvent.length);\r\n\r\n\t\t\tif ( (!event || event === tEvent) && (!namespace || namespace === tNamespace) ) {\r\n\t\t\t\tdelete scope_Events[bind];\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Updateable: margin, limit, padding, step, range, animate, snap\r\n\tfunction updateOptions ( optionsToUpdate, fireSetEvent ) {\r\n\r\n\t\t// Spectrum is created using the range, snap, direction and step options.\r\n\t\t// 'snap' and 'step' can be updated.\r\n\t\t// If 'snap' and 'step' are not passed, they should remain unchanged.\r\n\t\tvar v = valueGet();\r\n\r\n\t\tvar updateAble = ['margin', 'limit', 'padding', 'range', 'animate', 'snap', 'step', 'format'];\r\n\r\n\t\t// Only change options that we're actually passed to update.\r\n\t\tupdateAble.forEach(function(name){\r\n\t\t\tif ( optionsToUpdate[name] !== undefined ) {\r\n\t\t\t\toriginalOptions[name] = optionsToUpdate[name];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tvar newOptions = testOptions(originalOptions);\r\n\r\n\t\t// Load new options into the slider state\r\n\t\tupdateAble.forEach(function(name){\r\n\t\t\tif ( optionsToUpdate[name] !== undefined ) {\r\n\t\t\t\toptions[name] = newOptions[name];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tscope_Spectrum = newOptions.spectrum;\r\n\r\n\t\t// Limit, margin and padding depend on the spectrum but are stored outside of it. (#677)\r\n\t\toptions.margin = newOptions.margin;\r\n\t\toptions.limit = newOptions.limit;\r\n\t\toptions.padding = newOptions.padding;\r\n\r\n\t\t// Update pips, removes existing.\r\n\t\tif ( options.pips ) {\r\n\t\t\tpips(options.pips);\r\n\t\t}\r\n\r\n\t\t// Invalidate the current positioning so valueSet forces an update.\r\n\t\tscope_Locations = [];\r\n\t\tvalueSet(optionsToUpdate.start || v, fireSetEvent);\r\n\t}\r\n\r\n\t// Throw an error if the slider was already initialized.\r\n\tif ( scope_Target.noUiSlider ) {\r\n\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): Slider was already initialized.\");\r\n\t}\r\n\r\n\t// Create the base element, initialise HTML and set classes.\r\n\t// Add handles and connect elements.\r\n\taddSlider(scope_Target);\r\n\taddElements(options.connect, scope_Base);\r\n\r\n\tscope_Self = {\r\n\t\tdestroy: destroy,\r\n\t\tsteps: getCurrentStep,\r\n\t\ton: bindEvent,\r\n\t\toff: removeEvent,\r\n\t\tget: valueGet,\r\n\t\tset: valueSet,\r\n\t\treset: valueReset,\r\n\t\t// Exposed for unit testing, don't use this in your application.\r\n\t\t__moveHandles: function(a, b, c) { moveHandles(a, b, scope_Locations, c); },\r\n\t\toptions: originalOptions, // Issue #600, #678\r\n\t\tupdateOptions: updateOptions,\r\n\t\ttarget: scope_Target, // Issue #597\r\n\t\tremovePips: removePips,\r\n\t\tpips: pips // Issue #594\r\n\t};\r\n\r\n\t// Attach user events.\r\n\tbindSliderEvents(options.events);\r\n\r\n\t// Use the public value method to set the start values.\r\n\tvalueSet(options.start);\r\n\r\n\tif ( options.pips ) {\r\n\t\tpips(options.pips);\r\n\t}\r\n\r\n\tif ( options.tooltips ) {\r\n\t\ttooltips();\r\n\t}\r\n\r\n\taria();\r\n\r\n\treturn scope_Self;\r\n\r\n}\r\n\r\n\r\n\t// Run the standard initializer\r\n\tfunction initialize ( target, originalOptions ) {\r\n\r\n\t\tif ( !target || !target.nodeName ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): create requires a single element, got: \" + target);\r\n\t\t}\r\n\r\n\t\t// Test the options and create the slider environment;\r\n\t\tvar options = testOptions( originalOptions, target );\r\n\t\tvar api = closure( target, options, originalOptions );\r\n\r\n\t\ttarget.noUiSlider = api;\r\n\r\n\t\treturn api;\r\n\t}\r\n\r\n\t// Use an object instead of a function for future expansibility;\r\n\treturn {\r\n\t\tversion: VERSION,\r\n\t\tcreate: initialize\r\n\t};\r\n\r\n}));","AndrewMartin.carousels = [];\n\nAndrewMartin.carousel = () => {\n\n    const activeButton = '<button class=\"slick-polygon-button\">' +\n                            '<svg width=\"30px\" height=\"30px\" viewBox=\"0 0 30 30\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">' +\n                                '<polygon id=\"path-1\" points=\"15 0 14.3169392 1.99095879 1.99095879 14.3162292 0 15 1.99095879 15.6834158 14.3169392 28.0090412 15 30 15.6834158 28.0090412 28.0090412 15.6834158 30 15 28.0090412 14.3162292 15.6834158 1.99095879\"></polygon>' +\n                            '</svg>' +\n                        '</button>';\n\n    // Hero carousel\n    document.querySelectorAll('.js-carousel--hero').forEach((el, i) => {\n        el.classList.add('js-carousel--hero-' + i);\n\n        var carousel = new Carousel({\n            dots: true,\n            customPaging: function() {\n                return activeButton;\n            },\n            swipe: true,\n            adaptiveHeight: true,\n            autoplay: true,\n            autoplaySpeed: 7000,\n            fade: true,\n            speed: 300,\n            pauseOnHover: false,\n            pauseOnFocus: false\n        }, 'hero-' + i);\n\n        $(el).on(('init reInit afterChange'), (event, slick, currentSlide) => {\n            const activeSlideIndex = typeof currentSlide === 'undefined' ? 0 : currentSlide;\n            const currentSlideElement = $(slick.$slides[activeSlideIndex]);\n            const heroItemRightExists = currentSlideElement.find('.hero__item--right').length > 0;\n            const slickDots = $(slick.$dots);\n\n            if (heroItemRightExists) {\n                slickDots.addClass('slick-dots--left');\n                slickDots.removeClass('slick-dots--right');\n            } else {\n                slickDots.addClass('slick-dots--right');\n                slickDots.removeClass('slick-dots--left');\n            }\n\n            const heroItem = currentSlideElement.get(0).querySelector('.hero__item');\n\n            if (heroItem && !heroItem.dataset.seen) {\n                const observer = new IntersectionObserver(([entry]) => {\n                    if (entry.isIntersecting) {\n                        heroItem.dataset.seen = true;\n\n                        window.dataLayer.push({\n                            event: 'hero_banner_view',\n                            hero_banner_id: heroItem.dataset.gaId,\n                            hero_banner: heroItem.dataset.gaLabel,\n                            hero_banner_position: activeSlideIndex,\n                        });\n\n                        observer.disconnect();\n                    }\n                });\n\n                observer.observe(currentSlideElement.get(0));\n            }\n        });\n\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Quote carousel\n    document.querySelectorAll('.js-carousel--quote').forEach((el, i) => {\n        el.classList.add('js-carousel--quote-' + i);\n\n        var carousel = new Carousel({\n            dots: true,\n            customPaging: function() {\n                return activeButton;\n            },\n            swipe: true,\n            autoplay: false,\n            fade: true,\n            speed: 1000\n        }, 'quote-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Review carousel\n    document.querySelectorAll('.js-carousel--reviews').forEach((el, i) => {\n        el.classList.add('js-carousel--reviews-' + i);\n\n        let carousel = new Carousel({\n            appendArrows: $('.overlay-reviews__controls'),\n            dots: false,\n            swipe: true,\n            arrows: true,\n            infinite: false,\n            slidesToShow: 4,\n            slidesToScroll: 4,\n            responsive: [\n                {\n                    breakpoint: 1200,\n                    settings: {\n                        slidesToShow: 3,\n                        slidesToScroll: 3\n                    }\n                },\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2,\n                        slidesToScroll: 2\n                    }\n                },\n                {\n                    breakpoint: 680,\n                    settings: {\n                        slidesToShow: 1.5,\n                        slidesToScroll: 1,\n                    }\n                }\n            ],\n            autoplay: false,\n            speed: 1000\n        }, 'reviews-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Design review carousel\n    document.querySelectorAll('.js-carousel--design-review').forEach((el, i) => {\n        el.classList.add('js-carousel--design-review-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 6,\n            responsive: [\n                {\n                    breakpoint: 1920,\n                    settings: {\n                        slidesToShow: 5,\n                        slidesToScroll: 1\n                    }\n                },\n                {\n                    breakpoint: 1680,\n                    settings: {\n                        slidesToShow: 4,\n                        slidesToScroll: 1\n                    }\n                },\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2,\n                        slidesToScroll: 1\n                    }\n                },\n            ],\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: false,\n            autoplay: false,\n            fade: false,\n            speed: 1000\n        }, 'design-review-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n\n    // Complete the look carousel (carbon copy of above)\n    document.querySelectorAll('.js-carousel--product-recommended').forEach((el, i) => {\n\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        el.classList.add('js-carousel--product-recommended-' + i);\n\n        const title = el.previousElementSibling;\n\n        let carousel = new Carousel({\n            appendArrows: $(title),\n            slidesToShow: 4,\n            swipeToSlide: true,\n            responsive: [\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2,\n                        slidesToScroll: 1,\n                        swipeToSlide: true,\n                    }\n                },\n                {\n                    breakpoint: 680,\n                    settings: 'unslick',\n                },\n            ],\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: true,\n            autoplay: false,\n            fade: false,\n            speed: 200\n        }, 'product-recommended-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n\n    // Get inspired carousel\n    document.querySelectorAll('.js-carousel--inspired').forEach((el, i) => {\n        el.classList.add('js-carousel--inspired-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: false,\n            autoplay: false,\n            fade: true,\n            speed: 1000\n        }, 'inspired-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n      // Split Feature block carousel\n      document.querySelectorAll('.js-carousel--split-feature').forEach((el, i) => {\n        el.classList.add('js-carousel--split-feature-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            dots: false,\n            swipe: true,\n            autoplay: true,\n            fade: true,\n            speed: 1000\n        }, 'split-feature-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n     // PDP callout carousel\n     document.querySelectorAll('.js-carousel--product').forEach((el, i) => {\n        el.classList.add('js-carousel--product-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: false,\n            autoplay: false,\n            fade: true,\n            speed: 300\n        }, 'product-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // PDP mobile gallery carousel\n    document.querySelectorAll('.js-carousel--product-gallery').forEach((el, i) => {\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        el.classList.add('js-carousel--product-gallery-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            slidesToScroll: 1,\n            dots: true,\n            filter: {\n                selector: function() { return $('.slick-show', this).length === 1; },\n                breakpoint: AndrewMartin.breakpoints.tablet.size\n            },\n            customPaging: function() {\n                return activeButton;\n            },\n            swipe: true,\n            infinite: true,\n            autoplay: false,\n            fade: true,\n            cssEase: 'linear',\n            speed: 100\n        }, 'product-gallery-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // PDP gallery carousel\n    document.querySelectorAll('.js-carousel--product-gallery-v2').forEach((el, i) => {\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        const prevButton = document.querySelector('[data-mobile-prev]');\n        const nextButton = document.querySelector('[data-mobile-next]');\n        const count = document.querySelector('[data-carousel-count]');\n\n        if (window.matchMedia('(max-width: 999px)').matches && (nextButton || prevButton)) {\n            prevButton.addEventListener('click', () => {\n                $(el).slick('slickPrev');\n            })\n\n            nextButton.addEventListener('click', () => {\n                $(el).slick('slickNext');\n            })\n\n            $(el).on('init reInit afterChange', (event, slick, currentSlide) => {\n                //currentSlide is undefined on init -- set it to 0 in this case (currentSlide is 0 based)\n                const i = (currentSlide ? currentSlide : 0) + 1;\n\n                count.innerText = `${i}/${slick.slideCount}`\n            });\n        }\n\n        el.classList.add('js-carousel--product-gallery-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            slidesToScroll: 1,\n            arrows: true,\n            swipe: true,\n            infinite: true,\n            autoplay: false,\n            mobileFirst: true,\n            dots: false,\n            fade: true,\n            cssEase: 'linear',\n            asNavFor: '.js-carousel--product-thumbnails',\n            speed: 100,\n            responsive: [\n                {\n                    breakpoint: 999,\n                    settings: {\n                        swipe: false,\n                    },\n                },\n            ],\n        }, 'product-gallery-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n\n        if (window.matchMedia('(max-width: 999px)').matches) {\n            $(el).slick('slickFilter', function() {\n                return $('.slick-show', this).length === 1;\n            });\n        }\n    });\n\n    // PDP thumbnails\n    document.querySelectorAll('.js-carousel--product-thumbnails').forEach((el, i) => {\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        el.classList.add('js-carousel--product-thumbnails-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 4.5,\n            asNavFor: '.js-carousel--product-gallery-v2',\n            focusOnSelect: true,\n            infinite: false,\n            dots: false,\n            responsive: [\n                {\n                    breakpoint: 999,\n                    settings: \"unslick\",\n                },\n            ],\n        }, 'product-thumbnails-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Categories Block Carousel\n    document.querySelectorAll('.js-carousel--categories').forEach((el, i) => {\n        el.classList.add('js-carousel--categories-' + i);\n\n        let carousel = new Carousel({\n            appendArrows: $('.categories-carousel__controls'),\n            dots: false,\n            swipe: true,\n            arrows: true,\n            infinite: false,\n            slidesToShow: 3.75,\n            slidesToScroll: 1,\n            responsive: [\n                {\n                    breakpoint: 1200,\n                    settings: {\n                        slidesToShow: 3.3,\n                        slidesToScroll: 3\n                    }\n                },\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2.3,\n                        slidesToScroll: 2\n                    }\n                },\n                {\n                    breakpoint: 680,\n                    settings: 'unslick'\n                }\n            ],\n            autoplay: false,\n            speed: 200\n        }, 'categories-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n}\n","AndrewMartin.siteNoticeMessages = [];\nAndrewMartin.siteNotice = () => {\n    AndrewMartin.siteNoticeMessages = document.querySelectorAll('.js-header-message');\n\n    function loopMessages(active)  {\n        if (AndrewMartin.siteNoticeMessages.length) {\n            AndrewMartin.siteNoticeMessages.forEach((m) => {\n                m.classList.add('notice__content--hidden');\n            })\n\n            AndrewMartin.siteNoticeMessages[active].classList.remove('notice__content--hidden')\n\n            if (++active >= AndrewMartin.siteNoticeMessages.length) {\n                active = 0;\n            }\n\n            setTimeout(() => {\n                loopMessages(active)\n            }, 7000)\n        }\n    }\n\n    if (AndrewMartin.siteNoticeMessages.length) {\n        loopMessages(0);\n    }\n}\n","AndrewMartin.bloomreach = () => {\n    $('.js-bloomreach-identify').on('submit', function() {\n        if (typeof exponea === 'undefined') {\n            console.error('Bloomreach not initialised');\n            return true;\n        }\n\n        const email = $(this).find('input[name$=\"email\"]').val() || $(this).find('input[name$=\"email]\"]').val();\n\n        if (!email) {\n            console.error('No email address to send to bloomreach');\n            return true;\n        }\n\n        exponea.identify(\n            {\n              'email_id': email\n            },\n            {\n              'email': email\n            }\n        );\n\n        return true;\n    });\n}\n","AndrewMartin.klaviyo = () => {\n    !function(){if(!window.klaviyo){window._klOnsite=window._klOnsite||[];try{window.klaviyo=new Proxy({},{get:function(n,i){return\"push\"===i?function(){var n;(n=window._klOnsite).push.apply(n,arguments)}:function(){for(var n=arguments.length,o=new Array(n),w=0;w<n;w++)o[w]=arguments[w];var t=\"function\"==typeof o[o.length-1]?o.pop():void 0,e=new Promise((function(n){window._klOnsite.push([i].concat(o,[function(i){t&&t(i),n(i)}]))}));return e}}})}catch(n){window.klaviyo=window.klaviyo||[],window.klaviyo.push=function(){var n;(n=window._klOnsite).push.apply(n,arguments)}}}}();\n\n    const form = document.querySelector('.js-klaviyo-identify');\n\n    if (!form) {\n        console.error('Klaviyo form not found');\n        return;\n    }\n\n    form.addEventListener('submit', (event) => {\n        if (typeof klaviyo === 'undefined') {\n            console.error('Klaviyo not initialised');\n            return true;\n        }\n\n        const email = event.currentTarget.querySelector('input[name$=\"email\"]').value || event.currentTarget.querySelector('input[name$=\"email]\"]').value;\n\n        if (!email) {\n            console.error('No email address to send to klaviyo');\n            return true;\n        }\n\n        klaviyo.identify({\n            'email': email\n        }).then(() => {\n            console.log('Klaviyo identify success');\n        });\n\n        return true;\n    });\n}\n","/**\n * I would do this in CSS but we need to add in the SVG\n * symbol anyway and we only want to show the custom\n * checkbox if this code is run so better to do it here\n *\n * @author Neil Brayfield <neil@d3r.com>\n */\n$.fn.checkReplace = function() {\n    $(this).each(function() {\n        var current = $(this);\n        current.wrap('<div class=\"check-replace\"></div>').hide();\n\n        var wrap = $(this).parent();\n\n        wrap.append(\n            '<svg class=\"icon-tick\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-tick\" />' +\n            '</svg>'\n        );\n\n        current.on('change', function (e) {\n\n            if (current.prop('checked')) {\n                wrap.addClass('check-replace--active');\n            } else {\n                wrap.removeClass('check-replace--active');\n            }\n\n            return true;\n        });\n\n        $(this).trigger('change');\n    });\n};\n","/**\n * I would do this in CSS but we need to add in the SVG\n * symbol anyway and we only want to show the custom\n * checkbox if this code is run so better to do it here\n *\n * @author Andy Hartley <andy.hartley@d3r.com>\n */\n$.fn.customCheckReplace = function() {\n    $(this).each(function() {\n        var current = $(this);\n        current.wrap('<div class=\"check-replace\"></div>').hide();\n\n        var wrap = $(this).parent();\n\n        wrap.append(\n            '<svg class=\"icon-tick\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-tick\" />' +\n            '</svg>'\n        );\n\n        current.on('change', function (e) {\n            if (current.prop('checked')) {\n                wrap.addClass('check-replace--active');\n            } else {\n                wrap.removeClass('check-replace--active');\n            }\n\n            if (e.isTrigger) {\n                return false;\n            }\n\n            return true;\n        });\n\n        $(this).trigger('change');\n    });\n};\n"],"sourceRoot":"../../../../resources/javascript"}